xref: /dragonfly/contrib/gcc-8.0/gcc/lra-spills.c (revision e6d22e9b)
1 /* Change pseudos by memory.
2    Copyright (C) 2010-2018 Free Software Foundation, Inc.
3    Contributed by Vladimir Makarov <vmakarov@redhat.com>.
4 
5 This file is part of GCC.
6 
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
10 version.
11 
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15 for more details.
16 
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3.	If not see
19 <http://www.gnu.org/licenses/>.	 */
20 
21 
22 /* This file contains code for a pass to change spilled pseudos into
23    memory.
24 
25    The pass creates necessary stack slots and assigns spilled pseudos
26    to the stack slots in following way:
27 
28    for all spilled pseudos P most frequently used first do
29      for all stack slots S do
30        if P doesn't conflict with pseudos assigned to S then
31 	 assign S to P and goto to the next pseudo process
32        end
33      end
34      create new stack slot S and assign P to S
35    end
36 
37    The actual algorithm is bit more complicated because of different
38    pseudo sizes.
39 
40    After that the code changes spilled pseudos (except ones created
41    from scratches) by corresponding stack slot memory in RTL.
42 
43    If at least one stack slot was created, we need to run more passes
44    because we have new addresses which should be checked and because
45    the old address displacements might change and address constraints
46    (or insn memory constraints) might not be satisfied any more.
47 
48    For some targets, the pass can spill some pseudos into hard
49    registers of different class (usually into vector registers)
50    instead of spilling them into memory if it is possible and
51    profitable.  Spilling GENERAL_REGS pseudo into SSE registers for
52    Intel Corei7 is an example of such optimization.  And this is
53    actually recommended by Intel optimization guide.
54 
55    The file also contains code for final change of pseudos on hard
56    regs correspondingly assigned to them.  */
57 
58 #include "config.h"
59 #include "system.h"
60 #include "coretypes.h"
61 #include "backend.h"
62 #include "target.h"
63 #include "rtl.h"
64 #include "df.h"
65 #include "insn-config.h"
66 #include "regs.h"
67 #include "memmodel.h"
68 #include "ira.h"
69 #include "recog.h"
70 #include "output.h"
71 #include "cfgrtl.h"
72 #include "lra.h"
73 #include "lra-int.h"
74 
75 
76 /* Max regno at the start of the pass.	*/
77 static int regs_num;
78 
79 /* Map spilled regno -> hard regno used instead of memory for
80    spilling.  */
81 static rtx *spill_hard_reg;
82 
83 /* The structure describes stack slot of a spilled pseudo.  */
84 struct pseudo_slot
85 {
86   /* Number (0, 1, ...) of the stack slot to which given pseudo
87      belongs.  */
88   int slot_num;
89   /* First or next slot with the same slot number.  */
90   struct pseudo_slot *next, *first;
91   /* Memory representing the spilled pseudo.  */
92   rtx mem;
93 };
94 
95 /* The stack slots for each spilled pseudo.  Indexed by regnos.	 */
96 static struct pseudo_slot *pseudo_slots;
97 
98 /* The structure describes a register or a stack slot which can be
99    used for several spilled pseudos.  */
100 struct slot
101 {
102   /* First pseudo with given stack slot.  */
103   int regno;
104   /* Hard reg into which the slot pseudos are spilled.	The value is
105      negative for pseudos spilled into memory.	*/
106   int hard_regno;
107   /* Maximum alignment required by all users of the slot.  */
108   unsigned int align;
109   /* Maximum size required by all users of the slot.  */
110   poly_int64 size;
111   /* Memory representing the all stack slot.  It can be different from
112      memory representing a pseudo belonging to give stack slot because
113      pseudo can be placed in a part of the corresponding stack slot.
114      The value is NULL for pseudos spilled into a hard reg.  */
115   rtx mem;
116   /* Combined live ranges of all pseudos belonging to given slot.  It
117      is used to figure out that a new spilled pseudo can use given
118      stack slot.  */
119   lra_live_range_t live_ranges;
120 };
121 
122 /* Array containing info about the stack slots.	 The array element is
123    indexed by the stack slot number in the range [0..slots_num).  */
124 static struct slot *slots;
125 /* The number of the stack slots currently existing.  */
126 static int slots_num;
127 
128 /* Set up memory of the spilled pseudo I.  The function can allocate
129    the corresponding stack slot if it is not done yet.	*/
130 static void
131 assign_mem_slot (int i)
132 {
133   rtx x = NULL_RTX;
134   machine_mode mode = GET_MODE (regno_reg_rtx[i]);
135   poly_int64 inherent_size = PSEUDO_REGNO_BYTES (i);
136   machine_mode wider_mode
137     = wider_subreg_mode (mode, lra_reg_info[i].biggest_mode);
138   poly_int64 total_size = GET_MODE_SIZE (wider_mode);
139   poly_int64 adjust = 0;
140 
141   lra_assert (regno_reg_rtx[i] != NULL_RTX && REG_P (regno_reg_rtx[i])
142 	      && lra_reg_info[i].nrefs != 0 && reg_renumber[i] < 0);
143 
144   unsigned int slot_num = pseudo_slots[i].slot_num;
145   x = slots[slot_num].mem;
146   if (!x)
147     {
148       x = assign_stack_local (BLKmode, slots[slot_num].size,
149 			      slots[slot_num].align);
150       slots[slot_num].mem = x;
151     }
152 
153   /* On a big endian machine, the "address" of the slot is the address
154      of the low part that fits its inherent mode.  */
155   adjust += subreg_size_lowpart_offset (inherent_size, total_size);
156   x = adjust_address_nv (x, GET_MODE (regno_reg_rtx[i]), adjust);
157 
158   /* Set all of the memory attributes as appropriate for a spill.  */
159   set_mem_attrs_for_spill (x);
160   pseudo_slots[i].mem = x;
161 }
162 
163 /* Sort pseudos according their usage frequencies.  */
164 static int
165 regno_freq_compare (const void *v1p, const void *v2p)
166 {
167   const int regno1 = *(const int *) v1p;
168   const int regno2 = *(const int *) v2p;
169   int diff;
170 
171   if ((diff = lra_reg_info[regno2].freq - lra_reg_info[regno1].freq) != 0)
172     return diff;
173   return regno1 - regno2;
174 }
175 
176 /* Sort pseudos according to their slots, putting the slots in the order
177    that they should be allocated.
178 
179    First prefer to group slots with variable sizes together and slots
180    with constant sizes together, since that usually makes them easier
181    to address from a common anchor point.  E.g. loads of polynomial-sized
182    registers tend to take polynomial offsets while loads of constant-sized
183    registers tend to take constant (non-polynomial) offsets.
184 
185    Next, slots with lower numbers have the highest priority and should
186    get the smallest displacement from the stack or frame pointer
187    (whichever is being used).
188 
189    The first allocated slot is always closest to the frame pointer,
190    so prefer lower slot numbers when frame_pointer_needed.  If the stack
191    and frame grow in the same direction, then the first allocated slot is
192    always closest to the initial stack pointer and furthest away from the
193    final stack pointer, so allocate higher numbers first when using the
194    stack pointer in that case.  The reverse is true if the stack and
195    frame grow in opposite directions.  */
196 static int
197 pseudo_reg_slot_compare (const void *v1p, const void *v2p)
198 {
199   const int regno1 = *(const int *) v1p;
200   const int regno2 = *(const int *) v2p;
201   int diff, slot_num1, slot_num2;
202 
203   slot_num1 = pseudo_slots[regno1].slot_num;
204   slot_num2 = pseudo_slots[regno2].slot_num;
205   diff = (int (slots[slot_num1].size.is_constant ())
206 	  - int (slots[slot_num2].size.is_constant ()));
207   if (diff != 0)
208     return diff;
209   if ((diff = slot_num1 - slot_num2) != 0)
210     return (frame_pointer_needed
211 	    || (!FRAME_GROWS_DOWNWARD) == STACK_GROWS_DOWNWARD ? diff : -diff);
212   poly_int64 total_size1 = GET_MODE_SIZE (lra_reg_info[regno1].biggest_mode);
213   poly_int64 total_size2 = GET_MODE_SIZE (lra_reg_info[regno2].biggest_mode);
214   if ((diff = compare_sizes_for_sort (total_size2, total_size1)) != 0)
215     return diff;
216   return regno1 - regno2;
217 }
218 
219 /* Assign spill hard registers to N pseudos in PSEUDO_REGNOS which is
220    sorted in order of highest frequency first.  Put the pseudos which
221    did not get a spill hard register at the beginning of array
222    PSEUDO_REGNOS.  Return the number of such pseudos.  */
223 static int
224 assign_spill_hard_regs (int *pseudo_regnos, int n)
225 {
226   int i, k, p, regno, res, spill_class_size, hard_regno, nr;
227   enum reg_class rclass, spill_class;
228   machine_mode mode;
229   lra_live_range_t r;
230   rtx_insn *insn;
231   rtx set;
232   basic_block bb;
233   HARD_REG_SET conflict_hard_regs;
234   bitmap setjump_crosses = regstat_get_setjmp_crosses ();
235   /* Hard registers which can not be used for any purpose at given
236      program point because they are unallocatable or already allocated
237      for other pseudos.	 */
238   HARD_REG_SET *reserved_hard_regs;
239 
240   if (! lra_reg_spill_p)
241     return n;
242   /* Set up reserved hard regs for every program point.	 */
243   reserved_hard_regs = XNEWVEC (HARD_REG_SET, lra_live_max_point);
244   for (p = 0; p < lra_live_max_point; p++)
245     COPY_HARD_REG_SET (reserved_hard_regs[p], lra_no_alloc_regs);
246   for (i = FIRST_PSEUDO_REGISTER; i < regs_num; i++)
247     if (lra_reg_info[i].nrefs != 0
248 	&& (hard_regno = lra_get_regno_hard_regno (i)) >= 0)
249       for (r = lra_reg_info[i].live_ranges; r != NULL; r = r->next)
250 	for (p = r->start; p <= r->finish; p++)
251 	  add_to_hard_reg_set (&reserved_hard_regs[p],
252 			       lra_reg_info[i].biggest_mode, hard_regno);
253   auto_bitmap ok_insn_bitmap (&reg_obstack);
254   FOR_EACH_BB_FN (bb, cfun)
255     FOR_BB_INSNS (bb, insn)
256       if (DEBUG_INSN_P (insn)
257 	  || ((set = single_set (insn)) != NULL_RTX
258 	      && REG_P (SET_SRC (set)) && REG_P (SET_DEST (set))))
259 	bitmap_set_bit (ok_insn_bitmap, INSN_UID (insn));
260   for (res = i = 0; i < n; i++)
261     {
262       regno = pseudo_regnos[i];
263       rclass = lra_get_allocno_class (regno);
264       if (bitmap_bit_p (setjump_crosses, regno)
265 	  || (spill_class
266 	      = ((enum reg_class)
267 		 targetm.spill_class ((reg_class_t) rclass,
268 				      PSEUDO_REGNO_MODE (regno)))) == NO_REGS
269 	  || bitmap_intersect_compl_p (&lra_reg_info[regno].insn_bitmap,
270 				       ok_insn_bitmap))
271 	{
272 	  pseudo_regnos[res++] = regno;
273 	  continue;
274 	}
275       lra_assert (spill_class != NO_REGS);
276       COPY_HARD_REG_SET (conflict_hard_regs,
277 			 lra_reg_info[regno].conflict_hard_regs);
278       for (r = lra_reg_info[regno].live_ranges; r != NULL; r = r->next)
279 	for (p = r->start; p <= r->finish; p++)
280 	  IOR_HARD_REG_SET (conflict_hard_regs, reserved_hard_regs[p]);
281       spill_class_size = ira_class_hard_regs_num[spill_class];
282       mode = lra_reg_info[regno].biggest_mode;
283       for (k = 0; k < spill_class_size; k++)
284 	{
285 	  hard_regno = ira_class_hard_regs[spill_class][k];
286 	  if (! overlaps_hard_reg_set_p (conflict_hard_regs, mode, hard_regno))
287 	    break;
288 	}
289       if (k >= spill_class_size)
290 	{
291 	   /* There is no available regs -- assign memory later.  */
292 	  pseudo_regnos[res++] = regno;
293 	  continue;
294 	}
295       if (lra_dump_file != NULL)
296 	fprintf (lra_dump_file, "  Spill r%d into hr%d\n", regno, hard_regno);
297       add_to_hard_reg_set (&hard_regs_spilled_into,
298 			   lra_reg_info[regno].biggest_mode, hard_regno);
299       /* Update reserved_hard_regs.  */
300       for (r = lra_reg_info[regno].live_ranges; r != NULL; r = r->next)
301 	for (p = r->start; p <= r->finish; p++)
302 	  add_to_hard_reg_set (&reserved_hard_regs[p],
303 			       lra_reg_info[regno].biggest_mode, hard_regno);
304       spill_hard_reg[regno]
305 	= gen_raw_REG (PSEUDO_REGNO_MODE (regno), hard_regno);
306       for (nr = 0;
307 	   nr < hard_regno_nregs (hard_regno,
308 				  lra_reg_info[regno].biggest_mode);
309 	   nr++)
310 	/* Just loop.  */
311 	df_set_regs_ever_live (hard_regno + nr, true);
312     }
313   free (reserved_hard_regs);
314   return res;
315 }
316 
317 /* Add pseudo REGNO to slot SLOT_NUM.  */
318 static void
319 add_pseudo_to_slot (int regno, int slot_num)
320 {
321   struct pseudo_slot *first;
322 
323   /* Each pseudo has an inherent size which comes from its own mode,
324      and a total size which provides room for paradoxical subregs.
325      We need to make sure the size and alignment of the slot are
326      sufficient for both.  */
327   machine_mode mode = wider_subreg_mode (PSEUDO_REGNO_MODE (regno),
328 					 lra_reg_info[regno].biggest_mode);
329   unsigned int align = spill_slot_alignment (mode);
330   slots[slot_num].align = MAX (slots[slot_num].align, align);
331   slots[slot_num].size = upper_bound (slots[slot_num].size,
332 				      GET_MODE_SIZE (mode));
333 
334   if (slots[slot_num].regno < 0)
335     {
336       /* It is the first pseudo in the slot.  */
337       slots[slot_num].regno = regno;
338       pseudo_slots[regno].first = &pseudo_slots[regno];
339       pseudo_slots[regno].next = NULL;
340     }
341   else
342     {
343       first = pseudo_slots[regno].first = &pseudo_slots[slots[slot_num].regno];
344       pseudo_slots[regno].next = first->next;
345       first->next = &pseudo_slots[regno];
346     }
347   pseudo_slots[regno].mem = NULL_RTX;
348   pseudo_slots[regno].slot_num = slot_num;
349   slots[slot_num].live_ranges
350     = lra_merge_live_ranges (slots[slot_num].live_ranges,
351 			     lra_copy_live_range_list
352 			     (lra_reg_info[regno].live_ranges));
353 }
354 
355 /* Assign stack slot numbers to pseudos in array PSEUDO_REGNOS of
356    length N.  Sort pseudos in PSEUDO_REGNOS for subsequent assigning
357    memory stack slots.	*/
358 static void
359 assign_stack_slot_num_and_sort_pseudos (int *pseudo_regnos, int n)
360 {
361   int i, j, regno;
362 
363   slots_num = 0;
364   /* Assign stack slot numbers to spilled pseudos, use smaller numbers
365      for most frequently used pseudos.	*/
366   for (i = 0; i < n; i++)
367     {
368       regno = pseudo_regnos[i];
369       if (! flag_ira_share_spill_slots)
370 	j = slots_num;
371       else
372 	{
373 	  machine_mode mode
374 	    = wider_subreg_mode (PSEUDO_REGNO_MODE (regno),
375 				 lra_reg_info[regno].biggest_mode);
376 	  for (j = 0; j < slots_num; j++)
377 	    if (slots[j].hard_regno < 0
378 		/* Although it's possible to share slots between modes
379 		   with constant and non-constant widths, we usually
380 		   get better spill code by keeping the constant and
381 		   non-constant areas separate.  */
382 		&& (GET_MODE_SIZE (mode).is_constant ()
383 		    == slots[j].size.is_constant ())
384 		&& ! (lra_intersected_live_ranges_p
385 		      (slots[j].live_ranges,
386 		       lra_reg_info[regno].live_ranges)))
387 	      break;
388 	}
389       if (j >= slots_num)
390 	{
391 	  /* New slot.	*/
392 	  slots[j].live_ranges = NULL;
393 	  slots[j].size = 0;
394 	  slots[j].align = BITS_PER_UNIT;
395 	  slots[j].regno = slots[j].hard_regno = -1;
396 	  slots[j].mem = NULL_RTX;
397 	  slots_num++;
398 	}
399       add_pseudo_to_slot (regno, j);
400     }
401   /* Sort regnos according to their slot numbers.  */
402   qsort (pseudo_regnos, n, sizeof (int), pseudo_reg_slot_compare);
403 }
404 
405 /* Recursively process LOC in INSN and change spilled pseudos to the
406    corresponding memory or spilled hard reg.  Ignore spilled pseudos
407    created from the scratches.  Return true if the pseudo nrefs equal
408    to 0 (don't change the pseudo in this case).  Otherwise return false.  */
409 static bool
410 remove_pseudos (rtx *loc, rtx_insn *insn)
411 {
412   int i;
413   rtx hard_reg;
414   const char *fmt;
415   enum rtx_code code;
416   bool res = false;
417 
418   if (*loc == NULL_RTX)
419     return res;
420   code = GET_CODE (*loc);
421   if (code == REG && (i = REGNO (*loc)) >= FIRST_PSEUDO_REGISTER
422       && lra_get_regno_hard_regno (i) < 0
423       /* We do not want to assign memory for former scratches because
424 	 it might result in an address reload for some targets.	 In
425 	 any case we transform such pseudos not getting hard registers
426 	 into scratches back.  */
427       && ! lra_former_scratch_p (i))
428     {
429       if (lra_reg_info[i].nrefs == 0
430 	  && pseudo_slots[i].mem == NULL && spill_hard_reg[i] == NULL)
431 	return true;
432       if ((hard_reg = spill_hard_reg[i]) != NULL_RTX)
433 	*loc = copy_rtx (hard_reg);
434       else
435 	{
436 	  rtx x = lra_eliminate_regs_1 (insn, pseudo_slots[i].mem,
437 					GET_MODE (pseudo_slots[i].mem),
438 					false, false, 0, true);
439 	  *loc = x != pseudo_slots[i].mem ? x : copy_rtx (x);
440 	}
441       return res;
442     }
443 
444   fmt = GET_RTX_FORMAT (code);
445   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
446     {
447       if (fmt[i] == 'e')
448 	res = remove_pseudos (&XEXP (*loc, i), insn) || res;
449       else if (fmt[i] == 'E')
450 	{
451 	  int j;
452 
453 	  for (j = XVECLEN (*loc, i) - 1; j >= 0; j--)
454 	    res = remove_pseudos (&XVECEXP (*loc, i, j), insn) || res;
455 	}
456     }
457   return res;
458 }
459 
460 /* Convert spilled pseudos into their stack slots or spill hard regs,
461    put insns to process on the constraint stack (that is all insns in
462    which pseudos were changed to memory or spill hard regs).   */
463 static void
464 spill_pseudos (void)
465 {
466   basic_block bb;
467   rtx_insn *insn, *curr;
468   int i;
469 
470   auto_bitmap spilled_pseudos (&reg_obstack);
471   auto_bitmap changed_insns (&reg_obstack);
472   for (i = FIRST_PSEUDO_REGISTER; i < regs_num; i++)
473     {
474       if (lra_reg_info[i].nrefs != 0 && lra_get_regno_hard_regno (i) < 0
475 	  && ! lra_former_scratch_p (i))
476 	{
477 	  bitmap_set_bit (spilled_pseudos, i);
478 	  bitmap_ior_into (changed_insns, &lra_reg_info[i].insn_bitmap);
479 	}
480     }
481   FOR_EACH_BB_FN (bb, cfun)
482     {
483       FOR_BB_INSNS_SAFE (bb, insn, curr)
484 	{
485 	  bool removed_pseudo_p = false;
486 
487 	  if (bitmap_bit_p (changed_insns, INSN_UID (insn)))
488 	    {
489 	      rtx *link_loc, link;
490 
491 	      removed_pseudo_p = remove_pseudos (&PATTERN (insn), insn);
492 	      if (CALL_P (insn)
493 		  && remove_pseudos (&CALL_INSN_FUNCTION_USAGE (insn), insn))
494 		removed_pseudo_p = true;
495 	      for (link_loc = &REG_NOTES (insn);
496 		   (link = *link_loc) != NULL_RTX;
497 		   link_loc = &XEXP (link, 1))
498 		{
499 		  switch (REG_NOTE_KIND (link))
500 		    {
501 		    case REG_FRAME_RELATED_EXPR:
502 		    case REG_CFA_DEF_CFA:
503 		    case REG_CFA_ADJUST_CFA:
504 		    case REG_CFA_OFFSET:
505 		    case REG_CFA_REGISTER:
506 		    case REG_CFA_EXPRESSION:
507 		    case REG_CFA_RESTORE:
508 		    case REG_CFA_SET_VDRAP:
509 		      if (remove_pseudos (&XEXP (link, 0), insn))
510 			removed_pseudo_p = true;
511 		      break;
512 		    default:
513 		      break;
514 		    }
515 		}
516 	      if (lra_dump_file != NULL)
517 		fprintf (lra_dump_file,
518 			 "Changing spilled pseudos to memory in insn #%u\n",
519 			 INSN_UID (insn));
520 	      lra_push_insn (insn);
521 	      if (lra_reg_spill_p || targetm.different_addr_displacement_p ())
522 		lra_set_used_insn_alternative (insn, LRA_UNKNOWN_ALT);
523 	    }
524 	  else if (CALL_P (insn)
525 		   /* Presence of any pseudo in CALL_INSN_FUNCTION_USAGE
526 		      does not affect value of insn_bitmap of the
527 		      corresponding lra_reg_info.  That is because we
528 		      don't need to reload pseudos in
529 		      CALL_INSN_FUNCTION_USAGEs.  So if we process only
530 		      insns in the insn_bitmap of given pseudo here, we
531 		      can miss the pseudo in some
532 		      CALL_INSN_FUNCTION_USAGEs.  */
533 		   && remove_pseudos (&CALL_INSN_FUNCTION_USAGE (insn), insn))
534 	    removed_pseudo_p = true;
535 	  if (removed_pseudo_p)
536 	    {
537 	      lra_assert (DEBUG_INSN_P (insn));
538 	      lra_invalidate_insn_data (insn);
539 	      INSN_VAR_LOCATION_LOC (insn) = gen_rtx_UNKNOWN_VAR_LOC ();
540 	      if (lra_dump_file != NULL)
541 		fprintf (lra_dump_file,
542 			 "Debug insn #%u is reset because it referenced "
543 			 "removed pseudo\n", INSN_UID (insn));
544 	    }
545 	  bitmap_and_compl_into (df_get_live_in (bb), spilled_pseudos);
546 	  bitmap_and_compl_into (df_get_live_out (bb), spilled_pseudos);
547 	}
548     }
549 }
550 
551 /* Return true if we need to change some pseudos into memory.  */
552 bool
553 lra_need_for_spills_p (void)
554 {
555   int i; max_regno = max_reg_num ();
556 
557   for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++)
558     if (lra_reg_info[i].nrefs != 0 && lra_get_regno_hard_regno (i) < 0
559 	&& ! lra_former_scratch_p (i))
560       return true;
561   return false;
562 }
563 
564 /* Change spilled pseudos into memory or spill hard regs.  Put changed
565    insns on the constraint stack (these insns will be considered on
566    the next constraint pass).  The changed insns are all insns in
567    which pseudos were changed.  */
568 void
569 lra_spill (void)
570 {
571   int i, n, curr_regno;
572   int *pseudo_regnos;
573 
574   regs_num = max_reg_num ();
575   spill_hard_reg = XNEWVEC (rtx, regs_num);
576   pseudo_regnos = XNEWVEC (int, regs_num);
577   for (n = 0, i = FIRST_PSEUDO_REGISTER; i < regs_num; i++)
578     if (lra_reg_info[i].nrefs != 0 && lra_get_regno_hard_regno (i) < 0
579 	/* We do not want to assign memory for former scratches.  */
580 	&& ! lra_former_scratch_p (i))
581       pseudo_regnos[n++] = i;
582   lra_assert (n > 0);
583   pseudo_slots = XNEWVEC (struct pseudo_slot, regs_num);
584   for (i = FIRST_PSEUDO_REGISTER; i < regs_num; i++)
585     {
586       spill_hard_reg[i] = NULL_RTX;
587       pseudo_slots[i].mem = NULL_RTX;
588     }
589   slots = XNEWVEC (struct slot, regs_num);
590   /* Sort regnos according their usage frequencies.  */
591   qsort (pseudo_regnos, n, sizeof (int), regno_freq_compare);
592   n = assign_spill_hard_regs (pseudo_regnos, n);
593   assign_stack_slot_num_and_sort_pseudos (pseudo_regnos, n);
594   for (i = 0; i < n; i++)
595     if (pseudo_slots[pseudo_regnos[i]].mem == NULL_RTX)
596       assign_mem_slot (pseudo_regnos[i]);
597   if (n > 0 && crtl->stack_alignment_needed)
598     /* If we have a stack frame, we must align it now.  The stack size
599        may be a part of the offset computation for register
600        elimination.  */
601     assign_stack_local (BLKmode, 0, crtl->stack_alignment_needed);
602   if (lra_dump_file != NULL)
603     {
604       for (i = 0; i < slots_num; i++)
605 	{
606 	  fprintf (lra_dump_file, "  Slot %d regnos (width = ", i);
607 	  print_dec (GET_MODE_SIZE (GET_MODE (slots[i].mem)),
608 		     lra_dump_file, SIGNED);
609 	  fprintf (lra_dump_file, "):");
610 	  for (curr_regno = slots[i].regno;;
611 	       curr_regno = pseudo_slots[curr_regno].next - pseudo_slots)
612 	    {
613 	      fprintf (lra_dump_file, "	 %d", curr_regno);
614 	      if (pseudo_slots[curr_regno].next == NULL)
615 		break;
616 	    }
617 	  fprintf (lra_dump_file, "\n");
618 	}
619     }
620   spill_pseudos ();
621   free (slots);
622   free (pseudo_slots);
623   free (pseudo_regnos);
624   free (spill_hard_reg);
625 }
626 
627 /* Apply alter_subreg for subregs of regs in *LOC.  Use FINAL_P for
628    alter_subreg calls. Return true if any subreg of reg is
629    processed.  */
630 static bool
631 alter_subregs (rtx *loc, bool final_p)
632 {
633   int i;
634   rtx x = *loc;
635   bool res;
636   const char *fmt;
637   enum rtx_code code;
638 
639   if (x == NULL_RTX)
640     return false;
641   code = GET_CODE (x);
642   if (code == SUBREG && REG_P (SUBREG_REG (x)))
643     {
644       lra_assert (REGNO (SUBREG_REG (x)) < FIRST_PSEUDO_REGISTER);
645       alter_subreg (loc, final_p);
646       return true;
647     }
648   fmt = GET_RTX_FORMAT (code);
649   res = false;
650   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
651     {
652       if (fmt[i] == 'e')
653 	{
654 	  if (alter_subregs (&XEXP (x, i), final_p))
655 	    res = true;
656 	}
657       else if (fmt[i] == 'E')
658 	{
659 	  int j;
660 
661 	  for (j = XVECLEN (x, i) - 1; j >= 0; j--)
662 	    if (alter_subregs (&XVECEXP (x, i, j), final_p))
663 	      res = true;
664 	}
665     }
666   return res;
667 }
668 
669 /* Return true if REGNO is used for return in the current
670    function.  */
671 static bool
672 return_regno_p (unsigned int regno)
673 {
674   rtx outgoing = crtl->return_rtx;
675 
676   if (! outgoing)
677     return false;
678 
679   if (REG_P (outgoing))
680     return REGNO (outgoing) == regno;
681   else if (GET_CODE (outgoing) == PARALLEL)
682     {
683       int i;
684 
685       for (i = 0; i < XVECLEN (outgoing, 0); i++)
686 	{
687 	  rtx x = XEXP (XVECEXP (outgoing, 0, i), 0);
688 
689 	  if (REG_P (x) && REGNO (x) == regno)
690 	    return true;
691 	}
692     }
693   return false;
694 }
695 
696 /* Return true if REGNO is in one of subsequent USE after INSN in the
697    same BB.  */
698 static bool
699 regno_in_use_p (rtx_insn *insn, unsigned int regno)
700 {
701   static lra_insn_recog_data_t id;
702   static struct lra_static_insn_data *static_id;
703   struct lra_insn_reg *reg;
704   int i, arg_regno;
705   basic_block bb = BLOCK_FOR_INSN (insn);
706 
707   while ((insn = next_nondebug_insn (insn)) != NULL_RTX)
708     {
709       if (BARRIER_P (insn) || bb != BLOCK_FOR_INSN (insn))
710 	return false;
711       if (! INSN_P (insn))
712 	continue;
713       if (GET_CODE (PATTERN (insn)) == USE
714 	  && REG_P (XEXP (PATTERN (insn), 0))
715 	  && regno == REGNO (XEXP (PATTERN (insn), 0)))
716 	return true;
717       /* Check that the regno is not modified.  */
718       id = lra_get_insn_recog_data (insn);
719       for (reg = id->regs; reg != NULL; reg = reg->next)
720 	if (reg->type != OP_IN && reg->regno == (int) regno)
721 	  return false;
722       static_id = id->insn_static_data;
723       for (reg = static_id->hard_regs; reg != NULL; reg = reg->next)
724 	if (reg->type != OP_IN && reg->regno == (int) regno)
725 	  return false;
726       if (id->arg_hard_regs != NULL)
727 	for (i = 0; (arg_regno = id->arg_hard_regs[i]) >= 0; i++)
728 	  if ((int) regno == (arg_regno >= FIRST_PSEUDO_REGISTER
729 			      ? arg_regno : arg_regno - FIRST_PSEUDO_REGISTER))
730 	    return false;
731     }
732   return false;
733 }
734 
735 /* Final change of pseudos got hard registers into the corresponding
736    hard registers and removing temporary clobbers.  */
737 void
738 lra_final_code_change (void)
739 {
740   int i, hard_regno;
741   basic_block bb;
742   rtx_insn *insn, *curr;
743   int max_regno = max_reg_num ();
744 
745   for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++)
746     if (lra_reg_info[i].nrefs != 0
747 	&& (hard_regno = lra_get_regno_hard_regno (i)) >= 0)
748       SET_REGNO (regno_reg_rtx[i], hard_regno);
749   FOR_EACH_BB_FN (bb, cfun)
750     FOR_BB_INSNS_SAFE (bb, insn, curr)
751       if (INSN_P (insn))
752 	{
753 	  rtx pat = PATTERN (insn);
754 
755 	  if (GET_CODE (pat) == CLOBBER && LRA_TEMP_CLOBBER_P (pat))
756 	    {
757 	      /* Remove clobbers temporarily created in LRA.  We don't
758 		 need them anymore and don't want to waste compiler
759 		 time processing them in a few subsequent passes.  */
760 	      lra_invalidate_insn_data (insn);
761 	      delete_insn (insn);
762 	      continue;
763 	    }
764 
765 	  /* IRA can generate move insns involving pseudos.  It is
766 	     better remove them earlier to speed up compiler a bit.
767 	     It is also better to do it here as they might not pass
768 	     final RTL check in LRA, (e.g. insn moving a control
769 	     register into itself).  So remove an useless move insn
770 	     unless next insn is USE marking the return reg (we should
771 	     save this as some subsequent optimizations assume that
772 	     such original insns are saved).  */
773 	  if (NONJUMP_INSN_P (insn) && GET_CODE (pat) == SET
774 	      && REG_P (SET_SRC (pat)) && REG_P (SET_DEST (pat))
775 	      && REGNO (SET_SRC (pat)) == REGNO (SET_DEST (pat))
776 	      && (! return_regno_p (REGNO (SET_SRC (pat)))
777 		  || ! regno_in_use_p (insn, REGNO (SET_SRC (pat)))))
778 	    {
779 	      lra_invalidate_insn_data (insn);
780 	      delete_insn (insn);
781 	      continue;
782 	    }
783 
784 	  lra_insn_recog_data_t id = lra_get_insn_recog_data (insn);
785 	  struct lra_insn_reg *reg;
786 
787 	  for (reg = id->regs; reg != NULL; reg = reg->next)
788 	    if (reg->regno >= FIRST_PSEUDO_REGISTER
789 		&& lra_reg_info [reg->regno].nrefs == 0)
790 	      break;
791 
792 	  if (reg != NULL)
793 	    {
794 	      /* Pseudos still can be in debug insns in some very rare
795 		 and complicated cases, e.g. the pseudo was removed by
796 		 inheritance and the debug insn is not EBBs where the
797 		 inheritance happened.  It is difficult and time
798 		 consuming to find what hard register corresponds the
799 		 pseudo -- so just remove the debug insn.  Another
800 		 solution could be assigning hard reg/memory but it
801 		 would be a misleading info.  It is better not to have
802 		 info than have it wrong.  */
803 	      lra_assert (DEBUG_INSN_P (insn));
804 	      lra_invalidate_insn_data (insn);
805 	      delete_insn (insn);
806 	      continue;
807 	    }
808 
809 	  struct lra_static_insn_data *static_id = id->insn_static_data;
810 	  bool insn_change_p = false;
811 
812 	  for (i = id->insn_static_data->n_operands - 1; i >= 0; i--)
813 	    if ((DEBUG_INSN_P (insn) || ! static_id->operand[i].is_operator)
814 		&& alter_subregs (id->operand_loc[i], ! DEBUG_INSN_P (insn)))
815 	      {
816 		lra_update_dup (id, i);
817 		insn_change_p = true;
818 	      }
819 	  if (insn_change_p)
820 	    lra_update_operator_dups (id);
821 	}
822 }
823