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