LCOV - code coverage report
Current view: top level - gcc - ira-costs.cc (source / functions) Coverage Total Hit
Test: gcc.info Lines: 92.5 % 1392 1287
Test Date: 2026-02-28 14:20:25 Functions: 97.2 % 36 35
Legend: Lines:     hit not hit

            Line data    Source code
       1              : /* IRA hard register and memory cost calculation for allocnos or pseudos.
       2              :    Copyright (C) 2006-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              : #include "config.h"
      22              : #include "system.h"
      23              : #include "coretypes.h"
      24              : #include "backend.h"
      25              : #include "target.h"
      26              : #include "rtl.h"
      27              : #include "tree.h"
      28              : #include "predict.h"
      29              : #include "memmodel.h"
      30              : #include "tm_p.h"
      31              : #include "insn-config.h"
      32              : #include "regs.h"
      33              : #include "regset.h"
      34              : #include "ira.h"
      35              : #include "ira-int.h"
      36              : #include "addresses.h"
      37              : #include "reload.h"
      38              : #include "print-rtl.h"
      39              : 
      40              : /* The flags is set up every time when we calculate pseudo register
      41              :    classes through function ira_set_pseudo_classes.  */
      42              : static bool pseudo_classes_defined_p = false;
      43              : 
      44              : /* TRUE if we work with allocnos.  Otherwise we work with pseudos.  */
      45              : static bool allocno_p;
      46              : 
      47              : /* Number of elements in array `costs'.  */
      48              : static int cost_elements_num;
      49              : 
      50              : /* The `costs' struct records the cost of using hard registers of each
      51              :    class considered for the calculation and of using memory for each
      52              :    allocno or pseudo.  */
      53              : struct costs
      54              : {
      55              :   int mem_cost;
      56              :   /* Costs for register classes start here.  We process only some
      57              :      allocno classes.  */
      58              :   int cost[1];
      59              : };
      60              : 
      61              : #define max_struct_costs_size \
      62              :   (this_target_ira_int->x_max_struct_costs_size)
      63              : #define init_cost \
      64              :   (this_target_ira_int->x_init_cost)
      65              : #define temp_costs \
      66              :   (this_target_ira_int->x_temp_costs)
      67              : #define op_costs \
      68              :   (this_target_ira_int->x_op_costs)
      69              : #define this_op_costs \
      70              :   (this_target_ira_int->x_this_op_costs)
      71              : 
      72              : /* Costs of each class for each allocno or pseudo.  */
      73              : static struct costs *costs;
      74              : 
      75              : /* Accumulated costs of each class for each allocno.  */
      76              : static struct costs *total_allocno_costs;
      77              : 
      78              : /* It is the current size of struct costs.  */
      79              : static size_t struct_costs_size;
      80              : 
      81              : /* Return pointer to structure containing costs of allocno or pseudo
      82              :    with given NUM in array ARR.  */
      83              : #define COSTS(arr, num) \
      84              :   ((struct costs *) ((char *) (arr) + (num) * struct_costs_size))
      85              : 
      86              : /* Return index in COSTS when processing reg with REGNO.  */
      87              : #define COST_INDEX(regno) (allocno_p                                         \
      88              :                            ? ALLOCNO_NUM (ira_curr_regno_allocno_map[regno]) \
      89              :                            : (int) regno)
      90              : 
      91              : /* Record register class preferences of each allocno or pseudo.  Null
      92              :    value means no preferences.  It happens on the 1st iteration of the
      93              :    cost calculation.  */
      94              : static enum reg_class *pref;
      95              : 
      96              : /* Allocated buffers for pref.  */
      97              : static enum reg_class *pref_buffer;
      98              : 
      99              : /* Record allocno class of each allocno with the same regno.  */
     100              : static enum reg_class *regno_aclass;
     101              : 
     102              : /* Record cost gains for not allocating a register with an invariant
     103              :    equivalence.  */
     104              : static int *regno_equiv_gains;
     105              : 
     106              : /* Execution frequency of the current insn.  */
     107              : static int frequency;
     108              : 
     109              : 
     110              : 
     111              : /* Info about reg classes whose costs are calculated for a pseudo.  */
     112              : struct cost_classes
     113              : {
     114              :   /* Number of the cost classes in the subsequent array.  */
     115              :   int num;
     116              :   /* Container of the cost classes.  */
     117              :   enum reg_class classes[N_REG_CLASSES];
     118              :   /* Map reg class -> index of the reg class in the previous array.
     119              :      -1 if it is not a cost class.  */
     120              :   int index[N_REG_CLASSES];
     121              :   /* Map hard regno index of first class in array CLASSES containing
     122              :      the hard regno, -1 otherwise.  */
     123              :   int hard_regno_index[FIRST_PSEUDO_REGISTER];
     124              : };
     125              : 
     126              : /* Types of pointers to the structure above.  */
     127              : typedef struct cost_classes *cost_classes_t;
     128              : typedef const struct cost_classes *const_cost_classes_t;
     129              : 
     130              : /* Info about cost classes for each pseudo.  */
     131              : static cost_classes_t *regno_cost_classes;
     132              : 
     133              : /* Helper for cost_classes hashing.  */
     134              : 
     135              : struct cost_classes_hasher : pointer_hash <cost_classes>
     136              : {
     137              :   static inline hashval_t hash (const cost_classes *);
     138              :   static inline bool equal (const cost_classes *, const cost_classes *);
     139              :   static inline void remove (cost_classes *);
     140              : };
     141              : 
     142              : /* Returns hash value for cost classes info HV.  */
     143              : inline hashval_t
     144    108559768 : cost_classes_hasher::hash (const cost_classes *hv)
     145              : {
     146    108559768 :   return iterative_hash (&hv->classes, sizeof (enum reg_class) * hv->num, 0);
     147              : }
     148              : 
     149              : /* Compares cost classes info HV1 and HV2.  */
     150              : inline bool
     151    100583991 : cost_classes_hasher::equal (const cost_classes *hv1, const cost_classes *hv2)
     152              : {
     153    100583991 :   return (hv1->num == hv2->num
     154    100583991 :           && memcmp (hv1->classes, hv2->classes,
     155     51814754 :                      sizeof (enum reg_class) * hv1->num) == 0);
     156              : }
     157              : 
     158              : /* Delete cost classes info V from the hash table.  */
     159              : inline void
     160      5988832 : cost_classes_hasher::remove (cost_classes *v)
     161              : {
     162      5988832 :   ira_free (v);
     163      5988832 : }
     164              : 
     165              : /* Hash table of unique cost classes.  */
     166              : static hash_table<cost_classes_hasher> *cost_classes_htab;
     167              : 
     168              : /* Map allocno class -> cost classes for pseudo of given allocno
     169              :    class.  */
     170              : static cost_classes_t cost_classes_aclass_cache[N_REG_CLASSES];
     171              : 
     172              : /* Map mode -> cost classes for pseudo of give mode.  */
     173              : static cost_classes_t cost_classes_mode_cache[MAX_MACHINE_MODE];
     174              : 
     175              : /* Cost classes that include all classes in ira_important_classes.  */
     176              : static cost_classes all_cost_classes;
     177              : 
     178              : /* Use the array of classes in CLASSES_PTR to fill out the rest of
     179              :    the structure.  */
     180              : static void
     181      7489652 : complete_cost_classes (cost_classes_t classes_ptr)
     182              : {
     183    262137820 :   for (int i = 0; i < N_REG_CLASSES; i++)
     184    254648168 :     classes_ptr->index[i] = -1;
     185    696537636 :   for (int i = 0; i < FIRST_PSEUDO_REGISTER; i++)
     186    689047984 :     classes_ptr->hard_regno_index[i] = -1;
     187    155135263 :   for (int i = 0; i < classes_ptr->num; i++)
     188              :     {
     189    147645611 :       enum reg_class cl = classes_ptr->classes[i];
     190    147645611 :       classes_ptr->index[cl] = i;
     191   1708700737 :       for (int j = ira_class_hard_regs_num[cl] - 1; j >= 0; j--)
     192              :         {
     193   1561055126 :           unsigned int hard_regno = ira_class_hard_regs[cl][j];
     194   1561055126 :           if (classes_ptr->hard_regno_index[hard_regno] < 0)
     195    297115878 :             classes_ptr->hard_regno_index[hard_regno] = i;
     196              :         }
     197              :     }
     198      7489652 : }
     199              : 
     200              : /* Initialize info about the cost classes for each pseudo.  */
     201              : static void
     202      1500820 : initiate_regno_cost_classes (void)
     203              : {
     204      1500820 :   int size = sizeof (cost_classes_t) * max_reg_num ();
     205              : 
     206      1500820 :   regno_cost_classes = (cost_classes_t *) ira_allocate (size);
     207      1500820 :   memset (regno_cost_classes, 0, size);
     208      1500820 :   memset (cost_classes_aclass_cache, 0,
     209              :           sizeof (cost_classes_t) * N_REG_CLASSES);
     210      1500820 :   memset (cost_classes_mode_cache, 0,
     211              :           sizeof (cost_classes_t) * MAX_MACHINE_MODE);
     212      1500820 :   cost_classes_htab = new hash_table<cost_classes_hasher> (200);
     213      1500820 :   all_cost_classes.num = ira_important_classes_num;
     214     48131181 :   for (int i = 0; i < ira_important_classes_num; i++)
     215     46630361 :     all_cost_classes.classes[i] = ira_important_classes[i];
     216      1500820 :   complete_cost_classes (&all_cost_classes);
     217      1500820 : }
     218              : 
     219              : /* Create new cost classes from cost classes FROM and set up members
     220              :    index and hard_regno_index.  Return the new classes.  The function
     221              :    implements some common code of two functions
     222              :    setup_regno_cost_classes_by_aclass and
     223              :    setup_regno_cost_classes_by_mode.  */
     224              : static cost_classes_t
     225      5988832 : setup_cost_classes (cost_classes_t from)
     226              : {
     227      5988832 :   cost_classes_t classes_ptr;
     228              : 
     229      5988832 :   classes_ptr = (cost_classes_t) ira_allocate (sizeof (struct cost_classes));
     230      5988832 :   classes_ptr->num = from->num;
     231    107004082 :   for (int i = 0; i < from->num; i++)
     232    101015250 :     classes_ptr->classes[i] = from->classes[i];
     233      5988832 :   complete_cost_classes (classes_ptr);
     234      5988832 :   return classes_ptr;
     235              : }
     236              : 
     237              : /* Return a version of FULL that only considers registers in REGS that are
     238              :    valid for mode MODE.  Both FULL and the returned class are globally
     239              :    allocated.  */
     240              : static cost_classes_t
     241     53721260 : restrict_cost_classes (cost_classes_t full, machine_mode mode,
     242              :                        const_hard_reg_set regs)
     243              : {
     244     53721260 :   static struct cost_classes narrow;
     245     53721260 :   int map[N_REG_CLASSES];
     246     53721260 :   narrow.num = 0;
     247   1564148920 :   for (int i = 0; i < full->num; i++)
     248              :     {
     249              :       /* Assume that we'll drop the class.  */
     250   1510427660 :       map[i] = -1;
     251              : 
     252              :       /* Ignore classes that are too small for the mode.  */
     253   1510427660 :       enum reg_class cl = full->classes[i];
     254   1510427660 :       if (!contains_reg_of_mode[cl][mode])
     255    302856011 :         continue;
     256              : 
     257              :       /* Calculate the set of registers in CL that belong to REGS and
     258              :          are valid for MODE.  */
     259   1226311800 :       HARD_REG_SET valid_for_cl = reg_class_contents[cl] & regs;
     260   2452623600 :       valid_for_cl &= ~(ira_prohibited_class_mode_regs[cl][mode]
     261   1226311800 :                         | ira_no_alloc_regs);
     262   2452623600 :       if (hard_reg_set_empty_p (valid_for_cl))
     263     18740151 :         continue;
     264              : 
     265              :       /* Don't use this class if the set of valid registers is a subset
     266              :          of an existing class.  For example, suppose we have two classes
     267              :          GR_REGS and FR_REGS and a union class GR_AND_FR_REGS.  Suppose
     268              :          that the mode changes allowed by FR_REGS are not as general as
     269              :          the mode changes allowed by GR_REGS.
     270              : 
     271              :          In this situation, the mode changes for GR_AND_FR_REGS could
     272              :          either be seen as the union or the intersection of the mode
     273              :          changes allowed by the two subclasses.  The justification for
     274              :          the union-based definition would be that, if you want a mode
     275              :          change that's only allowed by GR_REGS, you can pick a register
     276              :          from the GR_REGS subclass.  The justification for the
     277              :          intersection-based definition would be that every register
     278              :          from the class would allow the mode change.
     279              : 
     280              :          However, if we have a register that needs to be in GR_REGS,
     281              :          using GR_AND_FR_REGS with the intersection-based definition
     282              :          would be too pessimistic, since it would bring in restrictions
     283              :          that only apply to FR_REGS.  Conversely, if we have a register
     284              :          that needs to be in FR_REGS, using GR_AND_FR_REGS with the
     285              :          union-based definition would lose the extra restrictions
     286              :          placed on FR_REGS.  GR_AND_FR_REGS is therefore only useful
     287              :          for cases where GR_REGS and FP_REGS are both valid.  */
     288              :       int pos;
     289  12300202156 :       for (pos = 0; pos < narrow.num; ++pos)
     290              :         {
     291  11514307113 :           enum reg_class cl2 = narrow.classes[pos];
     292  23028614226 :           if (hard_reg_set_subset_p (valid_for_cl, reg_class_contents[cl2]))
     293              :             break;
     294              :         }
     295   1207571649 :       map[i] = pos;
     296   1207571649 :       if (pos == narrow.num)
     297              :         {
     298              :           /* If several classes are equivalent, prefer to use the one
     299              :              that was chosen as the allocno class.  */
     300    785895043 :           enum reg_class cl2 = ira_allocno_class_translate[cl];
     301    785895043 :           if (ira_class_hard_regs_num[cl] == ira_class_hard_regs_num[cl2])
     302    785895043 :             cl = cl2;
     303    785895043 :           narrow.classes[narrow.num++] = cl;
     304              :         }
     305              :     }
     306     53721260 :   if (narrow.num == full->num)
     307              :     return full;
     308              : 
     309     53720409 :   cost_classes **slot = cost_classes_htab->find_slot (&narrow, INSERT);
     310     53720409 :   if (*slot == NULL)
     311              :     {
     312      4072116 :       cost_classes_t classes = setup_cost_classes (&narrow);
     313              :       /* Map equivalent classes to the representative that we chose above.  */
     314    130754574 :       for (int i = 0; i < ira_important_classes_num; i++)
     315              :         {
     316    126682458 :           enum reg_class cl = ira_important_classes[i];
     317    126682458 :           int index = full->index[cl];
     318    126682458 :           if (index >= 0)
     319    112677268 :             classes->index[cl] = map[index];
     320              :         }
     321      4072116 :       *slot = classes;
     322              :     }
     323     53720409 :   return *slot;
     324              : }
     325              : 
     326              : /* Setup cost classes for pseudo REGNO whose allocno class is ACLASS.
     327              :    This function is used when we know an initial approximation of
     328              :    allocno class of the pseudo already, e.g. on the second iteration
     329              :    of class cost calculation or after class cost calculation in
     330              :    register-pressure sensitive insn scheduling or register-pressure
     331              :    sensitive loop-invariant motion.  */
     332              : static void
     333     48798754 : setup_regno_cost_classes_by_aclass (int regno, enum reg_class aclass)
     334              : {
     335     48798754 :   static struct cost_classes classes;
     336     48798754 :   cost_classes_t classes_ptr;
     337     48798754 :   enum reg_class cl;
     338     48798754 :   int i;
     339     48798754 :   cost_classes **slot;
     340     48798754 :   HARD_REG_SET temp, temp2;
     341     48798754 :   bool exclude_p;
     342              : 
     343     48798754 :   if ((classes_ptr = cost_classes_aclass_cache[aclass]) == NULL)
     344              :     {
     345      4073838 :       temp = reg_class_contents[aclass] & ~ira_no_alloc_regs;
     346              :       /* We exclude classes from consideration which are subsets of
     347              :          ACLASS only if ACLASS is an uniform class.  */
     348      4073838 :       exclude_p = ira_uniform_class_p[aclass];
     349      4073838 :       classes.num = 0;
     350    130762246 :       for (i = 0; i < ira_important_classes_num; i++)
     351              :         {
     352    126688408 :           cl = ira_important_classes[i];
     353    126688408 :           if (exclude_p)
     354              :             {
     355              :               /* Exclude non-uniform classes which are subsets of
     356              :                  ACLASS.  */
     357     90268918 :               temp2 = reg_class_contents[cl] & ~ira_no_alloc_regs;
     358    180537836 :               if (hard_reg_set_subset_p (temp2, temp) && cl != aclass)
     359     10625134 :                 continue;
     360              :             }
     361    116063274 :           classes.classes[classes.num++] = cl;
     362              :         }
     363      4073838 :       slot = cost_classes_htab->find_slot (&classes, INSERT);
     364      4073838 :       if (*slot == NULL)
     365              :         {
     366      1916716 :           classes_ptr = setup_cost_classes (&classes);
     367      1916716 :           *slot = classes_ptr;
     368              :         }
     369      4073838 :       classes_ptr = cost_classes_aclass_cache[aclass] = (cost_classes_t) *slot;
     370              :     }
     371     48798754 :   if (regno_reg_rtx[regno] != NULL_RTX)
     372              :     {
     373              :       /* Restrict the classes to those that are valid for REGNO's mode
     374              :          (which might for example exclude singleton classes if the mode
     375              :          requires two registers).  Also restrict the classes to those that
     376              :          are valid for subregs of REGNO.  */
     377     48209250 :       const HARD_REG_SET *valid_regs = valid_mode_changes_for_regno (regno);
     378     48209250 :       if (!valid_regs)
     379     46855585 :         valid_regs = &reg_class_contents[ALL_REGS];
     380     48209250 :       classes_ptr = restrict_cost_classes (classes_ptr,
     381     48209250 :                                            PSEUDO_REGNO_MODE (regno),
     382              :                                            *valid_regs);
     383              :     }
     384     48798754 :   regno_cost_classes[regno] = classes_ptr;
     385     48798754 : }
     386              : 
     387              : /* Setup cost classes for pseudo REGNO with MODE.  Usage of MODE can
     388              :    decrease number of cost classes for the pseudo, if hard registers
     389              :    of some important classes cannot hold a value of MODE.  So the
     390              :    pseudo cannot get hard register of some important classes and cost
     391              :    calculation for such important classes is only wasting CPU
     392              :    time.  */
     393              : static void
     394     66617587 : setup_regno_cost_classes_by_mode (int regno, machine_mode mode)
     395              : {
     396     66617587 :   if (const HARD_REG_SET *valid_regs = valid_mode_changes_for_regno (regno))
     397      1773142 :     regno_cost_classes[regno] = restrict_cost_classes (&all_cost_classes,
     398              :                                                        mode, *valid_regs);
     399              :   else
     400              :     {
     401     64844445 :       if (cost_classes_mode_cache[mode] == NULL)
     402      3738868 :         cost_classes_mode_cache[mode]
     403      3738868 :           = restrict_cost_classes (&all_cost_classes, mode,
     404      3738868 :                                    reg_class_contents[ALL_REGS]);
     405     64844445 :       regno_cost_classes[regno] = cost_classes_mode_cache[mode];
     406              :     }
     407     66617587 : }
     408              : 
     409              : /* Finalize info about the cost classes for each pseudo.  */
     410              : static void
     411      1500820 : finish_regno_cost_classes (void)
     412              : {
     413      1500820 :   ira_free (regno_cost_classes);
     414      1500820 :   delete cost_classes_htab;
     415      1500820 :   cost_classes_htab = NULL;
     416      1500820 : }
     417              : 
     418              : 
     419              : 
     420              : /* Compute the cost of loading X into (if TO_P is TRUE) or from (if
     421              :    TO_P is FALSE) a register of class RCLASS in mode MODE.  X must not
     422              :    be a pseudo register.  */
     423              : static int
     424    377652142 : copy_cost (rtx x, machine_mode mode, reg_class_t rclass, bool to_p,
     425              :            secondary_reload_info *prev_sri)
     426              : {
     427    377652142 :   secondary_reload_info sri;
     428    377652142 :   reg_class_t secondary_class = NO_REGS;
     429              : 
     430              :   /* If X is a SCRATCH, there is actually nothing to move since we are
     431              :      assuming optimal allocation.  */
     432    377652142 :   if (GET_CODE (x) == SCRATCH)
     433              :     return 0;
     434              : 
     435              :   /* Get the class we will actually use for a reload.  */
     436    377642597 :   rclass = targetm.preferred_reload_class (x, rclass);
     437              : 
     438              :   /* If we need a secondary reload for an intermediate, the cost is
     439              :      that to load the input into the intermediate register, then to
     440              :      copy it.  */
     441    377642597 :   sri.prev_sri = prev_sri;
     442    377642597 :   sri.extra_cost = 0;
     443              :   /* PR 68770: Secondary reload might examine the t_icode field.  */
     444    377642597 :   sri.t_icode = CODE_FOR_nothing;
     445              : 
     446    377642597 :   secondary_class = targetm.secondary_reload (to_p, x, rclass, mode, &sri);
     447              : 
     448    377642597 :   if (secondary_class != NO_REGS)
     449              :     {
     450       115704 :       ira_init_register_move_cost_if_necessary (mode);
     451       115704 :       return (ira_register_move_cost[mode][(int) secondary_class][(int) rclass]
     452       115704 :               + sri.extra_cost
     453       115704 :               + copy_cost (x, mode, secondary_class, to_p, &sri));
     454              :     }
     455              : 
     456              :   /* For memory, use the memory move cost, for (hard) registers, use
     457              :      the cost to move between the register classes, and use 2 for
     458              :      everything else (constants).  */
     459    377526893 :   if (MEM_P (x) || rclass == NO_REGS)
     460    236069789 :     return sri.extra_cost
     461    236069789 :            + ira_memory_move_cost[mode][(int) rclass][to_p != 0];
     462    141457104 :   else if (REG_P (x))
     463              :     {
     464     45145148 :       reg_class_t x_class = REGNO_REG_CLASS (REGNO (x));
     465              : 
     466     45145148 :       ira_init_register_move_cost_if_necessary (mode);
     467     45145148 :       return (sri.extra_cost
     468     45145148 :               + ira_register_move_cost[mode][(int) x_class][(int) rclass]);
     469              :     }
     470              :   else
     471              :     /* If this is a constant, we may eventually want to call rtx_cost
     472              :        here.  */
     473     96311956 :     return sri.extra_cost + COSTS_N_INSNS (1);
     474              : }
     475              : 
     476              : 
     477              : 
     478              : /* Record the cost of using memory or hard registers of various
     479              :    classes for the operands in INSN.
     480              : 
     481              :    N_ALTS is the number of alternatives.
     482              :    N_OPS is the number of operands.
     483              :    OPS is an array of the operands.
     484              :    MODES are the modes of the operands, in case any are VOIDmode.
     485              :    CONSTRAINTS are the constraints to use for the operands.  This array
     486              :    is modified by this procedure.
     487              : 
     488              :    This procedure works alternative by alternative.  For each
     489              :    alternative we assume that we will be able to allocate all allocnos
     490              :    to their ideal register class and calculate the cost of using that
     491              :    alternative.  Then we compute, for each operand that is a
     492              :    pseudo-register, the cost of having the allocno allocated to each
     493              :    register class and using it in that alternative.  To this cost is
     494              :    added the cost of the alternative.
     495              : 
     496              :    The cost of each class for this insn is its lowest cost among all
     497              :    the alternatives.  */
     498              : static void
     499    139519230 : record_reg_classes (int n_alts, int n_ops, rtx *ops,
     500              :                     machine_mode *modes, const char **constraints,
     501              :                     rtx_insn *insn, enum reg_class *pref)
     502              : {
     503    139519230 :   int alt;
     504    139519230 :   int i, j, k;
     505    139519230 :   int insn_allows_mem[MAX_RECOG_OPERANDS];
     506    139519230 :   move_table *move_in_cost, *move_out_cost;
     507    139519230 :   short (*mem_cost)[2];
     508    139519230 :   const char *p;
     509              : 
     510    139519230 :   if (ira_dump_file != NULL && internal_flag_ira_verbose > 5)
     511              :     {
     512            0 :       fprintf (ira_dump_file, "    Processing insn %u", INSN_UID (insn));
     513            0 :       if (INSN_CODE (insn) >= 0
     514            0 :           && (p = get_insn_name (INSN_CODE (insn))) != NULL)
     515            0 :         fprintf (ira_dump_file, " {%s}", p);
     516            0 :       fprintf (ira_dump_file, " (freq=%d)\n",
     517            0 :                REG_FREQ_FROM_BB (BLOCK_FOR_INSN (insn)));
     518            0 :       dump_insn_slim (ira_dump_file, insn);
     519              :   }
     520              : 
     521    459406272 :   for (i = 0; i < n_ops; i++)
     522    319887042 :     insn_allows_mem[i] = 0;
     523              : 
     524              :   /* Process each alternative, each time minimizing an operand's cost
     525              :      with the cost for each operand in that alternative.  */
     526    139519230 :   alternative_mask preferred = get_preferred_alternatives (insn);
     527   1566403283 :   for (alt = 0; alt < n_alts; alt++)
     528              :     {
     529   1426884053 :       enum reg_class classes[MAX_RECOG_OPERANDS];
     530   1426884053 :       int allows_mem[MAX_RECOG_OPERANDS];
     531   1426884053 :       enum reg_class rclass;
     532   1426884053 :       int alt_fail = 0;
     533   1426884053 :       int alt_cost = 0, op_cost_add;
     534              : 
     535   1426884053 :       if (!TEST_BIT (preferred, alt))
     536              :         {
     537   1450838674 :           for (i = 0; i < recog_data.n_operands; i++)
     538   2008081146 :             constraints[i] = skip_alternative (constraints[i]);
     539              : 
     540    931792042 :           continue;
     541              :         }
     542              : 
     543    980085952 :       if (ira_dump_file != NULL && internal_flag_ira_verbose > 5)
     544              :         {
     545            0 :           fprintf (ira_dump_file, "      Alt %d:", alt);
     546            0 :           for (i = 0; i < n_ops; i++)
     547              :             {
     548            0 :               p = constraints[i];
     549            0 :               if (*p == '\0')
     550            0 :                 continue;
     551            0 :               fprintf (ira_dump_file, "  (%d) ", i);
     552            0 :               for (; *p != '\0' && *p != ',' && *p != '#'; p++)
     553            0 :                 fputc (*p, ira_dump_file);
     554              :             }
     555            0 :           fprintf (ira_dump_file, "\n");
     556              :         }
     557              : 
     558   2327620641 :       for (i = 0; i < n_ops; i++)
     559              :         {
     560   1832528630 :           unsigned char c;
     561   1832528630 :           const char *p = constraints[i];
     562   1832528630 :           rtx op = ops[i];
     563   1832528630 :           machine_mode mode = modes[i];
     564   1832528630 :           int allows_addr = 0;
     565   1832528630 :           int win = 0;
     566              : 
     567              :           /* Initially show we know nothing about the register class.  */
     568   1832528630 :           classes[i] = NO_REGS;
     569   1832528630 :           allows_mem[i] = 0;
     570              : 
     571              :           /* If this operand has no constraints at all, we can
     572              :              conclude nothing about it since anything is valid.  */
     573   1832528630 :           if (*p == 0)
     574              :             {
     575     29267742 :               if (REG_P (op) && REGNO (op) >= FIRST_PSEUDO_REGISTER)
     576            3 :                 memset (this_op_costs[i], 0, struct_costs_size);
     577     29267742 :               continue;
     578              :             }
     579              : 
     580              :           /* If this alternative is only relevant when this operand
     581              :              matches a previous operand, we do different things
     582              :              depending on whether this operand is a allocno-reg or not.
     583              :              We must process any modifiers for the operand before we
     584              :              can make this test.  */
     585   1905400617 :           while (*p == '%' || *p == '=' || *p == '+' || *p == '&')
     586    102139729 :             p++;
     587              : 
     588   1803260888 :           if (p[0] >= '0' && p[0] <= '0' + i)
     589              :             {
     590              :               /* Copy class and whether memory is allowed from the
     591              :                  matching alternative.  Then perform any needed cost
     592              :                  computations and/or adjustments.  */
     593     96320511 :               j = p[0] - '0';
     594     96320511 :               classes[i] = classes[j];
     595     96320511 :               allows_mem[i] = allows_mem[j];
     596     96320511 :               if (allows_mem[i])
     597     45802634 :                 insn_allows_mem[i] = 1;
     598              : 
     599     96320511 :               if (! REG_P (op) || REGNO (op) < FIRST_PSEUDO_REGISTER)
     600              :                 {
     601              :                   /* If this matches the other operand, we have no
     602              :                      added cost and we win.  */
     603     49328891 :                   if (rtx_equal_p (ops[j], op))
     604   1803260888 :                     win = 1;
     605              :                   /* If we can put the other operand into a register,
     606              :                      add to the cost of this alternative the cost to
     607              :                      copy this operand to the register used for the
     608              :                      other operand.  */
     609     33673075 :                   else if (classes[j] != NO_REGS)
     610              :                     {
     611     33512282 :                       alt_cost += copy_cost (op, mode, classes[j], 1, NULL);
     612     33512282 :                       win = 1;
     613              :                     }
     614              :                 }
     615     46991620 :               else if (! REG_P (ops[j])
     616     46991620 :                        || REGNO (ops[j]) < FIRST_PSEUDO_REGISTER)
     617              :                 {
     618              :                   /* This op is an allocno but the one it matches is
     619              :                      not.  */
     620              : 
     621              :                   /* If we can't put the other operand into a
     622              :                      register, this alternative can't be used.  */
     623              : 
     624       181691 :                   if (classes[j] == NO_REGS)
     625              :                     {
     626   1803260888 :                       alt_fail = 1;
     627              :                     }
     628              :                   else
     629              :                     /* Otherwise, add to the cost of this alternative the cost
     630              :                        to copy the other operand to the hard register used for
     631              :                        this operand.  */
     632              :                     {
     633       171683 :                       alt_cost += copy_cost (ops[j], mode, classes[j], 1, NULL);
     634              :                     }
     635              :                 }
     636              :               else
     637              :                 {
     638              :                   /* The costs of this operand are not the same as the
     639              :                      other operand since move costs are not symmetric.
     640              :                      Moreover, if we cannot tie them, this alternative
     641              :                      needs to do a copy, which is one insn.  */
     642     46809929 :                   struct costs *pp = this_op_costs[i];
     643     46809929 :                   int *pp_costs = pp->cost;
     644     46809929 :                   cost_classes_t cost_classes_ptr
     645     46809929 :                     = regno_cost_classes[REGNO (op)];
     646     46809929 :                   enum reg_class *cost_classes = cost_classes_ptr->classes;
     647     46809929 :                   bool in_p = recog_data.operand_type[i] != OP_OUT;
     648     46809929 :                   bool out_p = recog_data.operand_type[i] != OP_IN;
     649     46809929 :                   enum reg_class op_class = classes[i];
     650              : 
     651     46809929 :                   ira_init_register_move_cost_if_necessary (mode);
     652     46809929 :                   if (! in_p)
     653              :                     {
     654        60977 :                       ira_assert (out_p);
     655        60977 :                       if (op_class == NO_REGS)
     656              :                         {
     657            0 :                           mem_cost = ira_memory_move_cost[mode];
     658            0 :                           for (k = cost_classes_ptr->num - 1; k >= 0; k--)
     659              :                             {
     660            0 :                               rclass = cost_classes[k];
     661            0 :                               pp_costs[k] = mem_cost[rclass][0] * frequency;
     662              :                             }
     663              :                         }
     664              :                       else
     665              :                         {
     666        60977 :                           move_out_cost = ira_may_move_out_cost[mode];
     667       844672 :                           for (k = cost_classes_ptr->num - 1; k >= 0; k--)
     668              :                             {
     669       783695 :                               rclass = cost_classes[k];
     670       783695 :                               pp_costs[k]
     671       783695 :                                 = move_out_cost[op_class][rclass] * frequency;
     672              :                             }
     673              :                         }
     674              :                     }
     675     46748952 :                   else if (! out_p)
     676              :                     {
     677     46748952 :                       ira_assert (in_p);
     678     46748952 :                       if (op_class == NO_REGS)
     679              :                         {
     680       427165 :                           mem_cost = ira_memory_move_cost[mode];
     681      6216417 :                           for (k = cost_classes_ptr->num - 1; k >= 0; k--)
     682              :                             {
     683      5789252 :                               rclass = cost_classes[k];
     684      5789252 :                               pp_costs[k] = mem_cost[rclass][1] * frequency;
     685              :                             }
     686              :                         }
     687              :                       else
     688              :                         {
     689     46321787 :                           move_in_cost = ira_may_move_in_cost[mode];
     690    698643443 :                           for (k = cost_classes_ptr->num - 1; k >= 0; k--)
     691              :                             {
     692    652321656 :                               rclass = cost_classes[k];
     693    652321656 :                               pp_costs[k]
     694    652321656 :                                 = move_in_cost[rclass][op_class] * frequency;
     695              :                             }
     696              :                         }
     697              :                     }
     698              :                   else
     699              :                     {
     700            0 :                       if (op_class == NO_REGS)
     701              :                         {
     702            0 :                           mem_cost = ira_memory_move_cost[mode];
     703            0 :                           for (k = cost_classes_ptr->num - 1; k >= 0; k--)
     704              :                             {
     705            0 :                               rclass = cost_classes[k];
     706            0 :                               pp_costs[k] = ((mem_cost[rclass][0]
     707            0 :                                               + mem_cost[rclass][1])
     708            0 :                                              * frequency);
     709              :                             }
     710              :                         }
     711              :                       else
     712              :                         {
     713            0 :                           move_in_cost = ira_may_move_in_cost[mode];
     714            0 :                           move_out_cost = ira_may_move_out_cost[mode];
     715            0 :                           for (k = cost_classes_ptr->num - 1; k >= 0; k--)
     716              :                             {
     717            0 :                               rclass = cost_classes[k];
     718            0 :                               pp_costs[k] = ((move_in_cost[rclass][op_class]
     719            0 :                                               + move_out_cost[op_class][rclass])
     720            0 :                                              * frequency);
     721              :                             }
     722              :                         }
     723              :                     }
     724              : 
     725              :                   /* If the alternative actually allows memory, make
     726              :                      things a bit cheaper since we won't need an extra
     727              :                      insn to load it.  */
     728     46809929 :                   pp->mem_cost
     729     46809929 :                     = ((out_p ? ira_memory_move_cost[mode][op_class][0] : 0)
     730     46809929 :                        + (in_p ? ira_memory_move_cost[mode][op_class][1] : 0)
     731     46809929 :                        - allows_mem[i]) * frequency;
     732              : 
     733              :                   /* If we have assigned a class to this allocno in
     734              :                      our first pass, add a cost to this alternative
     735              :                      corresponding to what we would add if this
     736              :                      allocno were not in the appropriate class.  */
     737     46809929 :                   if (pref)
     738              :                     {
     739     17836391 :                       enum reg_class pref_class = pref[COST_INDEX (REGNO (op))];
     740              : 
     741     17836391 :                       if (pref_class == NO_REGS)
     742       634694 :                         alt_cost
     743       634694 :                           += ((out_p
     744              :                                ? ira_memory_move_cost[mode][op_class][0] : 0)
     745              :                               + (in_p
     746              :                                  ? ira_memory_move_cost[mode][op_class][1]
     747              :                                  : 0));
     748     17201697 :                       else if (ira_reg_class_intersect
     749     17201697 :                                [pref_class][op_class] == NO_REGS)
     750       314791 :                         alt_cost
     751       314791 :                           += ira_register_move_cost[mode][pref_class][op_class];
     752              :                     }
     753     46809929 :                   if (REGNO (ops[i]) != REGNO (ops[j])
     754     46809929 :                       && ! find_reg_note (insn, REG_DEAD, op))
     755     13196511 :                     alt_cost += 2;
     756              : 
     757     46809929 :                   p++;
     758              :                 }
     759              :             }
     760              : 
     761              :           /* Scan all the constraint letters.  See if the operand
     762              :              matches any of the constraints.  Collect the valid
     763              :              register classes and see if this operand accepts
     764              :              memory.  */
     765   4350752925 :           while ((c = *p))
     766              :             {
     767   4284356544 :               switch (c)
     768              :                 {
     769    317410413 :                 case '*':
     770              :                   /* Ignore the next letter for this pass.  */
     771    317410413 :                   c = *++p;
     772    317410413 :                   break;
     773              : 
     774            0 :                 case '^':
     775            0 :                   alt_cost += 2;
     776            0 :                   break;
     777              : 
     778    504631429 :                 case '?':
     779    504631429 :                   alt_cost += 2;
     780    504631429 :                   break;
     781              : 
     782     12669270 :                 case 'g':
     783     12669270 :                   if (MEM_P (op)
     784     12669270 :                       || (CONSTANT_P (op)
     785      5120343 :                           && (! flag_pic || LEGITIMATE_PIC_OPERAND_P (op))))
     786              :                     win = 1;
     787     12669270 :                   insn_allows_mem[i] = allows_mem[i] = 1;
     788     12669270 :                   classes[i] = ira_reg_class_subunion[classes[i]][GENERAL_REGS];
     789     12669270 :                   break;
     790              : 
     791   3449645432 :                 default:
     792   3449645432 :                   enum constraint_num cn = lookup_constraint (p);
     793   3449645432 :                   enum reg_class cl;
     794   3449645432 :                   switch (get_constraint_type (cn))
     795              :                     {
     796   2804031826 :                     case CT_REGISTER:
     797   2804031826 :                       cl = reg_class_for_constraint (cn);
     798   1002226827 :                       if (cl != NO_REGS)
     799    991636075 :                         classes[i] = ira_reg_class_subunion[classes[i]][cl];
     800              :                       break;
     801              : 
     802      4786651 :                     case CT_CONST_INT:
     803      4786651 :                       if (CONST_INT_P (op)
     804      4786651 :                           && insn_const_int_ok_for_constraint (INTVAL (op), cn))
     805              :                         win = 1;
     806              :                       break;
     807              : 
     808    276146745 :                     case CT_MEMORY:
     809    276146745 :                     case CT_RELAXED_MEMORY:
     810              :                       /* Every MEM can be reloaded to fit.  */
     811    276146745 :                       insn_allows_mem[i] = allows_mem[i] = 1;
     812    276146745 :                       if (MEM_P (op))
     813     79687817 :                         win = 1;
     814              :                       break;
     815              : 
     816     39577035 :                     case CT_SPECIAL_MEMORY:
     817     39577035 :                       insn_allows_mem[i] = allows_mem[i] = 1;
     818     39577035 :                       if (MEM_P (extract_mem_from_operand (op))
     819     39577035 :                           && constraint_satisfied_p (op, cn))
     820              :                         win = 1;
     821              :                       break;
     822              : 
     823      1161753 :                     case CT_ADDRESS:
     824              :                       /* Every address can be reloaded to fit.  */
     825      1161753 :                       allows_addr = 1;
     826      1161753 :                       if (address_operand (op, GET_MODE (op))
     827      1161753 :                           || constraint_satisfied_p (op, cn))
     828              :                         win = 1;
     829              :                       /* We know this operand is an address, so we
     830              :                          want it to be allocated to a hard register
     831              :                          that can be the base of an address,
     832              :                          i.e. BASE_REG_CLASS.  */
     833      1161753 :                       classes[i]
     834      2323506 :                         = ira_reg_class_subunion[classes[i]]
     835      1161753 :                           [base_reg_class (VOIDmode, ADDR_SPACE_GENERIC,
     836      1161753 :                                            ADDRESS, SCRATCH)];
     837      1161753 :                       break;
     838              : 
     839    323941422 :                     case CT_FIXED_FORM:
     840    323941422 :                       if (constraint_satisfied_p (op, cn))
     841   4284356544 :                         win = 1;
     842              :                       break;
     843              :                     }
     844              :                   break;
     845              :                 }
     846   4284356544 :               p += CONSTRAINT_LEN (c, p);
     847   4284356544 :               if (c == ',')
     848              :                 break;
     849              :             }
     850              : 
     851   1803260888 :           constraints[i] = p;
     852              : 
     853   1803260888 :           if (alt_fail)
     854              :             break;
     855              : 
     856              :           /* How we account for this operand now depends on whether it
     857              :              is a pseudo register or not.  If it is, we first check if
     858              :              any register classes are valid.  If not, we ignore this
     859              :              alternative, since we want to assume that all allocnos get
     860              :              allocated for register preferencing.  If some register
     861              :              class is valid, compute the costs of moving the allocno
     862              :              into that class.  */
     863   1803250880 :           if (REG_P (op) && REGNO (op) >= FIRST_PSEUDO_REGISTER)
     864              :             {
     865    817081981 :               if (classes[i] == NO_REGS && ! allows_mem[i])
     866              :                 {
     867              :                   /* We must always fail if the operand is a REG, but
     868              :                      we did not find a suitable class and memory is
     869              :                      not allowed.
     870              : 
     871              :                      Otherwise we may perform an uninitialized read
     872              :                      from this_op_costs after the `continue' statement
     873              :                      below.  */
     874              :                   alt_fail = 1;
     875              :                 }
     876              :               else
     877              :                 {
     878    613520521 :                   unsigned int regno = REGNO (op);
     879    613520521 :                   struct costs *pp = this_op_costs[i];
     880    613520521 :                   int *pp_costs = pp->cost;
     881    613520521 :                   cost_classes_t cost_classes_ptr = regno_cost_classes[regno];
     882    613520521 :                   enum reg_class *cost_classes = cost_classes_ptr->classes;
     883    613520521 :                   bool in_p = recog_data.operand_type[i] != OP_OUT;
     884    613520521 :                   bool out_p = recog_data.operand_type[i] != OP_IN;
     885    613520521 :                   enum reg_class op_class = classes[i];
     886              : 
     887    613520521 :                   ira_init_register_move_cost_if_necessary (mode);
     888    613520521 :                   if (! in_p)
     889              :                     {
     890    392580073 :                       ira_assert (out_p);
     891    392580073 :                       if (op_class == NO_REGS)
     892              :                         {
     893     72091468 :                           mem_cost = ira_memory_move_cost[mode];
     894   1114292227 :                           for (k = cost_classes_ptr->num - 1; k >= 0; k--)
     895              :                             {
     896   1042200759 :                               rclass = cost_classes[k];
     897   1042200759 :                               pp_costs[k] = mem_cost[rclass][0] * frequency;
     898              :                             }
     899              :                         }
     900              :                       else
     901              :                         {
     902    320488605 :                           move_out_cost = ira_may_move_out_cost[mode];
     903   4853181838 :                           for (k = cost_classes_ptr->num - 1; k >= 0; k--)
     904              :                             {
     905   4532693233 :                               rclass = cost_classes[k];
     906   4532693233 :                               pp_costs[k]
     907   4532693233 :                                 = move_out_cost[op_class][rclass] * frequency;
     908              :                             }
     909              :                         }
     910              :                     }
     911    220940448 :                   else if (! out_p)
     912              :                     {
     913    220927495 :                       ira_assert (in_p);
     914    220927495 :                       if (op_class == NO_REGS)
     915              :                         {
     916     16383315 :                           mem_cost = ira_memory_move_cost[mode];
     917    241925438 :                           for (k = cost_classes_ptr->num - 1; k >= 0; k--)
     918              :                             {
     919    225542123 :                               rclass = cost_classes[k];
     920    225542123 :                               pp_costs[k] = mem_cost[rclass][1] * frequency;
     921              :                             }
     922              :                         }
     923              :                       else
     924              :                         {
     925    204544180 :                           move_in_cost = ira_may_move_in_cost[mode];
     926   3005863011 :                           for (k = cost_classes_ptr->num - 1; k >= 0; k--)
     927              :                             {
     928   2801318831 :                               rclass = cost_classes[k];
     929   2801318831 :                               pp_costs[k]
     930   2801318831 :                                 = move_in_cost[rclass][op_class] * frequency;
     931              :                             }
     932              :                         }
     933              :                     }
     934              :                   else
     935              :                     {
     936        12953 :                       if (op_class == NO_REGS)
     937              :                         {
     938            0 :                           mem_cost = ira_memory_move_cost[mode];
     939            0 :                           for (k = cost_classes_ptr->num - 1; k >= 0; k--)
     940              :                             {
     941            0 :                               rclass = cost_classes[k];
     942            0 :                               pp_costs[k] = ((mem_cost[rclass][0]
     943            0 :                                               + mem_cost[rclass][1])
     944            0 :                                              * frequency);
     945              :                             }
     946              :                         }
     947              :                       else
     948              :                         {
     949        12953 :                           move_in_cost = ira_may_move_in_cost[mode];
     950        12953 :                           move_out_cost = ira_may_move_out_cost[mode];
     951       152907 :                           for (k = cost_classes_ptr->num - 1; k >= 0; k--)
     952              :                             {
     953       139954 :                               rclass = cost_classes[k];
     954       139954 :                               pp_costs[k] = ((move_in_cost[rclass][op_class]
     955       139954 :                                               + move_out_cost[op_class][rclass])
     956       139954 :                                              * frequency);
     957              :                             }
     958              :                         }
     959              :                     }
     960              : 
     961    613520521 :                   if (op_class == NO_REGS)
     962              :                     /* Although we don't need insn to reload from
     963              :                        memory, still accessing memory is usually more
     964              :                        expensive than a register.  */
     965     88474783 :                     pp->mem_cost = frequency;
     966              :                   else
     967              :                     /* If the alternative actually allows memory, make
     968              :                        things a bit cheaper since we won't need an
     969              :                        extra insn to load it.  */
     970    525045738 :                     pp->mem_cost
     971    525045738 :                       = ((out_p ? ira_memory_move_cost[mode][op_class][0] : 0)
     972    525045738 :                          + (in_p ? ira_memory_move_cost[mode][op_class][1] : 0)
     973    525045738 :                          - allows_mem[i]) * frequency;
     974              :                   /* If we have assigned a class to this allocno in
     975              :                      our first pass, add a cost to this alternative
     976              :                      corresponding to what we would add if this
     977              :                      allocno were not in the appropriate class.  */
     978    613520521 :                   if (pref)
     979              :                     {
     980    225072055 :                       enum reg_class pref_class = pref[COST_INDEX (REGNO (op))];
     981              : 
     982    225072055 :                       if (pref_class == NO_REGS)
     983              :                         {
     984      4358120 :                           if (op_class != NO_REGS)
     985      3523310 :                             alt_cost
     986      3523310 :                               += ((out_p
     987      3523310 :                                    ? ira_memory_move_cost[mode][op_class][0]
     988              :                                    : 0)
     989      3523310 :                                   + (in_p
     990      3523310 :                                      ? ira_memory_move_cost[mode][op_class][1]
     991              :                                      : 0));
     992              :                         }
     993    220713935 :                       else if (op_class == NO_REGS)
     994     30300393 :                         alt_cost
     995     30300393 :                           += ((out_p
     996     30300393 :                                ? ira_memory_move_cost[mode][pref_class][1]
     997              :                                : 0)
     998     30300393 :                               + (in_p
     999     30300393 :                                  ? ira_memory_move_cost[mode][pref_class][0]
    1000              :                                  : 0));
    1001    190413542 :                       else if (ira_reg_class_intersect[pref_class][op_class]
    1002              :                                == NO_REGS)
    1003     40328932 :                         alt_cost += (ira_register_move_cost
    1004     40328932 :                                      [mode][pref_class][op_class]);
    1005              :                     }
    1006              :                 }
    1007              :             }
    1008              : 
    1009              :           /* Otherwise, if this alternative wins, either because we
    1010              :              have already determined that or if we have a hard
    1011              :              register of the proper class, there is no cost for this
    1012              :              alternative.  */
    1013    986168899 :           else if (win || (REG_P (op)
    1014    233857360 :                            && reg_fits_class_p (op, classes[i],
    1015    233857360 :                                                 0, GET_MODE (op))))
    1016              :             ;
    1017              : 
    1018              :           /* If registers are valid, the cost of this alternative
    1019              :              includes copying the object to and/or from a
    1020              :              register.  */
    1021    646124228 :           else if (classes[i] != NO_REGS)
    1022              :             {
    1023    343852449 :               if (recog_data.operand_type[i] != OP_OUT)
    1024    184299349 :                 alt_cost += copy_cost (op, mode, classes[i], 1, NULL);
    1025              : 
    1026    343852449 :               if (recog_data.operand_type[i] != OP_IN)
    1027    159553124 :                 alt_cost += copy_cost (op, mode, classes[i], 0, NULL);
    1028              :             }
    1029              :           /* The only other way this alternative can be used is if
    1030              :              this is a constant that could be placed into memory.  */
    1031    302271779 :           else if (CONSTANT_P (op) && (allows_addr || allows_mem[i]))
    1032     20849306 :             alt_cost += ira_memory_move_cost[mode][classes[i]][1];
    1033              :           else
    1034              :             alt_fail = 1;
    1035              : 
    1036              :           if (alt_fail)
    1037              :             break;
    1038              :         }
    1039              : 
    1040    980085952 :       if (alt_fail)
    1041              :         {
    1042              :           /* The loop above might have exited early once the failure
    1043              :              was seen.  Skip over the constraints for the remaining
    1044              :              operands.  */
    1045    484993941 :           i += 1;
    1046    777321668 :           for (; i < n_ops; ++i)
    1047    584655454 :             constraints[i] = skip_alternative (constraints[i]);
    1048    484993941 :           continue;
    1049              :         }
    1050              : 
    1051    495092011 :       op_cost_add = alt_cost * frequency;
    1052              :       /* Finally, update the costs with the information we've
    1053              :          calculated about this alternative.  */
    1054   1601843390 :       for (i = 0; i < n_ops; i++)
    1055   1106751379 :         if (REG_P (ops[i]) && REGNO (ops[i]) >= FIRST_PSEUDO_REGISTER)
    1056              :           {
    1057    468829735 :             int old_cost;
    1058    468829735 :             bool cost_change_p = false;
    1059    468829735 :             struct costs *pp = op_costs[i], *qq = this_op_costs[i];
    1060    468829735 :             int *pp_costs = pp->cost, *qq_costs = qq->cost;
    1061    468829735 :             int scale = 1 + (recog_data.operand_type[i] == OP_INOUT);
    1062    468829735 :             cost_classes_t cost_classes_ptr
    1063    468829735 :               = regno_cost_classes[REGNO (ops[i])];
    1064              : 
    1065    468829735 :             old_cost = pp->mem_cost;
    1066    468829735 :             pp->mem_cost = MIN (old_cost,
    1067              :                                 (qq->mem_cost + op_cost_add) * scale);
    1068              : 
    1069    468829735 :             if (ira_dump_file != NULL && internal_flag_ira_verbose > 5
    1070            0 :                 && pp->mem_cost < old_cost)
    1071              :               {
    1072            0 :                 cost_change_p = true;
    1073            0 :                 fprintf (ira_dump_file, "        op %d(r=%u) new costs MEM:%d",
    1074              :                          i, REGNO(ops[i]), pp->mem_cost);
    1075              :               }
    1076   7005915906 :             for (k = cost_classes_ptr->num - 1; k >= 0; k--)
    1077              :               {
    1078   6537086171 :                 old_cost = pp_costs[k];
    1079   6537086171 :                 pp_costs[k]
    1080   6537086171 :                   = MIN (old_cost, (qq_costs[k] + op_cost_add) * scale);
    1081   6537086171 :                 if (ira_dump_file != NULL && internal_flag_ira_verbose > 5
    1082            0 :                     && pp_costs[k] < old_cost)
    1083              :                   {
    1084            0 :                     if (!cost_change_p)
    1085            0 :                       fprintf (ira_dump_file, "        op %d(r=%u) new costs",
    1086              :                                i, REGNO(ops[i]));
    1087            0 :                     cost_change_p = true;
    1088            0 :                     fprintf (ira_dump_file, " %s:%d",
    1089            0 :                              reg_class_names[cost_classes_ptr->classes[k]],
    1090              :                              pp_costs[k]);
    1091              :                   }
    1092              :               }
    1093    468829735 :             if (ira_dump_file != NULL && internal_flag_ira_verbose > 5
    1094            0 :                 && cost_change_p)
    1095            0 :               fprintf (ira_dump_file, "\n");
    1096              :           }
    1097              :     }
    1098              : 
    1099    139519230 :   if (allocno_p)
    1100    446937868 :     for (i = 0; i < n_ops; i++)
    1101              :       {
    1102    311194387 :         ira_allocno_t a;
    1103    311194387 :         rtx op = ops[i];
    1104              : 
    1105    311194387 :         if (! REG_P (op) || REGNO (op) < FIRST_PSEUDO_REGISTER)
    1106    180934367 :           continue;
    1107    130260020 :         a = ira_curr_regno_allocno_map [REGNO (op)];
    1108    130260020 :         if (! ALLOCNO_BAD_SPILL_P (a) && insn_allows_mem[i] == 0)
    1109     12059146 :           ALLOCNO_BAD_SPILL_P (a) = true;
    1110              :       }
    1111              : 
    1112    139519230 : }
    1113              : 
    1114              : 
    1115              : 
    1116              : /* Wrapper around REGNO_OK_FOR_INDEX_P, to allow pseudo registers.  */
    1117              : static inline bool
    1118       145602 : ok_for_index_p_nonstrict (rtx reg)
    1119              : {
    1120       145602 :   unsigned regno = REGNO (reg);
    1121              : 
    1122       145602 :   return regno >= FIRST_PSEUDO_REGISTER || REGNO_OK_FOR_INDEX_P (regno);
    1123              : }
    1124              : 
    1125              : /* A version of regno_ok_for_base_p for use here, when all
    1126              :    pseudo-registers should count as OK.  Arguments as for
    1127              :    regno_ok_for_base_p.  */
    1128              : static inline bool
    1129       147942 : ok_for_base_p_nonstrict (rtx reg, machine_mode mode, addr_space_t as,
    1130              :                          enum rtx_code outer_code, enum rtx_code index_code)
    1131              : {
    1132       147942 :   unsigned regno = REGNO (reg);
    1133              : 
    1134         1170 :   if (regno >= FIRST_PSEUDO_REGISTER)
    1135              :     return true;
    1136         1170 :   return ok_for_base_p_1 (regno, mode, as, outer_code, index_code);
    1137              : }
    1138              : 
    1139              : /* Record the pseudo registers we must reload into hard registers in a
    1140              :    subexpression of a memory address, X.
    1141              : 
    1142              :    If CONTEXT is 0, we are looking at the base part of an address,
    1143              :    otherwise we are looking at the index part.
    1144              : 
    1145              :    MODE and AS are the mode and address space of the memory reference;
    1146              :    OUTER_CODE and INDEX_CODE give the context that the rtx appears in.
    1147              :    These four arguments are passed down to base_reg_class.
    1148              : 
    1149              :    SCALE is twice the amount to multiply the cost by (it is twice so
    1150              :    we can represent half-cost adjustments).  */
    1151              : static void
    1152     94191672 : record_address_regs (machine_mode mode, addr_space_t as, rtx x,
    1153              :                      int context, enum rtx_code outer_code,
    1154              :                      enum rtx_code index_code, int scale)
    1155              : {
    1156     94191672 :   enum rtx_code code = GET_CODE (x);
    1157     94191672 :   enum reg_class rclass;
    1158              : 
    1159     94191672 :   if (context == 1)
    1160              :     rclass = INDEX_REG_CLASS;
    1161              :   else
    1162     86847766 :     rclass = base_reg_class (mode, as, outer_code, index_code);
    1163              : 
    1164     94191672 :   switch (code)
    1165              :     {
    1166              :     case CONST_INT:
    1167              :     case CONST:
    1168              :     case PC:
    1169              :     case SYMBOL_REF:
    1170              :     case LABEL_REF:
    1171              :       return;
    1172              : 
    1173     33106574 :     case PLUS:
    1174              :       /* When we have an address that is a sum, we must determine
    1175              :          whether registers are "base" or "index" regs.  If there is a
    1176              :          sum of two registers, we must choose one to be the "base".
    1177              :          Luckily, we can use the REG_POINTER to make a good choice
    1178              :          most of the time.  We only need to do this on machines that
    1179              :          can have two registers in an address and where the base and
    1180              :          index register classes are different.
    1181              : 
    1182              :          ??? This code used to set REGNO_POINTER_FLAG in some cases,
    1183              :          but that seems bogus since it should only be set when we are
    1184              :          sure the register is being used as a pointer.  */
    1185     33106574 :       {
    1186     33106574 :         rtx arg0 = XEXP (x, 0);
    1187     33106574 :         rtx arg1 = XEXP (x, 1);
    1188     33106574 :         enum rtx_code code0 = GET_CODE (arg0);
    1189     33106574 :         enum rtx_code code1 = GET_CODE (arg1);
    1190              : 
    1191              :         /* Look inside subregs.  */
    1192     33106574 :         if (code0 == SUBREG)
    1193        13848 :           arg0 = SUBREG_REG (arg0), code0 = GET_CODE (arg0);
    1194     33106574 :         if (code1 == SUBREG)
    1195         5408 :           arg1 = SUBREG_REG (arg1), code1 = GET_CODE (arg1);
    1196              : 
    1197              :         /* If index registers do not appear, or coincide with base registers,
    1198              :            just record registers in any non-constant operands.  We
    1199              :            assume here, as well as in the tests below, that all
    1200              :            addresses are in canonical form.  */
    1201     66213148 :         if (MAX_REGS_PER_ADDRESS == 1
    1202     33106574 :             || INDEX_REG_CLASS == base_reg_class (VOIDmode, as, PLUS, SCRATCH))
    1203              :           {
    1204            0 :             record_address_regs (mode, as, arg0, context, PLUS, code1, scale);
    1205            0 :             if (! CONSTANT_P (arg1))
    1206            0 :               record_address_regs (mode, as, arg1, context, PLUS, code0, scale);
    1207              :           }
    1208              : 
    1209              :         /* If the second operand is a constant integer, it doesn't
    1210              :            change what class the first operand must be.  */
    1211     33106574 :         else if (CONST_SCALAR_INT_P (arg1))
    1212     29480763 :           record_address_regs (mode, as, arg0, context, PLUS, code1, scale);
    1213              :         /* If the second operand is a symbolic constant, the first
    1214              :            operand must be an index register.  */
    1215      3625811 :         else if (code1 == SYMBOL_REF || code1 == CONST || code1 == LABEL_REF)
    1216       931582 :           record_address_regs (mode, as, arg0, 1, PLUS, code1, scale);
    1217              :         /* If both operands are registers but one is already a hard
    1218              :            register of index or reg-base class, give the other the
    1219              :            class that the hard register is not.  */
    1220      2694229 :         else if (code0 == REG && code1 == REG
    1221      1494355 :                  && REGNO (arg0) < FIRST_PSEUDO_REGISTER
    1222      2840176 :                  && (ok_for_base_p_nonstrict (arg0, mode, as, PLUS, REG)
    1223       144787 :                      || ok_for_index_p_nonstrict (arg0)))
    1224         3480 :           record_address_regs (mode, as, arg1,
    1225         3480 :                                ok_for_base_p_nonstrict (arg0, mode, as,
    1226              :                                                         PLUS, REG) ? 1 : 0,
    1227              :                                PLUS, REG, scale);
    1228      2693069 :         else if (code0 == REG && code1 == REG
    1229      1493195 :                  && REGNO (arg1) < FIRST_PSEUDO_REGISTER
    1230      2693894 :                  && (ok_for_base_p_nonstrict (arg1, mode, as, PLUS, REG)
    1231          815 :                      || ok_for_index_p_nonstrict (arg1)))
    1232           30 :           record_address_regs (mode, as, arg0,
    1233           30 :                                ok_for_base_p_nonstrict (arg1, mode, as,
    1234              :                                                         PLUS, REG) ? 1 : 0,
    1235              :                                PLUS, REG, scale);
    1236              :         /* If one operand is known to be a pointer, it must be the
    1237              :            base with the other operand the index.  Likewise if the
    1238              :            other operand is a MULT.  */
    1239      2693059 :         else if ((code0 == REG && REG_POINTER (arg0)) || code1 == MULT)
    1240              :           {
    1241      1272671 :             record_address_regs (mode, as, arg0, 0, PLUS, code1, scale);
    1242      1272671 :             record_address_regs (mode, as, arg1, 1, PLUS, code0, scale);
    1243              :           }
    1244      1420388 :         else if ((code1 == REG && REG_POINTER (arg1)) || code0 == MULT)
    1245              :           {
    1246      1043737 :             record_address_regs (mode, as, arg0, 1, PLUS, code1, scale);
    1247      1043737 :             record_address_regs (mode, as, arg1, 0, PLUS, code0, scale);
    1248              :           }
    1249              :         /* Otherwise, count equal chances that each might be a base or
    1250              :            index register.  This case should be rare.  */
    1251              :         else
    1252              :           {
    1253       376651 :             record_address_regs (mode, as, arg0, 0, PLUS, code1, scale / 2);
    1254       376651 :             record_address_regs (mode, as, arg0, 1, PLUS, code1, scale / 2);
    1255       376651 :             record_address_regs (mode, as, arg1, 0, PLUS, code0, scale / 2);
    1256       376651 :             record_address_regs (mode, as, arg1, 1, PLUS, code0, scale / 2);
    1257              :           }
    1258              :       }
    1259              :       break;
    1260              : 
    1261              :       /* Double the importance of an allocno that is incremented or
    1262              :          decremented, since it would take two extra insns if it ends
    1263              :          up in the wrong place.  */
    1264       164833 :     case POST_MODIFY:
    1265       164833 :     case PRE_MODIFY:
    1266       164833 :       record_address_regs (mode, as, XEXP (x, 0), 0, code,
    1267       164833 :                            GET_CODE (XEXP (XEXP (x, 1), 1)), 2 * scale);
    1268       164833 :       if (REG_P (XEXP (XEXP (x, 1), 1)))
    1269            0 :         record_address_regs (mode, as, XEXP (XEXP (x, 1), 1), 1, code, REG,
    1270              :                              2 * scale);
    1271              :       break;
    1272              : 
    1273      3358597 :     case POST_INC:
    1274      3358597 :     case PRE_INC:
    1275      3358597 :     case POST_DEC:
    1276      3358597 :     case PRE_DEC:
    1277              :       /* Double the importance of an allocno that is incremented or
    1278              :          decremented, since it would take two extra insns if it ends
    1279              :          up in the wrong place.  */
    1280      3358597 :       record_address_regs (mode, as, XEXP (x, 0), 0, code, SCRATCH, 2 * scale);
    1281      3358597 :       break;
    1282              : 
    1283     45173051 :     case REG:
    1284     45173051 :       {
    1285     45173051 :         struct costs *pp;
    1286     45173051 :         int *pp_costs;
    1287     45173051 :         enum reg_class i;
    1288     45173051 :         int k, regno, add_cost;
    1289     45173051 :         cost_classes_t cost_classes_ptr;
    1290     45173051 :         enum reg_class *cost_classes;
    1291     45173051 :         move_table *move_in_cost;
    1292              : 
    1293     45173051 :         if (REGNO (x) < FIRST_PSEUDO_REGISTER)
    1294              :           break;
    1295              : 
    1296     20886271 :         regno = REGNO (x);
    1297     20886271 :         if (allocno_p)
    1298     20512908 :           ALLOCNO_BAD_SPILL_P (ira_curr_regno_allocno_map[regno]) = true;
    1299     20886271 :         pp = COSTS (costs, COST_INDEX (regno));
    1300     20886271 :         add_cost = (ira_memory_move_cost[Pmode][rclass][1] * scale) / 2;
    1301     20886271 :         if (INT_MAX - add_cost < pp->mem_cost)
    1302            0 :           pp->mem_cost = INT_MAX;
    1303              :         else
    1304     20886271 :           pp->mem_cost += add_cost;
    1305     20886271 :         cost_classes_ptr = regno_cost_classes[regno];
    1306     20886271 :         cost_classes = cost_classes_ptr->classes;
    1307     20886271 :         pp_costs = pp->cost;
    1308     20886271 :         ira_init_register_move_cost_if_necessary (Pmode);
    1309     20886271 :         move_in_cost = ira_may_move_in_cost[Pmode];
    1310    337482933 :         for (k = cost_classes_ptr->num - 1; k >= 0; k--)
    1311              :           {
    1312    316596662 :             i = cost_classes[k];
    1313    316596662 :             add_cost = (move_in_cost[i][rclass] * scale) / 2;
    1314    316596662 :             if (INT_MAX - add_cost < pp_costs[k])
    1315        14447 :               pp_costs[k] = INT_MAX;
    1316              :             else
    1317    316582215 :               pp_costs[k] += add_cost;
    1318              :           }
    1319              :       }
    1320              :       break;
    1321              : 
    1322      2206787 :     default:
    1323      2206787 :       {
    1324      2206787 :         const char *fmt = GET_RTX_FORMAT (code);
    1325      2206787 :         int i;
    1326      6110534 :         for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
    1327      3903747 :           if (fmt[i] == 'e')
    1328      3888477 :             record_address_regs (mode, as, XEXP (x, i), context, code, SCRATCH,
    1329              :                                  scale);
    1330              :       }
    1331              :     }
    1332              : }
    1333              : 
    1334              : 
    1335              : 
    1336              : /* Calculate the costs of insn operands.  */
    1337              : static void
    1338    140392339 : record_operand_costs (rtx_insn *insn, enum reg_class *pref)
    1339              : {
    1340    140392339 :   const char *constraints[MAX_RECOG_OPERANDS];
    1341    140392339 :   machine_mode modes[MAX_RECOG_OPERANDS];
    1342    140392339 :   rtx set;
    1343    140392339 :   int i;
    1344              : 
    1345    140392339 :   if ((set = single_set (insn)) != NULL_RTX
    1346              :       /* In rare cases the single set insn might have less 2 operands
    1347              :          as the source can be a fixed special reg.  */
    1348    132796896 :       && recog_data.n_operands > 1
    1349    127766866 :       && recog_data.operand[0] == SET_DEST (set)
    1350    245146020 :       && recog_data.operand[1] == SET_SRC (set))
    1351              :     {
    1352     75936406 :       int regno, other_regno;
    1353     75936406 :       rtx dest = SET_DEST (set);
    1354     75936406 :       rtx src = SET_SRC (set);
    1355              : 
    1356     75936406 :       if (GET_CODE (dest) == SUBREG
    1357     77790446 :           && known_eq (GET_MODE_SIZE (GET_MODE (dest)),
    1358              :                        GET_MODE_SIZE (GET_MODE (SUBREG_REG (dest)))))
    1359              :         dest = SUBREG_REG (dest);
    1360     75936406 :       if (GET_CODE (src) == SUBREG
    1361     78765572 :           && known_eq (GET_MODE_SIZE (GET_MODE (src)),
    1362              :                        GET_MODE_SIZE (GET_MODE (SUBREG_REG (src)))))
    1363              :         src = SUBREG_REG (src);
    1364     35746390 :       if (REG_P (src) && REG_P (dest)
    1365     97181089 :           && (((regno = REGNO (src)) >= FIRST_PSEUDO_REGISTER
    1366     14728839 :                && (other_regno = REGNO (dest)) < FIRST_PSEUDO_REGISTER)
    1367     10031564 :               || ((regno = REGNO (dest)) >= FIRST_PSEUDO_REGISTER
    1368     10001834 :                   && (other_regno = REGNO (src)) < FIRST_PSEUDO_REGISTER)))
    1369              :         {
    1370     17699233 :           machine_mode mode = GET_MODE (SET_SRC (set)), cost_mode = mode;
    1371     17699233 :           machine_mode hard_reg_mode = GET_MODE(regno_reg_rtx[other_regno]);
    1372     35398466 :           poly_int64 pmode_size = GET_MODE_SIZE (mode);
    1373     35398466 :           poly_int64 phard_reg_mode_size = GET_MODE_SIZE (hard_reg_mode);
    1374     17699233 :           HOST_WIDE_INT mode_size, hard_reg_mode_size;
    1375     17699233 :           cost_classes_t cost_classes_ptr = regno_cost_classes[regno];
    1376     17699233 :           enum reg_class *cost_classes = cost_classes_ptr->classes;
    1377     17699233 :           reg_class_t rclass, hard_reg_class, bigger_hard_reg_class;
    1378     17699233 :           int cost_factor = 1, cost, k;
    1379     17699233 :           move_table *move_costs;
    1380     17699233 :           bool dead_p = find_regno_note (insn, REG_DEAD, REGNO (src));
    1381              : 
    1382     17699233 :           hard_reg_class = REGNO_REG_CLASS (other_regno);
    1383     17699233 :           bigger_hard_reg_class = ira_pressure_class_translate[hard_reg_class];
    1384              :           /* Target code may return any cost for mode which does not fit the
    1385              :              hard reg class (e.g. DImode for AREG on i386).  Check this and use
    1386              :              a bigger class to get the right cost.  */
    1387     17699233 :           if (bigger_hard_reg_class != NO_REGS
    1388     17699233 :               && ! ira_hard_reg_in_set_p (other_regno, mode,
    1389              :                                           reg_class_contents[hard_reg_class]))
    1390              :             hard_reg_class = bigger_hard_reg_class;
    1391     17699233 :           ira_init_register_move_cost_if_necessary (mode);
    1392     17699233 :           ira_init_register_move_cost_if_necessary (hard_reg_mode);
    1393              :           /* Use smaller movement cost for natural hard reg mode or its mode as
    1394              :              operand.  */
    1395     17699233 :           if (pmode_size.is_constant (&mode_size)
    1396     17699233 :               && phard_reg_mode_size.is_constant (&hard_reg_mode_size))
    1397              :             {
    1398              :               /* Assume we are moving in the natural modes: */
    1399     17699233 :               cost_factor = mode_size / hard_reg_mode_size;
    1400     17699233 :               if (mode_size % hard_reg_mode_size != 0)
    1401      3824597 :                 cost_factor++;
    1402     17699233 :               if (cost_factor
    1403     17699233 :                   * (ira_register_move_cost
    1404     17699233 :                      [hard_reg_mode][hard_reg_class][hard_reg_class])
    1405              :                   < (ira_register_move_cost
    1406     17699233 :                      [mode][hard_reg_class][hard_reg_class]))
    1407            0 :                 cost_mode = hard_reg_mode;
    1408              :               else
    1409              :                 cost_factor = 1;
    1410              :             }
    1411     17699233 :           move_costs = ira_register_move_cost[cost_mode];
    1412     17699233 :           i = regno == (int) REGNO (src) ? 1 : 0;
    1413    332650721 :           for (k = cost_classes_ptr->num - 1; k >= 0; k--)
    1414              :             {
    1415    314951488 :               rclass = cost_classes[k];
    1416    629902976 :               cost = (i == 0
    1417    314951488 :                       ? move_costs[hard_reg_class][rclass]
    1418    201145659 :                       : move_costs[rclass][hard_reg_class]);
    1419    314951488 :               cost *= cost_factor;
    1420    314951488 :               op_costs[i]->cost[k] = cost * frequency;
    1421              :               /* If this insn is a single set copying operand 1 to
    1422              :                  operand 0 and one operand is an allocno with the
    1423              :                  other a hard reg or an allocno that prefers a hard
    1424              :                  register that is in its own register class then we
    1425              :                  may want to adjust the cost of that register class to
    1426              :                  -1.
    1427              : 
    1428              :                  Avoid the adjustment if the source does not die to
    1429              :                  avoid stressing of register allocator by preferencing
    1430              :                  two colliding registers into single class.  */
    1431    314951488 :               if (dead_p
    1432    255116699 :                   && TEST_HARD_REG_BIT (reg_class_contents[rclass], other_regno)
    1433    314951488 :                   && (reg_class_size[(int) rclass]
    1434              :                       == (ira_reg_class_max_nregs
    1435    105423609 :                           [(int) rclass][(int) GET_MODE(src)])))
    1436              :                 {
    1437     13388319 :                   if (reg_class_size[rclass] == 1)
    1438     13235518 :                     op_costs[i]->cost[k] = -frequency;
    1439       152801 :                   else if (in_hard_reg_set_p (reg_class_contents[rclass],
    1440              :                                               GET_MODE(src), other_regno))
    1441       124879 :                     op_costs[i]->cost[k] = -frequency;
    1442              :                 }
    1443              :             }
    1444     17699233 :           op_costs[i]->mem_cost
    1445     17699233 :             = ira_memory_move_cost[mode][hard_reg_class][i] * frequency;
    1446     17699233 :           return;
    1447              :         }
    1448              :     }
    1449              : 
    1450    391325621 :   for (i = 0; i < recog_data.n_operands; i++)
    1451              :     {
    1452    268632515 :       constraints[i] = recog_data.constraints[i];
    1453    268632515 :       modes[i] = recog_data.operand_mode[i];
    1454              :     }
    1455              : 
    1456              :   /* If we get here, we are set up to record the costs of all the
    1457              :      operands for this insn.  Start by initializing the costs.  Then
    1458              :      handle any address registers.  Finally record the desired classes
    1459              :      for any allocnos, doing it twice if some pair of operands are
    1460              :      commutative.  */
    1461    391325621 :   for (i = 0; i < recog_data.n_operands; i++)
    1462              :     {
    1463    268632515 :       rtx op_mem = extract_mem_from_operand (recog_data.operand[i]);
    1464    268632515 :       memcpy (op_costs[i], init_cost, struct_costs_size);
    1465              : 
    1466    268632515 :       if (GET_CODE (recog_data.operand[i]) == SUBREG)
    1467      5005469 :         recog_data.operand[i] = SUBREG_REG (recog_data.operand[i]);
    1468              : 
    1469    268632515 :       if (MEM_P (op_mem))
    1470     44505932 :         record_address_regs (GET_MODE (op_mem),
    1471     44505932 :                              MEM_ADDR_SPACE (op_mem),
    1472              :                              XEXP (op_mem, 0),
    1473              :                              0, MEM, SCRATCH, frequency * 2);
    1474    224126583 :       else if (constraints[i][0] == 'p'
    1475    448249054 :                || (insn_extra_address_constraint
    1476    224122471 :                    (lookup_constraint (constraints[i]))))
    1477      1161742 :         record_address_regs (VOIDmode, ADDR_SPACE_GENERIC,
    1478              :                              recog_data.operand[i], 0, ADDRESS, SCRATCH,
    1479              :                              frequency * 2);
    1480              :     }
    1481              : 
    1482              :   /* Check for commutative in a separate loop so everything will have
    1483              :      been initialized.  We must do this even if one operand is a
    1484              :      constant--see addsi3 in m68k.md.  */
    1485    269539924 :   for (i = 0; i < (int) recog_data.n_operands - 1; i++)
    1486    146846818 :     if (constraints[i][0] == '%')
    1487              :       {
    1488              :         const char *xconstraints[MAX_RECOG_OPERANDS];
    1489              :         int j;
    1490              : 
    1491              :         /* Handle commutative operands by swapping the
    1492              :            constraints.  We assume the modes are the same.  */
    1493     68080651 :         for (j = 0; j < recog_data.n_operands; j++)
    1494     51254527 :           xconstraints[j] = constraints[j];
    1495              : 
    1496     16826124 :         xconstraints[i] = constraints[i+1];
    1497     16826124 :         xconstraints[i+1] = constraints[i];
    1498     16826124 :         record_reg_classes (recog_data.n_alternatives, recog_data.n_operands,
    1499              :                             recog_data.operand, modes,
    1500              :                             xconstraints, insn, pref);
    1501              :       }
    1502    122693106 :   record_reg_classes (recog_data.n_alternatives, recog_data.n_operands,
    1503              :                       recog_data.operand, modes,
    1504              :                       constraints, insn, pref);
    1505              : }
    1506              : 
    1507              : 
    1508              : 
    1509              : /* Process one insn INSN.  Scan it and record each time it would save
    1510              :    code to put a certain allocnos in a certain class.  Return the last
    1511              :    insn processed, so that the scan can be continued from there.  */
    1512              : static rtx_insn *
    1513    287403962 : scan_one_insn (rtx_insn *insn)
    1514              : {
    1515    287403962 :   enum rtx_code pat_code;
    1516    287403962 :   rtx set, note;
    1517    287403962 :   int i, k;
    1518    287403962 :   bool counted_mem;
    1519              : 
    1520    287403962 :   if (!NONDEBUG_INSN_P (insn))
    1521              :     return insn;
    1522              : 
    1523    141780027 :   pat_code = GET_CODE (PATTERN (insn));
    1524    141780027 :   if (pat_code == ASM_INPUT)
    1525              :     return insn;
    1526              : 
    1527              :   /* If INSN is a USE/CLOBBER of a pseudo in a mode M then go ahead
    1528              :      and initialize the register move costs of mode M.
    1529              : 
    1530              :      The pseudo may be related to another pseudo via a copy (implicit or
    1531              :      explicit) and if there are no mode M uses/sets of the original
    1532              :      pseudo, then we may leave the register move costs uninitialized for
    1533              :      mode M. */
    1534    141776193 :   if (pat_code == USE || pat_code == CLOBBER)
    1535              :     {
    1536      1383854 :       rtx x = XEXP (PATTERN (insn), 0);
    1537      1383854 :       if (GET_CODE (x) == REG
    1538      1370459 :           && REGNO (x) >= FIRST_PSEUDO_REGISTER
    1539      1413901 :           && have_regs_of_mode[GET_MODE (x)])
    1540        30046 :         ira_init_register_move_cost_if_necessary (GET_MODE (x));
    1541      1383854 :       return insn;
    1542              :     }
    1543              : 
    1544    140392339 :   counted_mem = false;
    1545    140392339 :   set = single_set (insn);
    1546    140392339 :   extract_insn (insn);
    1547              : 
    1548              :   /* If this insn loads a parameter from its stack slot, then it
    1549              :      represents a savings, rather than a cost, if the parameter is
    1550              :      stored in memory.  Record this fact.
    1551              : 
    1552              :      Similarly if we're loading other constants from memory (constant
    1553              :      pool, TOC references, small data areas, etc) and this is the only
    1554              :      assignment to the destination pseudo.
    1555              : 
    1556              :      Don't do this if SET_SRC (set) isn't a general operand, if it is
    1557              :      a memory requiring special instructions to load it, decreasing
    1558              :      mem_cost might result in it being loaded using the specialized
    1559              :      instruction into a register, then stored into stack and loaded
    1560              :      again from the stack.  See PR52208.
    1561              : 
    1562              :      Don't do this if SET_SRC (set) has side effect.  See PR56124.  */
    1563    132796896 :   if (set != 0 && REG_P (SET_DEST (set)) && MEM_P (SET_SRC (set))
    1564     17406983 :       && (note = find_reg_note (insn, REG_EQUIV, NULL_RTX)) != NULL_RTX
    1565      4963160 :       && ((MEM_P (XEXP (note, 0))
    1566      4462387 :            && !side_effects_p (SET_SRC (set)))
    1567       500773 :           || (CONSTANT_P (XEXP (note, 0))
    1568       500765 :               && targetm.legitimate_constant_p (GET_MODE (SET_DEST (set)),
    1569              :                                                 XEXP (note, 0))
    1570       154172 :               && REG_N_SETS (REGNO (SET_DEST (set))) == 1))
    1571      4616559 :       && general_operand (SET_SRC (set), GET_MODE (SET_SRC (set)))
    1572              :       /* LRA does not use equiv with a symbol for PIC code.  */
    1573    145008853 :       && (! ira_use_lra_p || ! pic_offset_table_rtx
    1574       328684 :           || ! contains_symbol_ref_p (XEXP (note, 0))))
    1575              :     {
    1576      4559156 :       enum reg_class cl = GENERAL_REGS;
    1577      4559156 :       rtx reg = SET_DEST (set);
    1578      4559156 :       int num = COST_INDEX (REGNO (reg));
    1579              :       /* Costs for NO_REGS are used in cost calculation on the
    1580              :          1st pass when the preferred register classes are not
    1581              :          known yet.  In this case we take the best scenario when
    1582              :          mode can't be put into GENERAL_REGS.  */
    1583      4559156 :       if (!targetm.hard_regno_mode_ok (ira_class_hard_regs[cl][0],
    1584      4559156 :                                        GET_MODE (reg)))
    1585      1251322 :         cl = NO_REGS;
    1586              : 
    1587      4559156 :       COSTS (costs, num)->mem_cost
    1588      4559156 :         -= ira_memory_move_cost[GET_MODE (reg)][cl][1] * frequency;
    1589      9118312 :       record_address_regs (GET_MODE (SET_SRC (set)),
    1590      9118312 :                            MEM_ADDR_SPACE (SET_SRC (set)),
    1591      4559156 :                            XEXP (SET_SRC (set), 0), 0, MEM, SCRATCH,
    1592              :                            frequency * 2);
    1593      4559156 :       counted_mem = true;
    1594              :     }
    1595              : 
    1596    140392339 :   record_operand_costs (insn, pref);
    1597              : 
    1598    140392339 :   if (ira_dump_file != NULL && internal_flag_ira_verbose > 5)
    1599              :     {
    1600            0 :       const char *p;
    1601            0 :       fprintf (ira_dump_file, "    Final costs after insn %u", INSN_UID (insn));
    1602            0 :       if (INSN_CODE (insn) >= 0
    1603            0 :           && (p = get_insn_name (INSN_CODE (insn))) != NULL)
    1604            0 :         fprintf (ira_dump_file, " {%s}", p);
    1605            0 :       fprintf (ira_dump_file, " (freq=%d)\n",
    1606            0 :                REG_FREQ_FROM_BB (BLOCK_FOR_INSN (insn)));
    1607            0 :       dump_insn_slim (ira_dump_file, insn);
    1608              :     }
    1609              : 
    1610              :   /* Now add the cost for each operand to the total costs for its
    1611              :      allocno.  */
    1612    444423320 :   for (i = 0; i < recog_data.n_operands; i++)
    1613              :     {
    1614    304030981 :       rtx op = recog_data.operand[i];
    1615              : 
    1616    304030981 :       if (GET_CODE (op) == SUBREG)
    1617        33173 :         op = SUBREG_REG (op);
    1618    304030981 :       if (REG_P (op) && REGNO (op) >= FIRST_PSEUDO_REGISTER)
    1619              :         {
    1620    123871533 :           int regno = REGNO (op);
    1621    123871533 :           struct costs *p = COSTS (costs, COST_INDEX (regno));
    1622    123871533 :           struct costs *q = op_costs[i];
    1623    123871533 :           int *p_costs = p->cost, *q_costs = q->cost;
    1624    123871533 :           cost_classes_t cost_classes_ptr = regno_cost_classes[regno];
    1625    123871533 :           int add_cost = 0;
    1626              : 
    1627              :           /* If the already accounted for the memory "cost" above, don't
    1628              :              do so again.  */
    1629    123871533 :           if (!counted_mem)
    1630              :             {
    1631    119312377 :               add_cost = q->mem_cost;
    1632    119312377 :               if (add_cost > 0 && INT_MAX - add_cost < p->mem_cost)
    1633            0 :                 p->mem_cost = INT_MAX;
    1634              :               else
    1635    119312377 :                 p->mem_cost += add_cost;
    1636              :             }
    1637    123871533 :           if (ira_dump_file != NULL && internal_flag_ira_verbose > 5)
    1638              :             {
    1639            0 :               fprintf (ira_dump_file, "        op %d(r=%u) MEM:%d(+%d)",
    1640              :                        i, REGNO(op), p->mem_cost, add_cost);
    1641              :             }
    1642   1839231583 :           for (k = cost_classes_ptr->num - 1; k >= 0; k--)
    1643              :             {
    1644   1715360050 :               add_cost = q_costs[k];
    1645   1715360050 :               if (add_cost > 0 && INT_MAX - add_cost < p_costs[k])
    1646            0 :                 p_costs[k] = INT_MAX;
    1647              :               else
    1648   1715360050 :                 p_costs[k] += add_cost;
    1649   1715360050 :               if (ira_dump_file != NULL && internal_flag_ira_verbose > 5)
    1650              :                 {
    1651            0 :                   fprintf (ira_dump_file, " %s:%d(+%d)",
    1652            0 :                            reg_class_names[cost_classes_ptr->classes[k]],
    1653            0 :                            p_costs[k], add_cost);
    1654              :                 }
    1655              :             }
    1656    123871533 :           if (ira_dump_file != NULL && internal_flag_ira_verbose > 5)
    1657            0 :             fprintf (ira_dump_file, "\n");
    1658              :         }
    1659              :     }
    1660              :   return insn;
    1661              : }
    1662              : 
    1663              : 
    1664              : 
    1665              : /* Print allocnos costs to the dump file.  */
    1666              : static void
    1667          127 : print_allocno_costs (void)
    1668              : {
    1669          127 :   int k;
    1670          127 :   ira_allocno_t a;
    1671          127 :   ira_allocno_iterator ai;
    1672              : 
    1673          127 :   ira_assert (allocno_p);
    1674          127 :   fprintf (ira_dump_file, "\n");
    1675         1341 :   FOR_EACH_ALLOCNO (a, ai)
    1676              :     {
    1677         1214 :       int i, rclass;
    1678         1214 :       basic_block bb;
    1679         1214 :       int regno = ALLOCNO_REGNO (a);
    1680         1214 :       cost_classes_t cost_classes_ptr = regno_cost_classes[regno];
    1681         1214 :       enum reg_class *cost_classes = cost_classes_ptr->classes;
    1682              : 
    1683         1214 :       i = ALLOCNO_NUM (a);
    1684         1214 :       fprintf (ira_dump_file, "  a%d(r%d,", i, regno);
    1685         1214 :       if ((bb = ALLOCNO_LOOP_TREE_NODE (a)->bb) != NULL)
    1686            0 :         fprintf (ira_dump_file, "b%d", bb->index);
    1687              :       else
    1688         1214 :         fprintf (ira_dump_file, "l%d", ALLOCNO_LOOP_TREE_NODE (a)->loop_num);
    1689         1214 :       fprintf (ira_dump_file, ") costs:");
    1690        19725 :       for (k = 0; k < cost_classes_ptr->num; k++)
    1691              :         {
    1692        17297 :           rclass = cost_classes[k];
    1693        17297 :           fprintf (ira_dump_file, " %s:%d", reg_class_names[rclass],
    1694        17297 :                    COSTS (costs, i)->cost[k]);
    1695        17297 :           if (flag_ira_region == IRA_REGION_ALL
    1696        17297 :               || flag_ira_region == IRA_REGION_MIXED)
    1697        13698 :             fprintf (ira_dump_file, ",%d",
    1698        13698 :                      COSTS (total_allocno_costs, i)->cost[k]);
    1699              :         }
    1700         1214 :       fprintf (ira_dump_file, " MEM:%i", COSTS (costs, i)->mem_cost);
    1701         1214 :       if (flag_ira_region == IRA_REGION_ALL
    1702         1214 :           || flag_ira_region == IRA_REGION_MIXED)
    1703         1004 :         fprintf (ira_dump_file, ",%d",
    1704         1004 :                  COSTS (total_allocno_costs, i)->mem_cost);
    1705         1214 :       fprintf (ira_dump_file, "\n");
    1706              :     }
    1707          127 : }
    1708              : 
    1709              : /* Print pseudo costs to the dump file.  */
    1710              : static void
    1711           16 : print_pseudo_costs (void)
    1712              : {
    1713           16 :   int regno, k;
    1714           16 :   int rclass;
    1715           16 :   cost_classes_t cost_classes_ptr;
    1716           16 :   enum reg_class *cost_classes;
    1717              : 
    1718           16 :   ira_assert (! allocno_p);
    1719           16 :   fprintf (ira_dump_file, "\n");
    1720          764 :   for (regno = max_reg_num () - 1; regno >= FIRST_PSEUDO_REGISTER; regno--)
    1721              :     {
    1722          748 :       if (REG_N_REFS (regno) <= 0)
    1723          444 :         continue;
    1724          304 :       cost_classes_ptr = regno_cost_classes[regno];
    1725          304 :       cost_classes = cost_classes_ptr->classes;
    1726          304 :       fprintf (ira_dump_file, "  r%d costs:", regno);
    1727         5904 :       for (k = 0; k < cost_classes_ptr->num; k++)
    1728              :         {
    1729         5296 :           rclass = cost_classes[k];
    1730         5296 :           fprintf (ira_dump_file, " %s:%d", reg_class_names[rclass],
    1731         5296 :                    COSTS (costs, regno)->cost[k]);
    1732              :         }
    1733          304 :       fprintf (ira_dump_file, " MEM:%i\n", COSTS (costs, regno)->mem_cost);
    1734              :     }
    1735           16 : }
    1736              : 
    1737              : /* Traverse the BB represented by LOOP_TREE_NODE to update the allocno
    1738              :    costs.  */
    1739              : static void
    1740     25510195 : process_bb_for_costs (basic_block bb)
    1741              : {
    1742     25510195 :   rtx_insn *insn;
    1743              : 
    1744     25510195 :   frequency = REG_FREQ_FROM_BB (bb);
    1745     25510195 :   if (frequency == 0)
    1746            0 :     frequency = 1;
    1747    312914157 :   FOR_BB_INSNS (bb, insn)
    1748    287403962 :     insn = scan_one_insn (insn);
    1749     25510195 : }
    1750              : 
    1751              : /* Traverse the BB represented by LOOP_TREE_NODE to update the allocno
    1752              :    costs.  */
    1753              : static void
    1754     28452746 : process_bb_node_for_costs (ira_loop_tree_node_t loop_tree_node)
    1755              : {
    1756     28452746 :   basic_block bb;
    1757              : 
    1758     28452746 :   bb = loop_tree_node->bb;
    1759     28452746 :   if (bb != NULL)
    1760     24825387 :     process_bb_for_costs (bb);
    1761     28452746 : }
    1762              : 
    1763              : /* Return true if all autoinc rtx in X change only a register and memory is
    1764              :    valid.  */
    1765              : static bool
    1766     53529556 : validate_autoinc_and_mem_addr_p (rtx x)
    1767              : {
    1768     53529556 :   enum rtx_code code = GET_CODE (x);
    1769     53529556 :   if (GET_RTX_CLASS (code) == RTX_AUTOINC)
    1770       382550 :     return REG_P (XEXP (x, 0));
    1771     53147006 :   const char *fmt = GET_RTX_FORMAT (code);
    1772    131962708 :   for (int i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
    1773     80149852 :     if (fmt[i] == 'e')
    1774              :       {
    1775     43639711 :         if (!validate_autoinc_and_mem_addr_p (XEXP (x, i)))
    1776              :           return false;
    1777              :       }
    1778     36510141 :     else if (fmt[i] == 'E')
    1779              :       {
    1780      2905121 :         for (int j = 0; j < XVECLEN (x, i); j++)
    1781      1961082 :           if (!validate_autoinc_and_mem_addr_p (XVECEXP (x, i, j)))
    1782              :             return false;
    1783              :       }
    1784              :   /* Check memory after checking autoinc to guarantee that autoinc is already
    1785              :      valid for machine-dependent code checking memory address.  */
    1786     51812856 :   return (!MEM_P (x)
    1787    110752490 :           || memory_address_addr_space_p (GET_MODE (x), XEXP (x, 0),
    1788      8251162 :                                           MEM_ADDR_SPACE (x)));
    1789              : }
    1790              : 
    1791              : /* Check that reg REGNO in INSN can be changed by TO (which is an invariant
    1792              :    equiv when INVARIANT_P is true).  Return true in case the result insn would
    1793              :    be valid one.  */
    1794              : static bool
    1795      7928763 : equiv_can_be_consumed_p (int regno, rtx to, rtx_insn *insn, bool invariant_p)
    1796              : {
    1797      7928763 :   validate_replace_src_group (regno_reg_rtx[regno], to, insn);
    1798              :   /* We can change register to equivalent memory in autoinc rtl.  Some code
    1799              :      including verify_changes assumes that autoinc contains only a register.
    1800              :      So check this first.  */
    1801      7928763 :   bool res = validate_autoinc_and_mem_addr_p (PATTERN (insn));
    1802      7928763 :   if (res)
    1803      6804379 :     res = verify_changes (0);
    1804      7928763 :   cancel_changes (0);
    1805      7928763 :   if (!res && invariant_p)
    1806              :     {
    1807              :       /* Here we use more expensive code for the invariant because we need to
    1808              :          simplify the result insn as the invariant can be arithmetic rtx
    1809              :          inserted into another arithmetic rtx, e.g. into memory address.  */
    1810       580542 :       rtx pat = PATTERN (insn);
    1811       580542 :       int code = INSN_CODE (insn);
    1812       580542 :       PATTERN (insn) = copy_rtx (pat);
    1813      1161084 :       PATTERN (insn)
    1814       580542 :         = simplify_replace_rtx (PATTERN (insn), regno_reg_rtx[regno], to);
    1815       580542 :       res = !insn_invalid_p (insn, false);
    1816       580542 :       PATTERN (insn) = pat;
    1817       580542 :       INSN_CODE (insn) = code;
    1818              :     }
    1819      7928763 :   return res;
    1820              : }
    1821              : 
    1822              : /* Return true if X contains a pseudo with equivalence.  In this case also
    1823              :    return the pseudo through parameter REG.  If the pseudo is a part of subreg,
    1824              :    return the subreg through parameter SUBREG.  */
    1825              : 
    1826              : static bool
    1827    275371537 : get_equiv_regno (rtx x, int &regno, rtx &subreg)
    1828              : {
    1829    275371537 :   subreg = NULL_RTX;
    1830    275371537 :   if (GET_CODE (x) == SUBREG)
    1831              :     {
    1832      2118393 :       subreg = x;
    1833      2118393 :       x = SUBREG_REG (x);
    1834              :     }
    1835    275371537 :   if (REG_P (x)
    1836    275371537 :       && (ira_reg_equiv[REGNO (x)].memory != NULL
    1837     82431103 :           || ira_reg_equiv[REGNO (x)].invariant != NULL
    1838     80090395 :           || ira_reg_equiv[REGNO (x)].constant != NULL))
    1839              :     {
    1840     10368866 :       regno = REGNO (x);
    1841     10368866 :       return true;
    1842              :     }
    1843    265002671 :   RTX_CODE code = GET_CODE (x);
    1844    265002671 :   const char *fmt = GET_RTX_FORMAT (code);
    1845              : 
    1846    619209975 :   for (int i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
    1847    369418002 :     if (fmt[i] == 'e')
    1848              :       {
    1849    204044953 :         if (get_equiv_regno (XEXP (x, i), regno, subreg))
    1850              :           return true;
    1851              :       }
    1852    165373049 :     else if (fmt[i] == 'E')
    1853              :       {
    1854     23791463 :         for (int j = 0; j < XVECLEN (x, i); j++)
    1855     16552528 :           if (get_equiv_regno (XVECEXP (x, i, j), regno, subreg))
    1856              :             return true;
    1857              :       }
    1858              :   return false;
    1859              : }
    1860              : 
    1861              : /* A pass through the current function insns.  Calculate costs of using
    1862              :    equivalences for pseudos and store them in regno_equiv_gains.  */
    1863              : 
    1864              : static void
    1865       963944 : calculate_equiv_gains (void)
    1866              : {
    1867       963944 :   basic_block bb;
    1868       963944 :   int regno, freq, cost;
    1869       963944 :   rtx subreg;
    1870       963944 :   rtx_insn *insn;
    1871       963944 :   machine_mode mode;
    1872       963944 :   enum reg_class rclass;
    1873       963944 :   bitmap_head equiv_pseudos;
    1874              : 
    1875       963944 :   ira_assert (allocno_p);
    1876       963944 :   bitmap_initialize (&equiv_pseudos, &reg_obstack);
    1877     48050536 :   for (regno = max_reg_num () - 1; regno >= FIRST_PSEUDO_REGISTER; regno--)
    1878     47086592 :     if (ira_reg_equiv[regno].init_insns != NULL
    1879      4215503 :         && (ira_reg_equiv[regno].memory != NULL
    1880      1448419 :             || ira_reg_equiv[regno].invariant != NULL
    1881       643554 :             || (ira_reg_equiv[regno].constant != NULL
    1882              :                 /* Ignore complicated constants which probably will be placed
    1883              :                    in memory:  */
    1884       643554 :                 && GET_CODE (ira_reg_equiv[regno].constant) != CONST_DOUBLE
    1885              :                 && GET_CODE (ira_reg_equiv[regno].constant) != CONST_VECTOR
    1886              :                 && GET_CODE (ira_reg_equiv[regno].constant) != LABEL_REF)))
    1887              :       {
    1888              :         rtx_insn_list *x;
    1889      7588681 :         for (x = ira_reg_equiv[regno].init_insns; x != NULL; x = x->next ())
    1890              :           {
    1891      4049095 :             insn = x->insn ();
    1892      4049095 :             rtx set = single_set (insn);
    1893              : 
    1894      4049095 :             if (set == NULL_RTX || SET_DEST (set) != regno_reg_rtx[regno])
    1895              :               break;
    1896      3539586 :             bb = BLOCK_FOR_INSN (insn);
    1897      3539586 :             ira_curr_regno_allocno_map
    1898      3539586 :               = ira_bb_nodes[bb->index].parent->regno_allocno_map;
    1899      3539586 :             mode = PSEUDO_REGNO_MODE (regno);
    1900      3539586 :             rclass = pref[COST_INDEX (regno)];
    1901      3539586 :             ira_init_register_move_cost_if_necessary (mode);
    1902      3539586 :             if (ira_reg_equiv[regno].memory != NULL)
    1903      2257575 :               cost = ira_memory_move_cost[mode][rclass][1];
    1904              :             else
    1905      1282011 :               cost = ira_register_move_cost[mode][rclass][rclass];
    1906      3539586 :             freq = REG_FREQ_FROM_BB (bb);
    1907      3539586 :             regno_equiv_gains[regno] += cost * freq;
    1908              :           }
    1909      4049095 :         if (x != NULL)
    1910              :           /* We found complicated equiv or reverse equiv mem=reg.  Ignore
    1911              :              them.  */
    1912       509509 :           regno_equiv_gains[regno] = 0;
    1913              :         else
    1914      3539586 :           bitmap_set_bit (&equiv_pseudos, regno);
    1915              :       }
    1916              : 
    1917     11385684 :   FOR_EACH_BB_FN (bb, cfun)
    1918              :     {
    1919     10421740 :       freq = REG_FREQ_FROM_BB (bb);
    1920     10421740 :       ira_curr_regno_allocno_map
    1921     10421740 :         = ira_bb_nodes[bb->index].parent->regno_allocno_map;
    1922    134029379 :       FOR_BB_INSNS (bb, insn)
    1923              :         {
    1924    238481731 :           if (!NONDEBUG_INSN_P (insn)
    1925     54774056 :               || !get_equiv_regno (PATTERN (insn), regno, subreg)
    1926    133976505 :               || !bitmap_bit_p (&equiv_pseudos, regno))
    1927    114874092 :             continue;
    1928              : 
    1929      8733547 :           if (ira_reg_equiv[regno].invariant != NULL)
    1930              :             {
    1931      2340708 :               rtx_insn_list *x = ira_reg_equiv[regno].init_insns;
    1932      3876632 :               for (; x != NULL; x = x->next ())
    1933      2340708 :                 if (insn == x->insn ())
    1934              :                   break;
    1935      2340708 :               if (x != NULL)
    1936       804784 :                 continue; /* skip equiv init insn for invariant */
    1937              :             }
    1938              : 
    1939      7928763 :           rtx subst = ira_reg_equiv[regno].memory;
    1940              : 
    1941      7928763 :           if (subst == NULL)
    1942      2590188 :             subst = ira_reg_equiv[regno].constant;
    1943      2590188 :           if (subst == NULL)
    1944      1535924 :             subst = ira_reg_equiv[regno].invariant;
    1945      1535924 :           ira_assert (subst != NULL);
    1946      7928763 :           mode = PSEUDO_REGNO_MODE (regno);
    1947      7928763 :           ira_init_register_move_cost_if_necessary (mode);
    1948      7928763 :           bool consumed_p
    1949     15857526 :             = equiv_can_be_consumed_p (regno, subst, insn,
    1950      7928763 :                                        subst == ira_reg_equiv[regno].invariant);
    1951              : 
    1952      7928763 :           rclass = pref[COST_INDEX (regno)];
    1953      7928763 :           if (MEM_P (subst)
    1954              :               /* If it is a change of constant into double for example, the
    1955              :                  result constant probably will be placed in memory.  */
    1956      2590188 :               || (ira_reg_equiv[regno].invariant == NULL
    1957      1054264 :                   && subreg != NULL_RTX
    1958         1147 :                   && !INTEGRAL_MODE_P (GET_MODE (subreg))))
    1959      8021057 :             cost = ira_memory_move_cost[mode][rclass][1] + (consumed_p ? 0 : 1);
    1960      2590127 :           else if (consumed_p)
    1961      1529368 :             continue;
    1962              :           else
    1963      1060759 :             cost = ira_register_move_cost[mode][rclass][rclass];
    1964      6399395 :           regno_equiv_gains[regno] -= cost * freq;
    1965              :         }
    1966              :     }
    1967       963944 :   bitmap_clear (&equiv_pseudos);
    1968       963944 : }
    1969              : 
    1970              : /* Find costs of register classes and memory for allocnos or pseudos
    1971              :    and their best costs.  Set up preferred, alternative and allocno
    1972              :    classes for pseudos.  */
    1973              : static void
    1974      1500820 : find_costs_and_classes (void)
    1975              : {
    1976      1500820 :   int i, k, start, max_cost_classes_num;
    1977      1500820 :   int pass;
    1978      1500820 :   basic_block bb;
    1979      1500820 :   enum reg_class *regno_best_class, new_class;
    1980              : 
    1981      1500820 :   init_recog ();
    1982      1500820 :   regno_best_class
    1983      1500820 :     = (enum reg_class *) ira_allocate (max_reg_num ()
    1984              :                                        * sizeof (enum reg_class));
    1985     68417866 :   for (i = max_reg_num () - 1; i >= FIRST_PSEUDO_REGISTER; i--)
    1986     66917046 :     regno_best_class[i] = NO_REGS;
    1987      2972225 :   if (!resize_reg_info () && allocno_p
    1988      2972182 :       && pseudo_classes_defined_p && flag_expensive_optimizations)
    1989              :     {
    1990           48 :       ira_allocno_t a;
    1991           48 :       ira_allocno_iterator ai;
    1992              : 
    1993           48 :       pref = pref_buffer;
    1994           48 :       max_cost_classes_num = 1;
    1995         1559 :       FOR_EACH_ALLOCNO (a, ai)
    1996              :         {
    1997         1511 :           pref[ALLOCNO_NUM (a)] = reg_preferred_class (ALLOCNO_REGNO (a));
    1998         1511 :           setup_regno_cost_classes_by_aclass
    1999         1511 :             (ALLOCNO_REGNO (a), pref[ALLOCNO_NUM (a)]);
    2000         1511 :           max_cost_classes_num
    2001         1511 :             = MAX (max_cost_classes_num,
    2002              :                    regno_cost_classes[ALLOCNO_REGNO (a)]->num);
    2003              :         }
    2004           48 :       start = 1;
    2005              :     }
    2006              :   else
    2007              :     {
    2008      1500772 :       pref = NULL;
    2009      1500772 :       max_cost_classes_num = ira_important_classes_num;
    2010     68415155 :       for (i = max_reg_num () - 1; i >= FIRST_PSEUDO_REGISTER; i--)
    2011     66914383 :         if (regno_reg_rtx[i] != NULL_RTX)
    2012     66617587 :           setup_regno_cost_classes_by_mode (i, PSEUDO_REGNO_MODE (i));
    2013              :         else
    2014       296796 :           setup_regno_cost_classes_by_aclass (i, ALL_REGS);
    2015              :       start = 0;
    2016              :     }
    2017      1500820 :   if (allocno_p)
    2018              :     /* Clear the flag for the next compiled function.  */
    2019      1471362 :     pseudo_classes_defined_p = false;
    2020              :   /* Normally we scan the insns once and determine the best class to
    2021              :      use for each allocno.  However, if -fexpensive-optimizations are
    2022              :      on, we do so twice, the second time using the tentative best
    2023              :      classes to guide the selection.  */
    2024      3994942 :   for (pass = start; pass <= flag_expensive_optimizations; pass++)
    2025              :     {
    2026      2494122 :       if ((!allocno_p || internal_flag_ira_verbose > 0) && ira_dump_file)
    2027          143 :         fprintf (ira_dump_file,
    2028              :                  "\nPass %i for finding pseudo/allocno costs\n\n", pass);
    2029              : 
    2030      2494122 :       if (pass != start)
    2031              :         {
    2032       993302 :           max_cost_classes_num = 1;
    2033     49493749 :           for (i = max_reg_num () - 1; i >= FIRST_PSEUDO_REGISTER; i--)
    2034              :             {
    2035     48500447 :               setup_regno_cost_classes_by_aclass (i, regno_best_class[i]);
    2036     48500447 :               max_cost_classes_num
    2037     48500447 :                 = MAX (max_cost_classes_num, regno_cost_classes[i]->num);
    2038              :             }
    2039              :         }
    2040              : 
    2041      2494122 :       struct_costs_size
    2042      2494122 :         = sizeof (struct costs) + sizeof (int) * (max_cost_classes_num - 1);
    2043              :       /* Zero out our accumulation of the cost of each class for each
    2044              :          allocno.  */
    2045      2494122 :       memset (costs, 0, cost_elements_num * struct_costs_size);
    2046              : 
    2047      2494122 :       if (allocno_p)
    2048              :         {
    2049              :           /* Scan the instructions and record each time it would save code
    2050              :              to put a certain allocno in a certain class.  */
    2051      2435258 :           ira_traverse_loop_tree (true, ira_loop_tree_root,
    2052              :                                   process_bb_node_for_costs, NULL);
    2053              : 
    2054      2435258 :           memcpy (total_allocno_costs, costs,
    2055      2435258 :                   max_struct_costs_size * ira_allocnos_num);
    2056              :         }
    2057              :       else
    2058              :         {
    2059        58864 :           basic_block bb;
    2060              : 
    2061       743672 :           FOR_EACH_BB_FN (bb, cfun)
    2062       684808 :             process_bb_for_costs (bb);
    2063              :         }
    2064              : 
    2065      2494122 :       if (pass == 0)
    2066      1500772 :         pref = pref_buffer;
    2067              : 
    2068      2494122 :       if (ira_use_lra_p && allocno_p && pass == 1)
    2069              :         /* It is a pass through all insns.  So do it once and only for RA (not
    2070              :            for insn scheduler) when we already found preferable pseudo register
    2071              :            classes on the previous pass.  */
    2072       963944 :         calculate_equiv_gains ();
    2073              : 
    2074              :       /* Now for each allocno look at how desirable each class is and
    2075              :          find which class is preferred.  */
    2076    117911615 :       for (i = max_reg_num () - 1; i >= FIRST_PSEUDO_REGISTER; i--)
    2077              :         {
    2078    115417493 :           ira_allocno_t a, parent_a;
    2079    115417493 :           int rclass, a_num, parent_a_num, add_cost;
    2080    115417493 :           ira_loop_tree_node_t parent;
    2081    115417493 :           int best_cost, allocno_cost;
    2082    115417493 :           enum reg_class best, alt_class;
    2083    115417493 :           cost_classes_t cost_classes_ptr = regno_cost_classes[i];
    2084    115417493 :           enum reg_class *cost_classes;
    2085    115417493 :           int *i_costs = temp_costs->cost;
    2086    115417493 :           int i_mem_cost;
    2087    115417493 :           int equiv_savings = regno_equiv_gains[i];
    2088              : 
    2089    115417493 :           if (! allocno_p)
    2090              :             {
    2091      2834642 :               if (regno_reg_rtx[i] == NULL_RTX)
    2092         4606 :                 continue;
    2093      2830036 :               memcpy (temp_costs, COSTS (costs, i), struct_costs_size);
    2094      2830036 :               i_mem_cost = temp_costs->mem_cost;
    2095      2830036 :               cost_classes = cost_classes_ptr->classes;
    2096              :             }
    2097              :           else
    2098              :             {
    2099    112582851 :               if (ira_regno_allocno_map[i] == NULL)
    2100     66005711 :                 continue;
    2101     46577140 :               memset (temp_costs, 0, struct_costs_size);
    2102     46577140 :               i_mem_cost = 0;
    2103     46577140 :               cost_classes = cost_classes_ptr->classes;
    2104              :               /* Find cost of all allocnos with the same regno.  */
    2105     46577140 :               for (a = ira_regno_allocno_map[i];
    2106    104023724 :                    a != NULL;
    2107     57446584 :                    a = ALLOCNO_NEXT_REGNO_ALLOCNO (a))
    2108              :                 {
    2109     57446584 :                   int *a_costs, *p_costs;
    2110              : 
    2111     57446584 :                   a_num = ALLOCNO_NUM (a);
    2112     57446584 :                   if ((flag_ira_region == IRA_REGION_ALL
    2113     57446584 :                        || flag_ira_region == IRA_REGION_MIXED)
    2114     45017482 :                       && (parent = ALLOCNO_LOOP_TREE_NODE (a)->parent) != NULL
    2115     17728137 :                       && (parent_a = parent->regno_allocno_map[i]) != NULL
    2116              :                       /* There are no caps yet.  */
    2117     68315541 :                       && bitmap_bit_p (ALLOCNO_LOOP_TREE_NODE
    2118     10868957 :                                        (a)->border_allocnos,
    2119              :                                        ALLOCNO_NUM (a)))
    2120              :                     {
    2121              :                       /* Propagate costs to upper levels in the region
    2122              :                          tree.  */
    2123     10862309 :                       parent_a_num = ALLOCNO_NUM (parent_a);
    2124     10862309 :                       a_costs = COSTS (total_allocno_costs, a_num)->cost;
    2125     10862309 :                       p_costs = COSTS (total_allocno_costs, parent_a_num)->cost;
    2126    157437433 :                       for (k = cost_classes_ptr->num - 1; k >= 0; k--)
    2127              :                         {
    2128    146575124 :                           add_cost = a_costs[k];
    2129    146575124 :                           if (add_cost > 0 && INT_MAX - add_cost < p_costs[k])
    2130            0 :                             p_costs[k] = INT_MAX;
    2131              :                           else
    2132    146575124 :                             p_costs[k] += add_cost;
    2133              :                         }
    2134     10862309 :                       add_cost = COSTS (total_allocno_costs, a_num)->mem_cost;
    2135     10862309 :                       if (add_cost > 0
    2136      5177173 :                           && (INT_MAX - add_cost
    2137              :                               < COSTS (total_allocno_costs,
    2138      5177173 :                                        parent_a_num)->mem_cost))
    2139            0 :                         COSTS (total_allocno_costs, parent_a_num)->mem_cost
    2140            0 :                           = INT_MAX;
    2141              :                       else
    2142     10862309 :                         COSTS (total_allocno_costs, parent_a_num)->mem_cost
    2143     10862309 :                           += add_cost;
    2144              : 
    2145     10862309 :                       if (i >= first_moveable_pseudo && i < last_moveable_pseudo)
    2146            0 :                         COSTS (total_allocno_costs, parent_a_num)->mem_cost = 0;
    2147              :                     }
    2148     57446584 :                   a_costs = COSTS (costs, a_num)->cost;
    2149    853028523 :                   for (k = cost_classes_ptr->num - 1; k >= 0; k--)
    2150              :                     {
    2151    795581939 :                       add_cost = a_costs[k];
    2152    795581939 :                       if (add_cost > 0 && INT_MAX - add_cost < i_costs[k])
    2153            0 :                         i_costs[k] = INT_MAX;
    2154              :                       else
    2155    795581939 :                         i_costs[k] += add_cost;
    2156              :                     }
    2157     57446584 :                   add_cost = COSTS (costs, a_num)->mem_cost;
    2158     57446584 :                   if (add_cost > 0 && INT_MAX - add_cost < i_mem_cost)
    2159              :                     i_mem_cost = INT_MAX;
    2160              :                   else
    2161     57446584 :                     i_mem_cost += add_cost;
    2162              :                 }
    2163              :             }
    2164     49407176 :           if (i >= first_moveable_pseudo && i < last_moveable_pseudo)
    2165              :             i_mem_cost = 0;
    2166     49379034 :           else if (ira_use_lra_p)
    2167              :             {
    2168     49379034 :               if (equiv_savings > 0)
    2169              :                 {
    2170       509793 :                   i_mem_cost = 0;
    2171       509793 :                   if (ira_dump_file != NULL && internal_flag_ira_verbose > 5)
    2172            0 :                     fprintf (ira_dump_file,
    2173              :                              "   Use MEM for r%d as the equiv savings is %d\n",
    2174              :                              i, equiv_savings);
    2175              :                 }
    2176              :             }
    2177            0 :           else if (equiv_savings < 0)
    2178            0 :             i_mem_cost = -equiv_savings;
    2179            0 :           else if (equiv_savings > 0)
    2180              :             {
    2181            0 :               i_mem_cost = 0;
    2182            0 :               for (k = cost_classes_ptr->num - 1; k >= 0; k--)
    2183            0 :                 i_costs[k] += equiv_savings;
    2184              :             }
    2185              : 
    2186     49407176 :           best_cost = (1 << (HOST_BITS_PER_INT - 2)) - 1;
    2187     49407176 :           best = ALL_REGS;
    2188     49407176 :           alt_class = NO_REGS;
    2189              :           /* Find best common class for all allocnos with the same
    2190              :              regno.  */
    2191    746693830 :           for (k = 0; k < cost_classes_ptr->num; k++)
    2192              :             {
    2193    697286654 :               rclass = cost_classes[k];
    2194    697286654 :               if (i_costs[k] < best_cost)
    2195              :                 {
    2196              :                   best_cost = i_costs[k];
    2197              :                   best = (enum reg_class) rclass;
    2198              :                 }
    2199    636662118 :               else if (i_costs[k] == best_cost)
    2200    302424769 :                 best = ira_reg_class_subunion[best][rclass];
    2201    697286654 :               if (pass == flag_expensive_optimizations
    2202              :                   /* We still prefer registers to memory even at this
    2203              :                      stage if their costs are the same.  We will make
    2204              :                      a final decision during assigning hard registers
    2205              :                      when we have all info including more accurate
    2206              :                      costs which might be affected by assigning hard
    2207              :                      registers to other pseudos because the pseudos
    2208              :                      involved in moves can be coalesced.  */
    2209    398515744 :                   && i_costs[k] <= i_mem_cost
    2210    275108644 :                   && (reg_class_size[reg_class_subunion[alt_class][rclass]]
    2211    275108644 :                       > reg_class_size[alt_class]))
    2212    697286654 :                 alt_class = reg_class_subunion[alt_class][rclass];
    2213              :             }
    2214     49407176 :           alt_class = ira_allocno_class_translate[alt_class];
    2215     49407176 :           if (best_cost > i_mem_cost
    2216     49407176 :               && ! non_spilled_static_chain_regno_p (i))
    2217       772717 :             regno_aclass[i] = NO_REGS;
    2218     48634459 :           else if (!optimize && !targetm.class_likely_spilled_p (best))
    2219              :             /* Registers in the alternative class are likely to need
    2220              :                longer or slower sequences than registers in the best class.
    2221              :                When optimizing we make some effort to use the best class
    2222              :                over the alternative class where possible, but at -O0 we
    2223              :                effectively give the alternative class equal weight.
    2224              :                We then run the risk of using slower alternative registers
    2225              :                when plenty of registers from the best class are still free.
    2226              :                This is especially true because live ranges tend to be very
    2227              :                short in -O0 code and so register pressure tends to be low.
    2228              : 
    2229              :                Avoid that by ignoring the alternative class if the best
    2230              :                class has plenty of registers.
    2231              : 
    2232              :                The union class arrays give important classes and only
    2233              :                part of it are allocno classes.  So translate them into
    2234              :                allocno classes.  */
    2235      9477307 :             regno_aclass[i] = ira_allocno_class_translate[best];
    2236              :           else
    2237              :             {
    2238              :               /* Make the common class the biggest class of best and
    2239              :                  alt_class.  Translate the common class into an
    2240              :                  allocno class too.  */
    2241     39157152 :               regno_aclass[i] = (ira_allocno_class_translate
    2242     39157152 :                                  [ira_reg_class_superunion[best][alt_class]]);
    2243     39157152 :               ira_assert (regno_aclass[i] != NO_REGS
    2244              :                           && ira_reg_allocno_class_p[regno_aclass[i]]);
    2245              :             }
    2246     49407176 :           if (pic_offset_table_rtx != NULL
    2247     49407176 :               && i == (int) REGNO (pic_offset_table_rtx))
    2248              :             {
    2249              :               /* For some targets, integer pseudos can be assigned to fp
    2250              :                  regs.  As we don't want reload pic offset table pseudo, we
    2251              :                  should avoid using non-integer regs.  */
    2252        81699 :               regno_aclass[i]
    2253        81699 :                 = ira_reg_class_intersect[regno_aclass[i]][GENERAL_REGS];
    2254        81699 :               alt_class = ira_reg_class_intersect[alt_class][GENERAL_REGS];
    2255              :             }
    2256     98814352 :           if ((new_class
    2257     98814352 :                = (reg_class) (targetm.ira_change_pseudo_allocno_class
    2258     49407176 :                               (i, regno_aclass[i], best))) != regno_aclass[i])
    2259              :             {
    2260            0 :               regno_aclass[i] = new_class;
    2261            0 :               if (hard_reg_set_subset_p (reg_class_contents[new_class],
    2262            0 :                                          reg_class_contents[best]))
    2263            0 :                 best = new_class;
    2264            0 :               if (hard_reg_set_subset_p (reg_class_contents[new_class],
    2265            0 :                                          reg_class_contents[alt_class]))
    2266            0 :                 alt_class = new_class;
    2267              :             }
    2268     49407176 :           if (pass == flag_expensive_optimizations)
    2269              :             {
    2270     31024899 :               if (best_cost > i_mem_cost
    2271              :                   /* Do not assign NO_REGS to static chain pointer
    2272              :                      pseudo when non-local goto is used.  */
    2273     31024899 :                   && ! non_spilled_static_chain_regno_p (i))
    2274              :                 best = alt_class = NO_REGS;
    2275     30538484 :               else if (best == alt_class)
    2276     21507523 :                 alt_class = NO_REGS;
    2277     31024899 :               setup_reg_classes (i, best, alt_class, regno_aclass[i]);
    2278     31024899 :               if ((!allocno_p || internal_flag_ira_verbose > 2)
    2279     31024899 :                   && ira_dump_file != NULL)
    2280          969 :                 fprintf (ira_dump_file,
    2281              :                          "    r%d: preferred %s, alternative %s, allocno %s\n",
    2282          969 :                          i, reg_class_names[best], reg_class_names[alt_class],
    2283          969 :                          reg_class_names[regno_aclass[i]]);
    2284              :             }
    2285     49407176 :           regno_best_class[i] = best;
    2286     49407176 :           if (! allocno_p)
    2287              :             {
    2288      5660072 :               pref[i] = (best_cost > i_mem_cost
    2289         2793 :                          && ! non_spilled_static_chain_regno_p (i)
    2290      2830036 :                          ? NO_REGS : best);
    2291      2830036 :               continue;
    2292              :             }
    2293     46577140 :           for (a = ira_regno_allocno_map[i];
    2294    104023724 :                a != NULL;
    2295     57446584 :                a = ALLOCNO_NEXT_REGNO_ALLOCNO (a))
    2296              :             {
    2297     57446584 :               enum reg_class aclass = regno_aclass[i];
    2298     57446584 :               int a_num = ALLOCNO_NUM (a);
    2299     57446584 :               int *total_a_costs = COSTS (total_allocno_costs, a_num)->cost;
    2300     57446584 :               int *a_costs = COSTS (costs, a_num)->cost;
    2301              : 
    2302     57446584 :               if (aclass == NO_REGS)
    2303              :                 best = NO_REGS;
    2304              :               else
    2305              :                 {
    2306              :                   /* Finding best class which is subset of the common
    2307              :                      class.  */
    2308              :                   best_cost = (1 << (HOST_BITS_PER_INT - 2)) - 1;
    2309              :                   allocno_cost = best_cost;
    2310              :                   best = ALL_REGS;
    2311    839285844 :                   for (k = 0; k < cost_classes_ptr->num; k++)
    2312              :                     {
    2313    782832241 :                       rclass = cost_classes[k];
    2314    782832241 :                       if (! ira_class_subset_p[rclass][aclass])
    2315    375369998 :                         continue;
    2316    407462243 :                       if (total_a_costs[k] < best_cost)
    2317              :                         {
    2318     61155263 :                           best_cost = total_a_costs[k];
    2319     61155263 :                           allocno_cost = a_costs[k];
    2320     61155263 :                           best = (enum reg_class) rclass;
    2321              :                         }
    2322    346306980 :                       else if (total_a_costs[k] == best_cost)
    2323              :                         {
    2324    284209041 :                           best = ira_reg_class_subunion[best][rclass];
    2325    284209041 :                           allocno_cost = MAX (allocno_cost, a_costs[k]);
    2326              :                         }
    2327              :                     }
    2328     56453603 :                   ALLOCNO_CLASS_COST (a) = allocno_cost;
    2329              :                 }
    2330     57446584 :               if (internal_flag_ira_verbose > 2 && ira_dump_file != NULL
    2331         1214 :                   && (pass == 0 || pref[a_num] != best))
    2332              :                 {
    2333          777 :                   fprintf (ira_dump_file, "    a%d (r%d,", a_num, i);
    2334          777 :                   if ((bb = ALLOCNO_LOOP_TREE_NODE (a)->bb) != NULL)
    2335            0 :                     fprintf (ira_dump_file, "b%d", bb->index);
    2336              :                   else
    2337          777 :                     fprintf (ira_dump_file, "l%d",
    2338              :                              ALLOCNO_LOOP_TREE_NODE (a)->loop_num);
    2339          777 :                   fprintf (ira_dump_file, ") best %s, allocno %s\n",
    2340          777 :                            reg_class_names[best],
    2341          777 :                            reg_class_names[aclass]);
    2342              :                 }
    2343     57446584 :               pref[a_num] = best;
    2344     57446584 :               if (pass == flag_expensive_optimizations && best != aclass
    2345      7477018 :                   && ira_class_hard_regs_num[best] > 0
    2346      7477018 :                   && (ira_reg_class_max_nregs[best][ALLOCNO_MODE (a)]
    2347              :                       >= ira_class_hard_regs_num[best]))
    2348              :                 {
    2349      6767404 :                   int ind = cost_classes_ptr->index[aclass];
    2350              : 
    2351      6767404 :                   ira_assert (ind >= 0);
    2352      6767404 :                   ira_init_register_move_cost_if_necessary (ALLOCNO_MODE (a));
    2353      6767404 :                   ira_add_allocno_pref (a, ira_class_hard_regs[best][0],
    2354      6767404 :                                         (a_costs[ind] - ALLOCNO_CLASS_COST (a))
    2355              :                                         / (ira_register_move_cost
    2356      6767404 :                                            [ALLOCNO_MODE (a)][best][aclass]));
    2357    134397208 :                   for (k = 0; k < cost_classes_ptr->num; k++)
    2358    120862400 :                     if (ira_class_subset_p[cost_classes[k]][best])
    2359      6767404 :                       a_costs[k] = a_costs[ind];
    2360              :                 }
    2361              :             }
    2362              :         }
    2363              : 
    2364      2494122 :       if (internal_flag_ira_verbose > 4 && ira_dump_file)
    2365              :         {
    2366          143 :           if (allocno_p)
    2367          127 :             print_allocno_costs ();
    2368              :           else
    2369           16 :             print_pseudo_costs ();
    2370          143 :           fprintf (ira_dump_file,"\n");
    2371              :         }
    2372              :     }
    2373      1500820 :   ira_free (regno_best_class);
    2374      1500820 : }
    2375              : 
    2376              : 
    2377              : 
    2378              : /* Process moves involving hard regs to modify allocno hard register
    2379              :    costs.  We can do this only after determining allocno class.  If a
    2380              :    hard register forms a register class, then moves with the hard
    2381              :    register are already taken into account in class costs for the
    2382              :    allocno.  */
    2383              : static void
    2384     12669981 : process_bb_node_for_hard_reg_moves (ira_loop_tree_node_t loop_tree_node)
    2385              : {
    2386     12669981 :   int i, freq, src_regno, dst_regno, hard_regno, a_regno;
    2387     12669981 :   bool to_p;
    2388     12669981 :   ira_allocno_t a, curr_a;
    2389     12669981 :   ira_loop_tree_node_t curr_loop_tree_node;
    2390     12669981 :   enum reg_class rclass;
    2391     12669981 :   basic_block bb;
    2392     12669981 :   rtx_insn *insn;
    2393     12669981 :   rtx set, src, dst;
    2394              : 
    2395     12669981 :   bb = loop_tree_node->bb;
    2396     12669981 :   if (bb == NULL)
    2397              :     return;
    2398     11008286 :   freq = REG_FREQ_FROM_BB (bb);
    2399      8628267 :   if (freq == 0)
    2400      2008088 :     freq = 1;
    2401    139707221 :   FOR_BB_INSNS (bb, insn)
    2402              :     {
    2403    128698935 :       if (!NONDEBUG_INSN_P (insn))
    2404     70164376 :         continue;
    2405     58534559 :       set = single_set (insn);
    2406     58534559 :       if (set == NULL_RTX)
    2407      3845328 :         continue;
    2408     54689231 :       dst = SET_DEST (set);
    2409     54689231 :       src = SET_SRC (set);
    2410     54689231 :       if (! REG_P (dst) || ! REG_P (src))
    2411     45568380 :         continue;
    2412      9120851 :       dst_regno = REGNO (dst);
    2413      9120851 :       src_regno = REGNO (src);
    2414      9120851 :       if (dst_regno >= FIRST_PSEUDO_REGISTER
    2415      9120851 :           && src_regno < FIRST_PSEUDO_REGISTER)
    2416              :         {
    2417      2992746 :           hard_regno = src_regno;
    2418      2992746 :           a = ira_curr_regno_allocno_map[dst_regno];
    2419      2992746 :           to_p = true;
    2420              :         }
    2421      7508572 :       else if (src_regno >= FIRST_PSEUDO_REGISTER
    2422      6128105 :                && dst_regno < FIRST_PSEUDO_REGISTER)
    2423              :         {
    2424      4747638 :           hard_regno = dst_regno;
    2425      4747638 :           a = ira_curr_regno_allocno_map[src_regno];
    2426      4747638 :           to_p = false;
    2427              :         }
    2428              :       else
    2429      1380467 :         continue;
    2430     15002497 :       if (reg_class_size[(int) REGNO_REG_CLASS (hard_regno)]
    2431              :           == (ira_reg_class_max_nregs
    2432      7740384 :               [REGNO_REG_CLASS (hard_regno)][(int) ALLOCNO_MODE(a)]))
    2433              :         /* If the class can provide only one hard reg to the allocno,
    2434              :            we processed the insn record_operand_costs already and we
    2435              :            actually updated the hard reg cost there.  */
    2436      7262113 :         continue;
    2437       478271 :       rclass = ALLOCNO_CLASS (a);
    2438       478271 :       if (! TEST_HARD_REG_BIT (reg_class_contents[rclass], hard_regno))
    2439        23082 :         continue;
    2440       455189 :       i = ira_class_hard_reg_index[rclass][hard_regno];
    2441       455189 :       if (i < 0)
    2442         7298 :         continue;
    2443       447891 :       a_regno = ALLOCNO_REGNO (a);
    2444       447891 :       for (curr_loop_tree_node = ALLOCNO_LOOP_TREE_NODE (a);
    2445       984814 :            curr_loop_tree_node != NULL;
    2446       536923 :            curr_loop_tree_node = curr_loop_tree_node->parent)
    2447       536923 :         if ((curr_a = curr_loop_tree_node->regno_allocno_map[a_regno]) != NULL)
    2448       466460 :           ira_add_allocno_pref (curr_a, hard_regno, freq);
    2449       447891 :       {
    2450       447891 :         int cost;
    2451       447891 :         enum reg_class hard_reg_class;
    2452       447891 :         machine_mode mode;
    2453              : 
    2454       447891 :         mode = ALLOCNO_MODE (a);
    2455       447891 :         hard_reg_class = REGNO_REG_CLASS (hard_regno);
    2456       447891 :         ira_init_register_move_cost_if_necessary (mode);
    2457       447891 :         cost = (to_p ? ira_register_move_cost[mode][hard_reg_class][rclass]
    2458       249595 :                 : ira_register_move_cost[mode][rclass][hard_reg_class]) * freq;
    2459       447891 :         ira_allocate_and_set_costs (&ALLOCNO_HARD_REG_COSTS (a), rclass,
    2460              :                                     ALLOCNO_CLASS_COST (a));
    2461       447891 :         ira_allocate_and_set_costs (&ALLOCNO_CONFLICT_HARD_REG_COSTS (a),
    2462              :                                     rclass, 0);
    2463       447891 :         ALLOCNO_HARD_REG_COSTS (a)[i] -= cost;
    2464       447891 :         ALLOCNO_CONFLICT_HARD_REG_COSTS (a)[i] -= cost;
    2465       447891 :         ALLOCNO_CLASS_COST (a) = MIN (ALLOCNO_CLASS_COST (a),
    2466              :                                       ALLOCNO_HARD_REG_COSTS (a)[i]);
    2467              :       }
    2468              :     }
    2469              : }
    2470              : 
    2471              : /* After we find hard register and memory costs for allocnos, define
    2472              :    its class and modify hard register cost because insns moving
    2473              :    allocno to/from hard registers.  */
    2474              : static void
    2475      1471362 : setup_allocno_class_and_costs (void)
    2476              : {
    2477      1471362 :   int i, j, n, regno, hard_regno, num;
    2478      1471362 :   int *reg_costs;
    2479      1471362 :   enum reg_class aclass, rclass;
    2480      1471362 :   ira_allocno_t a;
    2481      1471362 :   ira_allocno_iterator ai;
    2482      1471362 :   cost_classes_t cost_classes_ptr;
    2483              : 
    2484      1471362 :   ira_assert (allocno_p);
    2485     36709999 :   FOR_EACH_ALLOCNO (a, ai)
    2486              :     {
    2487     35238637 :       i = ALLOCNO_NUM (a);
    2488     35238637 :       regno = ALLOCNO_REGNO (a);
    2489     35238637 :       aclass = regno_aclass[regno];
    2490     35238637 :       cost_classes_ptr = regno_cost_classes[regno];
    2491     35238637 :       ira_assert (pref[i] == NO_REGS || aclass != NO_REGS);
    2492     35238637 :       ALLOCNO_MEMORY_COST (a) = COSTS (costs, i)->mem_cost;
    2493     35238637 :       ira_set_allocno_class (a, aclass);
    2494     35238637 :       if (aclass == NO_REGS)
    2495       690374 :         continue;
    2496     34548263 :       if (optimize && ALLOCNO_CLASS (a) != pref[i])
    2497              :         {
    2498      5595749 :           n = ira_class_hard_regs_num[aclass];
    2499      5595749 :           ALLOCNO_HARD_REG_COSTS (a)
    2500      5595749 :             = reg_costs = ira_allocate_cost_vector (aclass);
    2501     99960124 :           for (j = n - 1; j >= 0; j--)
    2502              :             {
    2503     94364375 :               hard_regno = ira_class_hard_regs[aclass][j];
    2504     94364375 :               if (TEST_HARD_REG_BIT (reg_class_contents[pref[i]], hard_regno))
    2505     15149165 :                 reg_costs[j] = ALLOCNO_CLASS_COST (a);
    2506              :               else
    2507              :                 {
    2508     79215210 :                   rclass = REGNO_REG_CLASS (hard_regno);
    2509     79215210 :                   num = cost_classes_ptr->index[rclass];
    2510     79215210 :                   if (num < 0)
    2511              :                     {
    2512       280419 :                       num = cost_classes_ptr->hard_regno_index[hard_regno];
    2513       280419 :                       ira_assert (num >= 0);
    2514              :                     }
    2515     79215210 :                   reg_costs[j] = COSTS (costs, i)->cost[num];
    2516              :                 }
    2517              :             }
    2518              :         }
    2519              :     }
    2520      1471362 :   if (optimize)
    2521      1043685 :     ira_traverse_loop_tree (true, ira_loop_tree_root,
    2522              :                             process_bb_node_for_hard_reg_moves, NULL);
    2523      1471362 : }
    2524              : 
    2525              : 
    2526              : 
    2527              : /* Function called once during compiler work.  */
    2528              : void
    2529       209218 : ira_init_costs_once (void)
    2530              : {
    2531       209218 :   int i;
    2532              : 
    2533       209218 :   init_cost = NULL;
    2534      6485758 :   for (i = 0; i < MAX_RECOG_OPERANDS; i++)
    2535              :     {
    2536      6276540 :       op_costs[i] = NULL;
    2537      6276540 :       this_op_costs[i] = NULL;
    2538              :     }
    2539       209218 :   temp_costs = NULL;
    2540       209218 : }
    2541              : 
    2542              : /* Free allocated temporary cost vectors.  */
    2543              : void
    2544       788929 : target_ira_int::free_ira_costs ()
    2545              : {
    2546       788929 :   int i;
    2547              : 
    2548       788929 :   free (x_init_cost);
    2549       788929 :   x_init_cost = NULL;
    2550     24456799 :   for (i = 0; i < MAX_RECOG_OPERANDS; i++)
    2551              :     {
    2552     23667870 :       free (x_op_costs[i]);
    2553     23667870 :       free (x_this_op_costs[i]);
    2554     23667870 :       x_op_costs[i] = x_this_op_costs[i] = NULL;
    2555              :     }
    2556       788929 :   free (x_temp_costs);
    2557       788929 :   x_temp_costs = NULL;
    2558       788929 : }
    2559              : 
    2560              : /* This is called each time register related information is
    2561              :    changed.  */
    2562              : void
    2563       214527 : ira_init_costs (void)
    2564              : {
    2565       214527 :   int i;
    2566              : 
    2567       214527 :   this_target_ira_int->free_ira_costs ();
    2568       214527 :   max_struct_costs_size
    2569       214527 :     = sizeof (struct costs) + sizeof (int) * (ira_important_classes_num - 1);
    2570              :   /* Don't use ira_allocate because vectors live through several IRA
    2571              :      calls.  */
    2572       214527 :   init_cost = (struct costs *) xmalloc (max_struct_costs_size);
    2573       214527 :   init_cost->mem_cost = 1000000;
    2574      6867325 :   for (i = 0; i < ira_important_classes_num; i++)
    2575      6652798 :     init_cost->cost[i] = 1000000;
    2576      6650337 :   for (i = 0; i < MAX_RECOG_OPERANDS; i++)
    2577              :     {
    2578      6435810 :       op_costs[i] = (struct costs *) xmalloc (max_struct_costs_size);
    2579      6435810 :       this_op_costs[i] = (struct costs *) xmalloc (max_struct_costs_size);
    2580              :     }
    2581       214527 :   temp_costs = (struct costs *) xmalloc (max_struct_costs_size);
    2582       214527 : }
    2583              : 
    2584              : 
    2585              : 
    2586              : /* Common initialization function for ira_costs and
    2587              :    ira_set_pseudo_classes.  */
    2588              : static void
    2589      1500820 : init_costs (void)
    2590              : {
    2591      1500820 :   init_subregs_of_mode ();
    2592      3001640 :   costs = (struct costs *) ira_allocate (max_struct_costs_size
    2593      1500820 :                                          * cost_elements_num);
    2594      3001640 :   pref_buffer = (enum reg_class *) ira_allocate (sizeof (enum reg_class)
    2595      1500820 :                                                  * cost_elements_num);
    2596      4502460 :   regno_aclass = (enum reg_class *) ira_allocate (sizeof (enum reg_class)
    2597      1500820 :                                                  * max_reg_num ());
    2598      1500820 :   regno_equiv_gains = (int *) ira_allocate (sizeof (int) * max_reg_num ());
    2599      1500820 :   memset (regno_equiv_gains, 0, sizeof (int) * max_reg_num ());
    2600      1500820 : }
    2601              : 
    2602              : /* Common finalization function for ira_costs and
    2603              :    ira_set_pseudo_classes.  */
    2604              : static void
    2605      1500820 : finish_costs (void)
    2606              : {
    2607      1500820 :   finish_subregs_of_mode ();
    2608      1500820 :   ira_free (regno_equiv_gains);
    2609      1500820 :   ira_free (regno_aclass);
    2610      1500820 :   ira_free (pref_buffer);
    2611      1500820 :   ira_free (costs);
    2612      1500820 : }
    2613              : 
    2614              : /* Entry function which defines register class, memory and hard
    2615              :    register costs for each allocno.  */
    2616              : void
    2617      1471362 : ira_costs (void)
    2618              : {
    2619      1471362 :   allocno_p = true;
    2620      1471362 :   cost_elements_num = ira_allocnos_num;
    2621      1471362 :   init_costs ();
    2622      2942724 :   total_allocno_costs = (struct costs *) ira_allocate (max_struct_costs_size
    2623      1471362 :                                                        * ira_allocnos_num);
    2624      1471362 :   initiate_regno_cost_classes ();
    2625      1471362 :   if (!ira_use_lra_p)
    2626              :     /* Process equivs in reload to update costs through hook
    2627              :        ira_adjust_equiv_reg_cost.  */
    2628            0 :     calculate_elim_costs_all_insns ();
    2629      1471362 :   find_costs_and_classes ();
    2630      1471362 :   setup_allocno_class_and_costs ();
    2631      1471362 :   finish_regno_cost_classes ();
    2632      1471362 :   finish_costs ();
    2633      1471362 :   ira_free (total_allocno_costs);
    2634      1471362 : }
    2635              : 
    2636              : /* Entry function which defines classes for pseudos.
    2637              :    Set pseudo_classes_defined_p only if DEFINE_PSEUDO_CLASSES is true.  */
    2638              : void
    2639        29458 : ira_set_pseudo_classes (bool define_pseudo_classes, FILE *dump_file)
    2640              : {
    2641        29458 :   FILE *saved_file = ira_dump_file;
    2642        29458 :   allocno_p = false;
    2643        29458 :   internal_flag_ira_verbose = flag_ira_verbose;
    2644        29458 :   ira_dump_file = dump_file;
    2645        29458 :   cost_elements_num = max_reg_num ();
    2646        29458 :   init_costs ();
    2647        29458 :   initiate_regno_cost_classes ();
    2648        29458 :   find_costs_and_classes ();
    2649        29458 :   finish_regno_cost_classes ();
    2650        29458 :   if (define_pseudo_classes)
    2651          101 :     pseudo_classes_defined_p = true;
    2652              : 
    2653        29458 :   finish_costs ();
    2654        29458 :   ira_dump_file = saved_file;
    2655        29458 : }
    2656              : 
    2657              : 
    2658              : 
    2659              : /* Change hard register costs for allocnos which lives through
    2660              :    function calls.  This is called only when we found all intersected
    2661              :    calls during building allocno live ranges.  */
    2662              : void
    2663      1471362 : ira_tune_allocno_costs (void)
    2664              : {
    2665      1471362 :   int j, n, regno;
    2666      1471362 :   int cost, min_cost, *reg_costs;
    2667      1471362 :   enum reg_class aclass;
    2668      1471362 :   machine_mode mode;
    2669      1471362 :   ira_allocno_t a;
    2670      1471362 :   ira_allocno_iterator ai;
    2671      1471362 :   ira_allocno_object_iterator oi;
    2672      1471362 :   ira_object_t obj;
    2673      1471362 :   bool skip_p;
    2674              : 
    2675     37930378 :   FOR_EACH_ALLOCNO (a, ai)
    2676              :     {
    2677     36459016 :       aclass = ALLOCNO_CLASS (a);
    2678     36459016 :       if (aclass == NO_REGS)
    2679       659420 :         continue;
    2680     35799596 :       mode = ALLOCNO_MODE (a);
    2681     35799596 :       n = ira_class_hard_regs_num[aclass];
    2682     35799596 :       min_cost = INT_MAX;
    2683     35799596 :       if (ALLOCNO_CALLS_CROSSED_NUM (a)
    2684     35799596 :           != ALLOCNO_CHEAP_CALLS_CROSSED_NUM (a))
    2685              :         {
    2686      3589289 :           ira_allocate_and_set_costs
    2687      3589289 :             (&ALLOCNO_HARD_REG_COSTS (a), aclass,
    2688              :              ALLOCNO_CLASS_COST (a));
    2689      3589289 :           reg_costs = ALLOCNO_HARD_REG_COSTS (a);
    2690     52190157 :           for (j = n - 1; j >= 0; j--)
    2691              :             {
    2692     48600868 :               regno = ira_class_hard_regs[aclass][j];
    2693     48600868 :               skip_p = false;
    2694     87402104 :               FOR_EACH_ALLOCNO_OBJECT (a, obj, oi)
    2695              :                 {
    2696     50006381 :                   if (ira_hard_reg_set_intersection_p (regno, mode,
    2697              :                                                        OBJECT_CONFLICT_HARD_REGS
    2698              :                                                        (obj)))
    2699              :                     {
    2700              :                       skip_p = true;
    2701              :                       break;
    2702              :                     }
    2703              :                 }
    2704     48600868 :               if (skip_p)
    2705     11205145 :                 continue;
    2706     37395723 :               cost = 0;
    2707     37395723 :               if (ira_need_caller_save_p (a, regno))
    2708     19265432 :                 cost += ira_caller_save_cost (a);
    2709              : #ifdef IRA_HARD_REGNO_ADD_COST_MULTIPLIER
    2710              :               {
    2711              :                 auto rclass = REGNO_REG_CLASS (regno);
    2712              :                 cost += ((ira_memory_move_cost[mode][rclass][0]
    2713              :                           + ira_memory_move_cost[mode][rclass][1])
    2714              :                          * ALLOCNO_FREQ (a)
    2715              :                          * IRA_HARD_REGNO_ADD_COST_MULTIPLIER (regno) / 2);
    2716              :               }
    2717              : #endif
    2718     37395723 :               if (INT_MAX - cost < reg_costs[j])
    2719            0 :                 reg_costs[j] = INT_MAX;
    2720              :               else
    2721     37395723 :                 reg_costs[j] += cost;
    2722     37395723 :               if (min_cost > reg_costs[j])
    2723     48600868 :                 min_cost = reg_costs[j];
    2724              :             }
    2725              :         }
    2726      3589289 :       if (min_cost != INT_MAX)
    2727      3573525 :         ALLOCNO_CLASS_COST (a) = min_cost;
    2728              : 
    2729              :       /* Some targets allow pseudos to be allocated to unaligned sequences
    2730              :          of hard registers.  However, selecting an unaligned sequence can
    2731              :          unnecessarily restrict later allocations.  So increase the cost of
    2732              :          unaligned hard regs to encourage the use of aligned hard regs.  */
    2733     35799596 :       {
    2734     35799596 :         const int nregs = ira_reg_class_max_nregs[aclass][ALLOCNO_MODE (a)];
    2735              : 
    2736     35799596 :         if (nregs > 1)
    2737              :           {
    2738      1305832 :             ira_allocate_and_set_costs
    2739      1305832 :               (&ALLOCNO_HARD_REG_COSTS (a), aclass, ALLOCNO_CLASS_COST (a));
    2740      1305832 :             reg_costs = ALLOCNO_HARD_REG_COSTS (a);
    2741     29210277 :             for (j = n - 1; j >= 0; j--)
    2742              :               {
    2743     27904445 :                 regno = ira_non_ordered_class_hard_regs[aclass][j];
    2744     27904445 :                 if ((regno % nregs) != 0)
    2745              :                   {
    2746     13712637 :                     int index = ira_class_hard_reg_index[aclass][regno];
    2747     13712637 :                     ira_assert (index != -1);
    2748     13712637 :                     reg_costs[index] += ALLOCNO_FREQ (a);
    2749              :                   }
    2750              :               }
    2751              :           }
    2752              :       }
    2753              :     }
    2754      1471362 : }
    2755              : 
    2756              : /* A hook from the reload pass.  Add COST to the estimated gain for eliminating
    2757              :    REGNO with its equivalence.  If COST is zero, record that no such
    2758              :    elimination is possible.  */
    2759              : 
    2760              : void
    2761            0 : ira_adjust_equiv_reg_cost (unsigned regno, int cost)
    2762              : {
    2763            0 :   ira_assert (!ira_use_lra_p);
    2764            0 :   if (cost == 0)
    2765            0 :     regno_equiv_gains[regno] = 0;
    2766              :   else
    2767            0 :     regno_equiv_gains[regno] += cost;
    2768            0 : }
    2769              : 
    2770              : void
    2771       256621 : ira_costs_cc_finalize (void)
    2772              : {
    2773       256621 :   this_target_ira_int->free_ira_costs ();
    2774       256621 : }
        

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.