LCOV - code coverage report
Current view: top level - gcc - lra-lives.cc (source / functions) Coverage Total Hit
Test: gcc.info Lines: 94.7 % 720 682
Test Date: 2026-02-28 14:20:25 Functions: 83.3 % 42 35
Legend: Lines:     hit not hit

            Line data    Source code
       1              : /* Build live ranges for pseudos.
       2              :    Copyright (C) 2010-2026 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 to build pseudo live-ranges (analogous
      23              :    structures used in IRA, so read comments about the live-ranges
      24              :    there) and other info necessary for other passes to assign
      25              :    hard-registers to pseudos, coalesce the spilled pseudos, and assign
      26              :    stack memory slots to spilled pseudos.  */
      27              : 
      28              : #include "config.h"
      29              : #include "system.h"
      30              : #include "coretypes.h"
      31              : #include "backend.h"
      32              : #include "rtl.h"
      33              : #include "tree.h"
      34              : #include "predict.h"
      35              : #include "df.h"
      36              : #include "memmodel.h"
      37              : #include "tm_p.h"
      38              : #include "insn-config.h"
      39              : #include "regs.h"
      40              : #include "ira.h"
      41              : #include "ira-int.h"
      42              : #include "recog.h"
      43              : #include "cfganal.h"
      44              : #include "sparseset.h"
      45              : #include "lra-int.h"
      46              : #include "target.h"
      47              : #include "function-abi.h"
      48              : 
      49              : /* Program points are enumerated by numbers from range
      50              :    0..LRA_LIVE_MAX_POINT-1.  There are approximately two times more
      51              :    program points than insns.  Program points are places in the
      52              :    program where liveness info can be changed.  In most general case
      53              :    (there are more complicated cases too) some program points
      54              :    correspond to places where input operand dies and other ones
      55              :    correspond to places where output operands are born.  */
      56              : int lra_live_max_point;
      57              : 
      58              : /* Accumulated execution frequency of all references for each hard
      59              :    register.  */
      60              : int lra_hard_reg_usage[FIRST_PSEUDO_REGISTER];
      61              : 
      62              : /* A global flag whose true value says to build live ranges for all
      63              :    pseudos, otherwise the live ranges only for pseudos got memory is
      64              :    build.  True value means also building copies and setting up hard
      65              :    register preferences.  The complete info is necessary for
      66              :    assignment, rematerialization and spill to register passes.  The
      67              :    complete info is not needed for the coalescing and spill to memory
      68              :    passes.  */
      69              : static bool complete_info_p;
      70              : 
      71              : /* Pseudos live at current point in the RTL scan.  */
      72              : static sparseset pseudos_live;
      73              : 
      74              : /* Pseudos probably living through calls and setjumps.  As setjump is
      75              :    a call too, if a bit in PSEUDOS_LIVE_THROUGH_SETJUMPS is set up
      76              :    then the corresponding bit in PSEUDOS_LIVE_THROUGH_CALLS is set up
      77              :    too.  These data are necessary for cases when only one subreg of a
      78              :    multi-reg pseudo is set up after a call.  So we decide it is
      79              :    probably live when traversing bb backward.  We are sure about
      80              :    living when we see its usage or definition of the pseudo.  */
      81              : static sparseset pseudos_live_through_calls;
      82              : static sparseset pseudos_live_through_setjumps;
      83              : 
      84              : /* Set of hard regs (except eliminable ones) currently live.  */
      85              : static HARD_REG_SET hard_regs_live;
      86              : 
      87              : /* Set of pseudos and hard registers start living/dying in the current
      88              :    insn.  These sets are used to update REG_DEAD and REG_UNUSED notes
      89              :    in the insn.  */
      90              : static sparseset start_living, start_dying;
      91              : 
      92              : /* Set of pseudos and hard regs dead and unused in the current
      93              :    insn.  */
      94              : static sparseset unused_set, dead_set;
      95              : 
      96              : /* Bitmap used for holding intermediate bitmap operation results.  */
      97              : static bitmap_head temp_bitmap;
      98              : 
      99              : /* Pool for pseudo live ranges.  */
     100              : static object_allocator<lra_live_range> lra_live_range_pool ("live ranges");
     101              : 
     102              : /* Free live range list LR.  */
     103              : static void
     104    323866249 : free_live_range_list (lra_live_range_t lr)
     105              : {
     106    323866249 :   lra_live_range_t next;
     107              : 
     108    425754369 :   while (lr != NULL)
     109              :     {
     110    101888120 :       next = lr->next;
     111    101888120 :       lra_live_range_pool.remove (lr);
     112    101888120 :       lr = next;
     113              :     }
     114    323866249 : }
     115              : 
     116              : /* Reset and release live range list LR.  */
     117              : void
     118            0 : lra_reset_live_range_list (lra_live_range_t &lr)
     119              : {
     120            0 :   lra_live_range_t first = lr;
     121            0 :   lr = NULL;
     122            0 :   free_live_range_list (first);
     123            0 : }
     124              : 
     125              : /* Create and return pseudo live range with given attributes.  */
     126              : static lra_live_range_t
     127    112331805 : create_live_range (int regno, int start, int finish, lra_live_range_t next)
     128              : {
     129            0 :   lra_live_range_t p = lra_live_range_pool.allocate ();
     130    112331805 :   p->regno = regno;
     131    112331805 :   p->start = start;
     132    112331805 :   p->finish = finish;
     133    112331805 :   p->next = next;
     134    112331805 :   return p;
     135              : }
     136              : 
     137              : /* Copy live range R and return the result.  */
     138              : static lra_live_range_t
     139      2120167 : copy_live_range (lra_live_range_t r)
     140              : {
     141      2120167 :   return new (lra_live_range_pool) lra_live_range (*r);
     142              : }
     143              : 
     144              : /* Copy live range list given by its head R and return the result.  */
     145              : lra_live_range_t
     146      1421708 : lra_copy_live_range_list (lra_live_range_t r)
     147              : {
     148      1421708 :   lra_live_range_t p, first, *chain;
     149              : 
     150      1421708 :   first = NULL;
     151      3541875 :   for (chain = &first; r != NULL; r = r->next)
     152              :     {
     153      2120167 :       p = copy_live_range (r);
     154      2120167 :       *chain = p;
     155      2120167 :       chain = &p->next;
     156              :     }
     157      1421708 :   return first;
     158              : }
     159              : 
     160              : /* Merge *non-intersected* ranges R1 and R2 and returns the result.
     161              :    The function maintains the order of ranges and tries to minimize
     162              :    size of the result range list.  Ranges R1 and R2 may not be used
     163              :    after the call.  */
     164              : lra_live_range_t
     165      1421708 : lra_merge_live_ranges (lra_live_range_t r1, lra_live_range_t r2)
     166              : {
     167      1421708 :   lra_live_range_t first, last;
     168              : 
     169      1421708 :   if (r1 == NULL)
     170              :     return r2;
     171       665244 :   if (r2 == NULL)
     172              :     return r1;
     173      5849398 :   for (first = last = NULL; r1 != NULL && r2 != NULL;)
     174              :     {
     175      5184154 :       if (r1->start < r2->start)
     176       411370 :         std::swap (r1, r2);
     177              : 
     178      5184154 :       if (r1->start == r2->finish + 1)
     179              :         {
     180              :           /* Joint ranges: merge r1 and r2 into r1.  */
     181        41658 :           r1->start = r2->start;
     182        41658 :           lra_live_range_t temp = r2;
     183        41658 :           r2 = r2->next;
     184        41658 :           lra_live_range_pool.remove (temp);
     185              :         }
     186              :       else
     187              :         {
     188      5142496 :           gcc_assert (r2->finish + 1 < r1->start);
     189              :           /* Add r1 to the result.  */
     190      5142496 :           if (first == NULL)
     191              :             first = last = r1;
     192              :           else
     193              :             {
     194      4480402 :               last->next = r1;
     195      4480402 :               last = r1;
     196              :             }
     197      5142496 :           r1 = r1->next;
     198              :         }
     199              :     }
     200       665244 :   if (r1 != NULL)
     201              :     {
     202        13457 :       if (first == NULL)
     203              :         first = r1;
     204              :       else
     205        10307 :         last->next = r1;
     206              :     }
     207              :   else
     208              :     {
     209       651787 :       lra_assert (r2 != NULL);
     210       651787 :       if (first == NULL)
     211              :         first = r2;
     212              :       else
     213       651787 :         last->next = r2;
     214              :     }
     215              :   return first;
     216              : }
     217              : 
     218              : /* Return TRUE if live ranges R1 and R2 intersect.  */
     219              : bool
     220     25912653 : lra_intersected_live_ranges_p (lra_live_range_t r1, lra_live_range_t r2)
     221              : {
     222              :   /* Remember the live ranges are always kept ordered.  */
     223     45003957 :   while (r1 != NULL && r2 != NULL)
     224              :     {
     225     44336504 :       if (r1->start > r2->finish)
     226     17481891 :         r1 = r1->next;
     227     26854613 :       else if (r2->start > r1->finish)
     228      1609413 :         r2 = r2->next;
     229              :       else
     230              :         return true;
     231              :     }
     232              :   return false;
     233              : }
     234              : 
     235              : enum point_type {
     236              :   DEF_POINT,
     237              :   USE_POINT
     238              : };
     239              : 
     240              : /* Return TRUE if set A contains a pseudo register, otherwise, return FALSE.  */
     241              : static bool
     242    793765790 : sparseset_contains_pseudos_p (sparseset a)
     243              : {
     244    793765790 :   int regno;
     245    934300630 :   EXECUTE_IF_SET_IN_SPARSESET (a, regno)
     246    339240983 :     if (!HARD_REGISTER_NUM_P (regno))
     247              :       return true;
     248              :   return false;
     249              : }
     250              : 
     251              : /* Mark pseudo REGNO as living or dying at program point POINT, depending on
     252              :    whether TYPE is a definition or a use.  If this is the first reference to
     253              :    REGNO that we've encountered, then create a new live range for it.  */
     254              : 
     255              : static void
     256   1293507464 : update_pseudo_point (int regno, int point, enum point_type type)
     257              : {
     258   1293507464 :   lra_live_range_t p;
     259              : 
     260              :   /* Don't compute points for hard registers.  */
     261   1293507464 :   if (HARD_REGISTER_NUM_P (regno))
     262              :     return;
     263              : 
     264   1177606440 :   if (complete_info_p || lra_get_regno_hard_regno (regno) < 0)
     265              :     {
     266   1165937555 :       if (type == DEF_POINT)
     267              :         {
     268    502326983 :           if (sparseset_bit_p (pseudos_live, regno))
     269              :             {
     270    502326983 :               p = lra_reg_info[regno].live_ranges;
     271    502326983 :               lra_assert (p != NULL);
     272    502326983 :               p->finish = point;
     273              :             }
     274              :         }
     275              :       else /* USE_POINT */
     276              :         {
     277    663610572 :           if (!sparseset_bit_p (pseudos_live, regno)
     278    663610572 :               && ((p = lra_reg_info[regno].live_ranges) == NULL
     279    413973190 :                   || (p->finish != point && p->finish + 1 != point)))
     280    112331805 :             lra_reg_info[regno].live_ranges
     281    112331805 :               = create_live_range (regno, point, -1, p);
     282              :         }
     283              :     }
     284              : }
     285              : 
     286              : /* The corresponding bitmaps of BB currently being processed.  */
     287              : static bitmap bb_killed_pseudos, bb_gen_pseudos;
     288              : 
     289              : /* Record hard register REGNO as now being live.  It updates
     290              :    living hard regs and START_LIVING.  */
     291              : static void
     292    234755874 : make_hard_regno_live (int regno)
     293              : {
     294    234755874 :   lra_assert (HARD_REGISTER_NUM_P (regno));
     295    234755874 :   if (TEST_HARD_REG_BIT (hard_regs_live, regno)
     296    234755874 :       || TEST_HARD_REG_BIT (eliminable_regset, regno))
     297              :     return;
     298    128472003 :   SET_HARD_REG_BIT (hard_regs_live, regno);
     299    128472003 :   sparseset_set_bit (start_living, regno);
     300    128472003 :   if (fixed_regs[regno] || TEST_HARD_REG_BIT (hard_regs_spilled_into, regno))
     301     74947299 :     bitmap_set_bit (bb_gen_pseudos, regno);
     302              : }
     303              : 
     304              : /* Process the definition of hard register REGNO.  This updates
     305              :    hard_regs_live, START_DYING and conflict hard regs for living
     306              :    pseudos.  */
     307              : static void
     308    126786091 : make_hard_regno_dead (int regno)
     309              : {
     310    126786091 :   if (TEST_HARD_REG_BIT (eliminable_regset, regno))
     311              :     return;
     312              : 
     313    126785188 :   lra_assert (HARD_REGISTER_NUM_P (regno));
     314    126785188 :   unsigned int i;
     315   1311920543 :   EXECUTE_IF_SET_IN_SPARSESET (pseudos_live, i)
     316   1185135355 :     SET_HARD_REG_BIT (lra_reg_info[i].conflict_hard_regs, regno);
     317              : 
     318    126785188 :   if (! TEST_HARD_REG_BIT (hard_regs_live, regno))
     319              :     return;
     320    126784444 :   CLEAR_HARD_REG_BIT (hard_regs_live, regno);
     321    126784444 :   sparseset_set_bit (start_dying, regno);
     322    126784444 :   if (fixed_regs[regno] || TEST_HARD_REG_BIT (hard_regs_spilled_into, regno))
     323              :     {
     324     74947078 :       bitmap_clear_bit (bb_gen_pseudos, regno);
     325     74947078 :       bitmap_set_bit (bb_killed_pseudos, regno);
     326              :     }
     327              : }
     328              : 
     329              : /* Mark pseudo REGNO as now being live and update START_LIVING.  */
     330              : static void
     331    674144910 : mark_pseudo_live (int regno)
     332              : {
     333    674144910 :   lra_assert (!HARD_REGISTER_NUM_P (regno));
     334    674144910 :   if (sparseset_bit_p (pseudos_live, regno))
     335              :     return;
     336              : 
     337    511950868 :   sparseset_set_bit (pseudos_live, regno);
     338    511950868 :   sparseset_set_bit (start_living, regno);
     339              : }
     340              : 
     341              : /* Mark pseudo REGNO as now being dead and update START_DYING.  */
     342              : static void
     343    511950868 : mark_pseudo_dead (int regno)
     344              : {
     345    511950868 :   lra_assert (!HARD_REGISTER_NUM_P (regno));
     346    511950868 :   lra_reg_info[regno].conflict_hard_regs |= hard_regs_live;
     347    511950868 :   if (!sparseset_bit_p (pseudos_live, regno))
     348              :     return;
     349              : 
     350    511950868 :   sparseset_clear_bit (pseudos_live, regno);
     351    511950868 :   sparseset_set_bit (start_dying, regno);
     352              : }
     353              : 
     354              : /* Mark register REGNO (pseudo or hard register) in MODE as being live
     355              :    and update BB_GEN_PSEUDOS.  */
     356              : static void
     357    374706369 : mark_regno_live (int regno, machine_mode mode)
     358              : {
     359    374706369 :   int last;
     360              : 
     361    374706369 :   if (HARD_REGISTER_NUM_P (regno))
     362              :     {
     363    217320894 :       for (last = end_hard_regno (mode, regno); regno < last; regno++)
     364    108963051 :         make_hard_regno_live (regno);
     365              :     }
     366              :   else
     367              :     {
     368    266348526 :       mark_pseudo_live (regno);
     369    266348526 :       bitmap_set_bit (bb_gen_pseudos, regno);
     370              :     }
     371    374706369 : }
     372              : 
     373              : 
     374              : /* Mark register REGNO (pseudo or hard register) in MODE as being dead
     375              :    and update BB_GEN_PSEUDOS and BB_KILLED_PSEUDOS.  */
     376              : static void
     377    150790544 : mark_regno_dead (int regno, machine_mode mode)
     378              : {
     379    150790544 :   int last;
     380              : 
     381    150790544 :   if (HARD_REGISTER_NUM_P (regno))
     382              :     {
     383     77736180 :       for (last = end_hard_regno (mode, regno); regno < last; regno++)
     384     39099592 :         make_hard_regno_dead (regno);
     385              :     }
     386              :   else
     387              :     {
     388    112153956 :       mark_pseudo_dead (regno);
     389    112153956 :       bitmap_clear_bit (bb_gen_pseudos, regno);
     390    112153956 :       bitmap_set_bit (bb_killed_pseudos, regno);
     391              :     }
     392    150790544 : }
     393              : 
     394              : 
     395              : 
     396              : /* This page contains code for making global live analysis of pseudos.
     397              :    The code works only when pseudo live info is changed on a BB
     398              :    border.  That might be a consequence of some global transformations
     399              :    in LRA, e.g. PIC pseudo reuse or rematerialization.  */
     400              : 
     401              : /* Structure describing local BB data used for pseudo
     402              :    live-analysis.  */
     403              : class bb_data_pseudos
     404              : {
     405              : public:
     406              :   /* Basic block about which the below data are.  */
     407              :   basic_block bb;
     408              :   bitmap_head killed_pseudos; /* pseudos killed in the BB.  */
     409              :   bitmap_head gen_pseudos; /* pseudos generated in the BB.  */
     410              : };
     411              : 
     412              : /* Array for all BB data.  Indexed by the corresponding BB index.  */
     413              : typedef class bb_data_pseudos *bb_data_t;
     414              : 
     415              : /* All basic block data are referred through the following array.  */
     416              : static bb_data_t bb_data;
     417              : 
     418              : /* Two small functions for access to the bb data.  */
     419              : static inline bb_data_t
     420     75374981 : get_bb_data (basic_block bb)
     421              : {
     422     75374981 :   return &bb_data[(bb)->index];
     423              : }
     424              : 
     425              : static inline bb_data_t
     426      8206095 : get_bb_data_by_index (int index)
     427              : {
     428      8206095 :   return &bb_data[index];
     429              : }
     430              : 
     431              : /* Bitmap with all hard regs.  */
     432              : static bitmap_head all_hard_regs_bitmap;
     433              : 
     434              : /* The transfer function used by the DF equation solver to propagate
     435              :    live info through block with BB_INDEX according to the following
     436              :    equation:
     437              : 
     438              :      bb.livein = (bb.liveout - bb.kill) OR bb.gen
     439              : */
     440              : static bool
     441      8206095 : live_trans_fun (int bb_index)
     442              : {
     443      8206095 :   basic_block bb = get_bb_data_by_index (bb_index)->bb;
     444      8206095 :   bitmap bb_liveout = df_get_live_out (bb);
     445      8206095 :   bitmap bb_livein = df_get_live_in (bb);
     446      8206095 :   bb_data_t bb_info = get_bb_data (bb);
     447              : 
     448      8206095 :   bitmap_and_compl (&temp_bitmap, bb_liveout, &all_hard_regs_bitmap);
     449      8206095 :   return bitmap_ior_and_compl (bb_livein, &bb_info->gen_pseudos,
     450      8206095 :                                &temp_bitmap, &bb_info->killed_pseudos);
     451              : }
     452              : 
     453              : /* The confluence function used by the DF equation solver to set up
     454              :    live info for a block BB without predecessor.  */
     455              : static void
     456       359179 : live_con_fun_0 (basic_block bb)
     457              : {
     458       359179 :   bitmap_and_into (df_get_live_out (bb), &all_hard_regs_bitmap);
     459       359179 : }
     460              : 
     461              : /* The confluence function used by the DF equation solver to propagate
     462              :    live info from successor to predecessor on edge E according to the
     463              :    following equation:
     464              : 
     465              :       bb.liveout = 0 for entry block | OR (livein of successors)
     466              :  */
     467              : static bool
     468     11968666 : live_con_fun_n (edge e)
     469              : {
     470     11968666 :   basic_block bb = e->src;
     471     11968666 :   basic_block dest = e->dest;
     472     11968666 :   bitmap bb_liveout = df_get_live_out (bb);
     473     11968666 :   bitmap dest_livein = df_get_live_in (dest);
     474              : 
     475     11968666 :   return bitmap_ior_and_compl_into (bb_liveout,
     476     11968666 :                                     dest_livein, &all_hard_regs_bitmap);
     477              : }
     478              : 
     479              : /* Indexes of all function blocks.  */
     480              : static bitmap_head all_blocks;
     481              : 
     482              : /* Allocate and initialize data needed for global pseudo live
     483              :    analysis.  */
     484              : static void
     485      1471362 : initiate_live_solver (void)
     486              : {
     487      1471362 :   bitmap_initialize (&all_hard_regs_bitmap, &reg_obstack);
     488      1471362 :   bitmap_set_range (&all_hard_regs_bitmap, 0, FIRST_PSEUDO_REGISTER);
     489      1471362 :   bb_data = XNEWVEC (class bb_data_pseudos, last_basic_block_for_fn (cfun));
     490      1471362 :   bitmap_initialize (&all_blocks, &reg_obstack);
     491              : 
     492      1471362 :   basic_block bb;
     493     18926800 :   FOR_ALL_BB_FN (bb, cfun)
     494              :     {
     495     17455438 :       bb_data_t bb_info = get_bb_data (bb);
     496     17455438 :       bb_info->bb = bb;
     497     17455438 :       bitmap_initialize (&bb_info->killed_pseudos, &reg_obstack);
     498     17455438 :       bitmap_initialize (&bb_info->gen_pseudos, &reg_obstack);
     499     17455438 :       bitmap_set_bit (&all_blocks, bb->index);
     500              :     }
     501      1471362 : }
     502              : 
     503              : /* Free all data needed for global pseudo live analysis.  */
     504              : static void
     505      1471362 : finish_live_solver (void)
     506              : {
     507      1471362 :   basic_block bb;
     508              : 
     509      1471362 :   bitmap_clear (&all_blocks);
     510     18926800 :   FOR_ALL_BB_FN (bb, cfun)
     511              :     {
     512     17455438 :       bb_data_t bb_info = get_bb_data (bb);
     513     17455438 :       bitmap_clear (&bb_info->killed_pseudos);
     514     17455438 :       bitmap_clear (&bb_info->gen_pseudos);
     515              :     }
     516      1471362 :   free (bb_data);
     517      1471362 :   bitmap_clear (&all_hard_regs_bitmap);
     518      1471362 : }
     519              : 
     520              : 
     521              : 
     522              : /* Insn currently scanned.  */
     523              : static rtx_insn *curr_insn;
     524              : /* The insn data.  */
     525              : static lra_insn_recog_data_t curr_id;
     526              : /* The insn static data.  */
     527              : static struct lra_static_insn_data *curr_static_id;
     528              : 
     529              : /* Vec containing execution frequencies of program points.  */
     530              : static vec<int> point_freq_vec;
     531              : 
     532              : /* The start of the above vector elements.  */
     533              : int *lra_point_freq;
     534              : 
     535              : /* Increment the current program point POINT to the next point which has
     536              :    execution frequency FREQ.  */
     537              : static void
     538    224743603 : next_program_point (int &point, int freq)
     539              : {
     540    224743603 :   point_freq_vec.safe_push (freq);
     541    224743603 :   lra_point_freq = point_freq_vec.address ();
     542    224743603 :   point++;
     543    224743603 : }
     544              : 
     545              : /* Update the preference of HARD_REGNO for pseudo REGNO by PROFIT.  */
     546              : void
     547     15443171 : lra_setup_reload_pseudo_preferenced_hard_reg (int regno,
     548              :                                               int hard_regno, int profit)
     549              : {
     550     15443171 :   lra_assert (regno >= lra_constraint_new_regno_start);
     551     15443171 :   if (lra_reg_info[regno].preferred_hard_regno1 == hard_regno)
     552      2886216 :     lra_reg_info[regno].preferred_hard_regno_profit1 += profit;
     553     12556955 :   else if (lra_reg_info[regno].preferred_hard_regno2 == hard_regno)
     554        75788 :     lra_reg_info[regno].preferred_hard_regno_profit2 += profit;
     555     12481167 :   else if (lra_reg_info[regno].preferred_hard_regno1 < 0)
     556              :     {
     557      9865455 :       lra_reg_info[regno].preferred_hard_regno1 = hard_regno;
     558      9865455 :       lra_reg_info[regno].preferred_hard_regno_profit1 = profit;
     559              :     }
     560      2615712 :   else if (lra_reg_info[regno].preferred_hard_regno2 < 0
     561        69213 :            || profit > lra_reg_info[regno].preferred_hard_regno_profit2)
     562              :     {
     563      2572665 :       lra_reg_info[regno].preferred_hard_regno2 = hard_regno;
     564      2572665 :       lra_reg_info[regno].preferred_hard_regno_profit2 = profit;
     565              :     }
     566              :   else
     567              :     return;
     568              :   /* Keep the 1st hard regno as more profitable.  */
     569     15400124 :   if (lra_reg_info[regno].preferred_hard_regno1 >= 0
     570     15400124 :       && lra_reg_info[regno].preferred_hard_regno2 >= 0
     571      2724527 :       && (lra_reg_info[regno].preferred_hard_regno_profit2
     572      2724527 :           > lra_reg_info[regno].preferred_hard_regno_profit1))
     573              :     {
     574       100561 :       std::swap (lra_reg_info[regno].preferred_hard_regno1,
     575              :                  lra_reg_info[regno].preferred_hard_regno2);
     576       100561 :       std::swap (lra_reg_info[regno].preferred_hard_regno_profit1,
     577              :                  lra_reg_info[regno].preferred_hard_regno_profit2);
     578              :     }
     579     15400124 :   if (lra_dump_file != NULL)
     580              :     {
     581          253 :       if ((hard_regno = lra_reg_info[regno].preferred_hard_regno1) >= 0)
     582          253 :         fprintf (lra_dump_file,
     583              :                  " Hard reg %d is preferable by r%d with profit %d\n",
     584              :                  hard_regno, regno,
     585              :                  lra_reg_info[regno].preferred_hard_regno_profit1);
     586          253 :       if ((hard_regno = lra_reg_info[regno].preferred_hard_regno2) >= 0)
     587           97 :         fprintf (lra_dump_file,
     588              :                  " Hard reg %d is preferable by r%d with profit %d\n",
     589              :                  hard_regno, regno,
     590              :                  lra_reg_info[regno].preferred_hard_regno_profit2);
     591              :     }
     592              : }
     593              : 
     594              : /* Check whether REGNO lives through calls and setjmps and clear
     595              :    the corresponding bits in PSEUDOS_LIVE_THROUGH_CALLS and
     596              :    PSEUDOS_LIVE_THROUGH_SETJUMPS.  All calls in the region described
     597              :    by PSEUDOS_LIVE_THROUGH_CALLS have the given ABI.  */
     598              : 
     599              : static inline void
     600    464464139 : check_pseudos_live_through_calls (int regno, const function_abi &abi)
     601              : {
     602    464464139 :   if (! sparseset_bit_p (pseudos_live_through_calls, regno))
     603              :     return;
     604              : 
     605     95570647 :   machine_mode mode = PSEUDO_REGNO_MODE (regno);
     606              : 
     607     95570647 :   sparseset_clear_bit (pseudos_live_through_calls, regno);
     608     95570647 :   lra_reg_info[regno].conflict_hard_regs |= abi.mode_clobbers (mode);
     609     95570647 :   if (! sparseset_bit_p (pseudos_live_through_setjumps, regno))
     610              :     return;
     611         7149 :   sparseset_clear_bit (pseudos_live_through_setjumps, regno);
     612              :   /* Don't allocate pseudos that cross setjmps or any call, if this
     613              :      function receives a nonlocal goto.  */
     614         7149 :   SET_HARD_REG_SET (lra_reg_info[regno].conflict_hard_regs);
     615              : }
     616              : 
     617              : /* Return true if insn REG is an early clobber operand in alternative
     618              :    NALT.  Negative NALT means that we don't know the current insn
     619              :    alternative.  So assume the worst.  */
     620              : static inline bool
     621    385436304 : reg_early_clobber_p (const struct lra_insn_reg *reg, int n_alt)
     622              : {
     623    385436304 :   return (n_alt == LRA_UNKNOWN_ALT
     624    385436304 :           ? reg->early_clobber_alts != 0
     625              :           : (n_alt != LRA_NON_CLOBBERED_ALT
     626    368357996 :              && TEST_BIT (reg->early_clobber_alts, n_alt)));
     627              : }
     628              : 
     629              : /* Clear pseudo REGNO in SET or all hard registers of REGNO in MODE in SET.  */
     630              : static void
     631    154697989 : clear_sparseset_regnos (sparseset set, int regno, enum machine_mode mode)
     632              : {
     633    154697989 :   if (regno >= FIRST_PSEUDO_REGISTER)
     634              :     {
     635     85281604 :       sparseset_clear_bit (dead_set, regno);
     636     85281604 :       return;
     637              :     }
     638    139079927 :   for (int last = end_hard_regno (mode, regno); regno < last; regno++)
     639     69663542 :     sparseset_clear_bit (set, regno);
     640              : }
     641              : 
     642              : /* Return true if pseudo REGNO is in SET or all hard registers of REGNO in MODE
     643              :    are in SET.  */
     644              : static bool
     645    158084890 : regnos_in_sparseset_p (sparseset set, int regno, enum machine_mode mode)
     646              : {
     647    158084890 :   if (regno >= FIRST_PSEUDO_REGISTER)
     648     88460541 :     return sparseset_bit_p (dead_set, regno);
     649    139287891 :   for (int last = end_hard_regno (mode, regno); regno < last; regno++)
     650     69871506 :     if (!sparseset_bit_p (set, regno))
     651              :       return false;
     652              :   return true;
     653              : }
     654              : 
     655              : /* Process insns of the basic block BB to update pseudo live ranges,
     656              :    pseudo hard register conflicts, and insn notes.  We do it on
     657              :    backward scan of BB insns.  CURR_POINT is the program point where
     658              :    BB ends.  The function updates this counter and returns in
     659              :    CURR_POINT the program point where BB starts.  The function also
     660              :    does local live info updates and can delete the dead insns if
     661              :    DEAD_INSN_P.  It returns true if pseudo live info was
     662              :    changed at the BB start.  */
     663              : static bool
     664     32257982 : process_bb_lives (basic_block bb, int &curr_point, bool dead_insn_p)
     665              : {
     666     32257982 :   int i, regno, freq;
     667     32257982 :   unsigned int j;
     668     32257982 :   bitmap_iterator bi;
     669     32257982 :   bitmap reg_live_out;
     670     32257982 :   unsigned int px;
     671     32257982 :   rtx_insn *next;
     672     32257982 :   rtx link, *link_loc;
     673     32257982 :   bool need_curr_point_incr;
     674              :   /* Only has a meaningful value once we've seen a call.  */
     675     32257982 :   function_abi last_call_abi = default_function_abi;
     676              : 
     677     32257982 :   reg_live_out = df_get_live_out (bb);
     678     32257982 :   sparseset_clear (pseudos_live);
     679     32257982 :   sparseset_clear (pseudos_live_through_calls);
     680     32257982 :   sparseset_clear (pseudos_live_through_setjumps);
     681     64515964 :   REG_SET_TO_HARD_REG_SET (hard_regs_live, reg_live_out);
     682     32257982 :   hard_regs_live &= ~eliminable_regset;
     683    440054366 :   EXECUTE_IF_SET_IN_BITMAP (reg_live_out, FIRST_PSEUDO_REGISTER, j, bi)
     684              :     {
     685    407796384 :       update_pseudo_point (j, curr_point, USE_POINT);
     686    407796384 :       mark_pseudo_live (j);
     687              :     }
     688              : 
     689     32257982 :   bb_gen_pseudos = &get_bb_data (bb)->gen_pseudos;
     690     32257982 :   bb_killed_pseudos = &get_bb_data (bb)->killed_pseudos;
     691     32257982 :   bitmap_clear (bb_gen_pseudos);
     692     32257982 :   bitmap_clear (bb_killed_pseudos);
     693     32257982 :   freq = REG_FREQ_FROM_BB (bb);
     694              : 
     695     32257982 :   if (lra_dump_file != NULL)
     696          571 :     fprintf (lra_dump_file, "  BB %d\n", bb->index);
     697              : 
     698              :   /* Scan the code of this basic block, noting which pseudos and hard
     699              :      regs are born or die.
     700              : 
     701              :      Note that this loop treats uninitialized values as live until the
     702              :      beginning of the block.  For example, if an instruction uses
     703              :      (reg:DI foo), and only (subreg:SI (reg:DI foo) 0) is ever set,
     704              :      FOO will remain live until the beginning of the block.  Likewise
     705              :      if FOO is not set at all.  This is unnecessarily pessimistic, but
     706              :      it probably doesn't matter much in practice.  */
     707    908817816 :   FOR_BB_INSNS_REVERSE_SAFE (bb, curr_insn, next)
     708              :     {
     709    422150926 :       bool call_p;
     710    422150926 :       int n_alt, dst_regno, src_regno;
     711    422150926 :       rtx set;
     712    422150926 :       struct lra_insn_reg *reg;
     713              : 
     714    422150926 :       if (!NONDEBUG_INSN_P (curr_insn))
     715    201691030 :         continue;
     716              : 
     717    220459896 :       curr_id = lra_get_insn_recog_data (curr_insn);
     718    220459896 :       curr_static_id = curr_id->insn_static_data;
     719    220459896 :       n_alt = curr_id->used_insn_alternative;
     720    220459896 :       if (lra_dump_file != NULL)
     721         2710 :         fprintf (lra_dump_file, "   Insn %u: point = %d, n_alt = %d\n",
     722         2710 :                  INSN_UID (curr_insn), curr_point, n_alt);
     723              : 
     724    220459896 :       set = single_set (curr_insn);
     725              : 
     726    220459896 :       if (dead_insn_p && set != NULL_RTX
     727    169839114 :           && REG_P (SET_DEST (set)) && !HARD_REGISTER_P (SET_DEST (set))
     728     88431271 :           && find_reg_note (curr_insn, REG_EH_REGION, NULL_RTX) == NULL_RTX
     729     88203140 :           && ! may_trap_p (PATTERN (curr_insn))
     730              :           /* Don't do premature remove of pic offset pseudo as we can
     731              :              start to use it after some reload generation.  */
     732    299801446 :           && (pic_offset_table_rtx == NULL_RTX
     733      8905920 :               || pic_offset_table_rtx != SET_DEST (set)))
     734              :         {
     735     79276443 :           bool remove_p = true;
     736              : 
     737     79851849 :           for (reg = curr_id->regs; reg != NULL; reg = reg->next)
     738     79803068 :             if (reg->type != OP_IN
     739     79803068 :                 && (reg->regno < FIRST_PSEUDO_REGISTER
     740     79276575 :                     ? TEST_HARD_REG_BIT (hard_regs_live, reg->regno)
     741     79276573 :                     : sparseset_bit_p (pseudos_live, reg->regno)))
     742              :               {
     743              :                 remove_p = false;
     744              :                 break;
     745              :               }
     746     80515473 :           for (reg = curr_static_id->hard_regs; reg != NULL; reg = reg->next)
     747     15722890 :             if (reg->type != OP_IN)
     748              :               {
     749              :                 remove_p = false;
     750              :                 break;
     751              :               }
     752              : 
     753     79276443 :           if (remove_p && ! volatile_refs_p (PATTERN (curr_insn)))
     754              :             {
     755        43479 :               dst_regno = REGNO (SET_DEST (set));
     756        43479 :               if (lra_dump_file != NULL)
     757            0 :                 fprintf (lra_dump_file, "   Deleting dead insn %u\n",
     758            0 :                          INSN_UID (curr_insn));
     759        43479 :               lra_set_insn_deleted (curr_insn);
     760        43479 :               if (lra_reg_info[dst_regno].nrefs == 0)
     761              :                 {
     762              :                   /* There might be some debug insns with the pseudo.  */
     763         6630 :                   unsigned int uid;
     764         6630 :                   rtx_insn *insn;
     765              : 
     766         6630 :                   bitmap_copy (&temp_bitmap, &lra_reg_info[dst_regno].insn_bitmap);
     767         6885 :                   EXECUTE_IF_SET_IN_BITMAP (&temp_bitmap, 0, uid, bi)
     768              :                     {
     769          255 :                       insn = lra_insn_recog_data[uid]->insn;
     770          255 :                       lra_substitute_pseudo_within_insn (insn, dst_regno,
     771              :                                                          SET_SRC (set), true);
     772          255 :                       lra_update_insn_regno_info (insn);
     773              :                     }
     774              :                 }
     775        43479 :               continue;
     776        43479 :             }
     777              :         }
     778              : 
     779              :       /* Update max ref width and hard reg usage.  */
     780    575262210 :       for (reg = curr_id->regs; reg != NULL; reg = reg->next)
     781              :         {
     782    354845793 :           int regno = reg->regno;
     783              : 
     784    354845793 :           lra_update_biggest_mode (regno, reg->biggest_mode);
     785    354845793 :           if (HARD_REGISTER_NUM_P (regno))
     786     97280591 :             lra_hard_reg_usage[regno] += freq;
     787              :         }
     788              : 
     789    220416417 :       call_p = CALL_P (curr_insn);
     790              : 
     791              :       /* If we have a simple register copy and the source reg is live after
     792              :          this instruction, then remove the source reg from the live set so
     793              :          that it will not conflict with the destination reg.  */
     794    220416417 :       rtx ignore_reg = non_conflicting_reg_copy_p (curr_insn);
     795    220416417 :       if (ignore_reg != NULL_RTX)
     796              :         {
     797     59157264 :           int ignore_regno = REGNO (ignore_reg);
     798     59157264 :           if (HARD_REGISTER_NUM_P (ignore_regno)
     799     59157264 :               && TEST_HARD_REG_BIT (hard_regs_live, ignore_regno))
     800       170108 :             CLEAR_HARD_REG_BIT (hard_regs_live, ignore_regno);
     801     58987156 :           else if (!HARD_REGISTER_NUM_P (ignore_regno)
     802     58987156 :                    && sparseset_bit_p (pseudos_live, ignore_regno))
     803     11753919 :             sparseset_clear_bit (pseudos_live, ignore_regno);
     804              :           else
     805              :             /* We don't need any special handling of the source reg if
     806              :                it is dead after this instruction.  */
     807              :             ignore_reg = NULL_RTX;
     808              :         }
     809              : 
     810    210672127 :       src_regno = (set != NULL_RTX && REG_P (SET_SRC (set))
     811    300863643 :                    ? REGNO (SET_SRC (set)) : -1);
     812    210672127 :       dst_regno = (set != NULL_RTX && REG_P (SET_DEST (set))
     813    156817346 :                    ? REGNO (SET_DEST (set)) : -1);
     814    220416417 :       if (complete_info_p
     815    219589834 :           && src_regno >= 0 && dst_regno >= 0
     816              :           /* Check that source regno does not conflict with
     817              :              destination regno to exclude most impossible
     818              :              preferences.  */
     819    279434005 :           && (((!HARD_REGISTER_NUM_P (src_regno)
     820     52070016 :                 && (! sparseset_bit_p (pseudos_live, src_regno)
     821         9246 :                     || (!HARD_REGISTER_NUM_P (dst_regno)
     822     59017588 :                         && lra_reg_val_equal_p (src_regno,
     823              :                                                 lra_reg_info[dst_regno].val,
     824            0 :                                                 lra_reg_info[dst_regno].offset))))
     825              :                || (HARD_REGISTER_NUM_P (src_regno)
     826      6947572 :                    && ! TEST_HARD_REG_BIT (hard_regs_live, src_regno)))
     827              :               /* It might be 'inheritance pseudo <- reload pseudo'.  */
     828         9259 :               || (src_regno >= lra_constraint_new_regno_start
     829          225 :                   && dst_regno >= lra_constraint_new_regno_start
     830              :                   /* Remember to skip special cases where src/dest regnos are
     831              :                      the same, e.g. insn SET pattern has matching constraints
     832              :                      like =r,0.  */
     833            0 :                   && src_regno != dst_regno)))
     834              :         {
     835     59008329 :           int hard_regno = -1, regno = -1;
     836              : 
     837     59008329 :           if (dst_regno >= lra_constraint_new_regno_start
     838     15795714 :               && src_regno >= lra_constraint_new_regno_start)
     839              :             {
     840              :               /* It might be still an original (non-reload) insn with
     841              :                  one unused output and a constraint requiring to use
     842              :                  the same reg for input/output operands. In this case
     843              :                  dst_regno and src_regno have the same value, we don't
     844              :                  need a misleading copy for this case.  */
     845      5897829 :               if (dst_regno != src_regno)
     846      5897829 :                 lra_create_copy (dst_regno, src_regno, freq);
     847              :             }
     848     53110500 :           else if (dst_regno >= lra_constraint_new_regno_start)
     849              :             {
     850      9897885 :               if (!HARD_REGISTER_NUM_P (hard_regno = src_regno))
     851      9793228 :                 hard_regno = reg_renumber[src_regno];
     852              :               regno = dst_regno;
     853              :             }
     854     43212615 :           else if (src_regno >= lra_constraint_new_regno_start)
     855              :             {
     856     10871067 :               if (!HARD_REGISTER_NUM_P (hard_regno = dst_regno))
     857      9196466 :                 hard_regno = reg_renumber[dst_regno];
     858              :               regno = src_regno;
     859              :             }
     860     59008329 :           if (regno >= 0 && hard_regno >= 0)
     861     12539270 :             lra_setup_reload_pseudo_preferenced_hard_reg
     862     12539270 :               (regno, hard_regno, freq);
     863              :         }
     864              : 
     865    220416417 :       sparseset_clear (start_living);
     866              : 
     867              :       /* Mark each defined value as live.  We need to do this for
     868              :          unused values because they still conflict with quantities
     869              :          that are live at the time of the definition.  */
     870    575262210 :       for (reg = curr_id->regs; reg != NULL; reg = reg->next)
     871    354845793 :         if (reg->type != OP_IN)
     872              :           {
     873    151882513 :             update_pseudo_point (reg->regno, curr_point, USE_POINT);
     874    151882513 :             mark_regno_live (reg->regno, reg->biggest_mode);
     875              :             /* ??? Should be a no-op for unused registers.  */
     876    151882513 :             check_pseudos_live_through_calls (reg->regno, last_call_abi);
     877              :           }
     878              : 
     879    277310232 :       for (reg = curr_static_id->hard_regs; reg != NULL; reg = reg->next)
     880     56893815 :         if (reg->type != OP_IN)
     881     40835639 :           make_hard_regno_live (reg->regno);
     882              : 
     883    220416417 :       if (curr_id->arg_hard_regs != NULL)
     884     31830453 :         for (i = 0; (regno = curr_id->arg_hard_regs[i]) >= 0; i++)
     885     22472681 :           if (!HARD_REGISTER_NUM_P (regno))
     886              :             /* It is a clobber.  */
     887       944146 :             make_hard_regno_live (regno - FIRST_PSEUDO_REGISTER);
     888              : 
     889    220416417 :       sparseset_copy (unused_set, start_living);
     890              : 
     891    220416417 :       sparseset_clear (start_dying);
     892              : 
     893              :       /* See which defined values die here.  */
     894    575262210 :       for (reg = curr_id->regs; reg != NULL; reg = reg->next)
     895    354845793 :         if (reg->type != OP_IN
     896    657177570 :             && ! reg_early_clobber_p (reg, n_alt) && ! reg->subreg_p)
     897              :           {
     898    150449264 :             if (reg->type == OP_OUT)
     899    130843382 :               update_pseudo_point (reg->regno, curr_point, DEF_POINT);
     900    150449264 :             mark_regno_dead (reg->regno, reg->biggest_mode);
     901              :           }
     902              : 
     903    277310232 :       for (reg = curr_static_id->hard_regs; reg != NULL; reg = reg->next)
     904     56893815 :         if (reg->type != OP_IN
     905    114343479 :             && ! reg_early_clobber_p (reg, n_alt) && ! reg->subreg_p)
     906     16614025 :           make_hard_regno_dead (reg->regno);
     907              : 
     908    220416417 :       if (curr_id->arg_hard_regs != NULL)
     909     31830453 :         for (i = 0; (regno = curr_id->arg_hard_regs[i]) >= 0; i++)
     910     22472681 :           if (!HARD_REGISTER_NUM_P (regno))
     911              :             /* It is a clobber.  */
     912       944146 :             make_hard_regno_dead (regno - FIRST_PSEUDO_REGISTER);
     913              : 
     914    220416417 :       if (call_p)
     915              :         {
     916     12087246 :           function_abi call_abi = insn_callee_abi (curr_insn);
     917              : 
     918     12087246 :           if (last_call_abi != call_abi)
     919      7078046 :             EXECUTE_IF_SET_IN_SPARSESET (pseudos_live, j)
     920      4838352 :               check_pseudos_live_through_calls (j, last_call_abi);
     921              : 
     922     12087246 :           last_call_abi = call_abi;
     923              : 
     924     12087246 :           sparseset_ior (pseudos_live_through_calls,
     925              :                          pseudos_live_through_calls, pseudos_live);
     926     12087246 :           if (cfun->has_nonlocal_label
     927     12087246 :               || (!targetm.setjmp_preserves_nonvolatile_regs_p ()
     928     12083058 :                   && (find_reg_note (curr_insn, REG_SETJMP, NULL_RTX)
     929              :                       != NULL_RTX)))
     930         6717 :             sparseset_ior (pseudos_live_through_setjumps,
     931              :                            pseudos_live_through_setjumps, pseudos_live);
     932              :         }
     933              : 
     934              :       /* Increment the current program point if we must.  */
     935    220416417 :       if (sparseset_contains_pseudos_p (unused_set)
     936    220416417 :           || sparseset_contains_pseudos_p (start_dying))
     937    111591467 :         next_program_point (curr_point, freq);
     938              : 
     939              :       /* If we removed the source reg from a simple register copy from the
     940              :          live set above, then add it back now so we don't accidentally add
     941              :          it to the start_living set below.  */
     942    220416417 :       if (ignore_reg != NULL_RTX)
     943              :         {
     944     11924027 :           int ignore_regno = REGNO (ignore_reg);
     945     11924027 :           if (HARD_REGISTER_NUM_P (ignore_regno))
     946       170108 :             SET_HARD_REG_BIT (hard_regs_live, ignore_regno);
     947              :           else
     948     11753919 :             sparseset_set_bit (pseudos_live, ignore_regno);
     949              :         }
     950              : 
     951    220416417 :       sparseset_clear (start_living);
     952              : 
     953              :       /* Mark each used value as live.  */
     954    575262210 :       for (reg = curr_id->regs; reg != NULL; reg = reg->next)
     955    354845793 :         if (reg->type != OP_OUT)
     956              :           {
     957    222707569 :             if (reg->type == OP_IN)
     958    202963280 :               update_pseudo_point (reg->regno, curr_point, USE_POINT);
     959    222707569 :             mark_regno_live (reg->regno, reg->biggest_mode);
     960    222707569 :             check_pseudos_live_through_calls (reg->regno, last_call_abi);
     961              :           }
     962              : 
     963    277310232 :       for (reg = curr_static_id->hard_regs; reg != NULL; reg = reg->next)
     964     56893815 :         if (reg->type != OP_OUT)
     965     16542017 :           make_hard_regno_live (reg->regno);
     966              : 
     967    220416417 :       if (curr_id->arg_hard_regs != NULL)
     968              :         /* Make argument hard registers live.  */
     969     31830453 :         for (i = 0; (regno = curr_id->arg_hard_regs[i]) >= 0; i++)
     970     22472681 :           if (HARD_REGISTER_NUM_P (regno))
     971     21528535 :             make_hard_regno_live (regno);
     972              : 
     973    220416417 :       sparseset_and_compl (dead_set, start_living, start_dying);
     974              : 
     975    220416417 :       sparseset_clear (start_dying);
     976              : 
     977              :       /* Mark early clobber outputs dead.  */
     978    575262210 :       for (reg = curr_id->regs; reg != NULL; reg = reg->next)
     979    354845793 :         if (reg->type != OP_IN
     980    507069586 :             && reg_early_clobber_p (reg, n_alt) && ! reg->subreg_p)
     981              :           {
     982       341280 :             if (reg->type == OP_OUT)
     983       224993 :               update_pseudo_point (reg->regno, curr_point, DEF_POINT);
     984       341280 :             mark_regno_dead (reg->regno, reg->biggest_mode);
     985              : 
     986              :             /* We're done processing inputs, so make sure early clobber
     987              :                operands that are both inputs and outputs are still live.  */
     988       341280 :             if (reg->type == OP_INOUT)
     989       116287 :               mark_regno_live (reg->regno, reg->biggest_mode);
     990              :           }
     991              : 
     992    277310232 :       for (reg = curr_static_id->hard_regs; reg != NULL; reg = reg->next)
     993     56893815 :         if (reg->type != OP_IN
     994    121951068 :             && reg_early_clobber_p (reg, n_alt) && ! reg->subreg_p)
     995              :           {
     996     24221614 :             struct lra_insn_reg *reg2;
     997              : 
     998              :             /* We can have early clobbered non-operand hard reg and
     999              :                the same hard reg as an insn input.  Don't make hard
    1000              :                reg dead before the insns.  */
    1001     48742101 :             for (reg2 = curr_static_id->hard_regs; reg2 != NULL; reg2 = reg2->next)
    1002     24543157 :               if (reg2->type != OP_OUT && reg2->regno == reg->regno)
    1003              :                 break;
    1004     24221614 :             if (reg2 != NULL)
    1005        22670 :               continue;
    1006              : 
    1007              :             HARD_REG_SET clobbered_regset;
    1008     24198944 :             CLEAR_HARD_REG_SET (clobbered_regset);
    1009     24198944 :             SET_HARD_REG_BIT (clobbered_regset, reg->regno);
    1010              : 
    1011     67120831 :             for (reg2 = curr_id->regs; reg2 != NULL; reg2 = reg2->next)
    1012     30495899 :               if (reg2->type != OP_OUT && reg2->regno < FIRST_PSEUDO_REGISTER
    1013     51186727 :                   && ira_hard_reg_set_intersection_p (reg2->regno,
    1014      8251738 :                                                       reg2->biggest_mode,
    1015              :                                                       clobbered_regset))
    1016              :                 break;
    1017     24198944 :             if (reg2 == NULL)
    1018              :               {
    1019     24185842 :                 make_hard_regno_dead (reg->regno);
    1020              :               }
    1021              :             else
    1022              :               {
    1023       164716 :                 EXECUTE_IF_SET_IN_SPARSESET (pseudos_live, j)
    1024       151614 :                   SET_HARD_REG_BIT (lra_reg_info[j].conflict_hard_regs,
    1025              :                                     reg->regno);
    1026              :               }
    1027              :           }
    1028              : 
    1029              :       /* Increment the current program point if we must.  */
    1030    220416417 :       if (sparseset_contains_pseudos_p (dead_set)
    1031    220416417 :           || sparseset_contains_pseudos_p (start_dying))
    1032     87114676 :         next_program_point (curr_point, freq);
    1033              : 
    1034              :       /* Update notes.  */
    1035    443766080 :       for (link_loc = &REG_NOTES (curr_insn); (link = *link_loc) != NULL_RTX;)
    1036              :         {
    1037    223349663 :           if (REG_NOTE_KIND (link) != REG_DEAD
    1038     92513811 :               && REG_NOTE_KIND (link) != REG_UNUSED)
    1039              :             ;
    1040    158084890 :           else if (REG_P (XEXP (link, 0)))
    1041              :             {
    1042    158084890 :               rtx note_reg = XEXP (link, 0);
    1043    158084890 :               int note_regno = REGNO (note_reg);
    1044              : 
    1045    161471791 :               if ((REG_NOTE_KIND (link) == REG_DEAD
    1046    130835852 :                    && ! regnos_in_sparseset_p (dead_set, note_regno,
    1047    130835852 :                                                GET_MODE (note_reg)))
    1048    286642004 :                   || (REG_NOTE_KIND (link) == REG_UNUSED
    1049     27249038 :                       && ! regnos_in_sparseset_p (unused_set, note_regno,
    1050     27249038 :                                                   GET_MODE (note_reg))))
    1051              :                 {
    1052      3386901 :                   *link_loc = XEXP (link, 1);
    1053      3386901 :                   continue;
    1054              :                 }
    1055    154697989 :               if (REG_NOTE_KIND (link) == REG_DEAD)
    1056    128557114 :                 clear_sparseset_regnos (dead_set, note_regno,
    1057    128557114 :                                         GET_MODE (note_reg));
    1058     26140875 :               else if (REG_NOTE_KIND (link) == REG_UNUSED)
    1059     26140875 :                 clear_sparseset_regnos (unused_set, note_regno,
    1060     26140875 :                                         GET_MODE (note_reg));
    1061              :             }
    1062    219962762 :           link_loc = &XEXP (link, 1);
    1063              :         }
    1064    229304870 :       EXECUTE_IF_SET_IN_SPARSESET (dead_set, j)
    1065      8888453 :         add_reg_note (curr_insn, REG_DEAD, regno_reg_rtx[j]);
    1066    442666225 :       EXECUTE_IF_SET_IN_SPARSESET (unused_set, j)
    1067      1833391 :         add_reg_note (curr_insn, REG_UNUSED, regno_reg_rtx[j]);
    1068              :     }
    1069              : 
    1070     32257982 :   if (bb_has_eh_pred (bb))
    1071              :     /* Any pseudos that are currently live conflict with the eh_return
    1072              :        data registers.  For liveness purposes, these registers are set
    1073              :        by artificial definitions at the start of the BB, so are not
    1074              :        actually live on entry.  */
    1075       538414 :     for (j = 0; ; ++j)
    1076              :       {
    1077      1615242 :         unsigned int regno = EH_RETURN_DATA_REGNO (j);
    1078              : 
    1079      1076828 :         if (regno == INVALID_REGNUM)
    1080              :           break;
    1081              : 
    1082      1076828 :         make_hard_regno_live (regno);
    1083      1076828 :         make_hard_regno_dead (regno);
    1084      1076828 :       }
    1085              : 
    1086              :   /* Pseudos can't go in stack regs at the start of a basic block that
    1087              :      is reached by an abnormal edge.  Likewise for registers that are at
    1088              :      least partly call clobbered, because caller-save, fixup_abnormal_edges
    1089              :      and possibly the table driven EH machinery are not quite ready to
    1090              :      handle such pseudos live across such edges.  */
    1091     32257982 :   if (bb_has_abnormal_pred (bb))
    1092              :     {
    1093              :       HARD_REG_SET clobbers;
    1094              : 
    1095       541692 :       CLEAR_HARD_REG_SET (clobbers);
    1096              : #ifdef STACK_REGS
    1097      1734164 :       EXECUTE_IF_SET_IN_SPARSESET (pseudos_live, px)
    1098      1192472 :         lra_reg_info[px].no_stack_p = true;
    1099      4875228 :       for (px = FIRST_STACK_REG; px <= LAST_STACK_REG; px++)
    1100      4333536 :         SET_HARD_REG_BIT (clobbers, px);
    1101              : #endif
    1102              :       /* No need to record conflicts for call clobbered regs if we
    1103              :          have nonlocal labels around, as we don't ever try to
    1104              :          allocate such regs in this case.  */
    1105       541692 :       if (!cfun->has_nonlocal_label
    1106       541692 :           && has_abnormal_call_or_eh_pred_edge_p (bb))
    1107     50071665 :         for (px = 0; HARD_REGISTER_NUM_P (px); px++)
    1108     49533260 :           if (eh_edge_abi.clobbers_at_least_part_of_reg_p (px)
    1109              : #ifdef REAL_PIC_OFFSET_TABLE_REGNUM
    1110              :               /* We should create a conflict of PIC pseudo with PIC
    1111              :                  hard reg as PIC hard reg can have a wrong value after
    1112              :                  jump described by the abnormal edge.  In this case we
    1113              :                  cannot allocate PIC hard reg to PIC pseudo as PIC
    1114              :                  pseudo will also have a wrong value.  */
    1115     49986664 :               || (px == REAL_PIC_OFFSET_TABLE_REGNUM
    1116       538405 :                   && pic_offset_table_rtx != NULL_RTX
    1117        22203 :                   && !HARD_REGISTER_P (pic_offset_table_rtx))
    1118              : #endif
    1119              :               )
    1120     44839362 :             SET_HARD_REG_BIT (clobbers, px);
    1121              : 
    1122       541692 :       clobbers &= ~hard_regs_live;
    1123     50377356 :       for (px = 0; HARD_REGISTER_NUM_P (px); px++)
    1124     49835664 :         if (TEST_HARD_REG_BIT (clobbers, px))
    1125              :           {
    1126     44865658 :             make_hard_regno_live (px);
    1127     44865658 :             make_hard_regno_dead (px);
    1128              :           }
    1129              :     }
    1130              : 
    1131     32257982 :   bool live_change_p = false;
    1132              :   /* Check if bb border live info was changed.  */
    1133     32257982 :   unsigned int live_pseudos_num = 0;
    1134    431369370 :   EXECUTE_IF_SET_IN_BITMAP (df_get_live_in (bb),
    1135              :                             FIRST_PSEUDO_REGISTER, j, bi)
    1136              :     {
    1137    399343549 :       live_pseudos_num++;
    1138    399343549 :       if (! sparseset_bit_p (pseudos_live, j))
    1139              :         {
    1140       232161 :           live_change_p = true;
    1141       232161 :           if (lra_dump_file != NULL)
    1142           14 :             fprintf (lra_dump_file,
    1143              :                      "  r%d is removed as live at bb%d start\n", j, bb->index);
    1144              :           break;
    1145              :         }
    1146              :     }
    1147           14 :   if (! live_change_p
    1148     32025821 :       && sparseset_cardinality (pseudos_live) != live_pseudos_num)
    1149              :     {
    1150       183107 :       live_change_p = true;
    1151       183107 :       if (lra_dump_file != NULL)
    1152           28 :         EXECUTE_IF_SET_IN_SPARSESET (pseudos_live, j)
    1153            7 :           if (! bitmap_bit_p (df_get_live_in (bb), j))
    1154            7 :             fprintf (lra_dump_file,
    1155              :                      "  r%d is added to live at bb%d start\n", j, bb->index);
    1156              :     }
    1157              :   /* See if we'll need an increment at the end of this basic block.
    1158              :      An increment is needed if the PSEUDOS_LIVE set is not empty,
    1159              :      to make sure the finish points are set up correctly.  */
    1160     32257982 :   need_curr_point_incr = (sparseset_cardinality (pseudos_live) > 0);
    1161              : 
    1162    831851806 :   EXECUTE_IF_SET_IN_SPARSESET (pseudos_live, i)
    1163              :     {
    1164    399796912 :       update_pseudo_point (i, curr_point, DEF_POINT);
    1165    399796912 :       mark_pseudo_dead (i);
    1166              :     }
    1167              : 
    1168    124014157 :   EXECUTE_IF_SET_IN_BITMAP (df_get_live_in (bb), FIRST_PSEUDO_REGISTER, j, bi)
    1169              :     {
    1170    113570386 :       if (sparseset_cardinality (pseudos_live_through_calls) == 0)
    1171              :         break;
    1172     91756175 :       if (sparseset_bit_p (pseudos_live_through_calls, j))
    1173     85035705 :         check_pseudos_live_through_calls (j, last_call_abi);
    1174              :     }
    1175              : 
    1176   2999992326 :   for (i = 0; HARD_REGISTER_NUM_P (i); ++i)
    1177              :     {
    1178   2967734344 :       if (!TEST_HARD_REG_BIT (hard_regs_live, i))
    1179   2923470893 :         continue;
    1180              : 
    1181     44263451 :       if (!TEST_HARD_REG_BIT (hard_regs_spilled_into, i))
    1182     44263451 :         continue;
    1183              : 
    1184            0 :       if (bitmap_bit_p (df_get_live_in (bb), i))
    1185            0 :         continue;
    1186              : 
    1187            0 :       live_change_p = true;
    1188            0 :       if (lra_dump_file)
    1189            0 :         fprintf (lra_dump_file,
    1190              :                  "  hard reg r%d is added to live at bb%d start\n", i,
    1191              :                  bb->index);
    1192            0 :       bitmap_set_bit (df_get_live_in (bb), i);
    1193              :     }
    1194              : 
    1195     32257982 :   if (need_curr_point_incr)
    1196     26037460 :     next_program_point (curr_point, freq);
    1197              : 
    1198     32257982 :   return live_change_p;
    1199              : }
    1200              : 
    1201              : /* Compress pseudo live ranges by removing program points where
    1202              :    nothing happens.  Complexity of many algorithms in LRA is linear
    1203              :    function of program points number.  To speed up the code we try to
    1204              :    minimize the number of the program points here.  */
    1205              : static void
    1206      1567167 : remove_some_program_points_and_update_live_ranges (void)
    1207              : {
    1208      1567167 :   unsigned i;
    1209      1567167 :   int n, max_regno;
    1210      1567167 :   int *map;
    1211      1567167 :   lra_live_range_t r, prev_r, next_r;
    1212      1567167 :   sbitmap_iterator sbi;
    1213      1567167 :   bool born_p, dead_p, prev_born_p, prev_dead_p;
    1214              : 
    1215      1567167 :   auto_sbitmap born (lra_live_max_point);
    1216      1567167 :   auto_sbitmap dead (lra_live_max_point);
    1217      1567167 :   bitmap_clear (born);
    1218      1567167 :   bitmap_clear (dead);
    1219      1567167 :   max_regno = max_reg_num ();
    1220    171851125 :   for (i = FIRST_PSEUDO_REGISTER; i < (unsigned) max_regno; i++)
    1221              :     {
    1222    282615763 :       for (r = lra_reg_info[i].live_ranges; r != NULL; r = r->next)
    1223              :         {
    1224    112331805 :           lra_assert (r->start <= r->finish);
    1225    112331805 :           bitmap_set_bit (born, r->start);
    1226    112331805 :           bitmap_set_bit (dead, r->finish);
    1227              :         }
    1228              :     }
    1229      1567167 :   auto_sbitmap born_or_dead (lra_live_max_point);
    1230      1567167 :   bitmap_ior (born_or_dead, born, dead);
    1231      1567167 :   map = XCNEWVEC (int, lra_live_max_point);
    1232      1567167 :   n = -1;
    1233      1567167 :   prev_born_p = prev_dead_p = false;
    1234    197260371 :   EXECUTE_IF_SET_IN_BITMAP (born_or_dead, 0, i, sbi)
    1235              :     {
    1236    194126037 :       born_p = bitmap_bit_p (born, i);
    1237    194126037 :       dead_p = bitmap_bit_p (dead, i);
    1238    194126037 :       if ((prev_born_p && ! prev_dead_p && born_p && ! dead_p)
    1239    179153551 :           || (prev_dead_p && ! prev_born_p && dead_p && ! born_p))
    1240              :         {
    1241     42647072 :           map[i] = n;
    1242     42647072 :           lra_point_freq[n] = MAX (lra_point_freq[n], lra_point_freq[i]);
    1243              :         }
    1244              :       else
    1245              :         {
    1246    151478965 :           map[i] = ++n;
    1247    151478965 :           lra_point_freq[n] = lra_point_freq[i];
    1248              :         }
    1249    194126037 :       prev_born_p = born_p;
    1250    194126037 :       prev_dead_p = dead_p;
    1251              :     }
    1252      1567167 :   n++;
    1253      1567167 :   if (lra_dump_file != NULL)
    1254           95 :     fprintf (lra_dump_file, "Compressing live ranges: from %d to %d - %d%%\n",
    1255              :              lra_live_max_point, n,
    1256           95 :              lra_live_max_point ? 100 * n / lra_live_max_point : 100);
    1257      1567167 :   if (n < lra_live_max_point)
    1258              :     {
    1259      1331691 :       lra_live_max_point = n;
    1260    168464012 :       for (i = FIRST_PSEUDO_REGISTER; i < (unsigned) max_regno; i++)
    1261              :         {
    1262    167132321 :           for (prev_r = NULL, r = lra_reg_info[i].live_ranges;
    1263    278702130 :                r != NULL;
    1264              :                r = next_r)
    1265              :             {
    1266    111569809 :               next_r = r->next;
    1267    111569809 :               r->start = map[r->start];
    1268    111569809 :               r->finish = map[r->finish];
    1269    111569809 :               if (prev_r == NULL || prev_r->start > r->finish + 1)
    1270              :                 {
    1271    109418930 :                   prev_r = r;
    1272    109418930 :                   continue;
    1273              :                 }
    1274      2150879 :               prev_r->start = r->start;
    1275      2150879 :               prev_r->next = next_r;
    1276      2150879 :               lra_live_range_pool.remove (r);
    1277              :             }
    1278              :         }
    1279              :     }
    1280      1567167 :   free (map);
    1281      1567167 : }
    1282              : 
    1283              : /* Print live ranges R to file F.  */
    1284              : void
    1285         2470 : lra_print_live_range_list (FILE *f, lra_live_range_t r)
    1286              : {
    1287         5466 :   for (; r != NULL; r = r->next)
    1288         2996 :     fprintf (f, " [%d..%d]", r->start, r->finish);
    1289         2470 :   fprintf (f, "\n");
    1290         2470 : }
    1291              : 
    1292              : DEBUG_FUNCTION void
    1293            0 : debug (lra_live_range &ref)
    1294              : {
    1295            0 :   lra_print_live_range_list (stderr, &ref);
    1296            0 : }
    1297              : 
    1298              : DEBUG_FUNCTION void
    1299            0 : debug (lra_live_range *ptr)
    1300              : {
    1301            0 :   if (ptr)
    1302            0 :     debug (*ptr);
    1303              :   else
    1304            0 :     fprintf (stderr, "<nil>\n");
    1305            0 : }
    1306              : 
    1307              : /* Print live ranges R to stderr.  */
    1308              : void
    1309            0 : lra_debug_live_range_list (lra_live_range_t r)
    1310              : {
    1311            0 :   lra_print_live_range_list (stderr, r);
    1312            0 : }
    1313              : 
    1314              : /* Print live ranges of pseudo REGNO to file F.  */
    1315              : static void
    1316         6022 : print_pseudo_live_ranges (FILE *f, int regno)
    1317              : {
    1318         6022 :   if (lra_reg_info[regno].live_ranges == NULL)
    1319              :     return;
    1320         2470 :   fprintf (f, " r%d:", regno);
    1321         2470 :   lra_print_live_range_list (f, lra_reg_info[regno].live_ranges);
    1322              : }
    1323              : 
    1324              : /* Print live ranges of pseudo REGNO to stderr.  */
    1325              : void
    1326            0 : lra_debug_pseudo_live_ranges (int regno)
    1327              : {
    1328            0 :   print_pseudo_live_ranges (stderr, regno);
    1329            0 : }
    1330              : 
    1331              : /* Print live ranges of all pseudos to file F.  */
    1332              : static void
    1333          190 : print_live_ranges (FILE *f)
    1334              : {
    1335          190 :   int i, max_regno;
    1336              : 
    1337          190 :   max_regno = max_reg_num ();
    1338         6402 :   for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++)
    1339         6022 :     print_pseudo_live_ranges (f, i);
    1340          190 : }
    1341              : 
    1342              : /* Print live ranges of all pseudos to stderr.  */
    1343              : void
    1344            0 : lra_debug_live_ranges (void)
    1345              : {
    1346            0 :   print_live_ranges (stderr);
    1347            0 : }
    1348              : 
    1349              : /* Compress pseudo live ranges.  */
    1350              : static void
    1351      1567167 : compress_live_ranges (void)
    1352              : {
    1353      1567167 :   remove_some_program_points_and_update_live_ranges ();
    1354      1567167 :   if (lra_dump_file != NULL)
    1355              :     {
    1356           95 :       fprintf (lra_dump_file, "Ranges after the compression:\n");
    1357           95 :       print_live_ranges (lra_dump_file);
    1358              :     }
    1359      1567167 : }
    1360              : 
    1361              : 
    1362              : 
    1363              : /* The number of the current live range pass.  */
    1364              : int lra_live_range_iter;
    1365              : 
    1366              : /* The function creates live ranges only for memory pseudos (or for
    1367              :    all ones if ALL_P), set up CONFLICT_HARD_REGS for the pseudos.  It
    1368              :    also does dead insn elimination if DEAD_INSN_P and global live
    1369              :    analysis only for pseudos and only if the pseudo live info was
    1370              :    changed on a BB border.  Return TRUE if the live info was
    1371              :    changed.  */
    1372              : static bool
    1373      1768372 : lra_create_live_ranges_1 (bool all_p, bool dead_insn_p)
    1374              : {
    1375      1768372 :   basic_block bb;
    1376      1768372 :   int i, hard_regno, max_regno = max_reg_num ();
    1377      1768372 :   int curr_point;
    1378      1768372 :   bool bb_live_change_p, have_referenced_pseudos = false;
    1379              : 
    1380      1768372 :   timevar_push (TV_LRA_CREATE_LIVE_RANGES);
    1381              : 
    1382      1768372 :   complete_info_p = all_p;
    1383      1768372 :   if (lra_dump_file != NULL)
    1384          106 :     fprintf (lra_dump_file,
    1385              :              "\n********** Pseudo live ranges #%d: **********\n\n",
    1386              :              ++lra_live_range_iter);
    1387      1768372 :   memset (lra_hard_reg_usage, 0, sizeof (lra_hard_reg_usage));
    1388    337012046 :   for (i = 0; i < max_regno; i++)
    1389              :     {
    1390    335243674 :       lra_reg_info[i].live_ranges = NULL;
    1391    335243674 :       CLEAR_HARD_REG_SET (lra_reg_info[i].conflict_hard_regs);
    1392    335243674 :       lra_reg_info[i].preferred_hard_regno1 = -1;
    1393    335243674 :       lra_reg_info[i].preferred_hard_regno2 = -1;
    1394    335243674 :       lra_reg_info[i].preferred_hard_regno_profit1 = 0;
    1395    335243674 :       lra_reg_info[i].preferred_hard_regno_profit2 = 0;
    1396              : #ifdef STACK_REGS
    1397    335243674 :       lra_reg_info[i].no_stack_p = false;
    1398              : #endif
    1399              :       /* The biggest mode is already set but its value might be to
    1400              :          conservative because of recent transformation.  Here in this
    1401              :          file we recalculate it again as it costs practically
    1402              :          nothing.  */
    1403    335243674 :       if (!HARD_REGISTER_NUM_P (i) && regno_reg_rtx[i] != NULL_RTX)
    1404    171727510 :         lra_reg_info[i].biggest_mode = GET_MODE (regno_reg_rtx[i]);
    1405              :       else
    1406    163516164 :         lra_reg_info[i].biggest_mode = VOIDmode;
    1407    335243674 :       if (!HARD_REGISTER_NUM_P (i)
    1408    172553450 :           && lra_reg_info[i].nrefs != 0)
    1409              :         {
    1410     88505675 :           if ((hard_regno = reg_renumber[i]) >= 0)
    1411     72977803 :             lra_hard_reg_usage[hard_regno] += lra_reg_info[i].freq;
    1412              :           have_referenced_pseudos = true;
    1413              :         }
    1414              :     }
    1415      1768372 :   lra_free_copies ();
    1416              : 
    1417              :   /* Under some circumstances, we can have functions without pseudo
    1418              :      registers.  For such functions, lra_live_max_point will be 0,
    1419              :      see e.g. PR55604, and there's nothing more to do for us here.  */
    1420      1768372 :   if (! have_referenced_pseudos)
    1421              :     {
    1422       201205 :       timevar_pop (TV_LRA_CREATE_LIVE_RANGES);
    1423       201205 :       return false;
    1424              :     }
    1425              : 
    1426      1567167 :   pseudos_live = sparseset_alloc (max_regno);
    1427      1567167 :   pseudos_live_through_calls = sparseset_alloc (max_regno);
    1428      1567167 :   pseudos_live_through_setjumps = sparseset_alloc (max_regno);
    1429      1567167 :   start_living = sparseset_alloc (max_regno);
    1430      1567167 :   start_dying = sparseset_alloc (max_regno);
    1431      1567167 :   dead_set = sparseset_alloc (max_regno);
    1432      1567167 :   unused_set = sparseset_alloc (max_regno);
    1433      1567167 :   curr_point = 0;
    1434      1567167 :   unsigned new_length = get_max_uid () * 2;
    1435      1567167 :   point_freq_vec.truncate (0);
    1436      1567167 :   point_freq_vec.reserve_exact (new_length);
    1437      1567167 :   lra_point_freq = point_freq_vec.address ();
    1438      1567167 :   int *rpo = XNEWVEC (int, n_basic_blocks_for_fn (cfun));
    1439      1567167 :   int n = inverted_rev_post_order_compute (cfun, rpo);
    1440      1567167 :   lra_assert (n == n_basic_blocks_for_fn (cfun));
    1441              :   bb_live_change_p = false;
    1442     36959483 :   for (i = 0; i < n; ++i)
    1443              :     {
    1444     35392316 :       bb = BASIC_BLOCK_FOR_FN (cfun, rpo[i]);
    1445     35392316 :       if (bb == EXIT_BLOCK_PTR_FOR_FN (cfun) || bb
    1446     33825149 :           == ENTRY_BLOCK_PTR_FOR_FN (cfun))
    1447      3134334 :         continue;
    1448     32257982 :       if (process_bb_lives (bb, curr_point, dead_insn_p))
    1449     35392316 :         bb_live_change_p = true;
    1450              :     }
    1451      1567167 :   free (rpo);
    1452      1567167 :   if (bb_live_change_p)
    1453              :     {
    1454              :       /* We need to clear pseudo live info as some pseudos can
    1455              :          disappear, e.g. pseudos with used equivalences.  */
    1456      6553831 :       FOR_EACH_BB_FN (bb, cfun)
    1457              :         {
    1458      6437670 :           bitmap_clear_range (df_get_live_in (bb), FIRST_PSEUDO_REGISTER,
    1459      6437670 :                               max_regno - FIRST_PSEUDO_REGISTER);
    1460      6437670 :           bitmap_clear_range (df_get_live_out (bb), FIRST_PSEUDO_REGISTER,
    1461              :                               max_regno - FIRST_PSEUDO_REGISTER);
    1462              :         }
    1463              :       /* As we did not change CFG since LRA start we can use
    1464              :          DF-infrastructure solver to solve live data flow problem.  */
    1465     10802973 :       for (int i = 0; HARD_REGISTER_NUM_P (i); ++i)
    1466              :         {
    1467     10686812 :           if (TEST_HARD_REG_BIT (hard_regs_spilled_into, i))
    1468            0 :             bitmap_clear_bit (&all_hard_regs_bitmap, i);
    1469              :         }
    1470       116161 :       df_simple_dataflow
    1471       116161 :         (DF_BACKWARD, NULL, live_con_fun_0, live_con_fun_n,
    1472              :          live_trans_fun, &all_blocks,
    1473              :          df_get_postorder (DF_BACKWARD), df_get_n_blocks (DF_BACKWARD));
    1474       116161 :       if (lra_dump_file != NULL)
    1475              :         {
    1476            7 :           fprintf (lra_dump_file,
    1477              :                    "Global pseudo live data have been updated:\n");
    1478            7 :           basic_block bb;
    1479           35 :           FOR_EACH_BB_FN (bb, cfun)
    1480              :             {
    1481           28 :               bb_data_t bb_info = get_bb_data (bb);
    1482           28 :               bitmap bb_livein = df_get_live_in (bb);
    1483           28 :               bitmap bb_liveout = df_get_live_out (bb);
    1484              : 
    1485           28 :               fprintf (lra_dump_file, "\nBB %d:\n", bb->index);
    1486           28 :               lra_dump_bitmap_with_title ("  gen:",
    1487              :                                           &bb_info->gen_pseudos, bb->index);
    1488           28 :               lra_dump_bitmap_with_title ("  killed:",
    1489              :                                           &bb_info->killed_pseudos, bb->index);
    1490           28 :               lra_dump_bitmap_with_title ("  livein:", bb_livein, bb->index);
    1491           28 :               lra_dump_bitmap_with_title ("  liveout:", bb_liveout, bb->index);
    1492              :             }
    1493              :         }
    1494              :     }
    1495      1567167 :   lra_live_max_point = curr_point;
    1496      1567167 :   if (lra_dump_file != NULL)
    1497           95 :     print_live_ranges (lra_dump_file);
    1498              :   /* Clean up.  */
    1499      1567167 :   sparseset_free (unused_set);
    1500      1567167 :   sparseset_free (dead_set);
    1501      1567167 :   sparseset_free (start_dying);
    1502      1567167 :   sparseset_free (start_living);
    1503      1567167 :   sparseset_free (pseudos_live_through_calls);
    1504      1567167 :   sparseset_free (pseudos_live_through_setjumps);
    1505      1567167 :   sparseset_free (pseudos_live);
    1506      1567167 :   compress_live_ranges ();
    1507      1567167 :   timevar_pop (TV_LRA_CREATE_LIVE_RANGES);
    1508      1567167 :   return bb_live_change_p;
    1509              : }
    1510              : 
    1511              : /* The main entry function creates live-ranges and other live info
    1512              :    necessary for the assignment sub-pass.  It uses
    1513              :    lra_creates_live_ranges_1 -- so read comments for the
    1514              :    function.  */
    1515              : void
    1516      1652211 : lra_create_live_ranges (bool all_p, bool dead_insn_p)
    1517              : {
    1518      1652211 :   if (! lra_create_live_ranges_1 (all_p, dead_insn_p))
    1519              :     return;
    1520       116161 :   if (lra_dump_file != NULL)
    1521            7 :     fprintf (lra_dump_file, "Live info was changed -- recalculate it\n");
    1522              :   /* Live info was changed on a bb border.  It means that some info,
    1523              :      e.g. about conflict regs, calls crossed, and live ranges may be
    1524              :      wrong.  We need this info for allocation.  So recalculate it
    1525              :      again but without removing dead insns which can change live info
    1526              :      again.  Repetitive live range calculations are expensive therefore
    1527              :      we stop here as we already have correct info although some
    1528              :      improvement in rare cases could be possible on this sub-pass if
    1529              :      we do dead insn elimination again (still the improvement may
    1530              :      happen later).  */
    1531       116161 :   lra_clear_live_ranges ();
    1532       116161 :   bool res = lra_create_live_ranges_1 (all_p, false);
    1533       116161 :   lra_assert (! res);
    1534              : }
    1535              : 
    1536              : /* Run lra_create_live_ranges if !complete_info_p.  Return FALSE iff
    1537              :    live ranges are known to have remained unchanged.  */
    1538              : 
    1539              : bool
    1540            0 : lra_complete_live_ranges (void)
    1541              : {
    1542            0 :   if (complete_info_p)
    1543              :     return false;
    1544              : 
    1545            0 :   lra_create_live_ranges (true, true);
    1546            0 :   return true;
    1547              : }
    1548              : 
    1549              : /* Finish all live ranges.  */
    1550              : void
    1551      1753610 : lra_clear_live_ranges (void)
    1552              : {
    1553      1753610 :   int i;
    1554              : 
    1555    325619859 :   for (i = 0; i < max_reg_num (); i++)
    1556    323866249 :     free_live_range_list (lra_reg_info[i].live_ranges);
    1557      1753610 :   point_freq_vec.release ();
    1558      1753610 : }
    1559              : 
    1560              : /* Initialize live ranges data once per function.  */
    1561              : void
    1562      1471362 : lra_live_ranges_init (void)
    1563              : {
    1564      1471362 :   bitmap_initialize (&temp_bitmap, &reg_obstack);
    1565      1471362 :   initiate_live_solver ();
    1566      1471362 : }
    1567              : 
    1568              : /* Finish live ranges data once per function.  */
    1569              : void
    1570      1471362 : lra_live_ranges_finish (void)
    1571              : {
    1572      1471362 :   finish_live_solver ();
    1573      1471362 :   bitmap_clear (&temp_bitmap);
    1574      1471362 :   lra_live_range_pool.release ();
    1575      1471362 : }
        

Generated by: LCOV version 2.4-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.