New testcase
[official-gcc.git] / gcc / caller-save.c
blobc8302ae6a7e4b2c59a1e85130ae9c4fddf9c851b
1 /* Save and restore call-clobbered registers which are live across a call.
2 Copyright (C) 1989, 1992, 1994, 1995, 1997, 1998,
3 1999, 2000 Free Software Foundation, Inc.
5 This file is part of GNU CC.
7 GNU CC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
12 GNU CC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GNU CC; see the file COPYING. If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
22 #include "config.h"
23 #include "system.h"
24 #include "rtl.h"
25 #include "insn-config.h"
26 #include "flags.h"
27 #include "regs.h"
28 #include "hard-reg-set.h"
29 #include "recog.h"
30 #include "basic-block.h"
31 #include "reload.h"
32 #include "function.h"
33 #include "expr.h"
34 #include "toplev.h"
35 #include "tm_p.h"
37 #ifndef MAX_MOVE_MAX
38 #define MAX_MOVE_MAX MOVE_MAX
39 #endif
41 #ifndef MIN_UNITS_PER_WORD
42 #define MIN_UNITS_PER_WORD UNITS_PER_WORD
43 #endif
45 #define MOVE_MAX_WORDS (MOVE_MAX / UNITS_PER_WORD)
47 /* Modes for each hard register that we can save. The smallest mode is wide
48 enough to save the entire contents of the register. When saving the
49 register because it is live we first try to save in multi-register modes.
50 If that is not possible the save is done one register at a time. */
52 static enum machine_mode
53 regno_save_mode[FIRST_PSEUDO_REGISTER][MAX_MOVE_MAX / MIN_UNITS_PER_WORD + 1];
55 /* For each hard register, a place on the stack where it can be saved,
56 if needed. */
58 static rtx
59 regno_save_mem[FIRST_PSEUDO_REGISTER][MAX_MOVE_MAX / MIN_UNITS_PER_WORD + 1];
61 /* We will only make a register eligible for caller-save if it can be
62 saved in its widest mode with a simple SET insn as long as the memory
63 address is valid. We record the INSN_CODE is those insns here since
64 when we emit them, the addresses might not be valid, so they might not
65 be recognized. */
67 static enum insn_code
68 reg_save_code[FIRST_PSEUDO_REGISTER][MAX_MOVE_MAX / MIN_UNITS_PER_WORD + 1];
69 static enum insn_code
70 reg_restore_code[FIRST_PSEUDO_REGISTER][MAX_MOVE_MAX / MIN_UNITS_PER_WORD + 1];
72 /* Set of hard regs currently residing in save area (during insn scan). */
74 static HARD_REG_SET hard_regs_saved;
76 /* Number of registers currently in hard_regs_saved. */
78 static int n_regs_saved;
80 /* Computed by mark_referenced_regs, all regs referenced in a given
81 insn. */
82 static HARD_REG_SET referenced_regs;
84 /* Computed in mark_set_regs, holds all registers set by the current
85 instruction. */
86 static HARD_REG_SET this_insn_sets;
89 static void mark_set_regs PARAMS ((rtx, rtx, void *));
90 static void mark_referenced_regs PARAMS ((rtx));
91 static int insert_save PARAMS ((struct insn_chain *, int, int,
92 HARD_REG_SET *));
93 static int insert_restore PARAMS ((struct insn_chain *, int, int,
94 int));
95 static struct insn_chain *insert_one_insn PARAMS ((struct insn_chain *, int,
96 enum insn_code, rtx));
97 static void add_stored_regs PARAMS ((rtx, rtx, void *));
99 /* Initialize for caller-save.
101 Look at all the hard registers that are used by a call and for which
102 regclass.c has not already excluded from being used across a call.
104 Ensure that we can find a mode to save the register and that there is a
105 simple insn to save and restore the register. This latter check avoids
106 problems that would occur if we tried to save the MQ register of some
107 machines directly into memory. */
109 void
110 init_caller_save ()
112 rtx addr_reg;
113 int offset;
114 rtx address;
115 int i, j;
117 /* First find all the registers that we need to deal with and all
118 the modes that they can have. If we can't find a mode to use,
119 we can't have the register live over calls. */
121 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
123 if (call_used_regs[i] && ! call_fixed_regs[i])
125 for (j = 1; j <= MOVE_MAX_WORDS; j++)
127 regno_save_mode[i][j] = HARD_REGNO_CALLER_SAVE_MODE (i, j);
128 if (regno_save_mode[i][j] == VOIDmode && j == 1)
130 call_fixed_regs[i] = 1;
131 SET_HARD_REG_BIT (call_fixed_reg_set, i);
135 else
136 regno_save_mode[i][1] = VOIDmode;
139 /* The following code tries to approximate the conditions under which
140 we can easily save and restore a register without scratch registers or
141 other complexities. It will usually work, except under conditions where
142 the validity of an insn operand is dependent on the address offset.
143 No such cases are currently known.
145 We first find a typical offset from some BASE_REG_CLASS register.
146 This address is chosen by finding the first register in the class
147 and by finding the smallest power of two that is a valid offset from
148 that register in every mode we will use to save registers. */
150 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
151 if (TEST_HARD_REG_BIT (reg_class_contents[(int) BASE_REG_CLASS], i))
152 break;
154 if (i == FIRST_PSEUDO_REGISTER)
155 abort ();
157 addr_reg = gen_rtx_REG (Pmode, i);
159 for (offset = 1 << (HOST_BITS_PER_INT / 2); offset; offset >>= 1)
161 address = gen_rtx_PLUS (Pmode, addr_reg, GEN_INT (offset));
163 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
164 if (regno_save_mode[i][1] != VOIDmode
165 && ! strict_memory_address_p (regno_save_mode[i][1], address))
166 break;
168 if (i == FIRST_PSEUDO_REGISTER)
169 break;
172 /* If we didn't find a valid address, we must use register indirect. */
173 if (offset == 0)
174 address = addr_reg;
176 /* Next we try to form an insn to save and restore the register. We
177 see if such an insn is recognized and meets its constraints. */
179 start_sequence ();
181 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
182 for (j = 1; j <= MOVE_MAX_WORDS; j++)
183 if (regno_save_mode[i][j] != VOIDmode)
185 rtx mem = gen_rtx_MEM (regno_save_mode[i][j], address);
186 rtx reg = gen_rtx_REG (regno_save_mode[i][j], i);
187 rtx savepat = gen_rtx_SET (VOIDmode, mem, reg);
188 rtx restpat = gen_rtx_SET (VOIDmode, reg, mem);
189 rtx saveinsn = emit_insn (savepat);
190 rtx restinsn = emit_insn (restpat);
191 int ok;
193 reg_save_code[i][j] = recog_memoized (saveinsn);
194 reg_restore_code[i][j] = recog_memoized (restinsn);
196 /* Now extract both insns and see if we can meet their
197 constraints. */
198 ok = (reg_save_code[i][j] != (enum insn_code)-1
199 && reg_restore_code[i][j] != (enum insn_code)-1);
200 if (ok)
202 extract_insn (saveinsn);
203 ok = constrain_operands (1);
204 extract_insn (restinsn);
205 ok &= constrain_operands (1);
208 if (! ok)
210 regno_save_mode[i][j] = VOIDmode;
211 if (j == 1)
213 call_fixed_regs[i] = 1;
214 SET_HARD_REG_BIT (call_fixed_reg_set, i);
219 end_sequence ();
222 /* Initialize save areas by showing that we haven't allocated any yet. */
224 void
225 init_save_areas ()
227 int i, j;
229 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
230 for (j = 1; j <= MOVE_MAX_WORDS; j++)
231 regno_save_mem[i][j] = 0;
234 /* Allocate save areas for any hard registers that might need saving.
235 We take a conservative approach here and look for call-clobbered hard
236 registers that are assigned to pseudos that cross calls. This may
237 overestimate slightly (especially if some of these registers are later
238 used as spill registers), but it should not be significant.
240 Future work:
242 In the fallback case we should iterate backwards across all possible
243 modes for the save, choosing the largest available one instead of
244 falling back to the smallest mode immediately. (eg TF -> DF -> SF).
246 We do not try to use "move multiple" instructions that exist
247 on some machines (such as the 68k moveml). It could be a win to try
248 and use them when possible. The hard part is doing it in a way that is
249 machine independent since they might be saving non-consecutive
250 registers. (imagine caller-saving d0,d1,a0,a1 on the 68k) */
252 void
253 setup_save_areas ()
255 int i, j, k;
256 unsigned int r;
257 HARD_REG_SET hard_regs_used;
259 /* Allocate space in the save area for the largest multi-register
260 pseudos first, then work backwards to single register
261 pseudos. */
263 /* Find and record all call-used hard-registers in this function. */
264 CLEAR_HARD_REG_SET (hard_regs_used);
265 for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++)
266 if (reg_renumber[i] >= 0 && REG_N_CALLS_CROSSED (i) > 0)
268 unsigned int regno = reg_renumber[i];
269 unsigned int endregno
270 = regno + HARD_REGNO_NREGS (regno, GET_MODE (regno_reg_rtx[i]));
272 for (r = regno; r < endregno; r++)
273 if (call_used_regs[r])
274 SET_HARD_REG_BIT (hard_regs_used, r);
277 /* Now run through all the call-used hard-registers and allocate
278 space for them in the caller-save area. Try to allocate space
279 in a manner which allows multi-register saves/restores to be done. */
281 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
282 for (j = MOVE_MAX_WORDS; j > 0; j--)
284 int do_save = 1;
286 /* If no mode exists for this size, try another. Also break out
287 if we have already saved this hard register. */
288 if (regno_save_mode[i][j] == VOIDmode || regno_save_mem[i][1] != 0)
289 continue;
291 /* See if any register in this group has been saved. */
292 for (k = 0; k < j; k++)
293 if (regno_save_mem[i + k][1])
295 do_save = 0;
296 break;
298 if (! do_save)
299 continue;
301 for (k = 0; k < j; k++)
302 if (! TEST_HARD_REG_BIT (hard_regs_used, i + k))
304 do_save = 0;
305 break;
307 if (! do_save)
308 continue;
310 /* We have found an acceptable mode to store in. */
311 regno_save_mem[i][j]
312 = assign_stack_local (regno_save_mode[i][j],
313 GET_MODE_SIZE (regno_save_mode[i][j]), 0);
315 /* Setup single word save area just in case... */
316 for (k = 0; k < j; k++)
318 /* This should not depend on WORDS_BIG_ENDIAN.
319 The order of words in regs is the same as in memory. */
320 rtx temp = gen_rtx_MEM (regno_save_mode[i + k][1],
321 XEXP (regno_save_mem[i][j], 0));
323 regno_save_mem[i + k][1]
324 = adj_offsettable_operand (temp, k * UNITS_PER_WORD);
328 /* Now loop again and set the alias set of any save areas we made to
329 the alias set used to represent frame objects. */
330 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
331 for (j = MOVE_MAX_WORDS; j > 0; j--)
332 if (regno_save_mem[i][j] != 0)
333 MEM_ALIAS_SET (regno_save_mem[i][j]) = get_frame_alias_set ();
336 /* Find the places where hard regs are live across calls and save them. */
338 void
339 save_call_clobbered_regs ()
341 struct insn_chain *chain, *next;
343 CLEAR_HARD_REG_SET (hard_regs_saved);
344 n_regs_saved = 0;
346 for (chain = reload_insn_chain; chain != 0; chain = next)
348 rtx insn = chain->insn;
349 enum rtx_code code = GET_CODE (insn);
351 next = chain->next;
353 if (chain->is_caller_save_insn)
354 abort ();
356 if (GET_RTX_CLASS (code) == 'i')
358 /* If some registers have been saved, see if INSN references
359 any of them. We must restore them before the insn if so. */
361 if (n_regs_saved)
363 int regno;
365 if (code == JUMP_INSN)
366 /* Restore all registers if this is a JUMP_INSN. */
367 COPY_HARD_REG_SET (referenced_regs, hard_regs_saved);
368 else
370 CLEAR_HARD_REG_SET (referenced_regs);
371 mark_referenced_regs (PATTERN (insn));
372 AND_HARD_REG_SET (referenced_regs, hard_regs_saved);
375 for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
376 if (TEST_HARD_REG_BIT (referenced_regs, regno))
377 regno += insert_restore (chain, 1, regno, MOVE_MAX_WORDS);
380 if (code == CALL_INSN)
382 int regno;
383 HARD_REG_SET hard_regs_to_save;
385 /* Use the register life information in CHAIN to compute which
386 regs are live during the call. */
387 REG_SET_TO_HARD_REG_SET (hard_regs_to_save,
388 &chain->live_throughout);
389 compute_use_by_pseudos (&hard_regs_to_save,
390 &chain->live_throughout);
392 /* Record all registers set in this call insn. These don't need
393 to be saved. N.B. the call insn might set a subreg of a
394 multi-hard-reg pseudo; then the pseudo is considered live
395 during the call, but the subreg that is set isn't. */
396 CLEAR_HARD_REG_SET (this_insn_sets);
397 note_stores (PATTERN (insn), mark_set_regs, NULL);
399 /* Compute which hard regs must be saved before this call. */
400 AND_COMPL_HARD_REG_SET (hard_regs_to_save, call_fixed_reg_set);
401 AND_COMPL_HARD_REG_SET (hard_regs_to_save, this_insn_sets);
402 AND_COMPL_HARD_REG_SET (hard_regs_to_save, hard_regs_saved);
403 AND_HARD_REG_SET (hard_regs_to_save, call_used_reg_set);
405 for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
406 if (TEST_HARD_REG_BIT (hard_regs_to_save, regno))
407 regno += insert_save (chain, 1, regno, &hard_regs_to_save);
409 /* Must recompute n_regs_saved. */
410 n_regs_saved = 0;
411 for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
412 if (TEST_HARD_REG_BIT (hard_regs_saved, regno))
413 n_regs_saved++;
417 if (chain->next == 0 || chain->next->block > chain->block)
419 int regno;
420 /* At the end of the basic block, we must restore any registers that
421 remain saved. If the last insn in the block is a JUMP_INSN, put
422 the restore before the insn, otherwise, put it after the insn. */
424 if (n_regs_saved)
425 for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
426 if (TEST_HARD_REG_BIT (hard_regs_saved, regno))
427 regno += insert_restore (chain, GET_CODE (insn) == JUMP_INSN,
428 regno, MOVE_MAX_WORDS);
433 /* Here from note_stores when an insn stores a value in a register.
434 Set the proper bit or bits in this_insn_sets. All pseudos that have
435 been assigned hard regs have had their register number changed already,
436 so we can ignore pseudos. */
437 static void
438 mark_set_regs (reg, setter, data)
439 rtx reg;
440 rtx setter ATTRIBUTE_UNUSED;
441 void *data ATTRIBUTE_UNUSED;
443 register int regno, endregno, i;
444 enum machine_mode mode = GET_MODE (reg);
445 int word = 0;
447 if (GET_CODE (reg) == SUBREG)
449 word = SUBREG_WORD (reg);
450 reg = SUBREG_REG (reg);
453 if (GET_CODE (reg) != REG || REGNO (reg) >= FIRST_PSEUDO_REGISTER)
454 return;
456 regno = REGNO (reg) + word;
457 endregno = regno + HARD_REGNO_NREGS (regno, mode);
459 for (i = regno; i < endregno; i++)
460 SET_HARD_REG_BIT (this_insn_sets, i);
463 /* Here from note_stores when an insn stores a value in a register.
464 Set the proper bit or bits in the passed regset. All pseudos that have
465 been assigned hard regs have had their register number changed already,
466 so we can ignore pseudos. */
467 static void
468 add_stored_regs (reg, setter, data)
469 rtx reg;
470 rtx setter;
471 void *data;
473 register int regno, endregno, i;
474 enum machine_mode mode = GET_MODE (reg);
475 int word = 0;
477 if (GET_CODE (setter) == CLOBBER)
478 return;
480 while (GET_CODE (reg) == SUBREG)
482 word += SUBREG_WORD (reg);
483 reg = SUBREG_REG (reg);
486 if (GET_CODE (reg) != REG || REGNO (reg) >= FIRST_PSEUDO_REGISTER)
487 return;
489 regno = REGNO (reg) + word;
490 endregno = regno + HARD_REGNO_NREGS (regno, mode);
492 for (i = regno; i < endregno; i++)
493 SET_REGNO_REG_SET ((regset) data, i);
496 /* Walk X and record all referenced registers in REFERENCED_REGS. */
497 static void
498 mark_referenced_regs (x)
499 rtx x;
501 enum rtx_code code = GET_CODE (x);
502 const char *fmt;
503 int i, j;
505 if (code == SET)
506 mark_referenced_regs (SET_SRC (x));
507 if (code == SET || code == CLOBBER)
509 x = SET_DEST (x);
510 code = GET_CODE (x);
511 if (code == REG || code == PC || code == CC0
512 || (code == SUBREG && GET_CODE (SUBREG_REG (x)) == REG
513 /* If we're setting only part of a multi-word register,
514 we shall mark it as referenced, because the words
515 that are not being set should be restored. */
516 && ((GET_MODE_SIZE (GET_MODE (x))
517 >= GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))))
518 || (GET_MODE_SIZE (GET_MODE (SUBREG_REG (x)))
519 <= UNITS_PER_WORD))))
520 return;
522 if (code == MEM || code == SUBREG)
524 x = XEXP (x, 0);
525 code = GET_CODE (x);
528 if (code == REG)
530 int regno = REGNO (x);
531 int hardregno = (regno < FIRST_PSEUDO_REGISTER ? regno
532 : reg_renumber[regno]);
534 if (hardregno >= 0)
536 int nregs = HARD_REGNO_NREGS (hardregno, GET_MODE (x));
537 while (nregs-- > 0)
538 SET_HARD_REG_BIT (referenced_regs, hardregno + nregs);
540 /* If this is a pseudo that did not get a hard register, scan its
541 memory location, since it might involve the use of another
542 register, which might be saved. */
543 else if (reg_equiv_mem[regno] != 0)
544 mark_referenced_regs (XEXP (reg_equiv_mem[regno], 0));
545 else if (reg_equiv_address[regno] != 0)
546 mark_referenced_regs (reg_equiv_address[regno]);
547 return;
550 fmt = GET_RTX_FORMAT (code);
551 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
553 if (fmt[i] == 'e')
554 mark_referenced_regs (XEXP (x, i));
555 else if (fmt[i] == 'E')
556 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
557 mark_referenced_regs (XVECEXP (x, i, j));
561 /* Insert a sequence of insns to restore. Place these insns in front of
562 CHAIN if BEFORE_P is nonzero, behind the insn otherwise. MAXRESTORE is
563 the maximum number of registers which should be restored during this call.
564 It should never be less than 1 since we only work with entire registers.
566 Note that we have verified in init_caller_save that we can do this
567 with a simple SET, so use it. Set INSN_CODE to what we save there
568 since the address might not be valid so the insn might not be recognized.
569 These insns will be reloaded and have register elimination done by
570 find_reload, so we need not worry about that here.
572 Return the extra number of registers saved. */
574 static int
575 insert_restore (chain, before_p, regno, maxrestore)
576 struct insn_chain *chain;
577 int before_p;
578 int regno;
579 int maxrestore;
581 int i, k;
582 rtx pat = NULL_RTX;
583 enum insn_code code = CODE_FOR_nothing;
584 int numregs = 0;
585 struct insn_chain *new;
587 /* A common failure mode if register status is not correct in the RTL
588 is for this routine to be called with a REGNO we didn't expect to
589 save. That will cause us to write an insn with a (nil) SET_DEST
590 or SET_SRC. Instead of doing so and causing a crash later, check
591 for this common case and abort here instead. This will remove one
592 step in debugging such problems. */
594 if (regno_save_mem[regno][1] == 0)
595 abort ();
597 /* Get the pattern to emit and update our status.
599 See if we can restore `maxrestore' registers at once. Work
600 backwards to the single register case. */
601 for (i = maxrestore; i > 0; i--)
603 int j;
604 int ok = 1;
606 if (regno_save_mem[regno][i] == 0)
607 continue;
609 for (j = 0; j < i; j++)
610 if (! TEST_HARD_REG_BIT (hard_regs_saved, regno + j))
612 ok = 0;
613 break;
615 /* Must do this one restore at a time */
616 if (! ok)
617 continue;
619 numregs = i;
620 break;
623 pat = gen_rtx_SET (VOIDmode,
624 gen_rtx_REG (GET_MODE (regno_save_mem[regno][numregs]),
625 regno),
626 regno_save_mem[regno][numregs]);
627 code = reg_restore_code[regno][numregs];
628 new = insert_one_insn (chain, before_p, code, pat);
630 /* Clear status for all registers we restored. */
631 for (k = 0; k < i; k++)
633 CLEAR_HARD_REG_BIT (hard_regs_saved, regno + k);
634 SET_REGNO_REG_SET (&new->dead_or_set, regno + k);
635 n_regs_saved--;
640 /* Tell our callers how many extra registers we saved/restored */
641 return numregs - 1;
644 /* Like insert_restore above, but save registers instead. */
645 static int
646 insert_save (chain, before_p, regno, to_save)
647 struct insn_chain *chain;
648 int before_p;
649 int regno;
650 HARD_REG_SET *to_save;
652 int i, k;
653 rtx pat = NULL_RTX;
654 enum insn_code code = CODE_FOR_nothing;
655 int numregs = 0;
656 struct insn_chain *new;
658 /* A common failure mode if register status is not correct in the RTL
659 is for this routine to be called with a REGNO we didn't expect to
660 save. That will cause us to write an insn with a (nil) SET_DEST
661 or SET_SRC. Instead of doing so and causing a crash later, check
662 for this common case and abort here instead. This will remove one
663 step in debugging such problems. */
665 if (regno_save_mem[regno][1] == 0)
666 abort ();
668 /* Get the pattern to emit and update our status.
670 See if we can save several registers with a single instruction.
671 Work backwards to the single register case. */
672 for (i = MOVE_MAX_WORDS; i > 0; i--)
674 int j;
675 int ok = 1;
676 if (regno_save_mem[regno][i] == 0)
677 continue;
679 for (j = 0; j < i; j++)
680 if (! TEST_HARD_REG_BIT (*to_save, regno + j))
682 ok = 0;
683 break;
685 /* Must do this one save at a time */
686 if (! ok)
687 continue;
689 numregs = i;
690 break;
693 pat = gen_rtx_SET (VOIDmode, regno_save_mem[regno][numregs],
694 gen_rtx_REG (GET_MODE (regno_save_mem[regno][numregs]),
695 regno));
696 code = reg_save_code[regno][numregs];
697 new = insert_one_insn (chain, before_p, code, pat);
699 /* Set hard_regs_saved and dead_or_set for all the registers we saved. */
700 for (k = 0; k < numregs; k++)
702 SET_HARD_REG_BIT (hard_regs_saved, regno + k);
703 SET_REGNO_REG_SET (&new->dead_or_set, regno + k);
704 n_regs_saved++;
707 /* Tell our callers how many extra registers we saved/restored */
708 return numregs - 1;
711 /* Emit a new caller-save insn and set the code. */
712 static struct insn_chain *
713 insert_one_insn (chain, before_p, code, pat)
714 struct insn_chain *chain;
715 int before_p;
716 enum insn_code code;
717 rtx pat;
719 rtx insn = chain->insn;
720 struct insn_chain *new;
722 #ifdef HAVE_cc0
723 /* If INSN references CC0, put our insns in front of the insn that sets
724 CC0. This is always safe, since the only way we could be passed an
725 insn that references CC0 is for a restore, and doing a restore earlier
726 isn't a problem. We do, however, assume here that CALL_INSNs don't
727 reference CC0. Guard against non-INSN's like CODE_LABEL. */
729 if ((GET_CODE (insn) == INSN || GET_CODE (insn) == JUMP_INSN)
730 && before_p
731 && reg_referenced_p (cc0_rtx, PATTERN (insn)))
732 chain = chain->prev, insn = chain->insn;
733 #endif
735 new = new_insn_chain ();
736 if (before_p)
738 rtx link;
740 new->prev = chain->prev;
741 if (new->prev != 0)
742 new->prev->next = new;
743 else
744 reload_insn_chain = new;
746 chain->prev = new;
747 new->next = chain;
748 new->insn = emit_insn_before (pat, insn);
749 /* ??? It would be nice if we could exclude the already / still saved
750 registers from the live sets. */
751 COPY_REG_SET (&new->live_throughout, &chain->live_throughout);
752 /* Registers that die in CHAIN->INSN still live in the new insn. */
753 for (link = REG_NOTES (chain->insn); link; link = XEXP (link, 1))
755 if (REG_NOTE_KIND (link) == REG_DEAD)
757 rtx reg = XEXP (link, 0);
758 int regno, i;
760 if (GET_CODE (reg) != REG)
761 abort ();
763 regno = REGNO (reg);
764 if (regno >= FIRST_PSEUDO_REGISTER)
765 regno = reg_renumber[regno];
766 if (regno < 0)
767 continue;
768 for (i = HARD_REGNO_NREGS (regno, GET_MODE (reg)) - 1;
769 i >= 0; i--)
770 SET_REGNO_REG_SET (&new->live_throughout, regno + i);
773 CLEAR_REG_SET (&new->dead_or_set);
774 if (chain->insn == BLOCK_HEAD (chain->block))
775 BLOCK_HEAD (chain->block) = new->insn;
777 else
779 new->next = chain->next;
780 if (new->next != 0)
781 new->next->prev = new;
782 chain->next = new;
783 new->prev = chain;
784 new->insn = emit_insn_after (pat, insn);
785 /* ??? It would be nice if we could exclude the already / still saved
786 registers from the live sets, and observe REG_UNUSED notes. */
787 COPY_REG_SET (&new->live_throughout, &chain->live_throughout);
788 /* Registers that are set in CHAIN->INSN live in the new insn.
789 (Unless there is a REG_UNUSED note for them, but we don't
790 look for them here.) */
791 note_stores (PATTERN (chain->insn), add_stored_regs,
792 &new->live_throughout);
793 CLEAR_REG_SET (&new->dead_or_set);
794 if (chain->insn == BLOCK_END (chain->block))
795 BLOCK_END (chain->block) = new->insn;
797 new->block = chain->block;
798 new->is_caller_save_insn = 1;
800 INSN_CODE (new->insn) = code;
801 return new;