1 /* Save and restore call-clobbered registers which are live across a call.
2 Copyright (C) 1989-2024 Free Software Foundation, Inc.
4 This file is part of GCC.
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3. If not see
18 <http://www.gnu.org/licenses/>. */
22 #include "coretypes.h"
30 #include "insn-config.h"
36 #include "addresses.h"
40 #include "function-abi.h"
42 #define MOVE_MAX_WORDS (MOVE_MAX / UNITS_PER_WORD)
44 #define regno_save_mode \
45 (this_target_reload->x_regno_save_mode)
46 #define cached_reg_save_code \
47 (this_target_reload->x_cached_reg_save_code)
48 #define cached_reg_restore_code \
49 (this_target_reload->x_cached_reg_restore_code)
51 /* For each hard register, a place on the stack where it can be saved,
55 regno_save_mem
[FIRST_PSEUDO_REGISTER
][MAX_MOVE_MAX
/ MIN_UNITS_PER_WORD
+ 1];
57 /* The number of elements in the subsequent array. */
58 static int save_slots_num
;
60 /* Allocated slots so far. */
61 static rtx save_slots
[FIRST_PSEUDO_REGISTER
];
63 /* Set of hard regs currently residing in save area (during insn scan). */
65 static HARD_REG_SET hard_regs_saved
;
67 /* Number of registers currently in hard_regs_saved. */
69 static int n_regs_saved
;
71 /* Computed by mark_referenced_regs, all regs referenced in a given
73 static HARD_REG_SET referenced_regs
;
76 typedef void refmarker_fn (rtx
*loc
, machine_mode mode
, int hardregno
,
79 static int reg_save_code (int, machine_mode
);
80 static int reg_restore_code (int, machine_mode
);
82 struct saved_hard_reg
;
83 static void initiate_saved_hard_regs (void);
84 static void new_saved_hard_reg (int, int);
85 static void finish_saved_hard_regs (void);
86 static int saved_hard_reg_compare_func (const void *, const void *);
88 static void mark_set_regs (rtx
, const_rtx
, void *);
89 static void mark_referenced_regs (rtx
*, refmarker_fn
*mark
, void *mark_arg
);
90 static refmarker_fn mark_reg_as_referenced
;
91 static refmarker_fn replace_reg_with_saved_mem
;
92 static int insert_save (class insn_chain
*, int, HARD_REG_SET
*,
94 static int insert_restore (class insn_chain
*, int, int, int,
96 static class insn_chain
*insert_one_insn (class insn_chain
*, int, int,
98 static void add_stored_regs (rtx
, const_rtx
, void *);
102 static GTY(()) rtx savepat
;
103 static GTY(()) rtx restpat
;
104 static GTY(()) rtx test_reg
;
105 static GTY(()) rtx test_mem
;
106 static GTY(()) rtx_insn
*saveinsn
;
107 static GTY(()) rtx_insn
*restinsn
;
109 /* Return the INSN_CODE used to save register REG in mode MODE. */
111 reg_save_code (int reg
, machine_mode mode
)
114 if (cached_reg_save_code
[reg
][mode
])
115 return cached_reg_save_code
[reg
][mode
];
116 if (!targetm
.hard_regno_mode_ok (reg
, mode
))
118 /* Depending on how targetm.hard_regno_mode_ok is defined, range
119 propagation might deduce here that reg >= FIRST_PSEUDO_REGISTER.
120 So the assert below silences a warning. */
121 gcc_assert (reg
< FIRST_PSEUDO_REGISTER
);
122 cached_reg_save_code
[reg
][mode
] = -1;
123 cached_reg_restore_code
[reg
][mode
] = -1;
127 /* Update the register number and modes of the register
128 and memory operand. */
129 set_mode_and_regno (test_reg
, mode
, reg
);
130 PUT_MODE (test_mem
, mode
);
132 /* Force re-recognition of the modified insns. */
133 INSN_CODE (saveinsn
) = -1;
134 INSN_CODE (restinsn
) = -1;
136 cached_reg_save_code
[reg
][mode
] = recog_memoized (saveinsn
);
137 cached_reg_restore_code
[reg
][mode
] = recog_memoized (restinsn
);
139 /* Now extract both insns and see if we can meet their
140 constraints. We don't know here whether the save and restore will
141 be in size- or speed-tuned code, so just use the set of enabled
143 ok
= (cached_reg_save_code
[reg
][mode
] != -1
144 && cached_reg_restore_code
[reg
][mode
] != -1);
147 extract_insn (saveinsn
);
148 ok
= constrain_operands (1, get_enabled_alternatives (saveinsn
));
149 extract_insn (restinsn
);
150 ok
&= constrain_operands (1, get_enabled_alternatives (restinsn
));
155 cached_reg_save_code
[reg
][mode
] = -1;
156 cached_reg_restore_code
[reg
][mode
] = -1;
158 gcc_assert (cached_reg_save_code
[reg
][mode
]);
159 return cached_reg_save_code
[reg
][mode
];
162 /* Return the INSN_CODE used to restore register REG in mode MODE. */
164 reg_restore_code (int reg
, machine_mode mode
)
166 if (cached_reg_restore_code
[reg
][mode
])
167 return cached_reg_restore_code
[reg
][mode
];
168 /* Populate our cache. */
169 reg_save_code (reg
, mode
);
170 return cached_reg_restore_code
[reg
][mode
];
173 /* Initialize for caller-save.
175 Look at all the hard registers that are used by a call and for which
176 reginfo.cc has not already excluded from being used across a call.
178 Ensure that we can find a mode to save the register and that there is a
179 simple insn to save and restore the register. This latter check avoids
180 problems that would occur if we tried to save the MQ register of some
181 machines directly into memory. */
184 init_caller_save (void)
191 if (caller_save_initialized_p
)
194 caller_save_initialized_p
= true;
196 /* First find all the registers that we need to deal with and all
197 the modes that they can have. If we can't find a mode to use,
198 we can't have the register live over calls. */
200 for (i
= 0; i
< FIRST_PSEUDO_REGISTER
; i
++)
201 for (j
= 1; j
<= MOVE_MAX_WORDS
; j
++)
203 regno_save_mode
[i
][j
] = HARD_REGNO_CALLER_SAVE_MODE (i
, j
, VOIDmode
);
204 if (regno_save_mode
[i
][j
] == VOIDmode
&& j
== 1)
205 CLEAR_HARD_REG_BIT (savable_regs
, i
);
208 /* The following code tries to approximate the conditions under which
209 we can easily save and restore a register without scratch registers or
210 other complexities. It will usually work, except under conditions where
211 the validity of an insn operand is dependent on the address offset.
212 No such cases are currently known.
214 We first find a typical offset from some BASE_REG_CLASS register.
215 This address is chosen by finding the first register in the class
216 and by finding the smallest power of two that is a valid offset from
217 that register in every mode we will use to save registers. */
219 for (i
= 0; i
< FIRST_PSEUDO_REGISTER
; i
++)
220 if (TEST_HARD_REG_BIT
222 [(int) base_reg_class (regno_save_mode
[i
][1], ADDR_SPACE_GENERIC
,
223 PLUS
, CONST_INT
)], i
))
226 gcc_assert (i
< FIRST_PSEUDO_REGISTER
);
228 addr_reg
= gen_rtx_REG (Pmode
, i
);
230 for (offset
= 1 << (HOST_BITS_PER_INT
/ 2); offset
; offset
>>= 1)
232 address
= gen_rtx_PLUS (Pmode
, addr_reg
, gen_int_mode (offset
, Pmode
));
234 for (i
= 0; i
< FIRST_PSEUDO_REGISTER
; i
++)
235 if (regno_save_mode
[i
][1] != VOIDmode
236 && ! strict_memory_address_p (regno_save_mode
[i
][1], address
))
239 if (i
== FIRST_PSEUDO_REGISTER
)
243 /* If we didn't find a valid address, we must use register indirect. */
247 /* Next we try to form an insn to save and restore the register. We
248 see if such an insn is recognized and meets its constraints.
250 To avoid lots of unnecessary RTL allocation, we construct all the RTL
251 once, then modify the memory and register operands in-place. */
253 test_reg
= gen_rtx_REG (word_mode
, LAST_VIRTUAL_REGISTER
+ 1);
254 test_mem
= gen_rtx_MEM (word_mode
, address
);
255 savepat
= gen_rtx_SET (test_mem
, test_reg
);
256 restpat
= gen_rtx_SET (test_reg
, test_mem
);
258 saveinsn
= gen_rtx_INSN (VOIDmode
, 0, 0, 0, savepat
, 0, -1, 0);
259 restinsn
= gen_rtx_INSN (VOIDmode
, 0, 0, 0, restpat
, 0, -1, 0);
261 for (i
= 0; i
< FIRST_PSEUDO_REGISTER
; i
++)
262 for (j
= 1; j
<= MOVE_MAX_WORDS
; j
++)
263 if (reg_save_code (i
,regno_save_mode
[i
][j
]) == -1)
265 regno_save_mode
[i
][j
] = VOIDmode
;
267 CLEAR_HARD_REG_BIT (savable_regs
, i
);
273 /* Initialize save areas by showing that we haven't allocated any yet. */
276 init_save_areas (void)
280 for (i
= 0; i
< FIRST_PSEUDO_REGISTER
; i
++)
281 for (j
= 1; j
<= MOVE_MAX_WORDS
; j
++)
282 regno_save_mem
[i
][j
] = 0;
287 /* The structure represents a hard register which should be saved
288 through the call. It is used when the integrated register
289 allocator (IRA) is used and sharing save slots is on. */
290 struct saved_hard_reg
292 /* Order number starting with 0. */
294 /* The hard regno. */
296 /* Execution frequency of all calls through which given hard
297 register should be saved. */
299 /* Stack slot reserved to save the hard register through calls. */
301 /* True if it is first hard register in the chain of hard registers
302 sharing the same stack slot. */
304 /* Order number of the next hard register structure with the same
305 slot in the chain. -1 represents end of the chain. */
309 /* Map: hard register number to the corresponding structure. */
310 static struct saved_hard_reg
*hard_reg_map
[FIRST_PSEUDO_REGISTER
];
312 /* The number of all structures representing hard registers should be
313 saved, in order words, the number of used elements in the following
315 static int saved_regs_num
;
317 /* Pointers to all the structures. Index is the order number of the
318 corresponding structure. */
319 static struct saved_hard_reg
*all_saved_regs
[FIRST_PSEUDO_REGISTER
];
321 /* First called function for work with saved hard registers. */
323 initiate_saved_hard_regs (void)
328 for (i
= 0; i
< FIRST_PSEUDO_REGISTER
; i
++)
329 hard_reg_map
[i
] = NULL
;
332 /* Allocate and return new saved hard register with given REGNO and
335 new_saved_hard_reg (int regno
, int call_freq
)
337 struct saved_hard_reg
*saved_reg
;
340 = (struct saved_hard_reg
*) xmalloc (sizeof (struct saved_hard_reg
));
341 hard_reg_map
[regno
] = all_saved_regs
[saved_regs_num
] = saved_reg
;
342 saved_reg
->num
= saved_regs_num
++;
343 saved_reg
->hard_regno
= regno
;
344 saved_reg
->call_freq
= call_freq
;
345 saved_reg
->first_p
= false;
346 saved_reg
->next
= -1;
349 /* Free memory allocated for the saved hard registers. */
351 finish_saved_hard_regs (void)
355 for (i
= 0; i
< saved_regs_num
; i
++)
356 free (all_saved_regs
[i
]);
359 /* The function is used to sort the saved hard register structures
360 according their frequency. */
362 saved_hard_reg_compare_func (const void *v1p
, const void *v2p
)
364 const struct saved_hard_reg
*p1
= *(struct saved_hard_reg
* const *) v1p
;
365 const struct saved_hard_reg
*p2
= *(struct saved_hard_reg
* const *) v2p
;
367 if (flag_omit_frame_pointer
)
369 if (p1
->call_freq
- p2
->call_freq
!= 0)
370 return p1
->call_freq
- p2
->call_freq
;
372 else if (p2
->call_freq
- p1
->call_freq
!= 0)
373 return p2
->call_freq
- p1
->call_freq
;
375 return p1
->num
- p2
->num
;
378 /* Allocate save areas for any hard registers that might need saving.
379 We take a conservative approach here and look for call-clobbered hard
380 registers that are assigned to pseudos that cross calls. This may
381 overestimate slightly (especially if some of these registers are later
382 used as spill registers), but it should not be significant.
384 For IRA we use priority coloring to decrease stack slots needed for
385 saving hard registers through calls. We build conflicts for them
390 In the fallback case we should iterate backwards across all possible
391 modes for the save, choosing the largest available one instead of
392 falling back to the smallest mode immediately. (eg TF -> DF -> SF).
394 We do not try to use "move multiple" instructions that exist
395 on some machines (such as the 68k moveml). It could be a win to try
396 and use them when possible. The hard part is doing it in a way that is
397 machine independent since they might be saving non-consecutive
398 registers. (imagine caller-saving d0,d1,a0,a1 on the 68k) */
401 setup_save_areas (void)
404 HARD_REG_SET hard_regs_used
;
405 struct saved_hard_reg
*saved_reg
;
407 class insn_chain
*chain
, *next
;
409 HARD_REG_SET hard_regs_to_save
, used_regs
, this_insn_sets
;
410 reg_set_iterator rsi
;
412 CLEAR_HARD_REG_SET (hard_regs_used
);
414 /* Find every CALL_INSN and record which hard regs are live across the
415 call into HARD_REG_MAP and HARD_REGS_USED. */
416 initiate_saved_hard_regs ();
417 /* Create hard reg saved regs. */
418 for (chain
= reload_insn_chain
; chain
!= 0; chain
= next
)
425 || find_reg_note (insn
, REG_NORETURN
, NULL
))
427 freq
= REG_FREQ_FROM_BB (BLOCK_FOR_INSN (insn
));
428 REG_SET_TO_HARD_REG_SET (hard_regs_to_save
,
429 &chain
->live_throughout
);
430 used_regs
= insn_callee_abi (insn
).full_reg_clobbers ();
432 /* Record all registers set in this call insn. These don't
433 need to be saved. N.B. the call insn might set a subreg
434 of a multi-hard-reg pseudo; then the pseudo is considered
435 live during the call, but the subreg that is set
437 CLEAR_HARD_REG_SET (this_insn_sets
);
438 note_stores (insn
, mark_set_regs
, &this_insn_sets
);
439 /* Sibcalls are considered to set the return value. */
440 if (SIBLING_CALL_P (insn
) && crtl
->return_rtx
)
441 mark_set_regs (crtl
->return_rtx
, NULL_RTX
, &this_insn_sets
);
443 used_regs
&= ~(fixed_reg_set
| this_insn_sets
);
444 hard_regs_to_save
&= used_regs
& savable_regs
;
445 for (regno
= 0; regno
< FIRST_PSEUDO_REGISTER
; regno
++)
446 if (TEST_HARD_REG_BIT (hard_regs_to_save
, regno
))
448 if (hard_reg_map
[regno
] != NULL
)
449 hard_reg_map
[regno
]->call_freq
+= freq
;
451 new_saved_hard_reg (regno
, freq
);
452 SET_HARD_REG_BIT (hard_regs_used
, regno
);
454 cheap
= find_reg_note (insn
, REG_RETURNED
, NULL
);
456 cheap
= XEXP (cheap
, 0);
457 /* Look through all live pseudos, mark their hard registers. */
458 EXECUTE_IF_SET_IN_REG_SET
459 (&chain
->live_throughout
, FIRST_PSEUDO_REGISTER
, regno
, rsi
)
461 int r
= reg_renumber
[regno
];
464 if (r
< 0 || regno_reg_rtx
[regno
] == cheap
)
467 bound
= r
+ hard_regno_nregs (r
, PSEUDO_REGNO_MODE (regno
));
468 for (; r
< bound
; r
++)
469 if (TEST_HARD_REG_BIT (used_regs
, r
))
471 if (hard_reg_map
[r
] != NULL
)
472 hard_reg_map
[r
]->call_freq
+= freq
;
474 new_saved_hard_reg (r
, freq
);
475 SET_HARD_REG_BIT (hard_regs_to_save
, r
);
476 SET_HARD_REG_BIT (hard_regs_used
, r
);
481 /* If requested, figure out which hard regs can share save slots. */
482 if (optimize
&& flag_ira_share_save_slots
)
485 char *saved_reg_conflicts
;
487 struct saved_hard_reg
*saved_reg2
, *saved_reg3
;
488 int call_saved_regs_num
;
489 struct saved_hard_reg
*call_saved_regs
[FIRST_PSEUDO_REGISTER
];
491 int prev_save_slots_num
;
492 rtx prev_save_slots
[FIRST_PSEUDO_REGISTER
];
494 /* Find saved hard register conflicts. */
495 saved_reg_conflicts
= (char *) xmalloc (saved_regs_num
* saved_regs_num
);
496 memset (saved_reg_conflicts
, 0, saved_regs_num
* saved_regs_num
);
497 for (chain
= reload_insn_chain
; chain
!= 0; chain
= next
)
500 call_saved_regs_num
= 0;
504 || find_reg_note (insn
, REG_NORETURN
, NULL
))
507 cheap
= find_reg_note (insn
, REG_RETURNED
, NULL
);
509 cheap
= XEXP (cheap
, 0);
511 REG_SET_TO_HARD_REG_SET (hard_regs_to_save
,
512 &chain
->live_throughout
);
513 used_regs
= insn_callee_abi (insn
).full_reg_clobbers ();
515 /* Record all registers set in this call insn. These don't
516 need to be saved. N.B. the call insn might set a subreg
517 of a multi-hard-reg pseudo; then the pseudo is considered
518 live during the call, but the subreg that is set
520 CLEAR_HARD_REG_SET (this_insn_sets
);
521 note_stores (insn
, mark_set_regs
, &this_insn_sets
);
522 /* Sibcalls are considered to set the return value,
523 compare df-scan.cc:df_get_call_refs. */
524 if (SIBLING_CALL_P (insn
) && crtl
->return_rtx
)
525 mark_set_regs (crtl
->return_rtx
, NULL_RTX
, &this_insn_sets
);
527 used_regs
&= ~(fixed_reg_set
| this_insn_sets
);
528 hard_regs_to_save
&= used_regs
& savable_regs
;
529 for (regno
= 0; regno
< FIRST_PSEUDO_REGISTER
; regno
++)
530 if (TEST_HARD_REG_BIT (hard_regs_to_save
, regno
))
532 gcc_assert (hard_reg_map
[regno
] != NULL
);
533 call_saved_regs
[call_saved_regs_num
++] = hard_reg_map
[regno
];
535 /* Look through all live pseudos, mark their hard registers. */
536 EXECUTE_IF_SET_IN_REG_SET
537 (&chain
->live_throughout
, FIRST_PSEUDO_REGISTER
, regno
, rsi
)
539 int r
= reg_renumber
[regno
];
542 if (r
< 0 || regno_reg_rtx
[regno
] == cheap
)
545 bound
= r
+ hard_regno_nregs (r
, PSEUDO_REGNO_MODE (regno
));
546 for (; r
< bound
; r
++)
547 if (TEST_HARD_REG_BIT (used_regs
, r
))
548 call_saved_regs
[call_saved_regs_num
++] = hard_reg_map
[r
];
550 for (i
= 0; i
< call_saved_regs_num
; i
++)
552 saved_reg
= call_saved_regs
[i
];
553 for (j
= 0; j
< call_saved_regs_num
; j
++)
556 saved_reg2
= call_saved_regs
[j
];
557 saved_reg_conflicts
[saved_reg
->num
* saved_regs_num
559 = saved_reg_conflicts
[saved_reg2
->num
* saved_regs_num
565 /* Sort saved hard regs. */
566 qsort (all_saved_regs
, saved_regs_num
, sizeof (struct saved_hard_reg
*),
567 saved_hard_reg_compare_func
);
568 /* Initiate slots available from the previous reload
570 prev_save_slots_num
= save_slots_num
;
571 memcpy (prev_save_slots
, save_slots
, save_slots_num
* sizeof (rtx
));
573 /* Allocate stack slots for the saved hard registers. */
574 for (i
= 0; i
< saved_regs_num
; i
++)
576 saved_reg
= all_saved_regs
[i
];
577 regno
= saved_reg
->hard_regno
;
578 for (j
= 0; j
< i
; j
++)
580 saved_reg2
= all_saved_regs
[j
];
581 if (! saved_reg2
->first_p
)
583 slot
= saved_reg2
->slot
;
584 for (k
= j
; k
>= 0; k
= next_k
)
586 saved_reg3
= all_saved_regs
[k
];
587 next_k
= saved_reg3
->next
;
588 if (saved_reg_conflicts
[saved_reg
->num
* saved_regs_num
593 && known_le (GET_MODE_SIZE (regno_save_mode
[regno
][1]),
594 GET_MODE_SIZE (regno_save_mode
595 [saved_reg2
->hard_regno
][1])))
599 (slot
, regno_save_mode
[saved_reg
->hard_regno
][1], 0);
600 regno_save_mem
[regno
][1] = saved_reg
->slot
;
601 saved_reg
->next
= saved_reg2
->next
;
602 saved_reg2
->next
= i
;
603 if (dump_file
!= NULL
)
604 fprintf (dump_file
, "%d uses slot of %d\n",
605 regno
, saved_reg2
->hard_regno
);
611 saved_reg
->first_p
= true;
612 for (best_slot_num
= -1, j
= 0; j
< prev_save_slots_num
; j
++)
614 slot
= prev_save_slots
[j
];
615 if (slot
== NULL_RTX
)
617 if (known_le (GET_MODE_SIZE (regno_save_mode
[regno
][1]),
618 GET_MODE_SIZE (GET_MODE (slot
)))
619 && best_slot_num
< 0)
621 if (GET_MODE (slot
) == regno_save_mode
[regno
][1])
624 if (best_slot_num
>= 0)
626 saved_reg
->slot
= prev_save_slots
[best_slot_num
];
630 regno_save_mode
[saved_reg
->hard_regno
][1], 0);
631 if (dump_file
!= NULL
)
633 "%d uses a slot from prev iteration\n", regno
);
634 prev_save_slots
[best_slot_num
] = NULL_RTX
;
635 if (best_slot_num
+ 1 == prev_save_slots_num
)
636 prev_save_slots_num
--;
641 = assign_stack_local_1
642 (regno_save_mode
[regno
][1],
643 GET_MODE_SIZE (regno_save_mode
[regno
][1]), 0,
645 if (dump_file
!= NULL
)
646 fprintf (dump_file
, "%d uses a new slot\n", regno
);
648 regno_save_mem
[regno
][1] = saved_reg
->slot
;
649 save_slots
[save_slots_num
++] = saved_reg
->slot
;
652 free (saved_reg_conflicts
);
653 finish_saved_hard_regs ();
657 /* We are not sharing slots.
659 Run through all the call-used hard-registers and allocate
660 space for each in the caller-save area. Try to allocate space
661 in a manner which allows multi-register saves/restores to be done. */
663 for (i
= 0; i
< FIRST_PSEUDO_REGISTER
; i
++)
664 for (j
= MOVE_MAX_WORDS
; j
> 0; j
--)
668 /* If no mode exists for this size, try another. Also break out
669 if we have already saved this hard register. */
670 if (regno_save_mode
[i
][j
] == VOIDmode
|| regno_save_mem
[i
][1] != 0)
673 /* See if any register in this group has been saved. */
674 for (k
= 0; k
< j
; k
++)
675 if (regno_save_mem
[i
+ k
][1])
683 for (k
= 0; k
< j
; k
++)
684 if (! TEST_HARD_REG_BIT (hard_regs_used
, i
+ k
))
692 /* We have found an acceptable mode to store in. Since
693 hard register is always saved in the widest mode
694 available, the mode may be wider than necessary, it is
695 OK to reduce the alignment of spill space. We will
696 verify that it is equal to or greater than required
697 when we restore and save the hard register in
698 insert_restore and insert_save. */
700 = assign_stack_local_1 (regno_save_mode
[i
][j
],
701 GET_MODE_SIZE (regno_save_mode
[i
][j
]),
702 0, ASLK_REDUCE_ALIGN
);
704 /* Setup single word save area just in case... */
705 for (k
= 0; k
< j
; k
++)
706 /* This should not depend on WORDS_BIG_ENDIAN.
707 The order of words in regs is the same as in memory. */
708 regno_save_mem
[i
+ k
][1]
709 = adjust_address_nv (regno_save_mem
[i
][j
],
710 regno_save_mode
[i
+ k
][1],
715 /* Now loop again and set the alias set of any save areas we made to
716 the alias set used to represent frame objects. */
717 for (i
= 0; i
< FIRST_PSEUDO_REGISTER
; i
++)
718 for (j
= MOVE_MAX_WORDS
; j
> 0; j
--)
719 if (regno_save_mem
[i
][j
] != 0)
720 set_mem_alias_set (regno_save_mem
[i
][j
], get_frame_alias_set ());
725 /* Find the places where hard regs are live across calls and save them. */
728 save_call_clobbered_regs (void)
730 class insn_chain
*chain
, *next
, *last
= NULL
;
731 machine_mode save_mode
[FIRST_PSEUDO_REGISTER
];
733 /* Computed in mark_set_regs, holds all registers set by the current
735 HARD_REG_SET this_insn_sets
;
737 CLEAR_HARD_REG_SET (hard_regs_saved
);
740 for (chain
= reload_insn_chain
; chain
!= 0; chain
= next
)
742 rtx_insn
*insn
= chain
->insn
;
743 enum rtx_code code
= GET_CODE (insn
);
747 gcc_assert (!chain
->is_caller_save_insn
);
749 if (NONDEBUG_INSN_P (insn
))
751 /* If some registers have been saved, see if INSN references
752 any of them. We must restore them before the insn if so. */
757 HARD_REG_SET this_insn_sets
;
759 if (code
== JUMP_INSN
)
760 /* Restore all registers if this is a JUMP_INSN. */
761 referenced_regs
= hard_regs_saved
;
764 CLEAR_HARD_REG_SET (referenced_regs
);
765 mark_referenced_regs (&PATTERN (insn
),
766 mark_reg_as_referenced
, NULL
);
767 referenced_regs
&= hard_regs_saved
;
770 for (regno
= 0; regno
< FIRST_PSEUDO_REGISTER
; regno
++)
771 if (TEST_HARD_REG_BIT (referenced_regs
, regno
))
772 regno
+= insert_restore (chain
, 1, regno
, MOVE_MAX_WORDS
,
774 /* If a saved register is set after the call, this means we no
775 longer should restore it. This can happen when parts of a
776 multi-word pseudo do not conflict with other pseudos, so
777 IRA may allocate the same hard register for both. One may
778 be live across the call, while the other is set
780 CLEAR_HARD_REG_SET (this_insn_sets
);
781 note_stores (insn
, mark_set_regs
, &this_insn_sets
);
782 hard_regs_saved
&= ~this_insn_sets
;
785 if (code
== CALL_INSN
786 && ! SIBLING_CALL_P (insn
)
787 && ! find_reg_note (insn
, REG_NORETURN
, NULL
))
790 HARD_REG_SET hard_regs_to_save
;
791 reg_set_iterator rsi
;
794 cheap
= find_reg_note (insn
, REG_RETURNED
, NULL
);
796 cheap
= XEXP (cheap
, 0);
798 /* Use the register life information in CHAIN to compute which
799 regs are live during the call. */
800 REG_SET_TO_HARD_REG_SET (hard_regs_to_save
,
801 &chain
->live_throughout
);
802 /* Save hard registers always in the widest mode available. */
803 for (regno
= 0; regno
< FIRST_PSEUDO_REGISTER
; regno
++)
804 if (TEST_HARD_REG_BIT (hard_regs_to_save
, regno
))
805 save_mode
[regno
] = regno_save_mode
[regno
][1];
807 save_mode
[regno
] = VOIDmode
;
809 /* Look through all live pseudos, mark their hard registers
810 and choose proper mode for saving. */
811 EXECUTE_IF_SET_IN_REG_SET
812 (&chain
->live_throughout
, FIRST_PSEUDO_REGISTER
, regno
, rsi
)
814 int r
= reg_renumber
[regno
];
818 if (r
< 0 || regno_reg_rtx
[regno
] == cheap
)
820 nregs
= hard_regno_nregs (r
, PSEUDO_REGNO_MODE (regno
));
821 mode
= HARD_REGNO_CALLER_SAVE_MODE
822 (r
, nregs
, PSEUDO_REGNO_MODE (regno
));
823 if (partial_subreg_p (save_mode
[r
], mode
))
826 SET_HARD_REG_BIT (hard_regs_to_save
, r
+ nregs
);
829 /* Record all registers set in this call insn. These don't need
830 to be saved. N.B. the call insn might set a subreg of a
831 multi-hard-reg pseudo; then the pseudo is considered live
832 during the call, but the subreg that is set isn't. */
833 CLEAR_HARD_REG_SET (this_insn_sets
);
834 note_stores (insn
, mark_set_regs
, &this_insn_sets
);
836 /* Compute which hard regs must be saved before this call. */
837 function_abi callee_abi
= insn_callee_abi (insn
);
838 hard_regs_to_save
&= ~(fixed_reg_set
841 hard_regs_to_save
&= savable_regs
;
842 hard_regs_to_save
&= callee_abi
.full_reg_clobbers ();
844 for (regno
= 0; regno
< FIRST_PSEUDO_REGISTER
; regno
++)
845 if (TEST_HARD_REG_BIT (hard_regs_to_save
, regno
))
846 regno
+= insert_save (chain
, regno
,
847 &hard_regs_to_save
, save_mode
);
849 /* Must recompute n_regs_saved. */
851 for (regno
= 0; regno
< FIRST_PSEUDO_REGISTER
; regno
++)
852 if (TEST_HARD_REG_BIT (hard_regs_saved
, regno
))
856 && HARD_REGISTER_P (cheap
)
857 && callee_abi
.clobbers_reg_p (GET_MODE (cheap
),
861 rtx pat
= PATTERN (insn
);
862 if (GET_CODE (pat
) == PARALLEL
)
863 pat
= XVECEXP (pat
, 0, 0);
864 dest
= SET_DEST (pat
);
865 /* For multiple return values dest is PARALLEL.
866 Currently we handle only single return value case. */
869 newpat
= gen_rtx_SET (cheap
, copy_rtx (dest
));
870 chain
= insert_one_insn (chain
, 0, -1, newpat
);
876 else if (DEBUG_INSN_P (insn
) && n_regs_saved
)
877 mark_referenced_regs (&PATTERN (insn
),
878 replace_reg_with_saved_mem
,
881 if (chain
->next
== 0 || chain
->next
->block
!= chain
->block
)
884 /* At the end of the basic block, we must restore any registers that
885 remain saved. If the last insn in the block is a JUMP_INSN, put
886 the restore before the insn, otherwise, put it after the insn. */
889 && DEBUG_INSN_P (insn
)
891 && last
->block
== chain
->block
)
893 rtx_insn
*ins
, *prev
;
894 basic_block bb
= BLOCK_FOR_INSN (insn
);
896 /* When adding hard reg restores after a DEBUG_INSN, move
897 all notes between last real insn and this DEBUG_INSN after
898 the DEBUG_INSN, otherwise we could get code
899 -g/-g0 differences. */
900 for (ins
= PREV_INSN (insn
); ins
!= last
->insn
; ins
= prev
)
902 prev
= PREV_INSN (ins
);
905 SET_NEXT_INSN (prev
) = NEXT_INSN (ins
);
906 SET_PREV_INSN (NEXT_INSN (ins
)) = prev
;
907 SET_PREV_INSN (ins
) = insn
;
908 SET_NEXT_INSN (ins
) = NEXT_INSN (insn
);
909 SET_NEXT_INSN (insn
) = ins
;
911 SET_PREV_INSN (NEXT_INSN (ins
)) = ins
;
912 if (BB_END (bb
) == insn
)
916 gcc_assert (DEBUG_INSN_P (ins
));
922 for (regno
= 0; regno
< FIRST_PSEUDO_REGISTER
; regno
++)
923 if (TEST_HARD_REG_BIT (hard_regs_saved
, regno
))
924 regno
+= insert_restore (chain
, JUMP_P (insn
),
925 regno
, MOVE_MAX_WORDS
, save_mode
);
930 /* Here from note_stores, or directly from save_call_clobbered_regs, when
931 an insn stores a value in a register.
932 Set the proper bit or bits in this_insn_sets. All pseudos that have
933 been assigned hard regs have had their register number changed already,
934 so we can ignore pseudos. */
936 mark_set_regs (rtx reg
, const_rtx setter ATTRIBUTE_UNUSED
, void *data
)
938 int regno
, endregno
, i
;
939 HARD_REG_SET
*this_insn_sets
= (HARD_REG_SET
*) data
;
941 if (GET_CODE (reg
) == SUBREG
)
943 rtx inner
= SUBREG_REG (reg
);
944 if (!REG_P (inner
) || REGNO (inner
) >= FIRST_PSEUDO_REGISTER
)
946 regno
= subreg_regno (reg
);
947 endregno
= regno
+ subreg_nregs (reg
);
950 && REGNO (reg
) < FIRST_PSEUDO_REGISTER
)
953 endregno
= END_REGNO (reg
);
958 for (i
= regno
; i
< endregno
; i
++)
959 SET_HARD_REG_BIT (*this_insn_sets
, i
);
962 /* Here from note_stores when an insn stores a value in a register.
963 Set the proper bit or bits in the passed regset. All pseudos that have
964 been assigned hard regs have had their register number changed already,
965 so we can ignore pseudos. */
967 add_stored_regs (rtx reg
, const_rtx setter
, void *data
)
969 int regno
, endregno
, i
;
970 machine_mode mode
= GET_MODE (reg
);
973 if (GET_CODE (setter
) == CLOBBER
)
976 if (GET_CODE (reg
) == SUBREG
977 && REG_P (SUBREG_REG (reg
))
978 && REGNO (SUBREG_REG (reg
)) < FIRST_PSEUDO_REGISTER
)
980 offset
= subreg_regno_offset (REGNO (SUBREG_REG (reg
)),
981 GET_MODE (SUBREG_REG (reg
)),
984 regno
= REGNO (SUBREG_REG (reg
)) + offset
;
985 endregno
= regno
+ subreg_nregs (reg
);
989 if (!REG_P (reg
) || REGNO (reg
) >= FIRST_PSEUDO_REGISTER
)
992 regno
= REGNO (reg
) + offset
;
993 endregno
= end_hard_regno (mode
, regno
);
996 for (i
= regno
; i
< endregno
; i
++)
997 SET_REGNO_REG_SET ((regset
) data
, i
);
1000 /* Walk X and record all referenced registers in REFERENCED_REGS. */
1002 mark_referenced_regs (rtx
*loc
, refmarker_fn
*mark
, void *arg
)
1004 enum rtx_code code
= GET_CODE (*loc
);
1009 mark_referenced_regs (&SET_SRC (*loc
), mark
, arg
);
1010 if (code
== SET
|| code
== CLOBBER
)
1012 loc
= &SET_DEST (*loc
);
1013 code
= GET_CODE (*loc
);
1014 if ((code
== REG
&& REGNO (*loc
) < FIRST_PSEUDO_REGISTER
)
1016 || (code
== SUBREG
&& REG_P (SUBREG_REG (*loc
))
1017 && REGNO (SUBREG_REG (*loc
)) < FIRST_PSEUDO_REGISTER
1018 /* If we're setting only part of a multi-word register,
1019 we shall mark it as referenced, because the words
1020 that are not being set should be restored. */
1021 && !read_modify_subreg_p (*loc
)))
1024 if (code
== MEM
|| code
== SUBREG
)
1026 loc
= &XEXP (*loc
, 0);
1027 code
= GET_CODE (*loc
);
1032 int regno
= REGNO (*loc
);
1033 int hardregno
= (regno
< FIRST_PSEUDO_REGISTER
? regno
1034 : reg_renumber
[regno
]);
1037 mark (loc
, GET_MODE (*loc
), hardregno
, arg
);
1039 /* ??? Will we ever end up with an equiv expression in a debug
1040 insn, that would have required restoring a reg, or will
1041 reload take care of it for us? */
1043 /* If this is a pseudo that did not get a hard register, scan its
1044 memory location, since it might involve the use of another
1045 register, which might be saved. */
1046 else if (reg_equiv_mem (regno
) != 0)
1047 mark_referenced_regs (&XEXP (reg_equiv_mem (regno
), 0), mark
, arg
);
1048 else if (reg_equiv_address (regno
) != 0)
1049 mark_referenced_regs (®_equiv_address (regno
), mark
, arg
);
1053 fmt
= GET_RTX_FORMAT (code
);
1054 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
1057 mark_referenced_regs (&XEXP (*loc
, i
), mark
, arg
);
1058 else if (fmt
[i
] == 'E')
1059 for (j
= XVECLEN (*loc
, i
) - 1; j
>= 0; j
--)
1060 mark_referenced_regs (&XVECEXP (*loc
, i
, j
), mark
, arg
);
1064 /* Parameter function for mark_referenced_regs() that adds registers
1065 present in the insn and in equivalent mems and addresses to
1069 mark_reg_as_referenced (rtx
*loc ATTRIBUTE_UNUSED
,
1072 void *arg ATTRIBUTE_UNUSED
)
1074 add_to_hard_reg_set (&referenced_regs
, mode
, hardregno
);
1077 /* Parameter function for mark_referenced_regs() that replaces
1078 registers referenced in a debug_insn that would have been restored,
1079 should it be a non-debug_insn, with their save locations. */
1082 replace_reg_with_saved_mem (rtx
*loc
,
1087 unsigned int i
, nregs
= hard_regno_nregs (regno
, mode
);
1089 machine_mode
*save_mode
= (machine_mode
*)arg
;
1091 for (i
= 0; i
< nregs
; i
++)
1092 if (TEST_HARD_REG_BIT (hard_regs_saved
, regno
+ i
))
1095 /* If none of the registers in the range would need restoring, we're
1101 if (!TEST_HARD_REG_BIT (hard_regs_saved
, regno
+ i
))
1105 && regno_save_mem
[regno
][nregs
])
1107 mem
= copy_rtx (regno_save_mem
[regno
][nregs
]);
1109 if (nregs
== hard_regno_nregs (regno
, save_mode
[regno
]))
1110 mem
= adjust_address_nv (mem
, save_mode
[regno
], 0);
1112 if (GET_MODE (mem
) != mode
)
1114 /* This is gen_lowpart_if_possible(), but without validating
1115 the newly-formed address. */
1116 poly_int64 offset
= byte_lowpart_offset (mode
, GET_MODE (mem
));
1117 mem
= adjust_address_nv (mem
, mode
, offset
);
1122 mem
= gen_rtx_CONCATN (mode
, rtvec_alloc (nregs
));
1123 for (i
= 0; i
< nregs
; i
++)
1124 if (TEST_HARD_REG_BIT (hard_regs_saved
, regno
+ i
))
1126 gcc_assert (regno_save_mem
[regno
+ i
][1]);
1127 XVECEXP (mem
, 0, i
) = copy_rtx (regno_save_mem
[regno
+ i
][1]);
1131 machine_mode smode
= save_mode
[regno
];
1132 gcc_assert (smode
!= VOIDmode
);
1133 if (hard_regno_nregs (regno
, smode
) > 1)
1134 smode
= mode_for_size (exact_div (GET_MODE_BITSIZE (mode
),
1136 GET_MODE_CLASS (mode
), 0).require ();
1137 XVECEXP (mem
, 0, i
) = gen_rtx_REG (smode
, regno
+ i
);
1141 gcc_assert (GET_MODE (mem
) == mode
);
1146 /* Insert a sequence of insns to restore. Place these insns in front of
1147 CHAIN if BEFORE_P is nonzero, behind the insn otherwise. MAXRESTORE is
1148 the maximum number of registers which should be restored during this call.
1149 It should never be less than 1 since we only work with entire registers.
1151 Note that we have verified in init_caller_save that we can do this
1152 with a simple SET, so use it. Set INSN_CODE to what we save there
1153 since the address might not be valid so the insn might not be recognized.
1154 These insns will be reloaded and have register elimination done by
1155 find_reload, so we need not worry about that here.
1157 Return the extra number of registers saved. */
1160 insert_restore (class insn_chain
*chain
, int before_p
, int regno
,
1161 int maxrestore
, machine_mode
*save_mode
)
1166 unsigned int numregs
= 0;
1167 class insn_chain
*new_chain
;
1170 /* A common failure mode if register status is not correct in the
1171 RTL is for this routine to be called with a REGNO we didn't
1172 expect to save. That will cause us to write an insn with a (nil)
1173 SET_DEST or SET_SRC. Instead of doing so and causing a crash
1174 later, check for this common case here instead. This will remove
1175 one step in debugging such problems. */
1176 gcc_assert (regno_save_mem
[regno
][1]);
1178 /* Get the pattern to emit and update our status.
1180 See if we can restore `maxrestore' registers at once. Work
1181 backwards to the single register case. */
1182 for (i
= maxrestore
; i
> 0; i
--)
1187 if (regno_save_mem
[regno
][i
] == 0)
1190 for (j
= 0; j
< i
; j
++)
1191 if (! TEST_HARD_REG_BIT (hard_regs_saved
, regno
+ j
))
1196 /* Must do this one restore at a time. */
1204 mem
= regno_save_mem
[regno
][numregs
];
1205 if (save_mode
[regno
] != VOIDmode
1206 && save_mode
[regno
] != GET_MODE (mem
)
1207 && numregs
== hard_regno_nregs (regno
, save_mode
[regno
])
1208 /* Check that insn to restore REGNO in save_mode[regno] is
1210 && reg_save_code (regno
, save_mode
[regno
]) >= 0)
1211 mem
= adjust_address_nv (mem
, save_mode
[regno
], 0);
1213 mem
= copy_rtx (mem
);
1215 /* Verify that the alignment of spill space is equal to or greater
1217 gcc_assert (MIN (MAX_SUPPORTED_STACK_ALIGNMENT
,
1218 GET_MODE_ALIGNMENT (GET_MODE (mem
))) <= MEM_ALIGN (mem
));
1220 pat
= gen_rtx_SET (gen_rtx_REG (GET_MODE (mem
), regno
), mem
);
1221 code
= reg_restore_code (regno
, GET_MODE (mem
));
1222 new_chain
= insert_one_insn (chain
, before_p
, code
, pat
);
1224 /* Clear status for all registers we restored. */
1225 for (k
= 0; k
< i
; k
++)
1227 CLEAR_HARD_REG_BIT (hard_regs_saved
, regno
+ k
);
1228 SET_REGNO_REG_SET (&new_chain
->dead_or_set
, regno
+ k
);
1232 /* Tell our callers how many extra registers we saved/restored. */
1236 /* Like insert_restore above, but save registers instead. */
1239 insert_save (class insn_chain
*chain
, int regno
,
1240 HARD_REG_SET
*to_save
, machine_mode
*save_mode
)
1246 unsigned int numregs
= 0;
1247 class insn_chain
*new_chain
;
1250 /* A common failure mode if register status is not correct in the
1251 RTL is for this routine to be called with a REGNO we didn't
1252 expect to save. That will cause us to write an insn with a (nil)
1253 SET_DEST or SET_SRC. Instead of doing so and causing a crash
1254 later, check for this common case here. This will remove one
1255 step in debugging such problems. */
1256 gcc_assert (regno_save_mem
[regno
][1]);
1258 /* Get the pattern to emit and update our status.
1260 See if we can save several registers with a single instruction.
1261 Work backwards to the single register case. */
1262 for (i
= MOVE_MAX_WORDS
; i
> 0; i
--)
1266 if (regno_save_mem
[regno
][i
] == 0)
1269 for (j
= 0; j
< i
; j
++)
1270 if (! TEST_HARD_REG_BIT (*to_save
, regno
+ j
))
1275 /* Must do this one save at a time. */
1283 mem
= regno_save_mem
[regno
][numregs
];
1284 if (save_mode
[regno
] != VOIDmode
1285 && save_mode
[regno
] != GET_MODE (mem
)
1286 && numregs
== hard_regno_nregs (regno
, save_mode
[regno
])
1287 /* Check that insn to save REGNO in save_mode[regno] is
1289 && reg_save_code (regno
, save_mode
[regno
]) >= 0)
1290 mem
= adjust_address_nv (mem
, save_mode
[regno
], 0);
1292 mem
= copy_rtx (mem
);
1294 /* Verify that the alignment of spill space is equal to or greater
1296 gcc_assert (MIN (MAX_SUPPORTED_STACK_ALIGNMENT
,
1297 GET_MODE_ALIGNMENT (GET_MODE (mem
))) <= MEM_ALIGN (mem
));
1299 pat
= gen_rtx_SET (mem
, gen_rtx_REG (GET_MODE (mem
), regno
));
1300 code
= reg_save_code (regno
, GET_MODE (mem
));
1301 new_chain
= insert_one_insn (chain
, 1, code
, pat
);
1303 /* Set hard_regs_saved and dead_or_set for all the registers we saved. */
1304 for (k
= 0; k
< numregs
; k
++)
1306 SET_HARD_REG_BIT (hard_regs_saved
, regno
+ k
);
1307 SET_REGNO_REG_SET (&new_chain
->dead_or_set
, regno
+ k
);
1311 /* Tell our callers how many extra registers we saved/restored. */
1315 /* A note_uses callback used by insert_one_insn. Add the hard-register
1316 equivalent of each REG to regset DATA. */
1319 add_used_regs (rtx
*loc
, void *data
)
1321 subrtx_iterator::array_type array
;
1322 FOR_EACH_SUBRTX (iter
, array
, *loc
, NONCONST
)
1324 const_rtx x
= *iter
;
1327 unsigned int regno
= REGNO (x
);
1328 if (HARD_REGISTER_NUM_P (regno
))
1329 bitmap_set_range ((regset
) data
, regno
, REG_NREGS (x
));
1331 gcc_checking_assert (reg_renumber
[regno
] < 0);
1336 /* Emit a new caller-save insn and set the code. */
1337 static class insn_chain
*
1338 insert_one_insn (class insn_chain
*chain
, int before_p
, int code
, rtx pat
)
1340 rtx_insn
*insn
= chain
->insn
;
1341 class insn_chain
*new_chain
;
1343 new_chain
= new_insn_chain ();
1348 new_chain
->prev
= chain
->prev
;
1349 if (new_chain
->prev
!= 0)
1350 new_chain
->prev
->next
= new_chain
;
1352 reload_insn_chain
= new_chain
;
1354 chain
->prev
= new_chain
;
1355 new_chain
->next
= chain
;
1356 new_chain
->insn
= emit_insn_before (pat
, insn
);
1357 /* ??? It would be nice if we could exclude the already / still saved
1358 registers from the live sets. */
1359 COPY_REG_SET (&new_chain
->live_throughout
, &chain
->live_throughout
);
1360 note_uses (&PATTERN (chain
->insn
), add_used_regs
,
1361 &new_chain
->live_throughout
);
1362 /* If CHAIN->INSN is a call, then the registers which contain
1363 the arguments to the function are live in the new insn. */
1364 if (CALL_P (chain
->insn
))
1365 for (link
= CALL_INSN_FUNCTION_USAGE (chain
->insn
);
1367 link
= XEXP (link
, 1))
1368 note_uses (&XEXP (link
, 0), add_used_regs
,
1369 &new_chain
->live_throughout
);
1371 CLEAR_REG_SET (&new_chain
->dead_or_set
);
1372 if (chain
->insn
== BB_HEAD (BASIC_BLOCK_FOR_FN (cfun
, chain
->block
)))
1373 BB_HEAD (BASIC_BLOCK_FOR_FN (cfun
, chain
->block
)) = new_chain
->insn
;
1377 new_chain
->next
= chain
->next
;
1378 if (new_chain
->next
!= 0)
1379 new_chain
->next
->prev
= new_chain
;
1380 chain
->next
= new_chain
;
1381 new_chain
->prev
= chain
;
1382 new_chain
->insn
= emit_insn_after (pat
, insn
);
1383 /* ??? It would be nice if we could exclude the already / still saved
1384 registers from the live sets, and observe REG_UNUSED notes. */
1385 COPY_REG_SET (&new_chain
->live_throughout
, &chain
->live_throughout
);
1386 /* Registers that are set in CHAIN->INSN live in the new insn.
1387 (Unless there is a REG_UNUSED note for them, but we don't
1388 look for them here.) */
1389 note_stores (chain
->insn
, add_stored_regs
, &new_chain
->live_throughout
);
1390 CLEAR_REG_SET (&new_chain
->dead_or_set
);
1391 if (chain
->insn
== BB_END (BASIC_BLOCK_FOR_FN (cfun
, chain
->block
)))
1392 BB_END (BASIC_BLOCK_FOR_FN (cfun
, chain
->block
)) = new_chain
->insn
;
1394 new_chain
->block
= chain
->block
;
1395 new_chain
->is_caller_save_insn
= 1;
1397 INSN_CODE (new_chain
->insn
) = code
;
1400 #include "gt-caller-save.h"