LCOV - code coverage report
Current view: top level - gcc - lra-spills.cc (source / functions) Coverage Total Hit
Test: gcc.info Lines: 77.8 % 388 302
Test Date: 2024-12-21 13:15:12 Functions: 100.0 % 13 13
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: - 0 0

             Branch data     Line data    Source code
       1                 :             : /* Change pseudos by memory.
       2                 :             :    Copyright (C) 2010-2024 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                 :             : class slot
     101                 :             : {
     102                 :             : public:
     103                 :             :   /* First pseudo with given stack slot.  */
     104                 :             :   int regno;
     105                 :             :   /* Hard reg into which the slot pseudos are spilled.  The value is
     106                 :             :      negative for pseudos spilled into memory.  */
     107                 :             :   int hard_regno;
     108                 :             :   /* Maximum alignment required by all users of the slot.  */
     109                 :             :   unsigned int align;
     110                 :             :   /* Maximum size required by all users of the slot.  */
     111                 :             :   poly_int64 size;
     112                 :             :   /* Memory representing the all stack slot.  It can be different from
     113                 :             :      memory representing a pseudo belonging to give stack slot because
     114                 :             :      pseudo can be placed in a part of the corresponding stack slot.
     115                 :             :      The value is NULL for pseudos spilled into a hard reg.  */
     116                 :             :   rtx mem;
     117                 :             :   /* Combined live ranges of all pseudos belonging to given slot.  It
     118                 :             :      is used to figure out that a new spilled pseudo can use given
     119                 :             :      stack slot.  */
     120                 :             :   lra_live_range_t live_ranges;
     121                 :             : };
     122                 :             : 
     123                 :             : /* Array containing info about the stack slots.  The array element is
     124                 :             :    indexed by the stack slot number in the range [0..slots_num).  */
     125                 :             : static class slot *slots;
     126                 :             : /* The number of the stack slots currently existing.  */
     127                 :             : static int slots_num;
     128                 :             : 
     129                 :             : /* Set up memory of the spilled pseudo I.  The function can allocate
     130                 :             :    the corresponding stack slot if it is not done yet.  */
     131                 :             : static void
     132                 :     1421750 : assign_mem_slot (int i)
     133                 :             : {
     134                 :     1421750 :   rtx x = NULL_RTX;
     135                 :     1421750 :   machine_mode mode = GET_MODE (regno_reg_rtx[i]);
     136                 :     2843500 :   poly_int64 inherent_size = PSEUDO_REGNO_BYTES (i);
     137                 :     1421750 :   machine_mode wider_mode
     138                 :     1421750 :     = wider_subreg_mode (mode, lra_reg_info[i].biggest_mode);
     139                 :     2843500 :   poly_int64 total_size = GET_MODE_SIZE (wider_mode);
     140                 :     1421750 :   poly_int64 adjust = 0;
     141                 :             : 
     142                 :     1421750 :   lra_assert (regno_reg_rtx[i] != NULL_RTX && REG_P (regno_reg_rtx[i])
     143                 :             :               && lra_reg_info[i].nrefs != 0 && reg_renumber[i] < 0);
     144                 :             : 
     145                 :     1421750 :   unsigned int slot_num = pseudo_slots[i].slot_num;
     146                 :     1421750 :   x = slots[slot_num].mem;
     147                 :     1421750 :   if (!x)
     148                 :             :     {
     149                 :     1536026 :       x = assign_stack_local (BLKmode, slots[slot_num].size,
     150                 :      768013 :                               slots[slot_num].align);
     151                 :      768013 :       slots[slot_num].mem = x;
     152                 :             :     }
     153                 :             : 
     154                 :             :   /* On a big endian machine, the "address" of the slot is the address
     155                 :             :      of the low part that fits its inherent mode.  */
     156                 :     1421750 :   adjust += subreg_size_lowpart_offset (inherent_size, total_size);
     157                 :     1421750 :   x = adjust_address_nv (x, GET_MODE (regno_reg_rtx[i]), adjust);
     158                 :             : 
     159                 :             :   /* Set all of the memory attributes as appropriate for a spill.  */
     160                 :     1421750 :   set_mem_attrs_for_spill (x);
     161                 :     1421750 :   pseudo_slots[i].mem = x;
     162                 :     1421750 : }
     163                 :             : 
     164                 :             : /* Sort pseudos according their usage frequencies.  */
     165                 :             : static int
     166                 :    29737687 : regno_freq_compare (const void *v1p, const void *v2p)
     167                 :             : {
     168                 :    29737687 :   const int regno1 = *(const int *) v1p;
     169                 :    29737687 :   const int regno2 = *(const int *) v2p;
     170                 :    29737687 :   int diff;
     171                 :             : 
     172                 :    29737687 :   if ((diff = lra_reg_info[regno2].freq - lra_reg_info[regno1].freq) != 0)
     173                 :             :     return diff;
     174                 :    11660704 :   return regno1 - regno2;
     175                 :             : }
     176                 :             : 
     177                 :             : /* Sort pseudos according to their slots, putting the slots in the order
     178                 :             :    that they should be allocated.
     179                 :             : 
     180                 :             :    First prefer to group slots with variable sizes together and slots
     181                 :             :    with constant sizes together, since that usually makes them easier
     182                 :             :    to address from a common anchor point.  E.g. loads of polynomial-sized
     183                 :             :    registers tend to take polynomial offsets while loads of constant-sized
     184                 :             :    registers tend to take constant (non-polynomial) offsets.
     185                 :             : 
     186                 :             :    Next, slots with lower numbers have the highest priority and should
     187                 :             :    get the smallest displacement from the stack or frame pointer
     188                 :             :    (whichever is being used).
     189                 :             : 
     190                 :             :    The first allocated slot is always closest to the frame pointer,
     191                 :             :    so prefer lower slot numbers when frame_pointer_needed.  If the stack
     192                 :             :    and frame grow in the same direction, then the first allocated slot is
     193                 :             :    always closest to the initial stack pointer and furthest away from the
     194                 :             :    final stack pointer, so allocate higher numbers first when using the
     195                 :             :    stack pointer in that case.  The reverse is true if the stack and
     196                 :             :    frame grow in opposite directions.  */
     197                 :             : static int
     198                 :    30153607 : pseudo_reg_slot_compare (const void *v1p, const void *v2p)
     199                 :             : {
     200                 :    30153607 :   const int regno1 = *(const int *) v1p;
     201                 :    30153607 :   const int regno2 = *(const int *) v2p;
     202                 :    30153607 :   int diff, slot_num1, slot_num2;
     203                 :             : 
     204                 :    30153607 :   slot_num1 = pseudo_slots[regno1].slot_num;
     205                 :    30153607 :   slot_num2 = pseudo_slots[regno2].slot_num;
     206                 :    30153607 :   diff = (int (slots[slot_num1].size.is_constant ())
     207                 :    30153607 :           - int (slots[slot_num2].size.is_constant ()));
     208                 :    30153607 :   if (diff != 0)
     209                 :             :     return diff;
     210                 :    30153607 :   if ((diff = slot_num1 - slot_num2) != 0)
     211                 :    22334824 :     return (frame_pointer_needed
     212                 :    22334824 :             || (!FRAME_GROWS_DOWNWARD) == STACK_GROWS_DOWNWARD ? diff : -diff);
     213                 :    15637566 :   poly_int64 total_size1 = GET_MODE_SIZE (lra_reg_info[regno1].biggest_mode);
     214                 :    15637566 :   poly_int64 total_size2 = GET_MODE_SIZE (lra_reg_info[regno2].biggest_mode);
     215                 :     7818783 :   if ((diff = compare_sizes_for_sort (total_size2, total_size1)) != 0)
     216                 :     1577413 :     return diff;
     217                 :     6241370 :   return regno1 - regno2;
     218                 :             : }
     219                 :             : 
     220                 :             : /* Assign spill hard registers to N pseudos in PSEUDO_REGNOS which is
     221                 :             :    sorted in order of highest frequency first.  Put the pseudos which
     222                 :             :    did not get a spill hard register at the beginning of array
     223                 :             :    PSEUDO_REGNOS.  Return the number of such pseudos.  */
     224                 :             : static int
     225                 :      215997 : assign_spill_hard_regs (int *pseudo_regnos, int n)
     226                 :             : {
     227                 :      215997 :   int i, k, p, regno, res, spill_class_size, hard_regno, nr;
     228                 :      215997 :   enum reg_class rclass, spill_class;
     229                 :      215997 :   machine_mode mode;
     230                 :      215997 :   lra_live_range_t r;
     231                 :      215997 :   rtx_insn *insn;
     232                 :      215997 :   rtx set;
     233                 :      215997 :   basic_block bb;
     234                 :      215997 :   HARD_REG_SET conflict_hard_regs;
     235                 :      215997 :   bitmap setjump_crosses = regstat_get_setjmp_crosses ();
     236                 :             :   /* Hard registers which cannot be used for any purpose at given
     237                 :             :      program point because they are unallocatable or already allocated
     238                 :             :      for other pseudos.  */
     239                 :      215997 :   HARD_REG_SET *reserved_hard_regs;
     240                 :             : 
     241                 :      215997 :   if (! lra_reg_spill_p)
     242                 :             :     return n;
     243                 :             :   /* Set up reserved hard regs for every program point.  */
     244                 :           0 :   reserved_hard_regs = XNEWVEC (HARD_REG_SET, lra_live_max_point);
     245                 :           0 :   for (p = 0; p < lra_live_max_point; p++)
     246                 :           0 :     reserved_hard_regs[p] = lra_no_alloc_regs;
     247                 :           0 :   for (i = FIRST_PSEUDO_REGISTER; i < regs_num; i++)
     248                 :           0 :     if (lra_reg_info[i].nrefs != 0
     249                 :           0 :         && (hard_regno = lra_get_regno_hard_regno (i)) >= 0)
     250                 :           0 :       for (r = lra_reg_info[i].live_ranges; r != NULL; r = r->next)
     251                 :           0 :         for (p = r->start; p <= r->finish; p++)
     252                 :           0 :           add_to_hard_reg_set (&reserved_hard_regs[p],
     253                 :             :                                lra_reg_info[i].biggest_mode, hard_regno);
     254                 :           0 :   auto_bitmap ok_insn_bitmap (&reg_obstack);
     255                 :           0 :   FOR_EACH_BB_FN (bb, cfun)
     256                 :           0 :     FOR_BB_INSNS (bb, insn)
     257                 :           0 :       if (DEBUG_INSN_P (insn)
     258                 :           0 :           || ((set = single_set (insn)) != NULL_RTX
     259                 :           0 :               && REG_P (SET_SRC (set)) && REG_P (SET_DEST (set))))
     260                 :           0 :         bitmap_set_bit (ok_insn_bitmap, INSN_UID (insn));
     261                 :           0 :   for (res = i = 0; i < n; i++)
     262                 :             :     {
     263                 :           0 :       regno = pseudo_regnos[i];
     264                 :           0 :       rclass = lra_get_allocno_class (regno);
     265                 :           0 :       if (bitmap_bit_p (setjump_crosses, regno)
     266                 :           0 :           || (spill_class
     267                 :           0 :               = ((enum reg_class)
     268                 :           0 :                  targetm.spill_class ((reg_class_t) rclass,
     269                 :           0 :                                       PSEUDO_REGNO_MODE (regno)))) == NO_REGS
     270                 :           0 :           || bitmap_intersect_compl_p (&lra_reg_info[regno].insn_bitmap,
     271                 :             :                                        ok_insn_bitmap))
     272                 :             :         {
     273                 :           0 :           pseudo_regnos[res++] = regno;
     274                 :           0 :           continue;
     275                 :             :         }
     276                 :           0 :       lra_assert (spill_class != NO_REGS);
     277                 :           0 :       conflict_hard_regs = lra_reg_info[regno].conflict_hard_regs;
     278                 :           0 :       for (r = lra_reg_info[regno].live_ranges; r != NULL; r = r->next)
     279                 :           0 :         for (p = r->start; p <= r->finish; p++)
     280                 :           0 :           conflict_hard_regs |= reserved_hard_regs[p];
     281                 :           0 :       spill_class_size = ira_class_hard_regs_num[spill_class];
     282                 :           0 :       mode = lra_reg_info[regno].biggest_mode;
     283                 :           0 :       for (k = 0; k < spill_class_size; k++)
     284                 :             :         {
     285                 :           0 :           hard_regno = ira_class_hard_regs[spill_class][k];
     286                 :           0 :           if (TEST_HARD_REG_BIT (eliminable_regset, hard_regno)
     287                 :           0 :               || !targetm.hard_regno_mode_ok (hard_regno, mode))
     288                 :           0 :             continue;
     289                 :           0 :           if (! overlaps_hard_reg_set_p (conflict_hard_regs, mode, hard_regno))
     290                 :             :             break;
     291                 :             :         }
     292                 :           0 :       if (k >= spill_class_size)
     293                 :             :         {
     294                 :             :            /* There is no available regs -- assign memory later.  */
     295                 :           0 :           pseudo_regnos[res++] = regno;
     296                 :           0 :           continue;
     297                 :             :         }
     298                 :           0 :       if (lra_dump_file != NULL)
     299                 :           0 :         fprintf (lra_dump_file, "  Spill r%d into hr%d\n", regno, hard_regno);
     300                 :           0 :       add_to_hard_reg_set (&hard_regs_spilled_into,
     301                 :           0 :                            lra_reg_info[regno].biggest_mode, hard_regno);
     302                 :             :       /* Update reserved_hard_regs.  */
     303                 :           0 :       for (r = lra_reg_info[regno].live_ranges; r != NULL; r = r->next)
     304                 :           0 :         for (p = r->start; p <= r->finish; p++)
     305                 :           0 :           add_to_hard_reg_set (&reserved_hard_regs[p],
     306                 :             :                                lra_reg_info[regno].biggest_mode, hard_regno);
     307                 :           0 :       spill_hard_reg[regno]
     308                 :           0 :         = gen_raw_REG (PSEUDO_REGNO_MODE (regno), hard_regno);
     309                 :           0 :       for (nr = 0;
     310                 :           0 :            nr < hard_regno_nregs (hard_regno,
     311                 :           0 :                                   lra_reg_info[regno].biggest_mode);
     312                 :             :            nr++)
     313                 :             :         /* Just loop.  */
     314                 :           0 :         df_set_regs_ever_live (hard_regno + nr, true);
     315                 :             :     }
     316                 :           0 :   free (reserved_hard_regs);
     317                 :           0 :   return res;
     318                 :           0 : }
     319                 :             : 
     320                 :             : /* Add pseudo REGNO to slot SLOT_NUM.  */
     321                 :             : static void
     322                 :     1421750 : add_pseudo_to_slot (int regno, int slot_num)
     323                 :             : {
     324                 :     1421750 :   struct pseudo_slot *first;
     325                 :             : 
     326                 :             :   /* Each pseudo has an inherent size which comes from its own mode,
     327                 :             :      and a total size which provides room for paradoxical subregs.
     328                 :             :      We need to make sure the size and alignment of the slot are
     329                 :             :      sufficient for both.  */
     330                 :     2843500 :   machine_mode mode = wider_subreg_mode (PSEUDO_REGNO_MODE (regno),
     331                 :     1421750 :                                          lra_reg_info[regno].biggest_mode);
     332                 :     1421750 :   unsigned int align = spill_slot_alignment (mode);
     333                 :     1421750 :   slots[slot_num].align = MAX (slots[slot_num].align, align);
     334                 :     1421750 :   slots[slot_num].size = upper_bound (slots[slot_num].size,
     335                 :     1421750 :                                       GET_MODE_SIZE (mode));
     336                 :             : 
     337                 :     1421750 :   if (slots[slot_num].regno < 0)
     338                 :             :     {
     339                 :             :       /* It is the first pseudo in the slot.  */
     340                 :      768013 :       slots[slot_num].regno = regno;
     341                 :      768013 :       pseudo_slots[regno].first = &pseudo_slots[regno];
     342                 :      768013 :       pseudo_slots[regno].next = NULL;
     343                 :             :     }
     344                 :             :   else
     345                 :             :     {
     346                 :      653737 :       first = pseudo_slots[regno].first = &pseudo_slots[slots[slot_num].regno];
     347                 :      653737 :       pseudo_slots[regno].next = first->next;
     348                 :      653737 :       first->next = &pseudo_slots[regno];
     349                 :             :     }
     350                 :     1421750 :   pseudo_slots[regno].mem = NULL_RTX;
     351                 :     1421750 :   pseudo_slots[regno].slot_num = slot_num;
     352                 :     1421750 :   slots[slot_num].live_ranges
     353                 :     1421750 :     = lra_merge_live_ranges (slots[slot_num].live_ranges,
     354                 :             :                              lra_copy_live_range_list
     355                 :     1421750 :                              (lra_reg_info[regno].live_ranges));
     356                 :     1421750 : }
     357                 :             : 
     358                 :             : /* Assign stack slot numbers to pseudos in array PSEUDO_REGNOS of
     359                 :             :    length N.  Sort pseudos in PSEUDO_REGNOS for subsequent assigning
     360                 :             :    memory stack slots.  */
     361                 :             : static void
     362                 :      215997 : assign_stack_slot_num_and_sort_pseudos (int *pseudo_regnos, int n)
     363                 :             : {
     364                 :      215997 :   int i, j, regno;
     365                 :             : 
     366                 :             :   /* Assign stack slot numbers to spilled pseudos, use smaller numbers
     367                 :             :      for most frequently used pseudos.  */
     368                 :     1637747 :   for (i = 0; i < n; i++)
     369                 :             :     {
     370                 :     1421750 :       regno = pseudo_regnos[i];
     371                 :     1421750 :       if (! flag_ira_share_spill_slots)
     372                 :       27572 :         j = slots_num;
     373                 :             :       else
     374                 :             :         {
     375                 :     1394178 :           machine_mode mode
     376                 :     2788356 :             = wider_subreg_mode (PSEUDO_REGNO_MODE (regno),
     377                 :     1394178 :                                  lra_reg_info[regno].biggest_mode);
     378                 :    26373587 :           for (j = 0; j < slots_num; j++)
     379                 :    25633146 :             if (slots[j].hard_regno < 0
     380                 :             :                 /* Although it's possible to share slots between modes
     381                 :             :                    with constant and non-constant widths, we usually
     382                 :             :                    get better spill code by keeping the constant and
     383                 :             :                    non-constant areas separate.  */
     384                 :    25633146 :                 && (GET_MODE_SIZE (mode).is_constant ()
     385                 :             :                     == slots[j].size.is_constant ())
     386                 :    51266292 :                 && ! (lra_intersected_live_ranges_p
     387                 :    25633146 :                       (slots[j].live_ranges,
     388                 :    25633146 :                        lra_reg_info[regno].live_ranges)))
     389                 :             :               break;
     390                 :             :         }
     391                 :     1421750 :       if (j >= slots_num)
     392                 :             :         {
     393                 :             :           /* New slot.  */
     394                 :      768013 :           slots[j].live_ranges = NULL;
     395                 :      768013 :           slots[j].size = 0;
     396                 :      768013 :           slots[j].align = BITS_PER_UNIT;
     397                 :      768013 :           slots[j].regno = slots[j].hard_regno = -1;
     398                 :      768013 :           slots[j].mem = NULL_RTX;
     399                 :      768013 :           slots_num++;
     400                 :             :         }
     401                 :     1421750 :       add_pseudo_to_slot (regno, j);
     402                 :             :     }
     403                 :             :   /* Sort regnos according to their slot numbers.  */
     404                 :      215997 :   qsort (pseudo_regnos, n, sizeof (int), pseudo_reg_slot_compare);
     405                 :      215997 : }
     406                 :             : 
     407                 :             : /* Recursively process LOC in INSN and change spilled pseudos to the
     408                 :             :    corresponding memory or spilled hard reg.  Ignore spilled pseudos
     409                 :             :    created from the scratches.  Return true if the pseudo nrefs equal
     410                 :             :    to 0 (don't change the pseudo in this case).  Otherwise return false.  */
     411                 :             : static bool
     412                 :    33671359 : remove_pseudos (rtx *loc, rtx_insn *insn)
     413                 :             : {
     414                 :    33671359 :   int i;
     415                 :    33671359 :   rtx hard_reg;
     416                 :    33671359 :   const char *fmt;
     417                 :    33671359 :   enum rtx_code code;
     418                 :    33671359 :   bool res = false;
     419                 :             : 
     420                 :    33671359 :   if (*loc == NULL_RTX)
     421                 :             :     return res;
     422                 :    30933636 :   code = GET_CODE (*loc);
     423                 :    30933636 :   if (code == SUBREG && REG_P (SUBREG_REG (*loc)))
     424                 :             :     {
     425                 :             :       /* Try to remove memory subregs to simplify LRA job
     426                 :             :          and avoid LRA cycling in case of subreg memory reload.  */
     427                 :      267957 :       res = remove_pseudos (&SUBREG_REG (*loc), insn);
     428                 :      267957 :       if (GET_CODE (SUBREG_REG (*loc)) == MEM)
     429                 :             :         {
     430                 :      203973 :           alter_subreg (loc, false);
     431                 :      203973 :           if (GET_CODE (*loc) == MEM)
     432                 :             :             {
     433                 :      203973 :               lra_update_insn_recog_data (insn);
     434                 :      203973 :               if (lra_dump_file != NULL)
     435                 :           0 :                 fprintf (lra_dump_file,
     436                 :             :                          "Memory subreg was simplified in insn #%u\n",
     437                 :           0 :                          INSN_UID (insn));
     438                 :             :             }
     439                 :             :         }
     440                 :      267957 :       return res;
     441                 :             :     }
     442                 :    14257801 :   else if (code == REG && (i = REGNO (*loc)) >= FIRST_PSEUDO_REGISTER
     443                 :     8617913 :       && lra_get_regno_hard_regno (i) < 0
     444                 :             :       /* We do not want to assign memory for former scratches because
     445                 :             :          it might result in an address reload for some targets.  In
     446                 :             :          any case we transform such pseudos not getting hard registers
     447                 :             :          into scratches back.  */
     448                 :    35579097 :       && ! ira_former_scratch_p (i))
     449                 :             :     {
     450                 :     4913418 :       if (lra_reg_info[i].nrefs == 0
     451                 :       23176 :           && pseudo_slots[i].mem == NULL && spill_hard_reg[i] == NULL)
     452                 :             :         return true;
     453                 :     4913418 :       if ((hard_reg = spill_hard_reg[i]) != NULL_RTX)
     454                 :           0 :         *loc = copy_rtx (hard_reg);
     455                 :     4913418 :       else if (pseudo_slots[i].mem != NULL_RTX)
     456                 :             :         /* There might be no memory slot or hard reg for a pseudo when we spill
     457                 :             :            the frame pointer after elimination of frame pointer to stack
     458                 :             :            pointer became impossible.  */
     459                 :             :         {
     460                 :     9826836 :           rtx x = lra_eliminate_regs_1 (insn, pseudo_slots[i].mem,
     461                 :     4913418 :                                         GET_MODE (pseudo_slots[i].mem),
     462                 :     4913418 :                                         false, false, 0, true);
     463                 :     4913418 :           *loc = x != pseudo_slots[i].mem ? x : copy_rtx (x);
     464                 :             :         }
     465                 :     4913418 :       return res;
     466                 :             :     }
     467                 :             : 
     468                 :    25752261 :   fmt = GET_RTX_FORMAT (code);
     469                 :    62109370 :   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
     470                 :             :     {
     471                 :    36357109 :       if (fmt[i] == 'e')
     472                 :    25605246 :         res = remove_pseudos (&XEXP (*loc, i), insn) || res;
     473                 :    10751863 :       else if (fmt[i] == 'E')
     474                 :             :         {
     475                 :      101961 :           int j;
     476                 :             : 
     477                 :      317426 :           for (j = XVECLEN (*loc, i) - 1; j >= 0; j--)
     478                 :      215465 :             res = remove_pseudos (&XVECEXP (*loc, i, j), insn) || res;
     479                 :             :         }
     480                 :             :     }
     481                 :             :   return res;
     482                 :             : }
     483                 :             : 
     484                 :             : /* Convert spilled pseudos into their stack slots or spill hard regs,
     485                 :             :    put insns to process on the constraint stack (that is all insns in
     486                 :             :    which pseudos were changed to memory or spill hard regs).   */
     487                 :             : static void
     488                 :      215997 : spill_pseudos (void)
     489                 :             : {
     490                 :      215997 :   basic_block bb;
     491                 :      215997 :   rtx_insn *insn, *curr;
     492                 :      215997 :   int i;
     493                 :             : 
     494                 :      215997 :   auto_bitmap spilled_pseudos (&reg_obstack);
     495                 :      215997 :   auto_bitmap changed_insns (&reg_obstack);
     496                 :    34783305 :   for (i = FIRST_PSEUDO_REGISTER; i < regs_num; i++)
     497                 :             :     {
     498                 :    17755457 :       if (lra_reg_info[i].nrefs != 0 && lra_get_regno_hard_regno (i) < 0
     499                 :    35992421 :           && ! ira_former_scratch_p (i))
     500                 :             :         {
     501                 :     1421750 :           bitmap_set_bit (spilled_pseudos, i);
     502                 :     1421750 :           bitmap_ior_into (changed_insns, &lra_reg_info[i].insn_bitmap);
     503                 :             :         }
     504                 :             :     }
     505                 :     6778479 :   FOR_EACH_BB_FN (bb, cfun)
     506                 :             :     {
     507                 :   192951926 :       FOR_BB_INSNS_SAFE (bb, insn, curr)
     508                 :             :         {
     509                 :    89913481 :           bool removed_pseudo_p = false;
     510                 :             : 
     511                 :    89913481 :           if (bitmap_bit_p (changed_insns, INSN_UID (insn)))
     512                 :             :             {
     513                 :     4844968 :               rtx *link_loc, link;
     514                 :             : 
     515                 :     4844968 :               removed_pseudo_p = remove_pseudos (&PATTERN (insn), insn);
     516                 :     4844968 :               if (CALL_P (insn)
     517                 :     4844968 :                   && remove_pseudos (&CALL_INSN_FUNCTION_USAGE (insn), insn))
     518                 :             :                 removed_pseudo_p = true;
     519                 :     4844968 :               for (link_loc = &REG_NOTES (insn);
     520                 :     8162974 :                    (link = *link_loc) != NULL_RTX;
     521                 :     3318006 :                    link_loc = &XEXP (link, 1))
     522                 :             :                 {
     523                 :     3318006 :                   switch (REG_NOTE_KIND (link))
     524                 :             :                     {
     525                 :           0 :                     case REG_FRAME_RELATED_EXPR:
     526                 :           0 :                     case REG_CFA_DEF_CFA:
     527                 :           0 :                     case REG_CFA_ADJUST_CFA:
     528                 :           0 :                     case REG_CFA_OFFSET:
     529                 :           0 :                     case REG_CFA_REGISTER:
     530                 :           0 :                     case REG_CFA_EXPRESSION:
     531                 :           0 :                     case REG_CFA_RESTORE:
     532                 :           0 :                     case REG_CFA_SET_VDRAP:
     533                 :           0 :                       if (remove_pseudos (&XEXP (link, 0), insn))
     534                 :     3318006 :                         removed_pseudo_p = true;
     535                 :             :                       break;
     536                 :             :                     default:
     537                 :             :                       break;
     538                 :             :                     }
     539                 :             :                 }
     540                 :     4844968 :               if (GET_CODE (PATTERN (insn)) == CLOBBER)
     541                 :             :                 /* This is a CLOBBER insn with pseudo spilled to memory.
     542                 :             :                    Mark it for removing it later together with LRA temporary
     543                 :             :                    CLOBBER insns.  */
     544                 :        6856 :                 LRA_TEMP_CLOBBER_P (PATTERN (insn)) = 1;
     545                 :     4844968 :               if (lra_dump_file != NULL)
     546                 :           6 :                 fprintf (lra_dump_file,
     547                 :             :                          "Changing spilled pseudos to memory in insn #%u\n",
     548                 :           6 :                          INSN_UID (insn));
     549                 :     4844968 :               lra_push_insn (insn);
     550                 :     4844968 :               if (lra_reg_spill_p || targetm.different_addr_displacement_p ())
     551                 :           0 :                 lra_set_used_insn_alternative (insn, LRA_UNKNOWN_ALT);
     552                 :             :             }
     553                 :    85068513 :           else if (CALL_P (insn)
     554                 :             :                    /* Presence of any pseudo in CALL_INSN_FUNCTION_USAGE
     555                 :             :                       does not affect value of insn_bitmap of the
     556                 :             :                       corresponding lra_reg_info.  That is because we
     557                 :             :                       don't need to reload pseudos in
     558                 :             :                       CALL_INSN_FUNCTION_USAGEs.  So if we process only
     559                 :             :                       insns in the insn_bitmap of given pseudo here, we
     560                 :             :                       can miss the pseudo in some
     561                 :             :                       CALL_INSN_FUNCTION_USAGEs.  */
     562                 :    85068513 :                    && remove_pseudos (&CALL_INSN_FUNCTION_USAGE (insn), insn))
     563                 :             :             removed_pseudo_p = true;
     564                 :     4844968 :           if (removed_pseudo_p)
     565                 :             :             {
     566                 :           0 :               lra_assert (DEBUG_INSN_P (insn));
     567                 :           0 :               lra_invalidate_insn_data (insn);
     568                 :           0 :               INSN_VAR_LOCATION_LOC (insn) = gen_rtx_UNKNOWN_VAR_LOC ();
     569                 :           0 :               if (lra_dump_file != NULL)
     570                 :           0 :                 fprintf (lra_dump_file,
     571                 :             :                          "Debug insn #%u is reset because it referenced "
     572                 :           0 :                          "removed pseudo\n", INSN_UID (insn));
     573                 :             :             }
     574                 :    89913481 :           bitmap_and_compl_into (df_get_live_in (bb), spilled_pseudos);
     575                 :    89913481 :           bitmap_and_compl_into (df_get_live_out (bb), spilled_pseudos);
     576                 :             :         }
     577                 :             :     }
     578                 :      215997 : }
     579                 :             : 
     580                 :             : /* Return true if we need scratch reg assignments.  */
     581                 :             : bool
     582                 :         331 : lra_need_for_scratch_reg_p (void)
     583                 :             : {
     584                 :         331 :   int i; max_regno = max_reg_num ();
     585                 :             : 
     586                 :       17936 :   for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++)
     587                 :        6534 :     if (lra_reg_info[i].nrefs != 0 && lra_get_regno_hard_regno (i) < 0
     588                 :       17605 :         && ira_former_scratch_p (i))
     589                 :             :       return true;
     590                 :             :   return false;
     591                 :             : }
     592                 :             : 
     593                 :             : /* Return true if we need to change some pseudos into memory.  */
     594                 :             : bool
     595                 :     1633667 : lra_need_for_spills_p (void)
     596                 :             : {
     597                 :     1633667 :   int i;
     598                 :             : 
     599                 :     1633667 :   max_regno = max_reg_num ();
     600                 :    86313493 :   for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++)
     601                 :    38632691 :     if (lra_reg_info[i].nrefs != 0 && lra_get_regno_hard_regno (i) < 0
     602                 :    85121477 :         && ! ira_former_scratch_p (i))
     603                 :             :       return true;
     604                 :             :   return false;
     605                 :             : }
     606                 :             : 
     607                 :             : /* Change spilled pseudos into memory or spill hard regs.  Put changed
     608                 :             :    insns on the constraint stack (these insns will be considered on
     609                 :             :    the next constraint pass).  The changed insns are all insns in
     610                 :             :    which pseudos were changed.  */
     611                 :             : void
     612                 :      215997 : lra_spill (void)
     613                 :             : {
     614                 :      215997 :   int i, n, n2, curr_regno;
     615                 :      215997 :   int *pseudo_regnos;
     616                 :             : 
     617                 :      215997 :   regs_num = max_reg_num ();
     618                 :      215997 :   spill_hard_reg = XNEWVEC (rtx, regs_num);
     619                 :      215997 :   pseudo_regnos = XNEWVEC (int, regs_num);
     620                 :    34999302 :   for (n = 0, i = FIRST_PSEUDO_REGISTER; i < regs_num; i++)
     621                 :    17755457 :     if (lra_reg_info[i].nrefs != 0 && lra_get_regno_hard_regno (i) < 0
     622                 :             :         /* We do not want to assign memory for former scratches.  */
     623                 :    35992421 :         && ! ira_former_scratch_p (i))
     624                 :     1421750 :       pseudo_regnos[n++] = i;
     625                 :      215997 :   lra_assert (n > 0);
     626                 :      215997 :   pseudo_slots = XNEWVEC (struct pseudo_slot, regs_num);
     627                 :    34783305 :   for (i = FIRST_PSEUDO_REGISTER; i < regs_num; i++)
     628                 :             :     {
     629                 :    34567308 :       spill_hard_reg[i] = NULL_RTX;
     630                 :    34567308 :       pseudo_slots[i].mem = NULL_RTX;
     631                 :             :     }
     632                 :      215997 :   slots = XNEWVEC (class slot, regs_num);
     633                 :             :   /* Sort regnos according their usage frequencies.  */
     634                 :      215997 :   qsort (pseudo_regnos, n, sizeof (int), regno_freq_compare);
     635                 :      215997 :   n = assign_spill_hard_regs (pseudo_regnos, n);
     636                 :      215997 :   slots_num = 0;
     637                 :      215997 :   assign_stack_slot_num_and_sort_pseudos (pseudo_regnos, n);
     638                 :     1853744 :   for (i = 0; i < n; i++)
     639                 :     1421750 :     if (pseudo_slots[pseudo_regnos[i]].mem == NULL_RTX)
     640                 :     1421750 :       assign_mem_slot (pseudo_regnos[i]);
     641                 :      215997 :   if ((n2 = lra_update_fp2sp_elimination (pseudo_regnos)) > 0)
     642                 :             :     {
     643                 :             :       /* Assign stack slots to spilled pseudos assigned to fp.  */
     644                 :           0 :       assign_stack_slot_num_and_sort_pseudos (pseudo_regnos, n2);
     645                 :           0 :       for (i = 0; i < n2; i++)
     646                 :           0 :         if (pseudo_slots[pseudo_regnos[i]].mem == NULL_RTX)
     647                 :           0 :           assign_mem_slot (pseudo_regnos[i]);
     648                 :             :     }
     649                 :      215997 :   if (n + n2 > 0 && crtl->stack_alignment_needed)
     650                 :             :     /* If we have a stack frame, we must align it now.  The stack size
     651                 :             :        may be a part of the offset computation for register
     652                 :             :        elimination.  */
     653                 :      215997 :     assign_stack_local (BLKmode, 0, crtl->stack_alignment_needed);
     654                 :      215997 :   if (lra_dump_file != NULL)
     655                 :             :     {
     656                 :           3 :       for (i = 0; i < slots_num; i++)
     657                 :             :         {
     658                 :           2 :           fprintf (lra_dump_file, "  Slot %d regnos (width = ", i);
     659                 :           2 :           print_dec (GET_MODE_SIZE (GET_MODE (slots[i].mem)),
     660                 :             :                      lra_dump_file, SIGNED);
     661                 :           2 :           fprintf (lra_dump_file, "):");
     662                 :           2 :           for (curr_regno = slots[i].regno;;
     663                 :           0 :                curr_regno = pseudo_slots[curr_regno].next - pseudo_slots)
     664                 :             :             {
     665                 :           2 :               fprintf (lra_dump_file, "     %d", curr_regno);
     666                 :           2 :               if (pseudo_slots[curr_regno].next == NULL)
     667                 :             :                 break;
     668                 :             :             }
     669                 :           2 :           fprintf (lra_dump_file, "\n");
     670                 :             :         }
     671                 :             :     }
     672                 :      215997 :   spill_pseudos ();
     673                 :      215997 :   free (slots);
     674                 :      215997 :   free (pseudo_slots);
     675                 :      215997 :   free (pseudo_regnos);
     676                 :      215997 :   free (spill_hard_reg);
     677                 :      215997 : }
     678                 :             : 
     679                 :             : /* Apply alter_subreg for subregs of regs in *LOC.  Use FINAL_P for
     680                 :             :    alter_subreg calls. Return true if any subreg of reg is
     681                 :             :    processed.  */
     682                 :             : static bool
     683                 :   324233973 : alter_subregs (rtx *loc, bool final_p)
     684                 :             : {
     685                 :   324233973 :   int i;
     686                 :   324233973 :   rtx x = *loc;
     687                 :   324233973 :   bool res;
     688                 :   324233973 :   const char *fmt;
     689                 :   324233973 :   enum rtx_code code;
     690                 :             : 
     691                 :   324233973 :   if (x == NULL_RTX)
     692                 :             :     return false;
     693                 :   324233973 :   code = GET_CODE (x);
     694                 :   324233973 :   if (code == SUBREG && REG_P (SUBREG_REG (x)))
     695                 :             :     {
     696                 :     2939293 :       lra_assert (REGNO (SUBREG_REG (x)) < FIRST_PSEUDO_REGISTER);
     697                 :     2939293 :       alter_subreg (loc, final_p);
     698                 :     2939293 :       return true;
     699                 :             :     }
     700                 :   321294680 :   fmt = GET_RTX_FORMAT (code);
     701                 :   321294680 :   res = false;
     702                 :   770818575 :   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
     703                 :             :     {
     704                 :   449523895 :       if (fmt[i] == 'e')
     705                 :             :         {
     706                 :   110214306 :           if (alter_subregs (&XEXP (x, i), final_p))
     707                 :   449523895 :             res = true;
     708                 :             :         }
     709                 :   339309589 :       else if (fmt[i] == 'E')
     710                 :             :         {
     711                 :      469669 :           int j;
     712                 :             : 
     713                 :     2135729 :           for (j = XVECLEN (x, i) - 1; j >= 0; j--)
     714                 :     1666060 :             if (alter_subregs (&XVECEXP (x, i, j), final_p))
     715                 :         416 :               res = true;
     716                 :             :         }
     717                 :             :     }
     718                 :             :   return res;
     719                 :             : }
     720                 :             : 
     721                 :             : /* Final change of pseudos got hard registers into the corresponding
     722                 :             :    hard registers and removing temporary clobbers.  */
     723                 :             : void
     724                 :     1415660 : lra_final_code_change (void)
     725                 :             : {
     726                 :     1415660 :   int i, hard_regno;
     727                 :     1415660 :   basic_block bb;
     728                 :     1415660 :   rtx_insn *insn, *curr;
     729                 :     1415660 :   rtx set;
     730                 :     1415660 :   int max_regno = max_reg_num ();
     731                 :             : 
     732                 :    74920842 :   for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++)
     733                 :    72089522 :     if (lra_reg_info[i].nrefs != 0
     734                 :   105653881 :         && (hard_regno = lra_get_regno_hard_regno (i)) >= 0)
     735                 :    33559014 :       SET_REGNO (regno_reg_rtx[i], hard_regno);
     736                 :    14976834 :   FOR_EACH_BB_FN (bb, cfun)
     737                 :   338384594 :     FOR_BB_INSNS_SAFE (bb, insn, curr)
     738                 :   155631123 :       if (INSN_P (insn))
     739                 :             :         {
     740                 :   128890490 :           rtx pat = PATTERN (insn);
     741                 :             : 
     742                 :   128890490 :           if (GET_CODE (pat) == USE && XEXP (pat, 0) == const1_rtx)
     743                 :             :             {
     744                 :             :               /* Remove markers to eliminate critical edges for jump insn
     745                 :             :                  output reloads (see code in ira.cc::ira).  */
     746                 :          11 :               lra_invalidate_insn_data (insn);
     747                 :          11 :               delete_insn (insn);
     748                 :          11 :               continue;
     749                 :             :             }
     750                 :   128890479 :           if (GET_CODE (pat) == CLOBBER && LRA_TEMP_CLOBBER_P (pat))
     751                 :             :             {
     752                 :             :               /* Remove clobbers temporarily created in LRA.  We don't
     753                 :             :                  need them anymore and don't want to waste compiler
     754                 :             :                  time processing them in a few subsequent passes.  */
     755                 :      133852 :               lra_invalidate_insn_data (insn);
     756                 :      133852 :               delete_insn (insn);
     757                 :      133852 :               continue;
     758                 :             :             }
     759                 :             : 
     760                 :             :           /* IRA can generate move insns involving pseudos.  It is
     761                 :             :              better remove them earlier to speed up compiler a bit.
     762                 :             :              It is also better to do it here as they might not pass
     763                 :             :              final RTL check in LRA, (e.g. insn moving a control
     764                 :             :              register into itself).  So remove an useless move insn
     765                 :             :              unless next insn is USE marking the return reg (we should
     766                 :             :              save this as some subsequent optimizations assume that
     767                 :             :              such original insns are saved).  */
     768                 :    74849754 :           if (NONJUMP_INSN_P (insn) && GET_CODE (pat) == SET
     769                 :    63400306 :               && REG_P (SET_SRC (pat)) && REG_P (SET_DEST (pat))
     770                 :    16428345 :               && REGNO (SET_SRC (pat)) == REGNO (SET_DEST (pat))
     771                 :   138933000 :               && REGNO (SET_SRC (pat)) >= FIRST_PSEUDO_REGISTER)
     772                 :             :             {
     773                 :           0 :               lra_invalidate_insn_data (insn);
     774                 :           0 :               delete_insn (insn);
     775                 :           0 :               continue;
     776                 :             :             }
     777                 :             : 
     778                 :   128756627 :           lra_insn_recog_data_t id = lra_get_insn_recog_data (insn);
     779                 :   128756627 :           struct lra_insn_reg *reg;
     780                 :             : 
     781                 :   273664076 :           for (reg = id->regs; reg != NULL; reg = reg->next)
     782                 :   144907704 :             if (reg->regno >= FIRST_PSEUDO_REGISTER
     783                 :    94906382 :                 && lra_reg_info [reg->regno].nrefs == 0)
     784                 :             :               break;
     785                 :             : 
     786                 :   128756627 :           if (reg != NULL)
     787                 :             :             {
     788                 :             :               /* Pseudos still can be in debug insns in some very rare
     789                 :             :                  and complicated cases, e.g. the pseudo was removed by
     790                 :             :                  inheritance and the debug insn is not EBBs where the
     791                 :             :                  inheritance happened.  It is difficult and time
     792                 :             :                  consuming to find what hard register corresponds the
     793                 :             :                  pseudo -- so just remove the debug insn.  Another
     794                 :             :                  solution could be assigning hard reg/memory but it
     795                 :             :                  would be a misleading info.  It is better not to have
     796                 :             :                  info than have it wrong.  */
     797                 :         255 :               lra_assert (DEBUG_INSN_P (insn));
     798                 :         255 :               lra_invalidate_insn_data (insn);
     799                 :         255 :               delete_insn (insn);
     800                 :         255 :               continue;
     801                 :             :             }
     802                 :             : 
     803                 :   128756372 :           struct lra_static_insn_data *static_id = id->insn_static_data;
     804                 :   128756372 :           bool insn_change_p = false;
     805                 :             : 
     806                 :   347346048 :           for (i = id->insn_static_data->n_operands - 1; i >= 0; i--)
     807                 :   188463271 :             if ((DEBUG_INSN_P (insn) || ! static_id->operand[i].is_operator)
     808                 :   400040878 :                 && alter_subregs (id->operand_loc[i], ! DEBUG_INSN_P (insn)))
     809                 :             :               {
     810                 :     2937581 :                 lra_update_dup (id, i);
     811                 :     2937581 :                 insn_change_p = true;
     812                 :             :               }
     813                 :   128756372 :           if ((GET_CODE (pat) == USE || GET_CODE (pat) == CLOBBER)
     814                 :   128756372 :               && alter_subregs (&XEXP (pat, 0), false))
     815                 :             :             insn_change_p = true;
     816                 :   128756372 :           if (insn_change_p)
     817                 :     2602888 :             lra_update_operator_dups (id);
     818                 :             : 
     819                 :   128756372 :           if ((set = single_set (insn)) != NULL
     820                 :    83742417 :               && REG_P (SET_SRC (set)) && REG_P (SET_DEST (set))
     821                 :   146183727 :               && REGNO (SET_SRC (set)) == REGNO (SET_DEST (set)))
     822                 :             :             {
     823                 :             :               /* Remove an useless move insn.  IRA can generate move
     824                 :             :                  insns involving pseudos.  It is better remove them
     825                 :             :                  earlier to speed up compiler a bit.  It is also
     826                 :             :                  better to do it here as they might not pass final RTL
     827                 :             :                  check in LRA, (e.g. insn moving a control register
     828                 :             :                  into itself).  */
     829                 :    10505318 :               lra_invalidate_insn_data (insn);
     830                 :    10505318 :               delete_insn (insn);
     831                 :             :             }
     832                 :             :         }
     833                 :     1415660 : }
        

Generated by: LCOV version 2.1-beta

LCOV profile is generated on x86_64 machine using following configure options: configure --disable-bootstrap --enable-coverage=opt --enable-languages=c,c++,fortran,go,jit,lto,rust,m2 --enable-host-shared. GCC test suite is run with the built compiler.