LCOV - code coverage report
Current view: top level - gcc - ira-int.h (source / functions) Coverage Total Hit
Test: gcc.info Lines: 100.0 % 211 211
Test Date: 2026-07-11 15:47:05 Functions: 100.0 % 24 24
Legend: Lines:     hit not hit

            Line data    Source code
       1              : /* Integrated Register Allocator (IRA) intercommunication header file.
       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              : #ifndef GCC_IRA_INT_H
      22              : #define GCC_IRA_INT_H
      23              : 
      24              : #include "recog.h"
      25              : #include "function-abi.h"
      26              : 
      27              : /* To provide consistency in naming, all IRA external variables,
      28              :    functions, common typedefs start with prefix ira_.  */
      29              : 
      30              : #if CHECKING_P
      31              : #define ENABLE_IRA_CHECKING
      32              : #endif
      33              : 
      34              : #ifdef ENABLE_IRA_CHECKING
      35              : #define ira_assert(c) gcc_assert (c)
      36              : #else
      37              : /* Always define and include C, so that warnings for empty body in an
      38              :   'if' statement and unused variable do not occur.  */
      39              : #define ira_assert(c) ((void)(0 && (c)))
      40              : #endif
      41              : 
      42              : /* Compute register frequency from edge frequency FREQ.  It is
      43              :    analogous to REG_FREQ_FROM_BB.  When optimizing for size, or
      44              :    profile driven feedback is available and the function is never
      45              :    executed, frequency is always equivalent.  Otherwise rescale the
      46              :    edge frequency.  */
      47              : #define REG_FREQ_FROM_EDGE_FREQ(freq)                              \
      48              :   (optimize_function_for_size_p (cfun)                             \
      49              :    ? REG_FREQ_MAX : (freq * REG_FREQ_MAX / BB_FREQ_MAX)            \
      50              :    ? (freq * REG_FREQ_MAX / BB_FREQ_MAX) : 1)
      51              : 
      52              : /* A modified value of flag `-fira-verbose' used internally.  */
      53              : extern int internal_flag_ira_verbose;
      54              : 
      55              : /* Dump file of the allocator if it is not NULL.  */
      56              : extern FILE *ira_dump_file;
      57              : 
      58              : /* Typedefs for pointers to allocno live range, allocno, and copy of
      59              :    allocnos.  */
      60              : typedef struct live_range *live_range_t;
      61              : typedef struct ira_allocno *ira_allocno_t;
      62              : typedef struct ira_allocno_pref *ira_pref_t;
      63              : typedef struct ira_allocno_copy *ira_copy_t;
      64              : typedef struct ira_object *ira_object_t;
      65              : 
      66              : /* Definition of vector of allocnos and copies.  */
      67              : 
      68              : /* Typedef for pointer to the subsequent structure.  */
      69              : typedef struct ira_loop_tree_node *ira_loop_tree_node_t;
      70              : 
      71              : typedef unsigned short move_table[N_REG_CLASSES];
      72              : 
      73              : /* In general case, IRA is a regional allocator.  The regions are
      74              :    nested and form a tree.  Currently regions are natural loops.  The
      75              :    following structure describes loop tree node (representing basic
      76              :    block or loop).  We need such tree because the loop tree from
      77              :    cfgloop.h is not convenient for the optimization: basic blocks are
      78              :    not a part of the tree from cfgloop.h.  We also use the nodes for
      79              :    storing additional information about basic blocks/loops for the
      80              :    register allocation purposes.  */
      81              : struct ira_loop_tree_node
      82              : {
      83              :   /* The node represents basic block if children == NULL.  */
      84              :   basic_block bb;    /* NULL for loop.  */
      85              :   /* NULL for BB or for loop tree root if we did not build CFG loop tree.  */
      86              :   class loop *loop;
      87              :   /* NEXT/SUBLOOP_NEXT is the next node/loop-node of the same parent.
      88              :      SUBLOOP_NEXT is always NULL for BBs.  */
      89              :   ira_loop_tree_node_t subloop_next, next;
      90              :   /* CHILDREN/SUBLOOPS is the first node/loop-node immediately inside
      91              :      the node.  They are NULL for BBs.  */
      92              :   ira_loop_tree_node_t subloops, children;
      93              :   /* The node immediately containing given node.  */
      94              :   ira_loop_tree_node_t parent;
      95              : 
      96              :   /* Loop level in range [0, ira_loop_tree_height).  */
      97              :   int level;
      98              : 
      99              :   /* All the following members are defined only for nodes representing
     100              :      loops.  */
     101              : 
     102              :   /* The loop number from CFG loop tree.  The root number is 0.  */
     103              :   int loop_num;
     104              : 
     105              :   /* True if the loop was marked for removal from the register
     106              :      allocation.  */
     107              :   bool to_remove_p;
     108              : 
     109              :   /* Allocnos in the loop corresponding to their regnos.  If it is
     110              :      NULL the loop does not form a separate register allocation region
     111              :      (e.g. because it has abnormal enter/exit edges and we cannot put
     112              :      code for register shuffling on the edges if a different
     113              :      allocation is used for a pseudo-register on different sides of
     114              :      the edges).  Caps are not in the map (remember we can have more
     115              :      one cap with the same regno in a region).  */
     116              :   ira_allocno_t *regno_allocno_map;
     117              : 
     118              :   /* True if there is an entry to given loop not from its parent (or
     119              :      grandparent) basic block.  For example, it is possible for two
     120              :      adjacent loops inside another loop.  */
     121              :   bool entered_from_non_parent_p;
     122              : 
     123              :   /* Maximal register pressure inside loop for given register class
     124              :      (defined only for the pressure classes).  */
     125              :   int reg_pressure[N_REG_CLASSES];
     126              : 
     127              :   /* Numbers of allocnos referred or living in the loop node (except
     128              :      for its subloops).  */
     129              :   bitmap all_allocnos;
     130              : 
     131              :   /* Numbers of allocnos living at the loop borders.  */
     132              :   bitmap border_allocnos;
     133              : 
     134              :   /* Regnos of pseudos modified in the loop node (including its
     135              :      subloops).  */
     136              :   bitmap modified_regnos;
     137              : 
     138              :   /* Numbers of copies referred in the corresponding loop.  */
     139              :   bitmap local_copies;
     140              : };
     141              : 
     142              : /* The root of the loop tree corresponding to the all function.  */
     143              : extern ira_loop_tree_node_t ira_loop_tree_root;
     144              : 
     145              : /* Height of the loop tree.  */
     146              : extern int ira_loop_tree_height;
     147              : 
     148              : /* All nodes representing basic blocks are referred through the
     149              :    following array.  We cannot use basic block member `aux' for this
     150              :    because it is used for insertion of insns on edges.  */
     151              : extern ira_loop_tree_node_t ira_bb_nodes;
     152              : 
     153              : /* Two access macros to the nodes representing basic blocks.  */
     154              : #if defined ENABLE_IRA_CHECKING && (GCC_VERSION >= 2007)
     155              : #define IRA_BB_NODE_BY_INDEX(index) __extension__                       \
     156              : (({ ira_loop_tree_node_t _node = (&ira_bb_nodes[index]);            \
     157              :      if (_node->children != NULL || _node->loop != NULL || _node->bb == NULL)\
     158              :        {                                                                \
     159              :          fprintf (stderr,                                               \
     160              :                   "\n%s: %d: error in %s: it is not a block node\n",  \
     161              :                   __FILE__, __LINE__, __FUNCTION__);                    \
     162              :          gcc_unreachable ();                                            \
     163              :        }                                                                \
     164              :      _node; }))
     165              : #else
     166              : #define IRA_BB_NODE_BY_INDEX(index) (&ira_bb_nodes[index])
     167              : #endif
     168              : 
     169              : #define IRA_BB_NODE(bb) IRA_BB_NODE_BY_INDEX ((bb)->index)
     170              : 
     171              : /* All nodes representing loops are referred through the following
     172              :    array.  */
     173              : extern ira_loop_tree_node_t ira_loop_nodes;
     174              : 
     175              : /* Two access macros to the nodes representing loops.  */
     176              : #if defined ENABLE_IRA_CHECKING && (GCC_VERSION >= 2007)
     177              : #define IRA_LOOP_NODE_BY_INDEX(index) __extension__                     \
     178              : (({ ira_loop_tree_node_t const _node = (&ira_loop_nodes[index]);    \
     179              :      if (_node->children == NULL || _node->bb != NULL                     \
     180              :          || (_node->loop == NULL && current_loops != NULL))          \
     181              :        {                                                                \
     182              :          fprintf (stderr,                                               \
     183              :                   "\n%s: %d: error in %s: it is not a loop node\n",   \
     184              :                   __FILE__, __LINE__, __FUNCTION__);                    \
     185              :          gcc_unreachable ();                                            \
     186              :        }                                                                \
     187              :      _node; }))
     188              : #else
     189              : #define IRA_LOOP_NODE_BY_INDEX(index) (&ira_loop_nodes[index])
     190              : #endif
     191              : 
     192              : #define IRA_LOOP_NODE(loop) IRA_LOOP_NODE_BY_INDEX ((loop)->num)
     193              : 
     194              : 
     195              : /* The structure describes program points where a given allocno lives.
     196              :    If the live ranges of two allocnos are intersected, the allocnos
     197              :    are in conflict.  */
     198              : struct live_range
     199              : {
     200              :   /* Object whose live range is described by given structure.  */
     201              :   ira_object_t object;
     202              :   /* Program point range.  */
     203              :   int start, finish;
     204              :   /* Next structure describing program points where the allocno
     205              :      lives.  */
     206              :   live_range_t next;
     207              :   /* Pointer to structures with the same start/finish.  */
     208              :   live_range_t start_next, finish_next;
     209              : };
     210              : 
     211              : /* Program points are enumerated by numbers from range
     212              :    0..IRA_MAX_POINT-1.  There are approximately two times more program
     213              :    points than insns.  Program points are places in the program where
     214              :    liveness info can be changed.  In most general case (there are more
     215              :    complicated cases too) some program points correspond to places
     216              :    where input operand dies and other ones correspond to places where
     217              :    output operands are born.  */
     218              : extern int ira_max_point;
     219              : 
     220              : /* Arrays of size IRA_MAX_POINT mapping a program point to the allocno
     221              :    live ranges with given start/finish point.  */
     222              : extern live_range_t *ira_start_point_ranges, *ira_finish_point_ranges;
     223              : 
     224              : /* A structure representing conflict information for an allocno
     225              :    (or one of its subwords).  */
     226              : struct ira_object
     227              : {
     228              :   /* The allocno associated with this record.  */
     229              :   ira_allocno_t allocno;
     230              :   /* Vector of accumulated conflicting conflict_redords with NULL end
     231              :      marker (if OBJECT_CONFLICT_VEC_P is true) or conflict bit vector
     232              :      otherwise.  */
     233              :   void *conflicts_array;
     234              :   /* Pointer to structures describing at what program point the
     235              :      object lives.  We always maintain the list in such way that *the
     236              :      ranges in the list are not intersected and ordered by decreasing
     237              :      their program points*.  */
     238              :   live_range_t live_ranges;
     239              :   /* The subword within ALLOCNO which is represented by this object.
     240              :      Zero means the lowest-order subword (or the entire allocno in case
     241              :      it is not being tracked in subwords).  */
     242              :   int subword;
     243              :   /* Allocated size of the conflicts array.  */
     244              :   unsigned int conflicts_array_size;
     245              :   /* A unique number for every instance of this structure, which is used
     246              :      to represent it in conflict bit vectors.  */
     247              :   int id;
     248              :   /* Before building conflicts, MIN and MAX are initialized to
     249              :      correspondingly minimal and maximal points of the accumulated
     250              :      live ranges.  Afterwards, they hold the minimal and maximal ids
     251              :      of other ira_objects that this one can conflict with.  */
     252              :   int min, max;
     253              :   /* Initial and accumulated hard registers conflicting with this
     254              :      object and as a consequences cannot be assigned to the allocno.
     255              :      All non-allocatable hard regs and hard regs of register classes
     256              :      different from given allocno one are included in the sets.  */
     257              :   HARD_REG_SET conflict_hard_regs, total_conflict_hard_regs;
     258              :   /* Number of accumulated conflicts in the vector of conflicting
     259              :      objects.  */
     260              :   int num_accumulated_conflicts;
     261              :   /* TRUE if conflicts are represented by a vector of pointers to
     262              :      ira_object structures.  Otherwise, we use a bit vector indexed
     263              :      by conflict ID numbers.  */
     264              :   unsigned int conflict_vec_p : 1;
     265              : };
     266              : 
     267              : 
     268              : /* Filter that restricts an allocno's hard regnos by referencing
     269              :    another allocno.  */
     270              : struct ira_dependent_filter
     271              : {
     272              :   /* Filter ID and MODE of this (dependent) op.  */
     273              :   int id;
     274              :   ENUM_BITFIELD (machine_mode) mode : MACHINE_MODE_BITSIZE;
     275              : 
     276              :   /* Allocno, hard regno and mode of the referenced op.  */
     277              :   ira_allocno_t ref_allocno;
     278              :   unsigned int ref_hard_regno;
     279              :   ENUM_BITFIELD (machine_mode) ref_mode : MACHINE_MODE_BITSIZE;
     280              : 
     281              :   struct ira_dependent_filter *next;
     282              : };
     283              : 
     284              : /* A structure representing an allocno (allocation entity).  Allocno
     285              :    represents a pseudo-register in an allocation region.  If
     286              :    pseudo-register does not live in a region but it lives in the
     287              :    nested regions, it is represented in the region by special allocno
     288              :    called *cap*.  There may be more one cap representing the same
     289              :    pseudo-register in region.  It means that the corresponding
     290              :    pseudo-register lives in more one non-intersected subregion.  */
     291              : struct ira_allocno
     292              : {
     293              :   /* The allocno order number starting with 0.  Each allocno has an
     294              :      unique number and the number is never changed for the
     295              :      allocno.  */
     296              :   int num;
     297              :   /* Regno for allocno or cap.  */
     298              :   int regno;
     299              :   /* Mode of the allocno which is the mode of the corresponding
     300              :      pseudo-register.  */
     301              :   ENUM_BITFIELD (machine_mode) mode : MACHINE_MODE_BITSIZE;
     302              :   /* Widest mode of the allocno which in at least one case could be
     303              :      for paradoxical subregs where wmode > mode.  */
     304              :   ENUM_BITFIELD (machine_mode) wmode : MACHINE_MODE_BITSIZE;
     305              :   /* Register class which should be used for allocation for given
     306              :      allocno.  NO_REGS means that we should use memory.  */
     307              :   ENUM_BITFIELD (reg_class) aclass : 16;
     308              :   /* Hard register assigned to given allocno.  Negative value means
     309              :      that memory was allocated to the allocno.  During the reload,
     310              :      spilled allocno has value equal to the corresponding stack slot
     311              :      number (0, ...) - 2.  Value -1 is used for allocnos spilled by the
     312              :      reload (at this point pseudo-register has only one allocno) which
     313              :      did not get stack slot yet.  */
     314              :   signed int hard_regno : 16;
     315              :   /* A bitmask of the ABIs used by calls that occur while the allocno
     316              :      is live.  */
     317              :   unsigned int crossed_calls_abis : NUM_ABI_IDS;
     318              :   /* During the reload, value TRUE means that we should not reassign a
     319              :      hard register to the allocno got memory earlier.  It is set up
     320              :      when we removed memory-memory move insn before each iteration of
     321              :      the reload.  */
     322              :   unsigned int dont_reassign_p : 1;
     323              : #ifdef STACK_REGS
     324              :   /* Set to TRUE if allocno can't be assigned to the stack hard
     325              :      register correspondingly in this region and area including the
     326              :      region and all its subregions recursively.  */
     327              :   unsigned int no_stack_reg_p : 1, total_no_stack_reg_p : 1;
     328              : #endif
     329              :   /* TRUE value means that there is no sense to spill the allocno
     330              :      during coloring because the spill will result in additional
     331              :      reloads in reload pass.  */
     332              :   unsigned int bad_spill_p : 1;
     333              :   /* TRUE if a hard register or memory has been assigned to the
     334              :      allocno.  */
     335              :   unsigned int assigned_p : 1;
     336              :   /* TRUE if conflicts for given allocno are represented by vector of
     337              :      pointers to the conflicting allocnos.  Otherwise, we use a bit
     338              :      vector where a bit with given index represents allocno with the
     339              :      same number.  */
     340              :   unsigned int conflict_vec_p : 1;
     341              :   /* True if the parent loop has an allocno for the same register and
     342              :      if the parent allocno's assignment might not be valid in this loop.
     343              :      This means that we cannot merge this allocno and the parent allocno
     344              :      together.
     345              : 
     346              :      This is only ever true for non-cap allocnos.  */
     347              :   unsigned int might_conflict_with_parent_p : 1;
     348              : #ifndef NUM_REGISTER_FILTERS
     349              : #error "insn-config.h not included"
     350              : #elif NUM_REGISTER_FILTERS
     351              :   /* The set of register filters applied to the allocno by operand
     352              :      alternatives that accept class ACLASS.  */
     353              :   unsigned int register_filters : NUM_REGISTER_FILTERS;
     354              : #endif
     355              :   /* List of dependent filters.  */
     356              :   struct ira_dependent_filter *dependent_filters;
     357              :   /* Accumulated usage references of the allocno.  Here and below,
     358              :      word 'accumulated' means info for given region and all nested
     359              :      subregions.  In this case, 'accumulated' means sum of references
     360              :      of the corresponding pseudo-register in this region and in all
     361              :      nested subregions recursively. */
     362              :   int nrefs;
     363              :   /* Accumulated frequency of usage of the allocno.  */
     364              :   int freq;
     365              :   /* Minimal accumulated and updated costs of usage register of the
     366              :      allocno class.  */
     367              :   int class_cost, updated_class_cost;
     368              :   /* Minimal accumulated, and updated costs of memory for the allocno.
     369              :      At the allocation start, the original and updated costs are
     370              :      equal.  The updated cost may be changed after finishing
     371              :      allocation in a region and starting allocation in a subregion.
     372              :      The change reflects the cost of spill/restore code on the
     373              :      subregion border if we assign memory to the pseudo in the
     374              :      subregion.  */
     375              :   int memory_cost, updated_memory_cost;
     376              :   /* Accumulated number of points where the allocno lives and there is
     377              :      excess pressure for its class.  Excess pressure for a register
     378              :      class at some point means that there are more allocnos of given
     379              :      register class living at the point than number of hard-registers
     380              :      of the class available for the allocation.  */
     381              :   int excess_pressure_points_num;
     382              :   /* The number of objects tracked in the following array.  */
     383              :   int num_objects;
     384              :   /* Accumulated frequency of calls which given allocno
     385              :      intersects.  */
     386              :   int call_freq;
     387              :   /* Accumulated number of the intersected calls.  */
     388              :   int calls_crossed_num;
     389              :   /* The number of calls across which it is live, but which should not
     390              :      affect register preferences.  */
     391              :   int cheap_calls_crossed_num;
     392              :   /* Allocnos with the same regno are linked by the following member.
     393              :      Allocnos corresponding to inner loops are first in the list (it
     394              :      corresponds to depth-first traverse of the loops).  */
     395              :   ira_allocno_t next_regno_allocno;
     396              :   /* There may be different allocnos with the same regno in different
     397              :      regions.  Allocnos are bound to the corresponding loop tree node.
     398              :      Pseudo-register may have only one regular allocno with given loop
     399              :      tree node but more than one cap (see comments above).  */
     400              :   ira_loop_tree_node_t loop_tree_node;
     401              :   /* Allocno hard reg preferences.  */
     402              :   ira_pref_t allocno_prefs;
     403              :   /* Copies to other non-conflicting allocnos.  The copies can
     404              :      represent move insn or potential move insn usually because of two
     405              :      operand insn constraints.  */
     406              :   ira_copy_t allocno_copies;
     407              :   /* It is a allocno (cap) representing given allocno on upper loop tree
     408              :      level.  */
     409              :   ira_allocno_t cap;
     410              :   /* It is a link to allocno (cap) on lower loop level represented by
     411              :      given cap.  Null if given allocno is not a cap.  */
     412              :   ira_allocno_t cap_member;
     413              :   /* An array of structures describing conflict information and live
     414              :      ranges for each object associated with the allocno.  There may be
     415              :      more than one such object in cases where the allocno represents a
     416              :      multi-word register.  */
     417              :   ira_object_t objects[2];
     418              :   /* Registers clobbered by intersected calls.  */
     419              :    HARD_REG_SET crossed_calls_clobbered_regs;
     420              :   /* Array of usage costs (accumulated and the one updated during
     421              :      coloring) for each hard register of the allocno class.  The
     422              :      member value can be NULL if all costs are the same and equal to
     423              :      CLASS_COST.  For example, the costs of two different hard
     424              :      registers can be different if one hard register is callee-saved
     425              :      and another one is callee-used and the allocno lives through
     426              :      calls.  Another example can be case when for some insn the
     427              :      corresponding pseudo-register value should be put in specific
     428              :      register class (e.g. AREG for x86) which is a strict subset of
     429              :      the allocno class (GENERAL_REGS for x86).  We have updated costs
     430              :      to reflect the situation when the usage cost of a hard register
     431              :      is decreased because the allocno is connected to another allocno
     432              :      by a copy and the another allocno has been assigned to the hard
     433              :      register.  */
     434              :   int *hard_reg_costs, *updated_hard_reg_costs;
     435              :   /* Array of decreasing costs (accumulated and the one updated during
     436              :      coloring) for allocnos conflicting with given allocno for hard
     437              :      regno of the allocno class.  The member value can be NULL if all
     438              :      costs are the same.  These costs are used to reflect preferences
     439              :      of other allocnos not assigned yet during assigning to given
     440              :      allocno.  */
     441              :   int *conflict_hard_reg_costs, *updated_conflict_hard_reg_costs;
     442              :   /* Different additional data.  It is used to decrease size of
     443              :      allocno data footprint.  */
     444              :   void *add_data;
     445              : };
     446              : 
     447              : 
     448              : /* All members of the allocno structures should be accessed only
     449              :    through the following macros.  */
     450              : #define ALLOCNO_NUM(A) ((A)->num)
     451              : #define ALLOCNO_REGNO(A) ((A)->regno)
     452              : #define ALLOCNO_REG(A) ((A)->reg)
     453              : #define ALLOCNO_NEXT_REGNO_ALLOCNO(A) ((A)->next_regno_allocno)
     454              : #define ALLOCNO_LOOP_TREE_NODE(A) ((A)->loop_tree_node)
     455              : #define ALLOCNO_CAP(A) ((A)->cap)
     456              : #define ALLOCNO_CAP_MEMBER(A) ((A)->cap_member)
     457              : #define ALLOCNO_NREFS(A) ((A)->nrefs)
     458              : #define ALLOCNO_FREQ(A) ((A)->freq)
     459              : #define ALLOCNO_MIGHT_CONFLICT_WITH_PARENT_P(A) \
     460              :   ((A)->might_conflict_with_parent_p)
     461              : #if NUM_REGISTER_FILTERS
     462              : #define ALLOCNO_REGISTER_FILTERS(A) (A)->register_filters
     463              : #define ALLOCNO_SET_REGISTER_FILTERS(A, X) ((A)->register_filters = (X))
     464              : #else
     465              : #define ALLOCNO_REGISTER_FILTERS(A) 0
     466              : #define ALLOCNO_SET_REGISTER_FILTERS(A, X) ((void) (A), gcc_assert ((X) == 0))
     467              : #endif
     468              : #define ALLOCNO_DEPENDENT_FILTERS(A) ((A)->dependent_filters)
     469              : #define ALLOCNO_HARD_REGNO(A) ((A)->hard_regno)
     470              : #define ALLOCNO_CALL_FREQ(A) ((A)->call_freq)
     471              : #define ALLOCNO_CALLS_CROSSED_NUM(A) ((A)->calls_crossed_num)
     472              : #define ALLOCNO_CHEAP_CALLS_CROSSED_NUM(A) ((A)->cheap_calls_crossed_num)
     473              : #define ALLOCNO_CROSSED_CALLS_ABIS(A) ((A)->crossed_calls_abis)
     474              : #define ALLOCNO_CROSSED_CALLS_CLOBBERED_REGS(A) \
     475              :   ((A)->crossed_calls_clobbered_regs)
     476              : #define ALLOCNO_MEM_OPTIMIZED_DEST(A) ((A)->mem_optimized_dest)
     477              : #define ALLOCNO_MEM_OPTIMIZED_DEST_P(A) ((A)->mem_optimized_dest_p)
     478              : #define ALLOCNO_SOMEWHERE_RENAMED_P(A) ((A)->somewhere_renamed_p)
     479              : #define ALLOCNO_CHILD_RENAMED_P(A) ((A)->child_renamed_p)
     480              : #define ALLOCNO_DONT_REASSIGN_P(A) ((A)->dont_reassign_p)
     481              : #ifdef STACK_REGS
     482              : #define ALLOCNO_NO_STACK_REG_P(A) ((A)->no_stack_reg_p)
     483              : #define ALLOCNO_TOTAL_NO_STACK_REG_P(A) ((A)->total_no_stack_reg_p)
     484              : #endif
     485              : #define ALLOCNO_BAD_SPILL_P(A) ((A)->bad_spill_p)
     486              : #define ALLOCNO_ASSIGNED_P(A) ((A)->assigned_p)
     487              : #define ALLOCNO_MODE(A) ((A)->mode)
     488              : #define ALLOCNO_WMODE(A) ((A)->wmode)
     489              : #define ALLOCNO_PREFS(A) ((A)->allocno_prefs)
     490              : #define ALLOCNO_COPIES(A) ((A)->allocno_copies)
     491              : #define ALLOCNO_HARD_REG_COSTS(A) ((A)->hard_reg_costs)
     492              : #define ALLOCNO_UPDATED_HARD_REG_COSTS(A) ((A)->updated_hard_reg_costs)
     493              : #define ALLOCNO_CONFLICT_HARD_REG_COSTS(A) \
     494              :   ((A)->conflict_hard_reg_costs)
     495              : #define ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS(A) \
     496              :   ((A)->updated_conflict_hard_reg_costs)
     497              : #define ALLOCNO_CLASS(A) ((A)->aclass)
     498              : #define ALLOCNO_CLASS_COST(A) ((A)->class_cost)
     499              : #define ALLOCNO_UPDATED_CLASS_COST(A) ((A)->updated_class_cost)
     500              : #define ALLOCNO_MEMORY_COST(A) ((A)->memory_cost)
     501              : #define ALLOCNO_UPDATED_MEMORY_COST(A) ((A)->updated_memory_cost)
     502              : #define ALLOCNO_EXCESS_PRESSURE_POINTS_NUM(A) \
     503              :   ((A)->excess_pressure_points_num)
     504              : #define ALLOCNO_OBJECT(A,N) ((A)->objects[N])
     505              : #define ALLOCNO_NUM_OBJECTS(A) ((A)->num_objects)
     506              : #define ALLOCNO_ADD_DATA(A) ((A)->add_data)
     507              : 
     508              : /* Typedef for pointer to the subsequent structure.  */
     509              : typedef struct ira_emit_data *ira_emit_data_t;
     510              : 
     511              : /* Allocno bound data used for emit pseudo live range split insns and
     512              :    to flattening IR.  */
     513              : struct ira_emit_data
     514              : {
     515              :   /* TRUE if the allocno assigned to memory was a destination of
     516              :      removed move (see ira-emit.cc) at loop exit because the value of
     517              :      the corresponding pseudo-register is not changed inside the
     518              :      loop.  */
     519              :   unsigned int mem_optimized_dest_p : 1;
     520              :   /* TRUE if the corresponding pseudo-register has disjoint live
     521              :      ranges and the other allocnos of the pseudo-register except this
     522              :      one changed REG.  */
     523              :   unsigned int somewhere_renamed_p : 1;
     524              :   /* TRUE if allocno with the same REGNO in a subregion has been
     525              :      renamed, in other words, got a new pseudo-register.  */
     526              :   unsigned int child_renamed_p : 1;
     527              :   /* Final rtx representation of the allocno.  */
     528              :   rtx reg;
     529              :   /* Non NULL if we remove restoring value from given allocno to
     530              :      MEM_OPTIMIZED_DEST at loop exit (see ira-emit.cc) because the
     531              :      allocno value is not changed inside the loop.  */
     532              :   ira_allocno_t mem_optimized_dest;
     533              : };
     534              : 
     535              : #define ALLOCNO_EMIT_DATA(a) ((ira_emit_data_t) ALLOCNO_ADD_DATA (a))
     536              : 
     537              : /* Data used to emit live range split insns and to flattening IR.  */
     538              : extern ira_emit_data_t ira_allocno_emit_data;
     539              : 
     540              : /* Abbreviation for frequent emit data access.  */
     541              : inline rtx
     542     35719509 : allocno_emit_reg (ira_allocno_t a)
     543              : {
     544     34567830 :   return ALLOCNO_EMIT_DATA (a)->reg;
     545              : }
     546              : 
     547              : #define OBJECT_ALLOCNO(O) ((O)->allocno)
     548              : #define OBJECT_SUBWORD(O) ((O)->subword)
     549              : #define OBJECT_CONFLICT_ARRAY(O) ((O)->conflicts_array)
     550              : #define OBJECT_CONFLICT_VEC(O) ((ira_object_t *)(O)->conflicts_array)
     551              : #define OBJECT_CONFLICT_BITVEC(O) ((IRA_INT_TYPE *)(O)->conflicts_array)
     552              : #define OBJECT_CONFLICT_ARRAY_SIZE(O) ((O)->conflicts_array_size)
     553              : #define OBJECT_CONFLICT_VEC_P(O) ((O)->conflict_vec_p)
     554              : #define OBJECT_NUM_CONFLICTS(O) ((O)->num_accumulated_conflicts)
     555              : #define OBJECT_CONFLICT_HARD_REGS(O) ((O)->conflict_hard_regs)
     556              : #define OBJECT_TOTAL_CONFLICT_HARD_REGS(O) ((O)->total_conflict_hard_regs)
     557              : #define OBJECT_MIN(O) ((O)->min)
     558              : #define OBJECT_MAX(O) ((O)->max)
     559              : #define OBJECT_CONFLICT_ID(O) ((O)->id)
     560              : #define OBJECT_LIVE_RANGES(O) ((O)->live_ranges)
     561              : 
     562              : /* Map regno -> allocnos with given regno (see comments for
     563              :    allocno member `next_regno_allocno').  */
     564              : extern ira_allocno_t *ira_regno_allocno_map;
     565              : 
     566              : /* Array of references to all allocnos.  The order number of the
     567              :    allocno corresponds to the index in the array.  Removed allocnos
     568              :    have NULL element value.  */
     569              : extern ira_allocno_t *ira_allocnos;
     570              : 
     571              : /* The size of the previous array.  */
     572              : extern int ira_allocnos_num;
     573              : 
     574              : /* Map a conflict id to its corresponding ira_object structure.  */
     575              : extern ira_object_t *ira_object_id_map;
     576              : 
     577              : /* The size of the previous array.  */
     578              : extern int ira_objects_num;
     579              : 
     580              : /* The following structure represents a hard register preference of
     581              :    allocno.  The preference represent move insns or potential move
     582              :    insns usually because of two operand insn constraints.  One move
     583              :    operand is a hard register.  */
     584              : struct ira_allocno_pref
     585              : {
     586              :   /* The unique order number of the preference node starting with 0.  */
     587              :   int num;
     588              :   /* Preferred hard register.  */
     589              :   int hard_regno;
     590              :   /* Accumulated execution frequency of insns from which the
     591              :      preference created.  */
     592              :   int freq;
     593              :   /* Given allocno.  */
     594              :   ira_allocno_t allocno;
     595              :   /* All preferences with the same allocno are linked by the following
     596              :      member.  */
     597              :   ira_pref_t next_pref;
     598              : };
     599              : 
     600              : /* Array of references to all allocno preferences.  The order number
     601              :    of the preference corresponds to the index in the array.  */
     602              : extern ira_pref_t *ira_prefs;
     603              : 
     604              : /* Size of the previous array.  */
     605              : extern int ira_prefs_num;
     606              : 
     607              : /* The following structure represents a copy of two allocnos.  The
     608              :    copies represent move insns or potential move insns usually because
     609              :    of two operand insn constraints.  To remove register shuffle, we
     610              :    also create copies between allocno which is output of an insn and
     611              :    allocno becoming dead in the insn.  */
     612              : struct ira_allocno_copy
     613              : {
     614              :   /* The unique order number of the copy node starting with 0.  */
     615              :   int num;
     616              :   /* Allocnos connected by the copy.  The first allocno should have
     617              :      smaller order number than the second one.  */
     618              :   ira_allocno_t first, second;
     619              :   /* Execution frequency of the copy.  */
     620              :   int freq;
     621              :   bool constraint_p;
     622              :   /* It is a move insn which is an origin of the copy.  The member
     623              :      value for the copy representing two operand insn constraints or
     624              :      for the copy created to remove register shuffle is NULL.  In last
     625              :      case the copy frequency is smaller than the corresponding insn
     626              :      execution frequency.  */
     627              :   rtx_insn *insn;
     628              :   /* All copies with the same allocno as FIRST are linked by the two
     629              :      following members.  */
     630              :   ira_copy_t prev_first_allocno_copy, next_first_allocno_copy;
     631              :   /* All copies with the same allocno as SECOND are linked by the two
     632              :      following members.  */
     633              :   ira_copy_t prev_second_allocno_copy, next_second_allocno_copy;
     634              :   /* Region from which given copy is originated.  */
     635              :   ira_loop_tree_node_t loop_tree_node;
     636              : };
     637              : 
     638              : /* Array of references to all copies.  The order number of the copy
     639              :    corresponds to the index in the array.  Removed copies have NULL
     640              :    element value.  */
     641              : extern ira_copy_t *ira_copies;
     642              : 
     643              : /* Size of the previous array.  */
     644              : extern int ira_copies_num;
     645              : 
     646              : /* The following structure describes a stack slot used for spilled
     647              :    pseudo-registers.  */
     648              : class ira_spilled_reg_stack_slot
     649              : {
     650              : public:
     651              :   /* pseudo-registers assigned to the stack slot.  */
     652              :   bitmap_head spilled_regs;
     653              :   /* RTL representation of the stack slot.  */
     654              :   rtx mem;
     655              :   /* Size of the stack slot.  */
     656              :   poly_uint64 width;
     657              : };
     658              : 
     659              : /* The number of elements in the following array.  */
     660              : extern int ira_spilled_reg_stack_slots_num;
     661              : 
     662              : /* The following array contains info about spilled pseudo-registers
     663              :    stack slots used in current function so far.  */
     664              : extern class ira_spilled_reg_stack_slot *ira_spilled_reg_stack_slots;
     665              : 
     666              : /* Correspondingly overall cost of the allocation, cost of the
     667              :    allocnos assigned to hard-registers, cost of the allocnos assigned
     668              :    to memory, cost of loads, stores and register move insns generated
     669              :    for pseudo-register live range splitting (see ira-emit.cc).  */
     670              : extern int64_t ira_overall_cost;
     671              : extern int64_t ira_reg_cost, ira_mem_cost;
     672              : extern int64_t ira_load_cost, ira_store_cost, ira_shuffle_cost;
     673              : extern int ira_move_loops_num, ira_additional_jumps_num;
     674              : 
     675              : 
     676              : /* This page contains a bitset implementation called 'min/max sets' used to
     677              :    record conflicts in IRA.
     678              :    They are named min/maxs set since we keep track of a minimum and a maximum
     679              :    bit number for each set representing the bounds of valid elements.  Otherwise,
     680              :    the implementation resembles sbitmaps in that we store an array of integers
     681              :    whose bits directly represent the members of the set.  */
     682              : 
     683              : /* The type used as elements in the array, and the number of bits in
     684              :    this type.  */
     685              : 
     686              : #define IRA_INT_BITS HOST_BITS_PER_WIDE_INT
     687              : #define IRA_INT_TYPE HOST_WIDE_INT
     688              : 
     689              : /* Set, clear or test bit number I in R, a bit vector of elements with
     690              :    minimal index and maximal index equal correspondingly to MIN and
     691              :    MAX.  */
     692              : #if defined ENABLE_IRA_CHECKING && (GCC_VERSION >= 2007)
     693              : 
     694              : #define SET_MINMAX_SET_BIT(R, I, MIN, MAX) __extension__                \
     695              :   (({ int _min = (MIN), _max = (MAX), _i = (I);                         \
     696              :      if (_i < _min || _i > _max)                                  \
     697              :        {                                                                \
     698              :          fprintf (stderr,                                               \
     699              :                   "\n%s: %d: error in %s: %d not in range [%d,%d]\n",   \
     700              :                   __FILE__, __LINE__, __FUNCTION__, _i, _min, _max);    \
     701              :          gcc_unreachable ();                                            \
     702              :        }                                                                \
     703              :      ((R)[(unsigned) (_i - _min) / IRA_INT_BITS]                        \
     704              :       |= ((IRA_INT_TYPE) 1 << ((unsigned) (_i - _min) % IRA_INT_BITS))); }))
     705              : 
     706              : 
     707              : #define CLEAR_MINMAX_SET_BIT(R, I, MIN, MAX) __extension__              \
     708              :   (({ int _min = (MIN), _max = (MAX), _i = (I);                         \
     709              :      if (_i < _min || _i > _max)                                  \
     710              :        {                                                                \
     711              :          fprintf (stderr,                                               \
     712              :                   "\n%s: %d: error in %s: %d not in range [%d,%d]\n",   \
     713              :                   __FILE__, __LINE__, __FUNCTION__, _i, _min, _max);    \
     714              :          gcc_unreachable ();                                            \
     715              :        }                                                                \
     716              :      ((R)[(unsigned) (_i - _min) / IRA_INT_BITS]                        \
     717              :       &= ~((IRA_INT_TYPE) 1 << ((unsigned) (_i - _min) % IRA_INT_BITS))); }))
     718              : 
     719              : #define TEST_MINMAX_SET_BIT(R, I, MIN, MAX) __extension__               \
     720              :   (({ int _min = (MIN), _max = (MAX), _i = (I);                         \
     721              :      if (_i < _min || _i > _max)                                  \
     722              :        {                                                                \
     723              :          fprintf (stderr,                                               \
     724              :                   "\n%s: %d: error in %s: %d not in range [%d,%d]\n",   \
     725              :                   __FILE__, __LINE__, __FUNCTION__, _i, _min, _max);    \
     726              :          gcc_unreachable ();                                            \
     727              :        }                                                                \
     728              :      ((R)[(unsigned) (_i - _min) / IRA_INT_BITS]                        \
     729              :       & ((IRA_INT_TYPE) 1 << ((unsigned) (_i - _min) % IRA_INT_BITS))); }))
     730              : 
     731              : #else
     732              : 
     733              : #define SET_MINMAX_SET_BIT(R, I, MIN, MAX)                      \
     734              :   ((R)[(unsigned) ((I) - (MIN)) / IRA_INT_BITS]                 \
     735              :    |= ((IRA_INT_TYPE) 1 << ((unsigned) ((I) - (MIN)) % IRA_INT_BITS)))
     736              : 
     737              : #define CLEAR_MINMAX_SET_BIT(R, I, MIN, MAX)                    \
     738              :   ((R)[(unsigned) ((I) - (MIN)) / IRA_INT_BITS]                 \
     739              :    &= ~((IRA_INT_TYPE) 1 << ((unsigned) ((I) - (MIN)) % IRA_INT_BITS)))
     740              : 
     741              : #define TEST_MINMAX_SET_BIT(R, I, MIN, MAX)                     \
     742              :   ((R)[(unsigned) ((I) - (MIN)) / IRA_INT_BITS]                 \
     743              :    & ((IRA_INT_TYPE) 1 << ((unsigned) ((I) - (MIN)) % IRA_INT_BITS)))
     744              : 
     745              : #endif
     746              : 
     747              : /* The iterator for min/max sets.  */
     748              : struct minmax_set_iterator {
     749              : 
     750              :   /* Array containing the bit vector.  */
     751              :   IRA_INT_TYPE *vec;
     752              : 
     753              :   /* The number of the current element in the vector.  */
     754              :   unsigned int word_num;
     755              : 
     756              :   /* The number of bits in the bit vector.  */
     757              :   unsigned int nel;
     758              : 
     759              :   /* The current bit index of the bit vector.  */
     760              :   unsigned int bit_num;
     761              : 
     762              :   /* Index corresponding to the 1st bit of the bit vector.   */
     763              :   int start_val;
     764              : 
     765              :   /* The word of the bit vector currently visited.  */
     766              :   unsigned IRA_INT_TYPE word;
     767              : };
     768              : 
     769              : /* Initialize the iterator I for bit vector VEC containing minimal and
     770              :    maximal values MIN and MAX.  */
     771              : inline void
     772     32652459 : minmax_set_iter_init (minmax_set_iterator *i, IRA_INT_TYPE *vec, int min,
     773              :                       int max)
     774              : {
     775     32652459 :   i->vec = vec;
     776     32652459 :   i->word_num = 0;
     777     32652459 :   i->nel = max < min ? 0 : max - min + 1;
     778     32652459 :   i->start_val = min;
     779     32652459 :   i->bit_num = 0;
     780     32652459 :   i->word = i->nel == 0 ? 0 : vec[0];
     781     32652459 : }
     782              : 
     783              : /* Return TRUE if we have more allocnos to visit, in which case *N is
     784              :    set to the number of the element to be visited.  Otherwise, return
     785              :    FALSE.  */
     786              : inline bool
     787    942130157 : minmax_set_iter_cond (minmax_set_iterator *i, int *n)
     788              : {
     789              :   /* Skip words that are zeros.  */
     790   1566774951 :   for (; i->word == 0; i->word = i->vec[i->word_num])
     791              :     {
     792    657297253 :       i->word_num++;
     793    657297253 :       i->bit_num = i->word_num * IRA_INT_BITS;
     794              : 
     795              :       /* If we have reached the end, break.  */
     796    657297253 :       if (i->bit_num >= i->nel)
     797              :         return false;
     798              :     }
     799              : 
     800              :   /* Skip bits that are zero.  */
     801    909477698 :   int off = ctz_hwi (i->word);
     802    909477698 :   i->bit_num += off;
     803    909477698 :   i->word >>= off;
     804              : 
     805    909477698 :   *n = (int) i->bit_num + i->start_val;
     806              : 
     807    909477698 :   return true;
     808              : }
     809              : 
     810              : /* Advance to the next element in the set.  */
     811              : inline void
     812    909477698 : minmax_set_iter_next (minmax_set_iterator *i)
     813              : {
     814    909477698 :   i->word >>= 1;
     815    909477698 :   i->bit_num++;
     816    909477698 : }
     817              : 
     818              : /* Loop over all elements of a min/max set given by bit vector VEC and
     819              :    their minimal and maximal values MIN and MAX.  In each iteration, N
     820              :    is set to the number of next allocno.  ITER is an instance of
     821              :    minmax_set_iterator used to iterate over the set.  */
     822              : #define FOR_EACH_BIT_IN_MINMAX_SET(VEC, MIN, MAX, N, ITER)      \
     823              :   for (minmax_set_iter_init (&(ITER), (VEC), (MIN), (MAX)); \
     824              :        minmax_set_iter_cond (&(ITER), &(N));                    \
     825              :        minmax_set_iter_next (&(ITER)))
     826              : 
     827              : class target_ira_int {
     828              : public:
     829              :   ~target_ira_int ();
     830              : 
     831              :   void free_ira_costs ();
     832              :   void free_register_move_costs ();
     833              : 
     834              :   /* Initialized once.  It is a maximal possible size of the allocated
     835              :      struct costs.  */
     836              :   size_t x_max_struct_costs_size;
     837              : 
     838              :   /* Allocated and initialized once, and used to initialize cost values
     839              :      for each insn.  */
     840              :   struct costs *x_init_cost;
     841              : 
     842              :   /* Allocated once, and used for temporary purposes.  */
     843              :   struct costs *x_temp_costs;
     844              : 
     845              :   /* Allocated once, and used for the cost calculation.  */
     846              :   struct costs *x_op_costs[MAX_RECOG_OPERANDS];
     847              :   struct costs *x_this_op_costs[MAX_RECOG_OPERANDS];
     848              : 
     849              :   /* Hard registers that cannot be used for the register allocator for
     850              :      all functions of the current compilation unit.  */
     851              :   HARD_REG_SET x_no_unit_alloc_regs;
     852              : 
     853              :   /* Map: hard regs X modes -> set of hard registers for storing value
     854              :      of given mode starting with given hard register.  */
     855              :   HARD_REG_SET (x_ira_reg_mode_hard_regset
     856              :                 [FIRST_PSEUDO_REGISTER][NUM_MACHINE_MODES]);
     857              : 
     858              :   /* Maximum cost of moving from a register in one class to a register
     859              :      in another class.  Based on TARGET_REGISTER_MOVE_COST.  */
     860              :   move_table *x_ira_register_move_cost[MAX_MACHINE_MODE];
     861              : 
     862              :   /* Similar, but here we don't have to move if the first index is a
     863              :      subset of the second so in that case the cost is zero.  */
     864              :   move_table *x_ira_may_move_in_cost[MAX_MACHINE_MODE];
     865              : 
     866              :   /* Similar, but here we don't have to move if the first index is a
     867              :      superset of the second so in that case the cost is zero.  */
     868              :   move_table *x_ira_may_move_out_cost[MAX_MACHINE_MODE];
     869              : 
     870              :   /* Keep track of the last mode we initialized move costs for.  */
     871              :   int x_last_mode_for_init_move_cost;
     872              : 
     873              :   /* Array analog of the macro MEMORY_MOVE_COST but they contain maximal
     874              :      cost not minimal.  */
     875              :   short int x_ira_max_memory_move_cost[MAX_MACHINE_MODE][N_REG_CLASSES][2];
     876              : 
     877              :   /* Map class->true if class is a possible allocno class, false
     878              :      otherwise. */
     879              :   bool x_ira_reg_allocno_class_p[N_REG_CLASSES];
     880              : 
     881              :   /* Map class->true if class is a pressure class, false otherwise. */
     882              :   bool x_ira_reg_pressure_class_p[N_REG_CLASSES];
     883              : 
     884              :   /* Array of the number of hard registers of given class which are
     885              :      available for allocation.  The order is defined by the hard
     886              :      register numbers.  */
     887              :   short x_ira_non_ordered_class_hard_regs[N_REG_CLASSES][FIRST_PSEUDO_REGISTER];
     888              : 
     889              :   /* Index (in ira_class_hard_regs; for given register class and hard
     890              :      register (in general case a hard register can belong to several
     891              :      register classes).  The index is negative for hard registers
     892              :      unavailable for the allocation.  */
     893              :   short x_ira_class_hard_reg_index[N_REG_CLASSES][FIRST_PSEUDO_REGISTER];
     894              : 
     895              :   /* Index [CL][M] contains R if R appears somewhere in a register of the form:
     896              : 
     897              :          (reg:M R'), R' not in x_ira_prohibited_class_mode_regs[CL][M]
     898              : 
     899              :      For example, if:
     900              : 
     901              :      - (reg:M 2) is valid and occupies two registers;
     902              :      - register 2 belongs to CL; and
     903              :      - register 3 belongs to the same pressure class as CL
     904              : 
     905              :      then (reg:M 2) contributes to [CL][M] and registers 2 and 3 will be
     906              :      in the set.  */
     907              :   HARD_REG_SET x_ira_useful_class_mode_regs[N_REG_CLASSES][NUM_MACHINE_MODES];
     908              : 
     909              :   /* The value is number of elements in the subsequent array.  */
     910              :   int x_ira_important_classes_num;
     911              : 
     912              :   /* The array containing all non-empty classes.  Such classes is
     913              :      important for calculation of the hard register usage costs.  */
     914              :   enum reg_class x_ira_important_classes[N_REG_CLASSES];
     915              : 
     916              :   /* The array containing indexes of important classes in the previous
     917              :      array.  The array elements are defined only for important
     918              :      classes.  */
     919              :   int x_ira_important_class_nums[N_REG_CLASSES];
     920              : 
     921              :   /* Map class->true if class is an uniform class, false otherwise.  */
     922              :   bool x_ira_uniform_class_p[N_REG_CLASSES];
     923              : 
     924              :   /* The biggest important class inside of intersection of the two
     925              :      classes (that is calculated taking only hard registers available
     926              :      for allocation into account;.  If the both classes contain no hard
     927              :      registers available for allocation, the value is calculated with
     928              :      taking all hard-registers including fixed ones into account.  */
     929              :   enum reg_class x_ira_reg_class_intersect[N_REG_CLASSES][N_REG_CLASSES];
     930              : 
     931              :   /* Classes with end marker LIM_REG_CLASSES which are intersected with
     932              :      given class (the first index).  That includes given class itself.
     933              :      This is calculated taking only hard registers available for
     934              :      allocation into account.  */
     935              :   enum reg_class x_ira_reg_class_super_classes[N_REG_CLASSES][N_REG_CLASSES];
     936              : 
     937              :   /* The biggest (smallest) important class inside of (covering) union
     938              :      of the two classes (that is calculated taking only hard registers
     939              :      available for allocation into account).  If the both classes
     940              :      contain no hard registers available for allocation, the value is
     941              :      calculated with taking all hard-registers including fixed ones
     942              :      into account.  In other words, the value is the corresponding
     943              :      reg_class_subunion (reg_class_superunion) value.  */
     944              :   enum reg_class x_ira_reg_class_subunion[N_REG_CLASSES][N_REG_CLASSES];
     945              :   enum reg_class x_ira_reg_class_superunion[N_REG_CLASSES][N_REG_CLASSES];
     946              : 
     947              :   /* For each reg class, table listing all the classes contained in it
     948              :      (excluding the class itself.  Non-allocatable registers are
     949              :      excluded from the consideration).  */
     950              :   enum reg_class x_alloc_reg_class_subclasses[N_REG_CLASSES][N_REG_CLASSES];
     951              : 
     952              :   /* Array whose values are hard regset of hard registers for which
     953              :      move of the hard register in given mode into itself is
     954              :      prohibited.  */
     955              :   HARD_REG_SET x_ira_prohibited_mode_move_regs[NUM_MACHINE_MODES];
     956              : 
     957              :   /* Flag of that the above array has been initialized.  */
     958              :   bool x_ira_prohibited_mode_move_regs_initialized_p;
     959              : 
     960              :   /* Number of real occurrences of hard regs before IRA.  */
     961              :   size_t x_ira_hard_regno_nrefs[FIRST_PSEUDO_REGISTER];
     962              : };
     963              : 
     964              : extern class target_ira_int default_target_ira_int;
     965              : #if SWITCHABLE_TARGET
     966              : extern class target_ira_int *this_target_ira_int;
     967              : #else
     968              : #define this_target_ira_int (&default_target_ira_int)
     969              : #endif
     970              : 
     971              : #define ira_reg_mode_hard_regset \
     972              :   (this_target_ira_int->x_ira_reg_mode_hard_regset)
     973              : #define ira_register_move_cost \
     974              :   (this_target_ira_int->x_ira_register_move_cost)
     975              : #define ira_max_memory_move_cost \
     976              :   (this_target_ira_int->x_ira_max_memory_move_cost)
     977              : #define ira_may_move_in_cost \
     978              :   (this_target_ira_int->x_ira_may_move_in_cost)
     979              : #define ira_may_move_out_cost \
     980              :   (this_target_ira_int->x_ira_may_move_out_cost)
     981              : #define ira_reg_allocno_class_p \
     982              :   (this_target_ira_int->x_ira_reg_allocno_class_p)
     983              : #define ira_reg_pressure_class_p \
     984              :   (this_target_ira_int->x_ira_reg_pressure_class_p)
     985              : #define ira_non_ordered_class_hard_regs \
     986              :   (this_target_ira_int->x_ira_non_ordered_class_hard_regs)
     987              : #define ira_class_hard_reg_index \
     988              :   (this_target_ira_int->x_ira_class_hard_reg_index)
     989              : #define ira_useful_class_mode_regs \
     990              :   (this_target_ira_int->x_ira_useful_class_mode_regs)
     991              : #define ira_important_classes_num \
     992              :   (this_target_ira_int->x_ira_important_classes_num)
     993              : #define ira_important_classes \
     994              :   (this_target_ira_int->x_ira_important_classes)
     995              : #define ira_important_class_nums \
     996              :   (this_target_ira_int->x_ira_important_class_nums)
     997              : #define ira_uniform_class_p \
     998              :   (this_target_ira_int->x_ira_uniform_class_p)
     999              : #define ira_reg_class_intersect \
    1000              :   (this_target_ira_int->x_ira_reg_class_intersect)
    1001              : #define ira_reg_class_super_classes \
    1002              :   (this_target_ira_int->x_ira_reg_class_super_classes)
    1003              : #define ira_reg_class_subunion \
    1004              :   (this_target_ira_int->x_ira_reg_class_subunion)
    1005              : #define ira_reg_class_superunion \
    1006              :   (this_target_ira_int->x_ira_reg_class_superunion)
    1007              : #define ira_prohibited_mode_move_regs \
    1008              :   (this_target_ira_int->x_ira_prohibited_mode_move_regs)
    1009              : #define ira_hard_regno_nrefs \
    1010              :   (this_target_ira_int->x_ira_hard_regno_nrefs)
    1011              : 
    1012              : /* ira.cc: */
    1013              : 
    1014              : extern void *ira_allocate (size_t);
    1015              : extern void ira_free (void *addr);
    1016              : extern bitmap ira_allocate_bitmap (void);
    1017              : extern void ira_free_bitmap (bitmap);
    1018              : extern void ira_print_disposition (FILE *);
    1019              : extern void ira_debug_disposition (void);
    1020              : extern void ira_debug_allocno_classes (void);
    1021              : extern void ira_init_register_move_cost (machine_mode);
    1022              : extern alternative_mask ira_setup_alts (rtx_insn *);
    1023              : extern int ira_get_dup_out_num (int, alternative_mask, bool &);
    1024              : 
    1025              : /* ira-build.cc */
    1026              : 
    1027              : /* The current loop tree node and its regno allocno map.  */
    1028              : extern ira_loop_tree_node_t ira_curr_loop_tree_node;
    1029              : extern ira_allocno_t *ira_curr_regno_allocno_map;
    1030              : 
    1031              : extern void ira_debug_pref (ira_pref_t);
    1032              : extern void ira_debug_prefs (void);
    1033              : extern void ira_debug_allocno_prefs (ira_allocno_t);
    1034              : 
    1035              : extern void ira_debug_copy (ira_copy_t);
    1036              : extern void debug (ira_allocno_copy &ref);
    1037              : extern void debug (ira_allocno_copy *ptr);
    1038              : 
    1039              : extern void ira_debug_copies (void);
    1040              : extern void ira_debug_allocno_copies (ira_allocno_t);
    1041              : extern void debug (ira_allocno &ref);
    1042              : extern void debug (ira_allocno *ptr);
    1043              : 
    1044              : extern void ira_traverse_loop_tree (bool, ira_loop_tree_node_t,
    1045              :                                     void (*) (ira_loop_tree_node_t),
    1046              :                                     void (*) (ira_loop_tree_node_t));
    1047              : extern ira_allocno_t ira_parent_allocno (ira_allocno_t);
    1048              : extern ira_allocno_t ira_parent_or_cap_allocno (ira_allocno_t);
    1049              : extern ira_allocno_t ira_create_allocno (int, bool, ira_loop_tree_node_t);
    1050              : extern void ira_create_allocno_objects (ira_allocno_t);
    1051              : extern void ira_set_allocno_class (ira_allocno_t, enum reg_class);
    1052              : extern bool ira_conflict_vector_profitable_p (ira_object_t, int);
    1053              : extern void ira_allocate_conflict_vec (ira_object_t, int);
    1054              : extern void ira_allocate_object_conflicts (ira_object_t, int);
    1055              : extern void ior_hard_reg_conflicts (ira_allocno_t, const_hard_reg_set);
    1056              : extern void ira_print_expanded_allocno (ira_allocno_t);
    1057              : extern void ira_add_live_range_to_object (ira_object_t, int, int);
    1058              : extern live_range_t ira_create_live_range (ira_object_t, int, int,
    1059              :                                            live_range_t);
    1060              : extern live_range_t ira_copy_live_range_list (live_range_t);
    1061              : extern live_range_t ira_merge_live_ranges (live_range_t, live_range_t);
    1062              : extern bool ira_live_ranges_intersect_p (live_range_t, live_range_t);
    1063              : extern void ira_finish_live_range (live_range_t);
    1064              : extern void ira_finish_live_range_list (live_range_t);
    1065              : extern void ira_free_allocno_updated_costs (ira_allocno_t);
    1066              : extern ira_pref_t ira_create_pref (ira_allocno_t, int, int);
    1067              : extern void ira_add_allocno_pref (ira_allocno_t, int, int);
    1068              : extern void ira_remove_pref (ira_pref_t);
    1069              : extern void ira_remove_allocno_prefs (ira_allocno_t);
    1070              : extern ira_copy_t ira_create_copy (ira_allocno_t, ira_allocno_t,
    1071              :                                    int, bool, rtx_insn *,
    1072              :                                    ira_loop_tree_node_t);
    1073              : extern ira_copy_t ira_add_allocno_copy (ira_allocno_t, ira_allocno_t, int,
    1074              :                                         bool, rtx_insn *,
    1075              :                                         ira_loop_tree_node_t);
    1076              : 
    1077              : extern int *ira_allocate_cost_vector (reg_class_t);
    1078              : extern void ira_free_cost_vector (int *, reg_class_t);
    1079              : 
    1080              : extern void ira_flattening (int, int);
    1081              : extern bool ira_build (void);
    1082              : extern void ira_destroy (void);
    1083              : 
    1084              : /* ira-costs.cc */
    1085              : extern void ira_init_costs_once (void);
    1086              : extern void ira_init_costs (void);
    1087              : extern void ira_costs (void);
    1088              : extern void ira_tune_allocno_costs (void);
    1089              : 
    1090              : /* ira-lives.cc */
    1091              : 
    1092              : extern void ira_rebuild_start_finish_chains (void);
    1093              : extern void ira_print_live_range_list (FILE *, live_range_t);
    1094              : extern void debug (live_range &ref);
    1095              : extern void debug (live_range *ptr);
    1096              : extern void ira_debug_live_range_list (live_range_t);
    1097              : extern void ira_debug_allocno_live_ranges (ira_allocno_t);
    1098              : extern void ira_debug_live_ranges (void);
    1099              : extern void ira_create_allocno_live_ranges (void);
    1100              : extern void ira_compress_allocno_live_ranges (void);
    1101              : extern void ira_finish_allocno_live_ranges (void);
    1102              : extern void ira_implicitly_set_insn_hard_regs (HARD_REG_SET *,
    1103              :                                                alternative_mask);
    1104              : extern void ira_add_dependent_filter (ira_allocno_t, int,
    1105              :                                       machine_mode, ira_allocno_t,
    1106              :                                       unsigned int, machine_mode);
    1107              : 
    1108              : /* ira-conflicts.cc */
    1109              : extern void ira_debug_conflicts (bool);
    1110              : extern void ira_build_conflicts (void);
    1111              : 
    1112              : /* ira-color.cc */
    1113              : extern ira_allocno_t ira_soft_conflict (ira_allocno_t, ira_allocno_t);
    1114              : extern void ira_debug_hard_regs_forest (void);
    1115              : extern int ira_loop_edge_freq (ira_loop_tree_node_t, int, bool);
    1116              : extern void ira_reassign_conflict_allocnos (int);
    1117              : extern void ira_initiate_assign (void);
    1118              : extern void ira_finish_assign (void);
    1119              : extern void ira_color (void);
    1120              : 
    1121              : /* ira-emit.cc */
    1122              : extern void ira_initiate_emit_data (void);
    1123              : extern void ira_finish_emit_data (void);
    1124              : extern void ira_emit (bool);
    1125              : 
    1126              : 
    1127              : 
    1128              : /* Return true if equivalence of pseudo REGNO is not a lvalue.  */
    1129              : inline bool
    1130     49815438 : ira_equiv_no_lvalue_p (int regno)
    1131              : {
    1132     49815438 :   if (regno >= ira_reg_equiv_len)
    1133              :     return false;
    1134     49815438 :   return (ira_reg_equiv[regno].constant != NULL_RTX
    1135     48529775 :           || ira_reg_equiv[regno].invariant != NULL_RTX
    1136     96356828 :           || (ira_reg_equiv[regno].memory != NULL_RTX
    1137      3916140 :               && MEM_READONLY_P (ira_reg_equiv[regno].memory)));
    1138              : }
    1139              : 
    1140              : 
    1141              : 
    1142              : /* Initialize register costs for MODE if necessary.  */
    1143              : inline void
    1144   1581177584 : ira_init_register_move_cost_if_necessary (machine_mode mode)
    1145              : {
    1146   1581177584 :   if (ira_register_move_cost[mode] == NULL)
    1147     10203609 :     ira_init_register_move_cost (mode);
    1148   1581177584 : }
    1149              : 
    1150              : 
    1151              : 
    1152              : /* The iterator for all allocnos.  */
    1153              : struct ira_allocno_iterator {
    1154              :   /* The number of the current element in IRA_ALLOCNOS.  */
    1155              :   int n;
    1156              : };
    1157              : 
    1158              : /* Initialize the iterator I.  */
    1159              : inline void
    1160     33829319 : ira_allocno_iter_init (ira_allocno_iterator *i)
    1161              : {
    1162     33829319 :   i->n = 0;
    1163     33829319 : }
    1164              : 
    1165              : /* Return TRUE if we have more allocnos to visit, in which case *A is
    1166              :    set to the allocno to be visited.  Otherwise, return FALSE.  */
    1167              : inline bool
    1168    890915640 : ira_allocno_iter_cond (ira_allocno_iterator *i, ira_allocno_t *a)
    1169              : {
    1170    890915640 :   int n;
    1171              : 
    1172    942188982 :   for (n = i->n; n < ira_allocnos_num; n++)
    1173    908359663 :     if (ira_allocnos[n] != NULL)
    1174              :       {
    1175    857086321 :         *a = ira_allocnos[n];
    1176    857086321 :         i->n = n + 1;
    1177    857086321 :         return true;
    1178              :       }
    1179              :   return false;
    1180              : }
    1181              : 
    1182              : /* Loop over all allocnos.  In each iteration, A is set to the next
    1183              :    allocno.  ITER is an instance of ira_allocno_iterator used to iterate
    1184              :    the allocnos.  */
    1185              : #define FOR_EACH_ALLOCNO(A, ITER)                       \
    1186              :   for (ira_allocno_iter_init (&(ITER));                     \
    1187              :        ira_allocno_iter_cond (&(ITER), &(A));)
    1188              : 
    1189              : /* The iterator for all objects.  */
    1190              : struct ira_object_iterator {
    1191              :   /* The number of the current element in ira_object_id_map.  */
    1192              :   int n;
    1193              : };
    1194              : 
    1195              : /* Initialize the iterator I.  */
    1196              : inline void
    1197      8742373 : ira_object_iter_init (ira_object_iterator *i)
    1198              : {
    1199      8742373 :   i->n = 0;
    1200      8742373 : }
    1201              : 
    1202              : /* Return TRUE if we have more objects to visit, in which case *OBJ is
    1203              :    set to the object to be visited.  Otherwise, return FALSE.  */
    1204              : inline bool
    1205    220092025 : ira_object_iter_cond (ira_object_iterator *i, ira_object_t *obj)
    1206              : {
    1207    220092025 :   int n;
    1208              : 
    1209    234589693 :   for (n = i->n; n < ira_objects_num; n++)
    1210    225847320 :     if (ira_object_id_map[n] != NULL)
    1211              :       {
    1212    211349652 :         *obj = ira_object_id_map[n];
    1213    211349652 :         i->n = n + 1;
    1214    211349652 :         return true;
    1215              :       }
    1216              :   return false;
    1217              : }
    1218              : 
    1219              : /* Loop over all objects.  In each iteration, OBJ is set to the next
    1220              :    object.  ITER is an instance of ira_object_iterator used to iterate
    1221              :    the objects.  */
    1222              : #define FOR_EACH_OBJECT(OBJ, ITER)                      \
    1223              :   for (ira_object_iter_init (&(ITER));                      \
    1224              :        ira_object_iter_cond (&(ITER), &(OBJ));)
    1225              : 
    1226              : /* The iterator for objects associated with an allocno.  */
    1227              : struct ira_allocno_object_iterator {
    1228              :   /* The number of the element the allocno's object array.  */
    1229              :   int n;
    1230              : };
    1231              : 
    1232              : /* Initialize the iterator I.  */
    1233              : inline void
    1234    132389383 : ira_allocno_object_iter_init (ira_allocno_object_iterator *i)
    1235              : {
    1236    132389383 :   i->n = 0;
    1237    132389383 : }
    1238              : 
    1239              : /* Return TRUE if we have more objects to visit in allocno A, in which
    1240              :    case *O is set to the object to be visited.  Otherwise, return
    1241              :    FALSE.  */
    1242              : inline bool
    1243    485761254 : ira_allocno_object_iter_cond (ira_allocno_object_iterator *i, ira_allocno_t a,
    1244              :                               ira_object_t *o)
    1245              : {
    1246    485761254 :   int n = i->n++;
    1247    485761254 :   if (n < ALLOCNO_NUM_OBJECTS (a))
    1248              :     {
    1249    234260385 :       *o = ALLOCNO_OBJECT (a, n);
    1250    229695285 :       return true;
    1251              :     }
    1252              :   return false;
    1253              : }
    1254              : 
    1255              : /* Loop over all objects associated with allocno A.  In each
    1256              :    iteration, O is set to the next object.  ITER is an instance of
    1257              :    ira_allocno_object_iterator used to iterate the conflicts.  */
    1258              : #define FOR_EACH_ALLOCNO_OBJECT(A, O, ITER)                     \
    1259              :   for (ira_allocno_object_iter_init (&(ITER));                      \
    1260              :        ira_allocno_object_iter_cond (&(ITER), (A), &(O));)
    1261              : 
    1262              : 
    1263              : /* The iterator for prefs.  */
    1264              : struct ira_pref_iterator {
    1265              :   /* The number of the current element in IRA_PREFS.  */
    1266              :   int n;
    1267              : };
    1268              : 
    1269              : /* Initialize the iterator I.  */
    1270              : inline void
    1271      1505045 : ira_pref_iter_init (ira_pref_iterator *i)
    1272              : {
    1273      1505045 :   i->n = 0;
    1274      1505045 : }
    1275              : 
    1276              : /* Return TRUE if we have more prefs to visit, in which case *PREF is
    1277              :    set to the pref to be visited.  Otherwise, return FALSE.  */
    1278              : inline bool
    1279      7909503 : ira_pref_iter_cond (ira_pref_iterator *i, ira_pref_t *pref)
    1280              : {
    1281      7909503 :   int n;
    1282              : 
    1283      8817291 :   for (n = i->n; n < ira_prefs_num; n++)
    1284      7312246 :     if (ira_prefs[n] != NULL)
    1285              :       {
    1286      6404458 :         *pref = ira_prefs[n];
    1287      6404458 :         i->n = n + 1;
    1288      6404458 :         return true;
    1289              :       }
    1290              :   return false;
    1291              : }
    1292              : 
    1293              : /* Loop over all prefs.  In each iteration, P is set to the next
    1294              :    pref.  ITER is an instance of ira_pref_iterator used to iterate
    1295              :    the prefs.  */
    1296              : #define FOR_EACH_PREF(P, ITER)                          \
    1297              :   for (ira_pref_iter_init (&(ITER));                        \
    1298              :        ira_pref_iter_cond (&(ITER), &(P));)
    1299              : 
    1300              : 
    1301              : /* The iterator for copies.  */
    1302              : struct ira_copy_iterator {
    1303              :   /* The number of the current element in IRA_COPIES.  */
    1304              :   int n;
    1305              : };
    1306              : 
    1307              : /* Initialize the iterator I.  */
    1308              : inline void
    1309      2515552 : ira_copy_iter_init (ira_copy_iterator *i)
    1310              : {
    1311      2515552 :   i->n = 0;
    1312      2515552 : }
    1313              : 
    1314              : /* Return TRUE if we have more copies to visit, in which case *CP is
    1315              :    set to the copy to be visited.  Otherwise, return FALSE.  */
    1316              : inline bool
    1317     19292944 : ira_copy_iter_cond (ira_copy_iterator *i, ira_copy_t *cp)
    1318              : {
    1319     19292944 :   int n;
    1320              : 
    1321     19292944 :   for (n = i->n; n < ira_copies_num; n++)
    1322     16777392 :     if (ira_copies[n] != NULL)
    1323              :       {
    1324     16777392 :         *cp = ira_copies[n];
    1325     16777392 :         i->n = n + 1;
    1326     16777392 :         return true;
    1327              :       }
    1328              :   return false;
    1329              : }
    1330              : 
    1331              : /* Loop over all copies.  In each iteration, C is set to the next
    1332              :    copy.  ITER is an instance of ira_copy_iterator used to iterate
    1333              :    the copies.  */
    1334              : #define FOR_EACH_COPY(C, ITER)                          \
    1335              :   for (ira_copy_iter_init (&(ITER));                        \
    1336              :        ira_copy_iter_cond (&(ITER), &(C));)
    1337              : 
    1338              : /* The iterator for object conflicts.  */
    1339              : struct ira_object_conflict_iterator {
    1340              : 
    1341              :   /* TRUE if the conflicts are represented by vector of allocnos.  */
    1342              :   bool conflict_vec_p;
    1343              : 
    1344              :   /* The conflict vector or conflict bit vector.  */
    1345              :   void *vec;
    1346              : 
    1347              :   /* The number of the current element in the vector (of type
    1348              :      ira_object_t or IRA_INT_TYPE).  */
    1349              :   unsigned int word_num;
    1350              : 
    1351              :   /* The bit vector size.  It is defined only if
    1352              :      OBJECT_CONFLICT_VEC_P is FALSE.  */
    1353              :   unsigned int size;
    1354              : 
    1355              :   /* The current bit index of bit vector.  It is defined only if
    1356              :      OBJECT_CONFLICT_VEC_P is FALSE.  */
    1357              :   unsigned int bit_num;
    1358              : 
    1359              :   /* The object id corresponding to the 1st bit of the bit vector.  It
    1360              :      is defined only if OBJECT_CONFLICT_VEC_P is FALSE.  */
    1361              :   int base_conflict_id;
    1362              : 
    1363              :   /* The word of bit vector currently visited.  It is defined only if
    1364              :      OBJECT_CONFLICT_VEC_P is FALSE.  */
    1365              :   unsigned IRA_INT_TYPE word;
    1366              : };
    1367              : 
    1368              : /* Initialize the iterator I with ALLOCNO conflicts.  */
    1369              : inline void
    1370    112546766 : ira_object_conflict_iter_init (ira_object_conflict_iterator *i,
    1371              :                                ira_object_t obj)
    1372              : {
    1373    112546766 :   i->conflict_vec_p = OBJECT_CONFLICT_VEC_P (obj);
    1374    112546766 :   i->vec = OBJECT_CONFLICT_ARRAY (obj);
    1375    112546766 :   i->word_num = 0;
    1376    112546766 :   if (i->conflict_vec_p)
    1377     33004340 :     i->size = i->bit_num = i->base_conflict_id = i->word = 0;
    1378              :   else
    1379              :     {
    1380     79542426 :       if (OBJECT_MIN (obj) > OBJECT_MAX (obj))
    1381      3596130 :         i->size = 0;
    1382              :       else
    1383     75946296 :         i->size = ((OBJECT_MAX (obj) - OBJECT_MIN (obj)
    1384              :                     + IRA_INT_BITS)
    1385     75946296 :                    / IRA_INT_BITS) * sizeof (IRA_INT_TYPE);
    1386     79542426 :       i->bit_num = 0;
    1387     79542426 :       i->base_conflict_id = OBJECT_MIN (obj);
    1388     79542426 :       i->word = (i->size == 0 ? 0 : ((IRA_INT_TYPE *) i->vec)[0]);
    1389              :     }
    1390    112546766 : }
    1391              : 
    1392              : /* Return TRUE if we have more conflicting allocnos to visit, in which
    1393              :    case *A is set to the allocno to be visited.  Otherwise, return
    1394              :    FALSE.  */
    1395              : inline bool
    1396   2633097833 : ira_object_conflict_iter_cond (ira_object_conflict_iterator *i,
    1397              :                                ira_object_t *pobj)
    1398              : {
    1399   2633097833 :   ira_object_t obj;
    1400              : 
    1401   2633097833 :   if (i->conflict_vec_p)
    1402              :     {
    1403    975104574 :       obj = ((ira_object_t *) i->vec)[i->word_num++];
    1404    975104574 :       if (obj == NULL)
    1405              :         return false;
    1406              :     }
    1407              :   else
    1408              :     {
    1409   1657993259 :       unsigned IRA_INT_TYPE word = i->word;
    1410   1657993259 :       unsigned int bit_num = i->bit_num;
    1411              : 
    1412              :       /* Skip words that are zeros.  */
    1413   1943310607 :       for (; word == 0; word = ((IRA_INT_TYPE *) i->vec)[i->word_num])
    1414              :         {
    1415    363861380 :           i->word_num++;
    1416              : 
    1417              :           /* If we have reached the end, break.  */
    1418    363861380 :           if (i->word_num * sizeof (IRA_INT_TYPE) >= i->size)
    1419              :             return false;
    1420              : 
    1421    285317348 :           bit_num = i->word_num * IRA_INT_BITS;
    1422              :         }
    1423              : 
    1424              :       /* Skip bits that are zero.  */
    1425   1579449227 :       int off = ctz_hwi (word);
    1426   1579449227 :       bit_num += off;
    1427   1579449227 :       word >>= off;
    1428              : 
    1429   1579449227 :       obj = ira_object_id_map[bit_num + i->base_conflict_id];
    1430   1579449227 :       i->bit_num = bit_num + 1;
    1431   1579449227 :       i->word = word >> 1;
    1432              :     }
    1433              : 
    1434   2522249639 :   *pobj = obj;
    1435   2522249639 :   return true;
    1436              : }
    1437              : 
    1438              : /* Loop over all objects conflicting with OBJ.  In each iteration,
    1439              :    CONF is set to the next conflicting object.  ITER is an instance
    1440              :    of ira_object_conflict_iterator used to iterate the conflicts.  */
    1441              : #define FOR_EACH_OBJECT_CONFLICT(OBJ, CONF, ITER)                       \
    1442              :   for (ira_object_conflict_iter_init (&(ITER), (OBJ));                      \
    1443              :        ira_object_conflict_iter_cond (&(ITER), &(CONF));)
    1444              : 
    1445              : 
    1446              : 
    1447              : /* The function returns TRUE if at least one hard register from ones
    1448              :    starting with HARD_REGNO and containing value of MODE are in set
    1449              :    HARD_REGSET.  */
    1450              : inline bool
    1451    218012183 : ira_hard_reg_set_intersection_p (int hard_regno, machine_mode mode,
    1452              :                                  HARD_REG_SET hard_regset)
    1453              : {
    1454    218012183 :   int i;
    1455              : 
    1456    218012183 :   gcc_assert (hard_regno >= 0);
    1457    313240151 :   for (i = hard_regno_nregs (hard_regno, mode) - 1; i >= 0; i--)
    1458    230829060 :     if (TEST_HARD_REG_BIT (hard_regset, hard_regno + i))
    1459              :       return true;
    1460              :   return false;
    1461              : }
    1462              : 
    1463              : /* The function returns TRUE if hard registers starting with
    1464              :    HARD_REGNO and containing value of MODE are fully in set
    1465              :    HARD_REGSET.  */
    1466              : inline bool
    1467     56633995 : ira_hard_reg_in_set_p (int hard_regno, machine_mode mode,
    1468              :                        HARD_REG_SET hard_regset)
    1469              : {
    1470     56633995 :   int i;
    1471              : 
    1472     56633995 :   ira_assert (hard_regno >= 0);
    1473    113458506 :   for (i = hard_regno_nregs (hard_regno, mode) - 1; i >= 0; i--)
    1474     57869337 :     if (!TEST_HARD_REG_BIT (hard_regset, hard_regno + i))
    1475              :       return false;
    1476              :   return true;
    1477              : }
    1478              : 
    1479              : 
    1480              : 
    1481              : /* To save memory we use a lazy approach for allocation and
    1482              :    initialization of the cost vectors.  We do this only when it is
    1483              :    really necessary.  */
    1484              : 
    1485              : /* Allocate cost vector *VEC for hard registers of ACLASS and
    1486              :    initialize the elements by VAL if it is necessary */
    1487              : inline void
    1488      8779904 : ira_allocate_and_set_costs (int **vec, reg_class_t aclass, int val)
    1489              : {
    1490      8779904 :   int i, *reg_costs;
    1491      8779904 :   int len;
    1492              : 
    1493      8779904 :   if (*vec != NULL)
    1494              :     return;
    1495      5050789 :   *vec = reg_costs = ira_allocate_cost_vector (aclass);
    1496      5050789 :   len = ira_class_hard_regs_num[(int) aclass];
    1497     85005917 :   for (i = 0; i < len; i++)
    1498     79955128 :     reg_costs[i] = val;
    1499              : }
    1500              : 
    1501              : /* Allocate cost vector *VEC for hard registers of ACLASS and copy
    1502              :    values of vector SRC into the vector if it is necessary */
    1503              : inline void
    1504    199663600 : ira_allocate_and_copy_costs (int **vec, enum reg_class aclass, int *src)
    1505              : {
    1506    199663600 :   int len;
    1507              : 
    1508    199663600 :   if (*vec != NULL || src == NULL)
    1509              :     return;
    1510      8081715 :   *vec = ira_allocate_cost_vector (aclass);
    1511      8081715 :   len = ira_class_hard_regs_num[aclass];
    1512      8081715 :   memcpy (*vec, src, sizeof (int) * len);
    1513              : }
    1514              : 
    1515              : /* Allocate cost vector *VEC for hard registers of ACLASS and add
    1516              :    values of vector SRC into the vector if it is necessary */
    1517              : inline void
    1518      7937078 : ira_allocate_and_accumulate_costs (int **vec, enum reg_class aclass, int *src)
    1519              : {
    1520      7937078 :   int i, len;
    1521              : 
    1522      7937078 :   if (src == NULL)
    1523              :     return;
    1524       162899 :   len = ira_class_hard_regs_num[aclass];
    1525       162899 :   if (*vec == NULL)
    1526              :     {
    1527        40392 :       *vec = ira_allocate_cost_vector (aclass);
    1528        40392 :       memset (*vec, 0, sizeof (int) * len);
    1529              :     }
    1530      3825727 :   for (i = 0; i < len; i++)
    1531      3662828 :     (*vec)[i] += src[i];
    1532              : }
    1533              : 
    1534              : /* Allocate cost vector *VEC for hard registers of ACLASS and copy
    1535              :    values of vector SRC into the vector or initialize it by VAL (if
    1536              :    SRC is null).  */
    1537              : inline void
    1538     27549114 : ira_allocate_and_set_or_copy_costs (int **vec, enum reg_class aclass,
    1539              :                                     int val, int *src)
    1540              : {
    1541     27549114 :   int i, *reg_costs;
    1542     27549114 :   int len;
    1543              : 
    1544     27549114 :   if (*vec != NULL)
    1545              :     return;
    1546     13582182 :   *vec = reg_costs = ira_allocate_cost_vector (aclass);
    1547     13582182 :   len = ira_class_hard_regs_num[aclass];
    1548     13582182 :   if (src != NULL)
    1549      2388965 :     memcpy (reg_costs, src, sizeof (int) * len);
    1550              :   else
    1551              :     {
    1552    174804423 :       for (i = 0; i < len; i++)
    1553    163611206 :         reg_costs[i] = val;
    1554              :     }
    1555              : }
    1556              : 
    1557              : extern rtx ira_create_new_reg (rtx);
    1558              : extern int first_moveable_pseudo, last_moveable_pseudo;
    1559              : 
    1560              : /* Return the set of registers that would need a caller save if allocno A
    1561              :    overlapped them.  */
    1562              : 
    1563              : inline HARD_REG_SET
    1564      4663240 : ira_need_caller_save_regs (ira_allocno_t a)
    1565              : {
    1566      4663240 :   return call_clobbers_in_region (ALLOCNO_CROSSED_CALLS_ABIS (a),
    1567      4663240 :                                   ALLOCNO_CROSSED_CALLS_CLOBBERED_REGS (a),
    1568      4663240 :                                   ALLOCNO_MODE (a));
    1569              : }
    1570              : 
    1571              : /* Return true if we would need to save allocno A around a call if we
    1572              :    assigned hard register REGNO.  */
    1573              : 
    1574              : inline bool
    1575    279977204 : ira_need_caller_save_p (ira_allocno_t a, unsigned int regno)
    1576              : {
    1577    279977204 :   if (ALLOCNO_CALLS_CROSSED_NUM (a) == 0)
    1578              :     return false;
    1579     55507337 :   return call_clobbered_in_region_p (ALLOCNO_CROSSED_CALLS_ABIS (a),
    1580     55507337 :                                      ALLOCNO_CROSSED_CALLS_CLOBBERED_REGS (a),
    1581     55507337 :                                      ALLOCNO_MODE (a), regno);
    1582              : }
    1583              : 
    1584              : /* Represents the boundary between an allocno in one loop and its parent
    1585              :    allocno in the enclosing loop.  It is usually possible to change a
    1586              :    register's allocation on this boundary; the class provides routines
    1587              :    for calculating the cost of such changes.  */
    1588              : class ira_loop_border_costs
    1589              : {
    1590              : public:
    1591              :   ira_loop_border_costs (ira_allocno_t);
    1592              : 
    1593              :   int move_between_loops_cost () const;
    1594              :   int spill_outside_loop_cost () const;
    1595              :   int spill_inside_loop_cost () const;
    1596              : 
    1597              : private:
    1598              :   /* The mode and class of the child allocno.  */
    1599              :   machine_mode m_mode;
    1600              :   reg_class m_class;
    1601              : 
    1602              :   /* Sums the frequencies of the entry edges and the exit edges.  */
    1603              :   int m_entry_freq, m_exit_freq;
    1604              : };
    1605              : 
    1606              : /* Return the cost of storing the register on entry to the loop and
    1607              :    loading it back on exit from the loop.  This is the cost to use if
    1608              :    the register is spilled within the loop but is successfully allocated
    1609              :    in the parent loop.  */
    1610              : inline int
    1611     10489059 : ira_loop_border_costs::spill_inside_loop_cost () const
    1612              : {
    1613     10489059 :   return (m_entry_freq * ira_memory_move_cost[m_mode][m_class][0]
    1614     10489059 :           + m_exit_freq * ira_memory_move_cost[m_mode][m_class][1]);
    1615              : }
    1616              : 
    1617              : /* Return the cost of loading the register on entry to the loop and
    1618              :    storing it back on exit from the loop.  This is the cost to use if
    1619              :    the register is successfully allocated within the loop but is spilled
    1620              :    in the parent loop.  */
    1621              : inline int
    1622      2318729 : ira_loop_border_costs::spill_outside_loop_cost () const
    1623              : {
    1624      2318729 :   return (m_entry_freq * ira_memory_move_cost[m_mode][m_class][1]
    1625      2318729 :           + m_exit_freq * ira_memory_move_cost[m_mode][m_class][0]);
    1626              : }
    1627              : 
    1628              : /* Return the cost of moving the pseudo register between different hard
    1629              :    registers on entry and exit from the loop.  This is the cost to use
    1630              :    if the register is successfully allocated within both this loop and
    1631              :    the parent loop, but the allocations for the loops differ.  */
    1632              : inline int
    1633      1889051 : ira_loop_border_costs::move_between_loops_cost () const
    1634              : {
    1635      1889051 :   ira_init_register_move_cost_if_necessary (m_mode);
    1636      1889051 :   auto move_cost = ira_register_move_cost[m_mode][m_class][m_class];
    1637      1889051 :   return move_cost * (m_entry_freq + m_exit_freq);
    1638              : }
    1639              : 
    1640              : /* Return true if subloops that contain allocnos for A's register can
    1641              :    use a different assignment from A.  ALLOCATED_P is true for the case
    1642              :    in which allocation succeeded for A.  EXCLUDE_OLD_RELOAD is true if
    1643              :    we should always return false for non-LRA targets.  (This is a hack
    1644              :    and should be removed along with old reload.)  */
    1645              : inline bool
    1646     30770063 : ira_subloop_allocnos_can_differ_p (ira_allocno_t a, bool allocated_p = true,
    1647              :                                    bool exclude_old_reload = true)
    1648              : {
    1649     30770063 :   if (exclude_old_reload && !ira_use_lra_p)
    1650              :     return false;
    1651              : 
    1652     30770063 :   auto regno = ALLOCNO_REGNO (a);
    1653              : 
    1654     30770063 :   if (pic_offset_table_rtx != NULL
    1655     30770063 :       && regno == (int) REGNO (pic_offset_table_rtx))
    1656              :     return false;
    1657              : 
    1658     30669221 :   ira_assert (regno < ira_reg_equiv_len);
    1659     30669221 :   if (ira_equiv_no_lvalue_p (regno))
    1660              :     return false;
    1661              : 
    1662              :   /* Avoid overlapping multi-registers.  Moves between them might result
    1663              :      in wrong code generation.  */
    1664     28566377 :   if (allocated_p)
    1665              :     {
    1666     27048667 :       auto pclass = ira_pressure_class_translate[ALLOCNO_CLASS (a)];
    1667     27048667 :       if (ira_reg_class_max_nregs[pclass][ALLOCNO_MODE (a)] > 1)
    1668       275795 :         return false;
    1669              :     }
    1670              : 
    1671              :   return true;
    1672              : }
    1673              : 
    1674              : /* Return true if we should treat A and SUBLOOP_A as belonging to a
    1675              :    single region.  */
    1676              : inline bool
    1677      6759899 : ira_single_region_allocno_p (ira_allocno_t a, ira_allocno_t subloop_a)
    1678              : {
    1679      6759899 :   if (flag_ira_region != IRA_REGION_MIXED)
    1680              :     return false;
    1681              : 
    1682      6759899 :   if (ALLOCNO_MIGHT_CONFLICT_WITH_PARENT_P (subloop_a))
    1683              :     return false;
    1684              : 
    1685      6202638 :   auto rclass = ALLOCNO_CLASS (a);
    1686      6202638 :   auto pclass = ira_pressure_class_translate[rclass];
    1687      6202638 :   auto loop_used_regs = ALLOCNO_LOOP_TREE_NODE (a)->reg_pressure[pclass];
    1688      6202638 :   return loop_used_regs <= ira_class_hard_regs_num[pclass];
    1689              : }
    1690              : 
    1691              : /* Return the set of all hard registers that conflict with A.  */
    1692              : inline HARD_REG_SET
    1693      6789782 : ira_total_conflict_hard_regs (ira_allocno_t a)
    1694              : {
    1695      6789782 :   auto obj_0 = ALLOCNO_OBJECT (a, 0);
    1696      6789782 :   HARD_REG_SET conflicts = OBJECT_TOTAL_CONFLICT_HARD_REGS (obj_0);
    1697      6923354 :   for (int i = 1; i < ALLOCNO_NUM_OBJECTS (a); i++)
    1698       267144 :     conflicts |= OBJECT_TOTAL_CONFLICT_HARD_REGS (ALLOCNO_OBJECT (a, i));
    1699      6789782 :   return conflicts;
    1700              : }
    1701              : 
    1702              : /* Return the cost of saving a caller-saved register before each call
    1703              :    in A's live range and restoring the same register after each call.  */
    1704              : inline int
    1705     24867525 : ira_caller_save_cost (ira_allocno_t a)
    1706              : {
    1707     24867525 :   auto mode = ALLOCNO_MODE (a);
    1708     24867525 :   auto rclass = ALLOCNO_CLASS (a);
    1709     24867525 :   return (ALLOCNO_CALL_FREQ (a)
    1710     24867525 :           * (ira_memory_move_cost[mode][rclass][0]
    1711     24867525 :              + ira_memory_move_cost[mode][rclass][1]));
    1712              : }
    1713              : 
    1714              : /* A and SUBLOOP_A are allocnos for the same pseudo register, with A's
    1715              :    loop immediately enclosing SUBLOOP_A's loop.  If we allocate to A a
    1716              :    hard register R that is clobbered by a call in SUBLOOP_A, decide
    1717              :    which of the following approaches should be used for handling the
    1718              :    conflict:
    1719              : 
    1720              :    (1) Spill R on entry to SUBLOOP_A's loop, assign memory to SUBLOOP_A,
    1721              :        and restore R on exit from SUBLOOP_A's loop.
    1722              : 
    1723              :    (2) Spill R before each necessary call in SUBLOOP_A's live range and
    1724              :        restore R after each such call.
    1725              : 
    1726              :    Return true if (1) is better than (2).  SPILL_COST is the cost of
    1727              :    doing (1).  */
    1728              : inline bool
    1729      6246663 : ira_caller_save_loop_spill_p (ira_allocno_t a, ira_allocno_t subloop_a,
    1730              :                               int spill_cost)
    1731              : {
    1732      6246663 :   if (!ira_subloop_allocnos_can_differ_p (a))
    1733              :     return false;
    1734              : 
    1735              :   /* Calculate the cost of saving a call-clobbered register
    1736              :      before each call and restoring it afterwards.  */
    1737      5333148 :   int call_cost = ira_caller_save_cost (subloop_a);
    1738      5333148 :   return call_cost && call_cost >= spill_cost;
    1739              : }
    1740              : 
    1741              : /* True if X is a constant that can be forced into the constant pool.
    1742              :    MODE is the mode of the operand, or VOIDmode if not known.  */
    1743              : #define CONST_POOL_OK_P(MODE, X)                \
    1744              :   ((MODE) != VOIDmode                           \
    1745              :    && CONSTANT_P (X)                            \
    1746              :    && GET_CODE (X) != HIGH                      \
    1747              :    && GET_MODE_SIZE (MODE).is_constant ()       \
    1748              :    && !targetm.cannot_force_const_mem (MODE, X))
    1749              : 
    1750              : #endif /* GCC_IRA_INT_H */
        

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.