]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/caller-save.cc
PR middle-end/105604 - ICE: in tree_to_shwi with vla in struct and sprintf
[thirdparty/gcc.git] / gcc / caller-save.cc
CommitLineData
c5986054 1/* Save and restore call-clobbered registers which are live across a call.
7adcbafe 2 Copyright (C) 1989-2022 Free Software Foundation, Inc.
c5986054 3
1322177d 4This file is part of GCC.
c5986054 5
1322177d
LB
6GCC is free software; you can redistribute it and/or modify it under
7the terms of the GNU General Public License as published by the Free
9dcd6f09 8Software Foundation; either version 3, or (at your option) any later
1322177d 9version.
c5986054 10
1322177d
LB
11GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12WARRANTY; without even the implied warranty of MERCHANTABILITY or
13FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14for more details.
c5986054
RS
15
16You should have received a copy of the GNU General Public License
9dcd6f09
NC
17along with GCC; see the file COPYING3. If not see
18<http://www.gnu.org/licenses/>. */
c5986054
RS
19
20#include "config.h"
670ee920 21#include "system.h"
4977bab6 22#include "coretypes.h"
c7131fb2 23#include "backend.h"
c5986054 24#include "rtl.h"
957060b5
AM
25#include "tree.h"
26#include "predict.h"
c7131fb2 27#include "df.h"
4d0cdd0c 28#include "memmodel.h"
957060b5 29#include "tm_p.h"
c5986054 30#include "insn-config.h"
957060b5
AM
31#include "regs.h"
32#include "emit-rtl.h"
c5986054 33#include "recog.h"
60393bbc 34#include "reload.h"
36566b39 35#include "alias.h"
f6c4ed08 36#include "addresses.h"
7ee2468b 37#include "dumpfile.h"
1cb22a67 38#include "rtl-iter.h"
f939c3e6 39#include "target.h"
5a5a3bc5 40#include "function-abi.h"
c5986054 41
7609e720
BS
42#define MOVE_MAX_WORDS (MOVE_MAX / UNITS_PER_WORD)
43
bcbaaba1
RS
44#define regno_save_mode \
45 (this_target_reload->x_regno_save_mode)
cc14227f
RS
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)
c5986054
RS
50
51/* For each hard register, a place on the stack where it can be saved,
52 if needed. */
53
d329e058 54static rtx
ef0e53ce 55 regno_save_mem[FIRST_PSEUDO_REGISTER][MAX_MOVE_MAX / MIN_UNITS_PER_WORD + 1];
c5986054 56
058e97ec
VM
57/* The number of elements in the subsequent array. */
58static int save_slots_num;
59
60/* Allocated slots so far. */
61static rtx save_slots[FIRST_PSEUDO_REGISTER];
62
c5986054
RS
63/* Set of hard regs currently residing in save area (during insn scan). */
64
65static HARD_REG_SET hard_regs_saved;
66
7609e720 67/* Number of registers currently in hard_regs_saved. */
f95361c8 68
7609e720 69static int n_regs_saved;
f95361c8 70
7609e720
BS
71/* Computed by mark_referenced_regs, all regs referenced in a given
72 insn. */
73static HARD_REG_SET referenced_regs;
c5986054 74
7609e720 75
ef4bddc2 76typedef void refmarker_fn (rtx *loc, machine_mode mode, int hardregno,
b5b8b0ac
AO
77 void *mark_arg);
78
ef4bddc2
RS
79static int reg_save_code (int, machine_mode);
80static int reg_restore_code (int, machine_mode);
058e97ec
VM
81
82struct saved_hard_reg;
83static void initiate_saved_hard_regs (void);
e16b6fd0 84static void new_saved_hard_reg (int, int);
058e97ec
VM
85static void finish_saved_hard_regs (void);
86static int saved_hard_reg_compare_func (const void *, const void *);
87
7bc980e1 88static void mark_set_regs (rtx, const_rtx, void *);
b5b8b0ac
AO
89static void mark_referenced_regs (rtx *, refmarker_fn *mark, void *mark_arg);
90static refmarker_fn mark_reg_as_referenced;
91static refmarker_fn replace_reg_with_saved_mem;
99b1c316 92static int insert_save (class insn_chain *, int, HARD_REG_SET *,
ef4bddc2 93 machine_mode *);
99b1c316 94static int insert_restore (class insn_chain *, int, int, int,
ef4bddc2 95 machine_mode *);
99b1c316 96static class insn_chain *insert_one_insn (class insn_chain *, int, int,
d329e058 97 rtx);
7bc980e1 98static void add_stored_regs (rtx, const_rtx, void *);
058e97ec 99
c5986054 100\f
058e97ec 101
78187f5a
JH
102static GTY(()) rtx savepat;
103static GTY(()) rtx restpat;
104static GTY(()) rtx test_reg;
105static GTY(()) rtx test_mem;
647d790d
DM
106static GTY(()) rtx_insn *saveinsn;
107static GTY(()) rtx_insn *restinsn;
78187f5a
JH
108
109/* Return the INSN_CODE used to save register REG in mode MODE. */
110static int
ef4bddc2 111reg_save_code (int reg, machine_mode mode)
78187f5a
JH
112{
113 bool ok;
114 if (cached_reg_save_code[reg][mode])
115 return cached_reg_save_code[reg][mode];
f939c3e6 116 if (!targetm.hard_regno_mode_ok (reg, mode))
f57e2756 117 {
f939c3e6
RS
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. */
f57e2756
JR
121 gcc_assert (reg < FIRST_PSEUDO_REGISTER);
122 cached_reg_save_code[reg][mode] = -1;
123 cached_reg_restore_code[reg][mode] = -1;
124 return -1;
125 }
78187f5a
JH
126
127 /* Update the register number and modes of the register
128 and memory operand. */
8deccbb7 129 set_mode_and_regno (test_reg, mode, reg);
78187f5a
JH
130 PUT_MODE (test_mem, mode);
131
132 /* Force re-recognition of the modified insns. */
133 INSN_CODE (saveinsn) = -1;
f81e79b5 134 INSN_CODE (restinsn) = -1;
78187f5a
JH
135
136 cached_reg_save_code[reg][mode] = recog_memoized (saveinsn);
137 cached_reg_restore_code[reg][mode] = recog_memoized (restinsn);
138
139 /* Now extract both insns and see if we can meet their
daca1a96
RS
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
142 alternatives. */
78187f5a
JH
143 ok = (cached_reg_save_code[reg][mode] != -1
144 && cached_reg_restore_code[reg][mode] != -1);
145 if (ok)
146 {
147 extract_insn (saveinsn);
daca1a96 148 ok = constrain_operands (1, get_enabled_alternatives (saveinsn));
78187f5a 149 extract_insn (restinsn);
daca1a96 150 ok &= constrain_operands (1, get_enabled_alternatives (restinsn));
78187f5a
JH
151 }
152
153 if (! ok)
154 {
155 cached_reg_save_code[reg][mode] = -1;
156 cached_reg_restore_code[reg][mode] = -1;
157 }
158 gcc_assert (cached_reg_save_code[reg][mode]);
159 return cached_reg_save_code[reg][mode];
160}
161
162/* Return the INSN_CODE used to restore register REG in mode MODE. */
163static int
ef4bddc2 164reg_restore_code (int reg, machine_mode mode)
78187f5a
JH
165{
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];
171}
172\f
c5986054
RS
173/* Initialize for caller-save.
174
175 Look at all the hard registers that are used by a call and for which
e53b6e56 176 reginfo.cc has not already excluded from being used across a call.
c5986054 177
d329e058 178 Ensure that we can find a mode to save the register and that there is a
c5986054
RS
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. */
182
183void
d329e058 184init_caller_save (void)
c5986054 185{
c5986054
RS
186 rtx addr_reg;
187 int offset;
188 rtx address;
f95361c8 189 int i, j;
c5986054 190
dc12b70e
JZ
191 if (caller_save_initialized_p)
192 return;
193
194 caller_save_initialized_p = true;
195
c5986054
RS
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. */
199
200 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
df1f0eef
RS
201 for (j = 1; j <= MOVE_MAX_WORDS; j++)
202 {
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);
206 }
c5986054
RS
207
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.
213
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. */
218
219 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
3dcc68a4
NC
220 if (TEST_HARD_REG_BIT
221 (reg_class_contents
86fc3d06
UW
222 [(int) base_reg_class (regno_save_mode[i][1], ADDR_SPACE_GENERIC,
223 PLUS, CONST_INT)], i))
c5986054
RS
224 break;
225
366de0ce 226 gcc_assert (i < FIRST_PSEUDO_REGISTER);
c5986054 227
38a448ca 228 addr_reg = gen_rtx_REG (Pmode, i);
c5986054
RS
229
230 for (offset = 1 << (HOST_BITS_PER_INT / 2); offset; offset >>= 1)
231 {
4789c0ce 232 address = gen_rtx_PLUS (Pmode, addr_reg, gen_int_mode (offset, Pmode));
c5986054
RS
233
234 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
f95361c8
JL
235 if (regno_save_mode[i][1] != VOIDmode
236 && ! strict_memory_address_p (regno_save_mode[i][1], address))
c5986054
RS
237 break;
238
239 if (i == FIRST_PSEUDO_REGISTER)
240 break;
241 }
242
243 /* If we didn't find a valid address, we must use register indirect. */
244 if (offset == 0)
245 address = addr_reg;
246
247 /* Next we try to form an insn to save and restore the register. We
d329e058 248 see if such an insn is recognized and meets its constraints.
bf1660a6
JL
249
250 To avoid lots of unnecessary RTL allocation, we construct all the RTL
251 once, then modify the memory and register operands in-place. */
252
c3dc5e66 253 test_reg = gen_rtx_REG (word_mode, LAST_VIRTUAL_REGISTER + 1);
5d2446b1 254 test_mem = gen_rtx_MEM (word_mode, address);
f7df4a84
RS
255 savepat = gen_rtx_SET (test_mem, test_reg);
256 restpat = gen_rtx_SET (test_reg, test_mem);
c5986054 257
ed8921dc
RS
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);
0db79a6b 260
787dc842
JH
261 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
262 for (j = 1; j <= MOVE_MAX_WORDS; j++)
78187f5a 263 if (reg_save_code (i,regno_save_mode[i][j]) == -1)
787dc842
JH
264 {
265 regno_save_mode[i][j] = VOIDmode;
266 if (j == 1)
026116ce 267 CLEAR_HARD_REG_BIT (savable_regs, i);
787dc842 268 }
c5986054 269}
058e97ec 270
c5986054 271\f
058e97ec 272
c5986054
RS
273/* Initialize save areas by showing that we haven't allocated any yet. */
274
275void
d329e058 276init_save_areas (void)
c5986054 277{
f95361c8 278 int i, j;
c5986054
RS
279
280 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
7609e720 281 for (j = 1; j <= MOVE_MAX_WORDS; j++)
f95361c8 282 regno_save_mem[i][j] = 0;
058e97ec 283 save_slots_num = 0;
b8698a0f 284
058e97ec
VM
285}
286
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. */
290struct saved_hard_reg
291{
292 /* Order number starting with 0. */
293 int num;
294 /* The hard regno. */
295 int hard_regno;
296 /* Execution frequency of all calls through which given hard
297 register should be saved. */
298 int call_freq;
299 /* Stack slot reserved to save the hard register through calls. */
300 rtx slot;
301 /* True if it is first hard register in the chain of hard registers
302 sharing the same stack slot. */
303 int first_p;
304 /* Order number of the next hard register structure with the same
305 slot in the chain. -1 represents end of the chain. */
306 int next;
307};
308
309/* Map: hard register number to the corresponding structure. */
310static struct saved_hard_reg *hard_reg_map[FIRST_PSEUDO_REGISTER];
311
312/* The number of all structures representing hard registers should be
313 saved, in order words, the number of used elements in the following
314 array. */
315static int saved_regs_num;
316
317/* Pointers to all the structures. Index is the order number of the
318 corresponding structure. */
319static struct saved_hard_reg *all_saved_regs[FIRST_PSEUDO_REGISTER];
320
321/* First called function for work with saved hard registers. */
322static void
323initiate_saved_hard_regs (void)
324{
325 int i;
326
327 saved_regs_num = 0;
328 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
329 hard_reg_map[i] = NULL;
330}
331
332/* Allocate and return new saved hard register with given REGNO and
333 CALL_FREQ. */
e16b6fd0 334static void
058e97ec
VM
335new_saved_hard_reg (int regno, int call_freq)
336{
337 struct saved_hard_reg *saved_reg;
338
339 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;
058e97ec
VM
347}
348
349/* Free memory allocated for the saved hard registers. */
350static void
351finish_saved_hard_regs (void)
352{
353 int i;
354
355 for (i = 0; i < saved_regs_num; i++)
356 free (all_saved_regs[i]);
357}
358
359/* The function is used to sort the saved hard register structures
360 according their frequency. */
361static int
362saved_hard_reg_compare_func (const void *v1p, const void *v2p)
363{
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;
b8698a0f 366
058e97ec
VM
367 if (flag_omit_frame_pointer)
368 {
369 if (p1->call_freq - p2->call_freq != 0)
370 return p1->call_freq - p2->call_freq;
371 }
372 else if (p2->call_freq - p1->call_freq != 0)
373 return p2->call_freq - p1->call_freq;
374
375 return p1->num - p2->num;
c5986054
RS
376}
377
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.
383
058e97ec
VM
384 For IRA we use priority coloring to decrease stack slots needed for
385 saving hard registers through calls. We build conflicts for them
386 to do coloring.
387
f95361c8
JL
388 Future work:
389
390 In the fallback case we should iterate backwards across all possible
d329e058 391 modes for the save, choosing the largest available one instead of
f95361c8
JL
392 falling back to the smallest mode immediately. (eg TF -> DF -> SF).
393
394 We do not try to use "move multiple" instructions that exist
d329e058 395 on some machines (such as the 68k moveml). It could be a win to try
f95361c8 396 and use them when possible. The hard part is doing it in a way that is
d329e058 397 machine independent since they might be saving non-consecutive
f95361c8 398 registers. (imagine caller-saving d0,d1,a0,a1 on the 68k) */
c5986054 399
437a710d 400void
d329e058 401setup_save_areas (void)
c5986054 402{
e90b336f 403 int i, j, k, freq;
f95361c8 404 HARD_REG_SET hard_regs_used;
e90b336f 405 struct saved_hard_reg *saved_reg;
86bf2d46 406 rtx_insn *insn;
99b1c316 407 class insn_chain *chain, *next;
e90b336f
JL
408 unsigned int regno;
409 HARD_REG_SET hard_regs_to_save, used_regs, this_insn_sets;
410 reg_set_iterator rsi;
f95361c8 411
f95361c8 412 CLEAR_HARD_REG_SET (hard_regs_used);
f95361c8 413
e90b336f
JL
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)
058e97ec 419 {
e384e6b5
BS
420 rtx cheap;
421
e90b336f
JL
422 insn = chain->insn;
423 next = chain->next;
424 if (!CALL_P (insn)
425 || find_reg_note (insn, REG_NORETURN, NULL))
426 continue;
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);
5a5a3bc5 430 used_regs = insn_callee_abi (insn).full_reg_clobbers ();
e90b336f
JL
431
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
436 isn't. */
437 CLEAR_HARD_REG_SET (this_insn_sets);
e8448ba5 438 note_stores (insn, mark_set_regs, &this_insn_sets);
e90b336f
JL
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);
442
df1f0eef
RS
443 used_regs &= ~(fixed_reg_set | this_insn_sets);
444 hard_regs_to_save &= used_regs & savable_regs;
e90b336f
JL
445 for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
446 if (TEST_HARD_REG_BIT (hard_regs_to_save, regno))
447 {
448 if (hard_reg_map[regno] != NULL)
449 hard_reg_map[regno]->call_freq += freq;
450 else
e16b6fd0 451 new_saved_hard_reg (regno, freq);
e90b336f
JL
452 SET_HARD_REG_BIT (hard_regs_used, regno);
453 }
e384e6b5
BS
454 cheap = find_reg_note (insn, REG_RETURNED, NULL);
455 if (cheap)
456 cheap = XEXP (cheap, 0);
e90b336f
JL
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)
058e97ec 460 {
e90b336f
JL
461 int r = reg_renumber[regno];
462 int bound;
058e97ec 463
e384e6b5 464 if (r < 0 || regno_reg_rtx[regno] == cheap)
e90b336f 465 continue;
058e97ec 466
ad474626 467 bound = r + hard_regno_nregs (r, PSEUDO_REGNO_MODE (regno));
e90b336f
JL
468 for (; r < bound; r++)
469 if (TEST_HARD_REG_BIT (used_regs, r))
058e97ec 470 {
e90b336f
JL
471 if (hard_reg_map[r] != NULL)
472 hard_reg_map[r]->call_freq += freq;
058e97ec 473 else
e16b6fd0 474 new_saved_hard_reg (r, freq);
e90b336f
JL
475 SET_HARD_REG_BIT (hard_regs_to_save, r);
476 SET_HARD_REG_BIT (hard_regs_used, r);
058e97ec 477 }
e90b336f
JL
478 }
479 }
b8698a0f 480
e90b336f
JL
481 /* If requested, figure out which hard regs can share save slots. */
482 if (optimize && flag_ira_share_save_slots)
483 {
484 rtx slot;
485 char *saved_reg_conflicts;
486 int next_k;
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];
490 int best_slot_num;
491 int prev_save_slots_num;
492 rtx prev_save_slots[FIRST_PSEUDO_REGISTER];
b8698a0f 493
058e97ec
VM
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)
498 {
e384e6b5 499 rtx cheap;
058e97ec
VM
500 call_saved_regs_num = 0;
501 insn = chain->insn;
502 next = chain->next;
481683e1 503 if (!CALL_P (insn)
058e97ec
VM
504 || find_reg_note (insn, REG_NORETURN, NULL))
505 continue;
e384e6b5
BS
506
507 cheap = find_reg_note (insn, REG_RETURNED, NULL);
508 if (cheap)
509 cheap = XEXP (cheap, 0);
510
058e97ec
VM
511 REG_SET_TO_HARD_REG_SET (hard_regs_to_save,
512 &chain->live_throughout);
5a5a3bc5 513 used_regs = insn_callee_abi (insn).full_reg_clobbers ();
058e97ec
VM
514
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
519 isn't. */
520 CLEAR_HARD_REG_SET (this_insn_sets);
e8448ba5 521 note_stores (insn, mark_set_regs, &this_insn_sets);
058e97ec 522 /* Sibcalls are considered to set the return value,
e53b6e56 523 compare df-scan.cc:df_get_call_refs. */
058e97ec
VM
524 if (SIBLING_CALL_P (insn) && crtl->return_rtx)
525 mark_set_regs (crtl->return_rtx, NULL_RTX, &this_insn_sets);
526
df1f0eef
RS
527 used_regs &= ~(fixed_reg_set | this_insn_sets);
528 hard_regs_to_save &= used_regs & savable_regs;
058e97ec
VM
529 for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
530 if (TEST_HARD_REG_BIT (hard_regs_to_save, regno))
531 {
532 gcc_assert (hard_reg_map[regno] != NULL);
533 call_saved_regs[call_saved_regs_num++] = hard_reg_map[regno];
534 }
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)
c5986054 538 {
058e97ec
VM
539 int r = reg_renumber[regno];
540 int bound;
b8698a0f 541
e384e6b5 542 if (r < 0 || regno_reg_rtx[regno] == cheap)
058e97ec
VM
543 continue;
544
ad474626 545 bound = r + hard_regno_nregs (r, PSEUDO_REGNO_MODE (regno));
058e97ec
VM
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];
c5986054 549 }
058e97ec
VM
550 for (i = 0; i < call_saved_regs_num; i++)
551 {
552 saved_reg = call_saved_regs[i];
553 for (j = 0; j < call_saved_regs_num; j++)
554 if (i != j)
555 {
556 saved_reg2 = call_saved_regs[j];
557 saved_reg_conflicts[saved_reg->num * saved_regs_num
558 + saved_reg2->num]
559 = saved_reg_conflicts[saved_reg2->num * saved_regs_num
560 + saved_reg->num]
561 = TRUE;
562 }
563 }
564 }
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
569 iteration. */
570 prev_save_slots_num = save_slots_num;
571 memcpy (prev_save_slots, save_slots, save_slots_num * sizeof (rtx));
572 save_slots_num = 0;
573 /* Allocate stack slots for the saved hard registers. */
574 for (i = 0; i < saved_regs_num; i++)
575 {
576 saved_reg = all_saved_regs[i];
577 regno = saved_reg->hard_regno;
578 for (j = 0; j < i; j++)
579 {
580 saved_reg2 = all_saved_regs[j];
581 if (! saved_reg2->first_p)
582 continue;
583 slot = saved_reg2->slot;
584 for (k = j; k >= 0; k = next_k)
585 {
586 saved_reg3 = all_saved_regs[k];
587 next_k = saved_reg3->next;
588 if (saved_reg_conflicts[saved_reg->num * saved_regs_num
589 + saved_reg3->num])
590 break;
591 }
592 if (k < 0
cf098191
RS
593 && known_le (GET_MODE_SIZE (regno_save_mode[regno][1]),
594 GET_MODE_SIZE (regno_save_mode
595 [saved_reg2->hard_regno][1])))
058e97ec
VM
596 {
597 saved_reg->slot
598 = adjust_address_nv
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);
606 break;
607 }
608 }
609 if (j == i)
610 {
611 saved_reg->first_p = TRUE;
612 for (best_slot_num = -1, j = 0; j < prev_save_slots_num; j++)
613 {
614 slot = prev_save_slots[j];
615 if (slot == NULL_RTX)
616 continue;
cf098191
RS
617 if (known_le (GET_MODE_SIZE (regno_save_mode[regno][1]),
618 GET_MODE_SIZE (GET_MODE (slot)))
058e97ec
VM
619 && best_slot_num < 0)
620 best_slot_num = j;
621 if (GET_MODE (slot) == regno_save_mode[regno][1])
622 break;
623 }
624 if (best_slot_num >= 0)
625 {
626 saved_reg->slot = prev_save_slots[best_slot_num];
627 saved_reg->slot
628 = adjust_address_nv
629 (saved_reg->slot,
630 regno_save_mode[saved_reg->hard_regno][1], 0);
631 if (dump_file != NULL)
632 fprintf (dump_file,
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--;
637 }
638 else
639 {
640 saved_reg->slot
641 = assign_stack_local_1
642 (regno_save_mode[regno][1],
80a832cd
JJ
643 GET_MODE_SIZE (regno_save_mode[regno][1]), 0,
644 ASLK_REDUCE_ALIGN);
058e97ec
VM
645 if (dump_file != NULL)
646 fprintf (dump_file, "%d uses a new slot\n", regno);
647 }
648 regno_save_mem[regno][1] = saved_reg->slot;
649 save_slots[save_slots_num++] = saved_reg->slot;
650 }
651 }
652 free (saved_reg_conflicts);
653 finish_saved_hard_regs ();
654 }
655 else
656 {
e90b336f
JL
657 /* We are not sharing slots.
658
659 Run through all the call-used hard-registers and allocate
660 space for each in the caller-save area. Try to allocate space
058e97ec 661 in a manner which allows multi-register saves/restores to be done. */
b8698a0f 662
058e97ec
VM
663 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
664 for (j = MOVE_MAX_WORDS; j > 0; j--)
665 {
666 int do_save = 1;
b8698a0f 667
058e97ec
VM
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)
671 continue;
b8698a0f 672
058e97ec
VM
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])
676 {
677 do_save = 0;
678 break;
679 }
680 if (! do_save)
681 continue;
b8698a0f 682
058e97ec
VM
683 for (k = 0; k < j; k++)
684 if (! TEST_HARD_REG_BIT (hard_regs_used, i + k))
685 {
686 do_save = 0;
687 break;
688 }
689 if (! do_save)
690 continue;
b8698a0f 691
058e97ec
VM
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. */
699 regno_save_mem[i][j]
700 = assign_stack_local_1 (regno_save_mode[i][j],
701 GET_MODE_SIZE (regno_save_mode[i][j]),
80a832cd 702 0, ASLK_REDUCE_ALIGN);
b8698a0f 703
058e97ec
VM
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],
711 k * UNITS_PER_WORD);
712 }
713 }
3bdf5ad1
RK
714
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)
ba4828e0 720 set_mem_alias_set (regno_save_mem[i][j], get_frame_alias_set ());
c5986054 721}
058e97ec 722
c5986054 723\f
058e97ec 724
437a710d 725/* Find the places where hard regs are live across calls and save them. */
3bdf5ad1 726
c5986054 727void
d329e058 728save_call_clobbered_regs (void)
c5986054 729{
99b1c316 730 class insn_chain *chain, *next, *last = NULL;
ef4bddc2 731 machine_mode save_mode [FIRST_PSEUDO_REGISTER];
7609e720 732
e30edd6c
R
733 /* Computed in mark_set_regs, holds all registers set by the current
734 instruction. */
735 HARD_REG_SET this_insn_sets;
736
7609e720
BS
737 CLEAR_HARD_REG_SET (hard_regs_saved);
738 n_regs_saved = 0;
c5986054 739
7609e720 740 for (chain = reload_insn_chain; chain != 0; chain = next)
c5986054 741 {
5d86f5f9 742 rtx_insn *insn = chain->insn;
7609e720
BS
743 enum rtx_code code = GET_CODE (insn);
744
745 next = chain->next;
746
366de0ce 747 gcc_assert (!chain->is_caller_save_insn);
7609e720 748
b5b8b0ac 749 if (NONDEBUG_INSN_P (insn))
c5986054 750 {
7609e720
BS
751 /* If some registers have been saved, see if INSN references
752 any of them. We must restore them before the insn if so. */
c5986054 753
7609e720 754 if (n_regs_saved)
c5986054 755 {
7609e720 756 int regno;
14292418 757 HARD_REG_SET this_insn_sets;
7609e720
BS
758
759 if (code == JUMP_INSN)
760 /* Restore all registers if this is a JUMP_INSN. */
6576d245 761 referenced_regs = hard_regs_saved;
0e6362d9 762 else
0887bd4b 763 {
7609e720 764 CLEAR_HARD_REG_SET (referenced_regs);
b5b8b0ac
AO
765 mark_referenced_regs (&PATTERN (insn),
766 mark_reg_as_referenced, NULL);
dc333d8f 767 referenced_regs &= hard_regs_saved;
0887bd4b 768 }
c5986054 769
7609e720
BS
770 for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
771 if (TEST_HARD_REG_BIT (referenced_regs, regno))
14292418
BS
772 regno += insert_restore (chain, 1, regno, MOVE_MAX_WORDS,
773 save_mode);
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
779 afterwards. */
780 CLEAR_HARD_REG_SET (this_insn_sets);
e8448ba5 781 note_stores (insn, mark_set_regs, &this_insn_sets);
d15e5131 782 hard_regs_saved &= ~this_insn_sets;
c5986054
RS
783 }
784
ed765125
PB
785 if (code == CALL_INSN
786 && ! SIBLING_CALL_P (insn)
787 && ! find_reg_note (insn, REG_NORETURN, NULL))
7609e720 788 {
3cd8c58a 789 unsigned regno;
7609e720 790 HARD_REG_SET hard_regs_to_save;
a2041967 791 reg_set_iterator rsi;
e384e6b5
BS
792 rtx cheap;
793
794 cheap = find_reg_note (insn, REG_RETURNED, NULL);
795 if (cheap)
796 cheap = XEXP (cheap, 0);
7609e720
BS
797
798 /* Use the register life information in CHAIN to compute which
285f3cf0
R
799 regs are live during the call. */
800 REG_SET_TO_HARD_REG_SET (hard_regs_to_save,
239a0f5b 801 &chain->live_throughout);
f63d1bf7 802 /* Save hard registers always in the widest mode available. */
787dc842
JH
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];
806 else
807 save_mode [regno] = VOIDmode;
808
f5143c46 809 /* Look through all live pseudos, mark their hard registers
787dc842
JH
810 and choose proper mode for saving. */
811 EXECUTE_IF_SET_IN_REG_SET
a2041967
KH
812 (&chain->live_throughout, FIRST_PSEUDO_REGISTER, regno, rsi)
813 {
814 int r = reg_renumber[regno];
815 int nregs;
ef4bddc2 816 machine_mode mode;
a2041967 817
e384e6b5 818 if (r < 0 || regno_reg_rtx[regno] == cheap)
058e97ec 819 continue;
ad474626 820 nregs = hard_regno_nregs (r, PSEUDO_REGNO_MODE (regno));
a2041967
KH
821 mode = HARD_REGNO_CALLER_SAVE_MODE
822 (r, nregs, PSEUDO_REGNO_MODE (regno));
bd4288c0 823 if (partial_subreg_p (save_mode[r], mode))
a2041967
KH
824 save_mode[r] = mode;
825 while (nregs-- > 0)
826 SET_HARD_REG_BIT (hard_regs_to_save, r + nregs);
827 }
7609e720
BS
828
829 /* Record all registers set in this call insn. These don't need
285f3cf0
R
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. */
7609e720 833 CLEAR_HARD_REG_SET (this_insn_sets);
e8448ba5 834 note_stores (insn, mark_set_regs, &this_insn_sets);
7609e720
BS
835
836 /* Compute which hard regs must be saved before this call. */
7392e5d8 837 function_abi callee_abi = insn_callee_abi (insn);
df1f0eef 838 hard_regs_to_save &= ~(fixed_reg_set
d15e5131
RS
839 | this_insn_sets
840 | hard_regs_saved);
df1f0eef 841 hard_regs_to_save &= savable_regs;
7392e5d8 842 hard_regs_to_save &= callee_abi.full_reg_clobbers ();
7609e720 843
7609e720
BS
844 for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
845 if (TEST_HARD_REG_BIT (hard_regs_to_save, regno))
8fc0c8fa
AS
846 regno += insert_save (chain, regno,
847 &hard_regs_to_save, save_mode);
7609e720
BS
848
849 /* Must recompute n_regs_saved. */
850 n_regs_saved = 0;
851 for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
852 if (TEST_HARD_REG_BIT (hard_regs_saved, regno))
853 n_regs_saved++;
e384e6b5
BS
854
855 if (cheap
856 && HARD_REGISTER_P (cheap)
7392e5d8
RS
857 && callee_abi.clobbers_reg_p (GET_MODE (cheap),
858 REGNO (cheap)))
e384e6b5 859 {
1d2944a3
BS
860 rtx dest, newpat;
861 rtx pat = PATTERN (insn);
862 if (GET_CODE (pat) == PARALLEL)
863 pat = XVECEXP (pat, 0, 0);
864 dest = SET_DEST (pat);
54bddf1d
IE
865 /* For multiple return values dest is PARALLEL.
866 Currently we handle only single return value case. */
867 if (REG_P (dest))
868 {
f7df4a84 869 newpat = gen_rtx_SET (cheap, copy_rtx (dest));
54bddf1d
IE
870 chain = insert_one_insn (chain, 0, -1, newpat);
871 }
e384e6b5 872 }
7609e720 873 }
169e464e 874 last = chain;
7609e720 875 }
b5b8b0ac
AO
876 else if (DEBUG_INSN_P (insn) && n_regs_saved)
877 mark_referenced_regs (&PATTERN (insn),
878 replace_reg_with_saved_mem,
879 save_mode);
c5986054 880
058e97ec 881 if (chain->next == 0 || chain->next->block != chain->block)
7609e720
BS
882 {
883 int regno;
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. */
887
49b48605
JJ
888 if (n_regs_saved
889 && DEBUG_INSN_P (insn)
890 && last
891 && last->block == chain->block)
169e464e 892 {
44b9179f 893 rtx_insn *ins, *prev;
169e464e
JJ
894 basic_block bb = BLOCK_FOR_INSN (insn);
895
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)
901 {
902 prev = PREV_INSN (ins);
903 if (NOTE_P (ins))
904 {
0f82e5c9
DM
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;
169e464e 910 if (NEXT_INSN (ins))
0f82e5c9 911 SET_PREV_INSN (NEXT_INSN (ins)) = ins;
169e464e 912 if (BB_END (bb) == insn)
1130d5e3 913 BB_END (bb) = ins;
169e464e
JJ
914 }
915 else
916 gcc_assert (DEBUG_INSN_P (ins));
917 }
918 }
919 last = NULL;
920
7609e720
BS
921 if (n_regs_saved)
922 for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
923 if (TEST_HARD_REG_BIT (hard_regs_saved, regno))
4b4bf941 924 regno += insert_restore (chain, JUMP_P (insn),
787dc842 925 regno, MOVE_MAX_WORDS, save_mode);
7609e720 926 }
d329e058 927 }
c5986054
RS
928}
929
e30edd6c
R
930/* Here from note_stores, or directly from save_call_clobbered_regs, when
931 an insn stores a value in a register.
7609e720 932 Set the proper bit or bits in this_insn_sets. All pseudos that have
c5986054
RS
933 been assigned hard regs have had their register number changed already,
934 so we can ignore pseudos. */
c5986054 935static void
7bc980e1 936mark_set_regs (rtx reg, const_rtx setter ATTRIBUTE_UNUSED, void *data)
c5986054 937{
b3694847 938 int regno, endregno, i;
f883e0a7 939 HARD_REG_SET *this_insn_sets = (HARD_REG_SET *) data;
c5986054
RS
940
941 if (GET_CODE (reg) == SUBREG)
942 {
ddef6bc7 943 rtx inner = SUBREG_REG (reg);
f8cfc6aa 944 if (!REG_P (inner) || REGNO (inner) >= FIRST_PSEUDO_REGISTER)
ddef6bc7 945 return;
6f9e3578 946 regno = subreg_regno (reg);
f1f4e530 947 endregno = regno + subreg_nregs (reg);
ddef6bc7 948 }
f8cfc6aa 949 else if (REG_P (reg)
ddef6bc7 950 && REGNO (reg) < FIRST_PSEUDO_REGISTER)
f1f4e530
JM
951 {
952 regno = REGNO (reg);
72d19505 953 endregno = END_REGNO (reg);
f1f4e530 954 }
ddef6bc7 955 else
c5986054
RS
956 return;
957
c5986054 958 for (i = regno; i < endregno; i++)
e30edd6c 959 SET_HARD_REG_BIT (*this_insn_sets, i);
c5986054
RS
960}
961
285f3cf0
R
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. */
966static void
7bc980e1 967add_stored_regs (rtx reg, const_rtx setter, void *data)
285f3cf0 968{
b3694847 969 int regno, endregno, i;
ef4bddc2 970 machine_mode mode = GET_MODE (reg);
ddef6bc7 971 int offset = 0;
285f3cf0
R
972
973 if (GET_CODE (setter) == CLOBBER)
974 return;
975
a446b4e8
JM
976 if (GET_CODE (reg) == SUBREG
977 && REG_P (SUBREG_REG (reg))
978 && REGNO (SUBREG_REG (reg)) < FIRST_PSEUDO_REGISTER)
285f3cf0 979 {
ddef6bc7
JJ
980 offset = subreg_regno_offset (REGNO (SUBREG_REG (reg)),
981 GET_MODE (SUBREG_REG (reg)),
982 SUBREG_BYTE (reg),
983 GET_MODE (reg));
a446b4e8 984 regno = REGNO (SUBREG_REG (reg)) + offset;
f1f4e530 985 endregno = regno + subreg_nregs (reg);
285f3cf0 986 }
f1f4e530
JM
987 else
988 {
989 if (!REG_P (reg) || REGNO (reg) >= FIRST_PSEUDO_REGISTER)
990 return;
285f3cf0 991
f1f4e530 992 regno = REGNO (reg) + offset;
09e18274 993 endregno = end_hard_regno (mode, regno);
f1f4e530 994 }
285f3cf0
R
995
996 for (i = regno; i < endregno; i++)
997 SET_REGNO_REG_SET ((regset) data, i);
998}
999
7609e720 1000/* Walk X and record all referenced registers in REFERENCED_REGS. */
c5986054 1001static void
b5b8b0ac 1002mark_referenced_regs (rtx *loc, refmarker_fn *mark, void *arg)
c5986054 1003{
b5b8b0ac 1004 enum rtx_code code = GET_CODE (*loc);
6f7d635c 1005 const char *fmt;
c5986054
RS
1006 int i, j;
1007
7609e720 1008 if (code == SET)
b5b8b0ac 1009 mark_referenced_regs (&SET_SRC (*loc), mark, arg);
7609e720
BS
1010 if (code == SET || code == CLOBBER)
1011 {
b5b8b0ac
AO
1012 loc = &SET_DEST (*loc);
1013 code = GET_CODE (*loc);
1014 if ((code == REG && REGNO (*loc) < FIRST_PSEUDO_REGISTER)
bd1cd0d0 1015 || code == PC
b5b8b0ac
AO
1016 || (code == SUBREG && REG_P (SUBREG_REG (*loc))
1017 && REGNO (SUBREG_REG (*loc)) < FIRST_PSEUDO_REGISTER
2696f6a4
AO
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. */
9eaf97d6 1021 && !read_modify_subreg_p (*loc)))
7609e720
BS
1022 return;
1023 }
1024 if (code == MEM || code == SUBREG)
1025 {
b5b8b0ac
AO
1026 loc = &XEXP (*loc, 0);
1027 code = GET_CODE (*loc);
7609e720 1028 }
f95361c8 1029
c5986054
RS
1030 if (code == REG)
1031 {
b5b8b0ac 1032 int regno = REGNO (*loc);
7609e720
BS
1033 int hardregno = (regno < FIRST_PSEUDO_REGISTER ? regno
1034 : reg_renumber[regno]);
c5986054 1035
7609e720 1036 if (hardregno >= 0)
b5b8b0ac
AO
1037 mark (loc, GET_MODE (*loc), hardregno, arg);
1038 else if (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? */
1042 return;
7609e720
BS
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. */
f2034d06
JL
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 (&reg_equiv_address (regno), mark, arg);
c5986054
RS
1050 return;
1051 }
7609e720 1052
c5986054
RS
1053 fmt = GET_RTX_FORMAT (code);
1054 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1055 {
1056 if (fmt[i] == 'e')
b5b8b0ac 1057 mark_referenced_regs (&XEXP (*loc, i), mark, arg);
c5986054 1058 else if (fmt[i] == 'E')
b5b8b0ac
AO
1059 for (j = XVECLEN (*loc, i) - 1; j >= 0; j--)
1060 mark_referenced_regs (&XVECEXP (*loc, i, j), mark, arg);
1061 }
1062}
1063
1064/* Parameter function for mark_referenced_regs() that adds registers
1065 present in the insn and in equivalent mems and addresses to
1066 referenced_regs. */
1067
1068static void
1069mark_reg_as_referenced (rtx *loc ATTRIBUTE_UNUSED,
ef4bddc2 1070 machine_mode mode,
b5b8b0ac
AO
1071 int hardregno,
1072 void *arg ATTRIBUTE_UNUSED)
1073{
1074 add_to_hard_reg_set (&referenced_regs, mode, hardregno);
1075}
1076
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. */
1080
1081static void
1082replace_reg_with_saved_mem (rtx *loc,
ef4bddc2 1083 machine_mode mode,
b5b8b0ac
AO
1084 int regno,
1085 void *arg)
1086{
ad474626 1087 unsigned int i, nregs = hard_regno_nregs (regno, mode);
b5b8b0ac 1088 rtx mem;
ef4bddc2 1089 machine_mode *save_mode = (machine_mode *)arg;
b5b8b0ac
AO
1090
1091 for (i = 0; i < nregs; i++)
1092 if (TEST_HARD_REG_BIT (hard_regs_saved, regno + i))
1093 break;
1094
1095 /* If none of the registers in the range would need restoring, we're
1096 all set. */
1097 if (i == nregs)
1098 return;
1099
1100 while (++i < nregs)
1101 if (!TEST_HARD_REG_BIT (hard_regs_saved, regno + i))
1102 break;
1103
1104 if (i == nregs
1105 && regno_save_mem[regno][nregs])
1106 {
1107 mem = copy_rtx (regno_save_mem[regno][nregs]);
1108
ad474626 1109 if (nregs == hard_regno_nregs (regno, save_mode[regno]))
b5b8b0ac
AO
1110 mem = adjust_address_nv (mem, save_mode[regno], 0);
1111
1112 if (GET_MODE (mem) != mode)
1113 {
1114 /* This is gen_lowpart_if_possible(), but without validating
1115 the newly-formed address. */
91914e56 1116 poly_int64 offset = byte_lowpart_offset (mode, GET_MODE (mem));
b5b8b0ac
AO
1117 mem = adjust_address_nv (mem, mode, offset);
1118 }
c5986054 1119 }
b5b8b0ac
AO
1120 else
1121 {
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))
1125 {
1126 gcc_assert (regno_save_mem[regno + i][1]);
1127 XVECEXP (mem, 0, i) = copy_rtx (regno_save_mem[regno + i][1]);
1128 }
1129 else
1130 {
ef4bddc2 1131 machine_mode smode = save_mode[regno];
6393e9d6 1132 gcc_assert (smode != VOIDmode);
ad474626 1133 if (hard_regno_nregs (regno, smode) > 1)
69a35085
RS
1134 smode = mode_for_size (exact_div (GET_MODE_BITSIZE (mode),
1135 nregs),
61b2290a 1136 GET_MODE_CLASS (mode), 0).require ();
6393e9d6 1137 XVECEXP (mem, 0, i) = gen_rtx_REG (smode, regno + i);
b5b8b0ac
AO
1138 }
1139 }
1140
1141 gcc_assert (GET_MODE (mem) == mode);
1142 *loc = mem;
c5986054 1143}
b5b8b0ac 1144
c5986054 1145\f
7609e720
BS
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.
c5986054
RS
1150
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
f95361c8 1155 find_reload, so we need not worry about that here.
c5986054 1156
f95361c8
JL
1157 Return the extra number of registers saved. */
1158
1159static int
99b1c316 1160insert_restore (class insn_chain *chain, int before_p, int regno,
ef4bddc2 1161 int maxrestore, machine_mode *save_mode)
c5986054 1162{
285f3cf0 1163 int i, k;
aefdd5ab 1164 rtx pat = NULL_RTX;
830a47ec 1165 int code;
787dc842 1166 unsigned int numregs = 0;
99b1c316 1167 class insn_chain *new_chain;
787dc842 1168 rtx mem;
c5986054 1169
41806d92
NS
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. */
366de0ce 1176 gcc_assert (regno_save_mem[regno][1]);
09835ed2 1177
7609e720 1178 /* Get the pattern to emit and update our status.
4554e20d 1179
7609e720 1180 See if we can restore `maxrestore' registers at once. Work
4554e20d
JL
1181 backwards to the single register case. */
1182 for (i = maxrestore; i > 0; i--)
c5986054 1183 {
285f3cf0 1184 int j;
7609e720
BS
1185 int ok = 1;
1186
1187 if (regno_save_mem[regno][i] == 0)
4554e20d
JL
1188 continue;
1189
7609e720
BS
1190 for (j = 0; j < i; j++)
1191 if (! TEST_HARD_REG_BIT (hard_regs_saved, regno + j))
1192 {
1193 ok = 0;
1194 break;
1195 }
f9da5064 1196 /* Must do this one restore at a time. */
4554e20d
JL
1197 if (! ok)
1198 continue;
7609e720 1199
4554e20d
JL
1200 numregs = i;
1201 break;
1202 }
f95361c8 1203
787dc842
JH
1204 mem = regno_save_mem [regno][numregs];
1205 if (save_mode [regno] != VOIDmode
1206 && save_mode [regno] != GET_MODE (mem)
ad474626 1207 && numregs == hard_regno_nregs (regno, save_mode [regno])
c3c96e68
L
1208 /* Check that insn to restore REGNO in save_mode[regno] is
1209 correct. */
1210 && reg_save_code (regno, save_mode[regno]) >= 0)
8d2547f2 1211 mem = adjust_address_nv (mem, save_mode[regno], 0);
ce7b36a4
JW
1212 else
1213 mem = copy_rtx (mem);
76fe54f0
L
1214
1215 /* Verify that the alignment of spill space is equal to or greater
1216 than required. */
058e97ec
VM
1217 gcc_assert (MIN (MAX_SUPPORTED_STACK_ALIGNMENT,
1218 GET_MODE_ALIGNMENT (GET_MODE (mem))) <= MEM_ALIGN (mem));
76fe54f0 1219
f7df4a84 1220 pat = gen_rtx_SET (gen_rtx_REG (GET_MODE (mem), regno), mem);
78187f5a 1221 code = reg_restore_code (regno, GET_MODE (mem));
32e9fa48 1222 new_chain = insert_one_insn (chain, before_p, code, pat);
285f3cf0
R
1223
1224 /* Clear status for all registers we restored. */
1225 for (k = 0; k < i; k++)
1226 {
1227 CLEAR_HARD_REG_BIT (hard_regs_saved, regno + k);
32e9fa48 1228 SET_REGNO_REG_SET (&new_chain->dead_or_set, regno + k);
285f3cf0
R
1229 n_regs_saved--;
1230 }
1231
6614fd40 1232 /* Tell our callers how many extra registers we saved/restored. */
4554e20d
JL
1233 return numregs - 1;
1234}
f95361c8 1235
7609e720 1236/* Like insert_restore above, but save registers instead. */
2cc2d4bb 1237
4554e20d 1238static int
99b1c316 1239insert_save (class insn_chain *chain, int regno,
a1440fa8 1240 HARD_REG_SET *to_save, machine_mode *save_mode)
4554e20d 1241{
787dc842
JH
1242 int i;
1243 unsigned int k;
4554e20d 1244 rtx pat = NULL_RTX;
830a47ec 1245 int code;
787dc842 1246 unsigned int numregs = 0;
99b1c316 1247 class insn_chain *new_chain;
787dc842 1248 rtx mem;
f95361c8 1249
41806d92
NS
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
4554e20d 1255 step in debugging such problems. */
366de0ce 1256 gcc_assert (regno_save_mem[regno][1]);
c5986054 1257
7609e720 1258 /* Get the pattern to emit and update our status.
f95361c8 1259
d329e058 1260 See if we can save several registers with a single instruction.
4554e20d 1261 Work backwards to the single register case. */
7609e720 1262 for (i = MOVE_MAX_WORDS; i > 0; i--)
4554e20d 1263 {
285f3cf0 1264 int j;
7609e720
BS
1265 int ok = 1;
1266 if (regno_save_mem[regno][i] == 0)
4554e20d 1267 continue;
f95361c8 1268
7609e720
BS
1269 for (j = 0; j < i; j++)
1270 if (! TEST_HARD_REG_BIT (*to_save, regno + j))
1271 {
1272 ok = 0;
1273 break;
1274 }
f9da5064 1275 /* Must do this one save at a time. */
4554e20d
JL
1276 if (! ok)
1277 continue;
1278
4554e20d
JL
1279 numregs = i;
1280 break;
f95361c8 1281 }
c5986054 1282
787dc842
JH
1283 mem = regno_save_mem [regno][numregs];
1284 if (save_mode [regno] != VOIDmode
1285 && save_mode [regno] != GET_MODE (mem)
ad474626 1286 && numregs == hard_regno_nregs (regno, save_mode [regno])
c3c96e68
L
1287 /* Check that insn to save REGNO in save_mode[regno] is
1288 correct. */
1289 && reg_save_code (regno, save_mode[regno]) >= 0)
8d2547f2 1290 mem = adjust_address_nv (mem, save_mode[regno], 0);
ce7b36a4
JW
1291 else
1292 mem = copy_rtx (mem);
76fe54f0
L
1293
1294 /* Verify that the alignment of spill space is equal to or greater
1295 than required. */
058e97ec
VM
1296 gcc_assert (MIN (MAX_SUPPORTED_STACK_ALIGNMENT,
1297 GET_MODE_ALIGNMENT (GET_MODE (mem))) <= MEM_ALIGN (mem));
76fe54f0 1298
f7df4a84 1299 pat = gen_rtx_SET (mem, gen_rtx_REG (GET_MODE (mem), regno));
78187f5a 1300 code = reg_save_code (regno, GET_MODE (mem));
8fc0c8fa 1301 new_chain = insert_one_insn (chain, 1, code, pat);
285f3cf0
R
1302
1303 /* Set hard_regs_saved and dead_or_set for all the registers we saved. */
1304 for (k = 0; k < numregs; k++)
1305 {
1306 SET_HARD_REG_BIT (hard_regs_saved, regno + k);
32e9fa48 1307 SET_REGNO_REG_SET (&new_chain->dead_or_set, regno + k);
285f3cf0
R
1308 n_regs_saved++;
1309 }
f95361c8 1310
6614fd40 1311 /* Tell our callers how many extra registers we saved/restored. */
f95361c8 1312 return numregs - 1;
c5986054 1313}
4554e20d 1314
574af2d6
RS
1315/* A note_uses callback used by insert_one_insn. Add the hard-register
1316 equivalent of each REG to regset DATA. */
1317
1318static void
1319add_used_regs (rtx *loc, void *data)
1320{
1cb22a67
RS
1321 subrtx_iterator::array_type array;
1322 FOR_EACH_SUBRTX (iter, array, *loc, NONCONST)
1323 {
1324 const_rtx x = *iter;
1325 if (REG_P (x))
1326 {
1327 unsigned int regno = REGNO (x);
1328 if (HARD_REGISTER_NUM_P (regno))
462a99aa 1329 bitmap_set_range ((regset) data, regno, REG_NREGS (x));
1cb22a67
RS
1330 else
1331 gcc_checking_assert (reg_renumber[regno] < 0);
1332 }
1333 }
574af2d6
RS
1334}
1335
7609e720 1336/* Emit a new caller-save insn and set the code. */
99b1c316
MS
1337static class insn_chain *
1338insert_one_insn (class insn_chain *chain, int before_p, int code, rtx pat)
4554e20d 1339{
5d86f5f9 1340 rtx_insn *insn = chain->insn;
99b1c316 1341 class insn_chain *new_chain;
d329e058 1342
32e9fa48 1343 new_chain = new_insn_chain ();
4554e20d
JL
1344 if (before_p)
1345 {
285f3cf0
R
1346 rtx link;
1347
32e9fa48
KG
1348 new_chain->prev = chain->prev;
1349 if (new_chain->prev != 0)
1350 new_chain->prev->next = new_chain;
7609e720 1351 else
32e9fa48 1352 reload_insn_chain = new_chain;
7609e720 1353
32e9fa48
KG
1354 chain->prev = new_chain;
1355 new_chain->next = chain;
1356 new_chain->insn = emit_insn_before (pat, insn);
92691d7d
JL
1357 /* ??? It would be nice if we could exclude the already / still saved
1358 registers from the live sets. */
32e9fa48 1359 COPY_REG_SET (&new_chain->live_throughout, &chain->live_throughout);
574af2d6
RS
1360 note_uses (&PATTERN (chain->insn), add_used_regs,
1361 &new_chain->live_throughout);
ac8bc93e
PB
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))
574af2d6
RS
1365 for (link = CALL_INSN_FUNCTION_USAGE (chain->insn);
1366 link != NULL_RTX;
1367 link = XEXP (link, 1))
1368 note_uses (&XEXP (link, 0), add_used_regs,
1369 &new_chain->live_throughout);
ac8bc93e 1370
32e9fa48 1371 CLEAR_REG_SET (&new_chain->dead_or_set);
06e28de2 1372 if (chain->insn == BB_HEAD (BASIC_BLOCK_FOR_FN (cfun, chain->block)))
1130d5e3 1373 BB_HEAD (BASIC_BLOCK_FOR_FN (cfun, chain->block)) = new_chain->insn;
4554e20d
JL
1374 }
1375 else
1376 {
32e9fa48
KG
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);
92691d7d
JL
1383 /* ??? It would be nice if we could exclude the already / still saved
1384 registers from the live sets, and observe REG_UNUSED notes. */
32e9fa48 1385 COPY_REG_SET (&new_chain->live_throughout, &chain->live_throughout);
285f3cf0 1386 /* Registers that are set in CHAIN->INSN live in the new insn.
c22cacf3 1387 (Unless there is a REG_UNUSED note for them, but we don't
285f3cf0 1388 look for them here.) */
e8448ba5 1389 note_stores (chain->insn, add_stored_regs, &new_chain->live_throughout);
32e9fa48 1390 CLEAR_REG_SET (&new_chain->dead_or_set);
06e28de2 1391 if (chain->insn == BB_END (BASIC_BLOCK_FOR_FN (cfun, chain->block)))
1130d5e3 1392 BB_END (BASIC_BLOCK_FOR_FN (cfun, chain->block)) = new_chain->insn;
4554e20d 1393 }
32e9fa48
KG
1394 new_chain->block = chain->block;
1395 new_chain->is_caller_save_insn = 1;
437a710d 1396
32e9fa48
KG
1397 INSN_CODE (new_chain->insn) = code;
1398 return new_chain;
4554e20d 1399}
78187f5a 1400#include "gt-caller-save.h"