LCOV - code coverage report
Current view: top level - gcc - ira-build.cc (source / functions) Coverage Total Hit
Test: gcc.info Lines: 72.3 % 1935 1399
Test Date: 2026-05-11 19:44:49 Functions: 78.6 % 117 92
Legend: Lines:     hit not hit

            Line data    Source code
       1              : /* Building internal representation for IRA.
       2              :    Copyright (C) 2006-2026 Free Software Foundation, Inc.
       3              :    Contributed by Vladimir Makarov <vmakarov@redhat.com>.
       4              : 
       5              : This file is part of GCC.
       6              : 
       7              : GCC is free software; you can redistribute it and/or modify it under
       8              : the terms of the GNU General Public License as published by the Free
       9              : Software Foundation; either version 3, or (at your option) any later
      10              : version.
      11              : 
      12              : GCC is distributed in the hope that it will be useful, but WITHOUT ANY
      13              : WARRANTY; without even the implied warranty of MERCHANTABILITY or
      14              : FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
      15              : for more details.
      16              : 
      17              : You should have received a copy of the GNU General Public License
      18              : along with GCC; see the file COPYING3.  If not see
      19              : <http://www.gnu.org/licenses/>.  */
      20              : 
      21              : #include "config.h"
      22              : #include "system.h"
      23              : #include "coretypes.h"
      24              : #include "backend.h"
      25              : #include "target.h"
      26              : #include "rtl.h"
      27              : #include "predict.h"
      28              : #include "df.h"
      29              : #include "insn-config.h"
      30              : #include "regs.h"
      31              : #include "memmodel.h"
      32              : #include "ira.h"
      33              : #include "ira-int.h"
      34              : #include "sparseset.h"
      35              : #include "cfgloop.h"
      36              : 
      37              : static ira_copy_t find_allocno_copy (ira_allocno_t, ira_allocno_t, rtx_insn *,
      38              :                                      ira_loop_tree_node_t);
      39              : 
      40              : /* The root of the loop tree corresponding to the all function.  */
      41              : ira_loop_tree_node_t ira_loop_tree_root;
      42              : 
      43              : /* Height of the loop tree.  */
      44              : int ira_loop_tree_height;
      45              : 
      46              : /* All nodes representing basic blocks are referred through the
      47              :    following array.  We cannot use basic block member `aux' for this
      48              :    because it is used for insertion of insns on edges.  */
      49              : ira_loop_tree_node_t ira_bb_nodes;
      50              : 
      51              : /* All nodes representing loops are referred through the following
      52              :    array.  */
      53              : ira_loop_tree_node_t ira_loop_nodes;
      54              : 
      55              : /* And size of the ira_loop_nodes array.  */
      56              : unsigned int ira_loop_nodes_count;
      57              : 
      58              : /* Map regno -> allocnos with given regno (see comments for
      59              :    allocno member `next_regno_allocno').  */
      60              : ira_allocno_t *ira_regno_allocno_map;
      61              : 
      62              : /* Array of references to all allocnos.  The order number of the
      63              :    allocno corresponds to the index in the array.  Removed allocnos
      64              :    have NULL element value.  */
      65              : ira_allocno_t *ira_allocnos;
      66              : 
      67              : /* Sizes of the previous array.  */
      68              : int ira_allocnos_num;
      69              : 
      70              : /* Count of conflict record structures we've created, used when creating
      71              :    a new conflict id.  */
      72              : int ira_objects_num;
      73              : 
      74              : /* Map a conflict id to its conflict record.  */
      75              : ira_object_t *ira_object_id_map;
      76              : 
      77              : /* Array of references to all allocno preferences.  The order number
      78              :    of the preference corresponds to the index in the array.  */
      79              : ira_pref_t *ira_prefs;
      80              : 
      81              : /* Size of the previous array.  */
      82              : int ira_prefs_num;
      83              : 
      84              : /* Array of references to all copies.  The order number of the copy
      85              :    corresponds to the index in the array.  Removed copies have NULL
      86              :    element value.  */
      87              : ira_copy_t *ira_copies;
      88              : 
      89              : /* Size of the previous array.  */
      90              : int ira_copies_num;
      91              : 
      92              : 
      93              : 
      94              : /* LAST_BASIC_BLOCK before generating additional insns because of live
      95              :    range splitting.  Emitting insns on a critical edge creates a new
      96              :    basic block.  */
      97              : static int last_basic_block_before_change;
      98              : 
      99              : /* Initialize some members in loop tree node NODE.  Use LOOP_NUM for
     100              :    the member loop_num.  */
     101              : static void
     102      2087861 : init_loop_tree_node (struct ira_loop_tree_node *node, int loop_num)
     103              : {
     104      2087861 :   int max_regno = max_reg_num ();
     105              : 
     106      2087861 :   node->regno_allocno_map
     107      2087861 :     = (ira_allocno_t *) ira_allocate (sizeof (ira_allocno_t) * max_regno);
     108      2087861 :   memset (node->regno_allocno_map, 0, sizeof (ira_allocno_t) * max_regno);
     109      2087861 :   memset (node->reg_pressure, 0, sizeof (node->reg_pressure));
     110      2087861 :   node->all_allocnos = ira_allocate_bitmap ();
     111      2087861 :   node->modified_regnos = ira_allocate_bitmap ();
     112      2087861 :   node->border_allocnos = ira_allocate_bitmap ();
     113      2087861 :   node->local_copies = ira_allocate_bitmap ();
     114      2087861 :   node->loop_num = loop_num;
     115      2087861 :   node->children = NULL;
     116      2087861 :   node->subloops = NULL;
     117      2087861 : }
     118              : 
     119              : 
     120              : /* The following function allocates the loop tree nodes.  If
     121              :    CURRENT_LOOPS is NULL, the nodes corresponding to the loops (except
     122              :    the root which corresponds the all function) will be not allocated
     123              :    but nodes will still be allocated for basic blocks.  */
     124              : static void
     125      1474414 : create_loop_tree_nodes (void)
     126              : {
     127      1474414 :   unsigned int i, j;
     128      1474414 :   bool skip_p;
     129      1474414 :   edge_iterator ei;
     130      1474414 :   edge e;
     131      1474414 :   loop_p loop;
     132              : 
     133      1474414 :   ira_bb_nodes
     134      1474414 :     = ((struct ira_loop_tree_node *)
     135      1474414 :        ira_allocate (sizeof (struct ira_loop_tree_node)
     136      1474414 :                      * last_basic_block_for_fn (cfun)));
     137      1474414 :   last_basic_block_before_change = last_basic_block_for_fn (cfun);
     138     18749734 :   for (i = 0; i < (unsigned int) last_basic_block_for_fn (cfun); i++)
     139              :     {
     140     17275320 :       ira_bb_nodes[i].regno_allocno_map = NULL;
     141     17275320 :       memset (ira_bb_nodes[i].reg_pressure, 0,
     142              :               sizeof (ira_bb_nodes[i].reg_pressure));
     143     17275320 :       ira_bb_nodes[i].all_allocnos = NULL;
     144     17275320 :       ira_bb_nodes[i].modified_regnos = NULL;
     145     17275320 :       ira_bb_nodes[i].border_allocnos = NULL;
     146     17275320 :       ira_bb_nodes[i].local_copies = NULL;
     147              :     }
     148      1474414 :   if (current_loops == NULL)
     149              :     {
     150       478788 :       ira_loop_nodes_count = 1;
     151       957576 :       ira_loop_nodes = ((struct ira_loop_tree_node *)
     152       478788 :                         ira_allocate (sizeof (struct ira_loop_tree_node)));
     153       478788 :       init_loop_tree_node (ira_loop_nodes, 0);
     154       478788 :       return;
     155              :     }
     156       995626 :   ira_loop_nodes_count = number_of_loops (cfun);
     157      1991252 :   ira_loop_nodes = ((struct ira_loop_tree_node *)
     158       995626 :                     ira_allocate (sizeof (struct ira_loop_tree_node)
     159       995626 :                                   * ira_loop_nodes_count));
     160      3614722 :   FOR_EACH_VEC_SAFE_ELT (get_loops (cfun), i, loop)
     161              :     {
     162      1623470 :       if (loop_outer (loop) != NULL)
     163              :         {
     164       627844 :           ira_loop_nodes[i].regno_allocno_map = NULL;
     165       627844 :           skip_p = false;
     166      1958154 :           FOR_EACH_EDGE (e, ei, loop->header->preds)
     167      1330310 :             if (e->src != loop->latch
     168      1330310 :                 && (e->flags & EDGE_ABNORMAL) && EDGE_CRITICAL_P (e))
     169              :               {
     170              :                 skip_p = true;
     171              :                 break;
     172              :               }
     173       627844 :           if (skip_p)
     174        14397 :             continue;
     175       627844 :           auto_vec<edge> edges = get_loop_exit_edges (loop);
     176      2319025 :           FOR_EACH_VEC_ELT (edges, j, e)
     177      1077734 :             if ((e->flags & EDGE_ABNORMAL) && EDGE_CRITICAL_P (e))
     178              :               {
     179              :                 skip_p = true;
     180              :                 break;
     181              :               }
     182       627844 :           if (skip_p)
     183        14397 :             continue;
     184       627844 :         }
     185      1609073 :       init_loop_tree_node (&ira_loop_nodes[i], loop->num);
     186              :     }
     187              : }
     188              : 
     189              : /* The function returns TRUE if there are more one allocation
     190              :    region.  */
     191              : static bool
     192      1474414 : more_one_region_p (void)
     193              : {
     194      1474414 :   unsigned int i;
     195      1474414 :   loop_p loop;
     196              : 
     197      1474414 :   if (current_loops != NULL)
     198      2439815 :     FOR_EACH_VEC_SAFE_ELT (get_loops (cfun), i, loop)
     199      1479377 :       if (ira_loop_nodes[i].regno_allocno_map != NULL
     200      1030814 :           && ira_loop_tree_root != &ira_loop_nodes[i])
     201              :         return true;
     202              :   return false;
     203              : }
     204              : 
     205              : /* Free the loop tree node of a loop.  */
     206              : static void
     207      2548974 : finish_loop_tree_node (ira_loop_tree_node_t loop)
     208              : {
     209      2548974 :   if (loop->regno_allocno_map != NULL)
     210              :     {
     211      2087861 :       ira_assert (loop->bb == NULL);
     212      2087861 :       ira_free_bitmap (loop->local_copies);
     213      2087861 :       ira_free_bitmap (loop->border_allocnos);
     214      2087861 :       ira_free_bitmap (loop->modified_regnos);
     215      2087861 :       ira_free_bitmap (loop->all_allocnos);
     216      2087861 :       ira_free (loop->regno_allocno_map);
     217      2087861 :       loop->regno_allocno_map = NULL;
     218              :     }
     219      2548974 : }
     220              : 
     221              : /* Free the loop tree nodes.  */
     222              : static void
     223      1474414 : finish_loop_tree_nodes (void)
     224              : {
     225      1474414 :   unsigned int i;
     226              : 
     227      3576672 :   for (i = 0; i < ira_loop_nodes_count; i++)
     228      2102258 :     finish_loop_tree_node (&ira_loop_nodes[i]);
     229      1474414 :   ira_free (ira_loop_nodes);
     230     20224148 :   for (i = 0; i < (unsigned int) last_basic_block_before_change; i++)
     231              :     {
     232     17275320 :       if (ira_bb_nodes[i].local_copies != NULL)
     233            0 :         ira_free_bitmap (ira_bb_nodes[i].local_copies);
     234     17275320 :       if (ira_bb_nodes[i].border_allocnos != NULL)
     235            0 :         ira_free_bitmap (ira_bb_nodes[i].border_allocnos);
     236     17275320 :       if (ira_bb_nodes[i].modified_regnos != NULL)
     237            0 :         ira_free_bitmap (ira_bb_nodes[i].modified_regnos);
     238     17275320 :       if (ira_bb_nodes[i].all_allocnos != NULL)
     239            0 :         ira_free_bitmap (ira_bb_nodes[i].all_allocnos);
     240     17275320 :       if (ira_bb_nodes[i].regno_allocno_map != NULL)
     241            0 :         ira_free (ira_bb_nodes[i].regno_allocno_map);
     242              :     }
     243      1474414 :   ira_free (ira_bb_nodes);
     244      1474414 : }
     245              : 
     246              : 
     247              : 
     248              : /* The following recursive function adds LOOP to the loop tree
     249              :    hierarchy.  LOOP is added only once.  If LOOP is NULL we adding
     250              :    loop designating the whole function when CFG loops are not
     251              :    built.  */
     252              : static void
     253     17425058 : add_loop_to_tree (class loop *loop)
     254              : {
     255     17425058 :   int loop_num;
     256     17425058 :   class loop *parent;
     257     17425058 :   ira_loop_tree_node_t loop_node, parent_node;
     258              : 
     259              :   /* We cannot use loop node access macros here because of potential
     260              :      checking and because the nodes are not initialized enough
     261              :      yet.  */
     262     17425058 :   if (loop != NULL && loop_outer (loop) != NULL)
     263      3101880 :     add_loop_to_tree (loop_outer (loop));
     264     17425058 :   loop_num = loop != NULL ? loop->num : 0;
     265     17425058 :   if (ira_loop_nodes[loop_num].regno_allocno_map != NULL
     266     17418027 :       && ira_loop_nodes[loop_num].children == NULL)
     267              :     {
     268              :       /* We have not added loop node to the tree yet.  */
     269      2087861 :       loop_node = &ira_loop_nodes[loop_num];
     270      2087861 :       loop_node->loop = loop;
     271      2087861 :       loop_node->bb = NULL;
     272      2087861 :       if (loop == NULL)
     273              :         parent = NULL;
     274              :       else
     275              :         {
     276      1609073 :           for (parent = loop_outer (loop);
     277      1611442 :                parent != NULL;
     278         2369 :                parent = loop_outer (parent))
     279       615816 :             if (ira_loop_nodes[parent->num].regno_allocno_map != NULL)
     280              :               break;
     281              :         }
     282      1609073 :       if (parent == NULL)
     283              :         {
     284      1474414 :           loop_node->next = NULL;
     285      1474414 :           loop_node->subloop_next = NULL;
     286      1474414 :           loop_node->parent = NULL;
     287              :         }
     288              :       else
     289              :         {
     290       613447 :           parent_node = &ira_loop_nodes[parent->num];
     291       613447 :           loop_node->next = parent_node->children;
     292       613447 :           parent_node->children = loop_node;
     293       613447 :           loop_node->subloop_next = parent_node->subloops;
     294       613447 :           parent_node->subloops = loop_node;
     295       613447 :           loop_node->parent = parent_node;
     296              :         }
     297              :     }
     298     17425058 : }
     299              : 
     300              : /* The following recursive function sets up levels of nodes of the
     301              :    tree given its root LOOP_NODE.  The enumeration starts with LEVEL.
     302              :    The function returns maximal value of level in the tree + 1.  */
     303              : static int
     304      2087861 : setup_loop_tree_level (ira_loop_tree_node_t loop_node, int level)
     305              : {
     306      2087861 :   int height, max_height;
     307      2087861 :   ira_loop_tree_node_t subloop_node;
     308              : 
     309      2087861 :   ira_assert (loop_node->bb == NULL);
     310      2087861 :   loop_node->level = level;
     311      2087861 :   max_height = level + 1;
     312      2087861 :   for (subloop_node = loop_node->subloops;
     313      2701308 :        subloop_node != NULL;
     314       613447 :        subloop_node = subloop_node->subloop_next)
     315              :     {
     316       613447 :       ira_assert (subloop_node->bb == NULL);
     317       613447 :       height = setup_loop_tree_level (subloop_node, level + 1);
     318       613447 :       if (height > max_height)
     319              :         max_height = height;
     320              :     }
     321      2087861 :   return max_height;
     322              : }
     323              : 
     324              : /* Create the loop tree.  The algorithm is designed to provide correct
     325              :    order of loops (they are ordered by their last loop BB) and basic
     326              :    blocks in the chain formed by member next.  */
     327              : static void
     328      1474414 : form_loop_tree (void)
     329              : {
     330      1474414 :   basic_block bb;
     331      1474414 :   class loop *parent;
     332      1474414 :   ira_loop_tree_node_t bb_node, loop_node;
     333              : 
     334              :   /* We cannot use loop/bb node access macros because of potential
     335              :      checking and because the nodes are not initialized enough
     336              :      yet.  */
     337     15797592 :   FOR_EACH_BB_FN (bb, cfun)
     338              :     {
     339     14323178 :       bb_node = &ira_bb_nodes[bb->index];
     340     14323178 :       bb_node->bb = bb;
     341     14323178 :       bb_node->loop = NULL;
     342     14323178 :       bb_node->subloops = NULL;
     343     14323178 :       bb_node->children = NULL;
     344     14323178 :       bb_node->subloop_next = NULL;
     345     14323178 :       bb_node->next = NULL;
     346     14323178 :       if (current_loops == NULL)
     347              :         parent = NULL;
     348              :       else
     349              :         {
     350     10598171 :           for (parent = bb->loop_father;
     351     10917179 :                parent != NULL;
     352       319008 :                parent = loop_outer (parent))
     353     10917179 :             if (ira_loop_nodes[parent->num].regno_allocno_map != NULL)
     354              :               break;
     355              :         }
     356     14323178 :       add_loop_to_tree (parent);
     357     14323178 :       loop_node = &ira_loop_nodes[parent == NULL ? 0 : parent->num];
     358     14323178 :       bb_node->next = loop_node->children;
     359     14323178 :       bb_node->parent = loop_node;
     360     14323178 :       loop_node->children = bb_node;
     361              :     }
     362      1474414 :   ira_loop_tree_root = IRA_LOOP_NODE_BY_INDEX (0);
     363      1474414 :   ira_loop_tree_height = setup_loop_tree_level (ira_loop_tree_root, 0);
     364      1474414 :   ira_assert (ira_loop_tree_root->regno_allocno_map != NULL);
     365      1474414 : }
     366              : 
     367              : 
     368              : 
     369              : /* Rebuild IRA_REGNO_ALLOCNO_MAP and REGNO_ALLOCNO_MAPs of the loop
     370              :    tree nodes.  */
     371              : static void
     372            0 : rebuild_regno_allocno_maps (void)
     373              : {
     374            0 :   unsigned int l;
     375            0 :   int max_regno, regno;
     376            0 :   ira_allocno_t a;
     377            0 :   ira_loop_tree_node_t loop_tree_node;
     378            0 :   loop_p loop;
     379            0 :   ira_allocno_iterator ai;
     380              : 
     381            0 :   ira_assert (current_loops != NULL);
     382            0 :   max_regno = max_reg_num ();
     383            0 :   FOR_EACH_VEC_SAFE_ELT (get_loops (cfun), l, loop)
     384            0 :     if (ira_loop_nodes[l].regno_allocno_map != NULL)
     385              :       {
     386            0 :         ira_free (ira_loop_nodes[l].regno_allocno_map);
     387            0 :         ira_loop_nodes[l].regno_allocno_map
     388            0 :           = (ira_allocno_t *) ira_allocate (sizeof (ira_allocno_t)
     389            0 :                                             * max_regno);
     390            0 :         memset (ira_loop_nodes[l].regno_allocno_map, 0,
     391              :                 sizeof (ira_allocno_t) * max_regno);
     392              :       }
     393            0 :   ira_free (ira_regno_allocno_map);
     394            0 :   ira_regno_allocno_map
     395            0 :     = (ira_allocno_t *) ira_allocate (max_regno * sizeof (ira_allocno_t));
     396            0 :   memset (ira_regno_allocno_map, 0, max_regno * sizeof (ira_allocno_t));
     397            0 :   FOR_EACH_ALLOCNO (a, ai)
     398              :     {
     399            0 :       if (ALLOCNO_CAP_MEMBER (a) != NULL)
     400              :         /* Caps are not in the regno allocno maps.  */
     401            0 :         continue;
     402            0 :       regno = ALLOCNO_REGNO (a);
     403            0 :       loop_tree_node = ALLOCNO_LOOP_TREE_NODE (a);
     404            0 :       ALLOCNO_NEXT_REGNO_ALLOCNO (a) = ira_regno_allocno_map[regno];
     405            0 :       ira_regno_allocno_map[regno] = a;
     406            0 :       if (loop_tree_node->regno_allocno_map[regno] == NULL)
     407              :         /* Remember that we can create temporary allocnos to break
     408              :            cycles in register shuffle.  */
     409            0 :         loop_tree_node->regno_allocno_map[regno] = a;
     410              :     }
     411            0 : }
     412              : 
     413              : 
     414              : /* Pools for allocnos, allocno live ranges and objects.  */
     415              : static object_allocator<live_range> live_range_pool ("live ranges");
     416              : static object_allocator<ira_allocno> allocno_pool ("allocnos");
     417              : static object_allocator<ira_object> object_pool ("objects");
     418              : 
     419              : /* Vec containing references to all created allocnos.  It is a
     420              :    container of array allocnos.  */
     421              : static vec<ira_allocno_t> allocno_vec;
     422              : 
     423              : /* Vec containing references to all created ira_objects.  It is a
     424              :    container of ira_object_id_map.  */
     425              : static vec<ira_object_t> ira_object_id_map_vec;
     426              : 
     427              : /* Initialize data concerning allocnos.  */
     428              : static void
     429      1474414 : initiate_allocnos (void)
     430              : {
     431      1474414 :   allocno_vec.create (max_reg_num () * 2);
     432      1474414 :   ira_allocnos = NULL;
     433      1474414 :   ira_allocnos_num = 0;
     434      1474414 :   ira_objects_num = 0;
     435      1474414 :   ira_object_id_map_vec.create (max_reg_num () * 2);
     436      1474414 :   ira_object_id_map = NULL;
     437      1474414 :   ira_regno_allocno_map
     438      1474414 :     = (ira_allocno_t *) ira_allocate (max_reg_num ()
     439              :                                       * sizeof (ira_allocno_t));
     440      1474414 :   memset (ira_regno_allocno_map, 0, max_reg_num () * sizeof (ira_allocno_t));
     441      1474414 : }
     442              : 
     443              : /* Create and return an object corresponding to a new allocno A.  */
     444              : static ira_object_t
     445     40102368 : ira_create_object (ira_allocno_t a, int subword)
     446              : {
     447     40102368 :   enum reg_class aclass = ALLOCNO_CLASS (a);
     448     40102368 :   ira_object_t obj = object_pool.allocate ();
     449              : 
     450     40102368 :   OBJECT_ALLOCNO (obj) = a;
     451     40102368 :   OBJECT_SUBWORD (obj) = subword;
     452     40102368 :   OBJECT_CONFLICT_ID (obj) = ira_objects_num;
     453     40102368 :   OBJECT_CONFLICT_VEC_P (obj) = false;
     454     40102368 :   OBJECT_CONFLICT_ARRAY (obj) = NULL;
     455     40102368 :   OBJECT_NUM_CONFLICTS (obj) = 0;
     456     40102368 :   OBJECT_CONFLICT_HARD_REGS (obj) = ira_no_alloc_regs;
     457     40102368 :   OBJECT_TOTAL_CONFLICT_HARD_REGS (obj) = ira_no_alloc_regs;
     458     40102368 :   OBJECT_CONFLICT_HARD_REGS (obj) |= ~reg_class_contents[aclass];
     459     40102368 :   OBJECT_TOTAL_CONFLICT_HARD_REGS (obj) |= ~reg_class_contents[aclass];
     460     40102368 :   OBJECT_MIN (obj) = INT_MAX;
     461     40102368 :   OBJECT_MAX (obj) = -1;
     462     40102368 :   OBJECT_LIVE_RANGES (obj) = NULL;
     463              : 
     464     40102368 :   ira_object_id_map_vec.safe_push (obj);
     465     40102368 :   ira_object_id_map
     466     40102368 :     = ira_object_id_map_vec.address ();
     467     40102368 :   ira_objects_num = ira_object_id_map_vec.length ();
     468              : 
     469     40102368 :   return obj;
     470              : }
     471              : 
     472              : /* Create and return the allocno corresponding to REGNO in
     473              :    LOOP_TREE_NODE.  Add the allocno to the list of allocnos with the
     474              :    same regno if CAP_P is FALSE.  */
     475              : ira_allocno_t
     476     38789470 : ira_create_allocno (int regno, bool cap_p,
     477              :                     ira_loop_tree_node_t loop_tree_node)
     478              : {
     479     38789470 :   ira_allocno_t a;
     480              : 
     481     38789470 :   a = allocno_pool.allocate ();
     482     38789470 :   ALLOCNO_REGNO (a) = regno;
     483     38789470 :   ALLOCNO_LOOP_TREE_NODE (a) = loop_tree_node;
     484     38789470 :   if (! cap_p)
     485              :     {
     486     35136145 :       ALLOCNO_NEXT_REGNO_ALLOCNO (a) = ira_regno_allocno_map[regno];
     487     35136145 :       ira_regno_allocno_map[regno] = a;
     488     35136145 :       if (loop_tree_node->regno_allocno_map[regno] == NULL)
     489              :         /* Remember that we can create temporary allocnos to break
     490              :            cycles in register shuffle on region borders (see
     491              :            ira-emit.cc).  */
     492     35131478 :         loop_tree_node->regno_allocno_map[regno] = a;
     493              :     }
     494     38789470 :   ALLOCNO_CAP (a) = NULL;
     495     38789470 :   ALLOCNO_CAP_MEMBER (a) = NULL;
     496     38789470 :   ALLOCNO_NUM (a) = ira_allocnos_num;
     497     38789470 :   bitmap_set_bit (loop_tree_node->all_allocnos, ALLOCNO_NUM (a));
     498     38789470 :   ALLOCNO_NREFS (a) = 0;
     499     38789470 :   ALLOCNO_FREQ (a) = 0;
     500     38789470 :   ALLOCNO_MIGHT_CONFLICT_WITH_PARENT_P (a) = false;
     501     38789470 :   ALLOCNO_SET_REGISTER_FILTERS (a, 0);
     502     38789470 :   ALLOCNO_HARD_REGNO (a) = -1;
     503     38789470 :   ALLOCNO_CALL_FREQ (a) = 0;
     504     38789470 :   ALLOCNO_CALLS_CROSSED_NUM (a) = 0;
     505     38789470 :   ALLOCNO_CHEAP_CALLS_CROSSED_NUM (a) = 0;
     506     38789470 :   ALLOCNO_CROSSED_CALLS_ABIS (a) = 0;
     507     38789470 :   CLEAR_HARD_REG_SET (ALLOCNO_CROSSED_CALLS_CLOBBERED_REGS (a));
     508              : #ifdef STACK_REGS
     509     38789470 :   ALLOCNO_NO_STACK_REG_P (a) = false;
     510     38789470 :   ALLOCNO_TOTAL_NO_STACK_REG_P (a) = false;
     511              : #endif
     512     38789470 :   ALLOCNO_DONT_REASSIGN_P (a) = false;
     513     38789470 :   ALLOCNO_BAD_SPILL_P (a) = false;
     514     38789470 :   ALLOCNO_ASSIGNED_P (a) = false;
     515     38789470 :   ALLOCNO_MODE (a) = (regno < 0 ? VOIDmode : PSEUDO_REGNO_MODE (regno));
     516     38789470 :   ALLOCNO_WMODE (a) = ALLOCNO_MODE (a);
     517     38789470 :   ALLOCNO_PREFS (a) = NULL;
     518     38789470 :   ALLOCNO_COPIES (a) = NULL;
     519     38789470 :   ALLOCNO_HARD_REG_COSTS (a) = NULL;
     520     38789470 :   ALLOCNO_CONFLICT_HARD_REG_COSTS (a) = NULL;
     521     38789470 :   ALLOCNO_UPDATED_HARD_REG_COSTS (a) = NULL;
     522     38789470 :   ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (a) = NULL;
     523     38789470 :   ALLOCNO_CLASS (a) = NO_REGS;
     524     38789470 :   ALLOCNO_UPDATED_CLASS_COST (a) = 0;
     525     38789470 :   ALLOCNO_CLASS_COST (a) = 0;
     526     38789470 :   ALLOCNO_MEMORY_COST (a) = 0;
     527     38789470 :   ALLOCNO_UPDATED_MEMORY_COST (a) = 0;
     528     38789470 :   ALLOCNO_EXCESS_PRESSURE_POINTS_NUM (a) = 0;
     529     38789470 :   ALLOCNO_NUM_OBJECTS (a) = 0;
     530              : 
     531     38789470 :   ALLOCNO_ADD_DATA (a) = NULL;
     532     38789470 :   allocno_vec.safe_push (a);
     533     38789470 :   ira_allocnos = allocno_vec.address ();
     534     38789470 :   ira_allocnos_num = allocno_vec.length ();
     535              : 
     536     38789470 :   return a;
     537              : }
     538              : 
     539              : /* Set up register class for A and update its conflict hard
     540              :    registers.  */
     541              : void
     542     38789470 : ira_set_allocno_class (ira_allocno_t a, enum reg_class aclass)
     543              : {
     544     38789470 :   ira_allocno_object_iterator oi;
     545     38789470 :   ira_object_t obj;
     546              : 
     547     38789470 :   ALLOCNO_CLASS (a) = aclass;
     548     38789470 :   FOR_EACH_ALLOCNO_OBJECT (a, obj, oi)
     549              :     {
     550            0 :       OBJECT_CONFLICT_HARD_REGS (obj) |= ~reg_class_contents[aclass];
     551            0 :       OBJECT_TOTAL_CONFLICT_HARD_REGS (obj) |= ~reg_class_contents[aclass];
     552              :     }
     553     38789470 : }
     554              : 
     555              : /* Determine the number of objects we should associate with allocno A
     556              :    and allocate them.  */
     557              : void
     558     38789470 : ira_create_allocno_objects (ira_allocno_t a)
     559              : {
     560     38789470 :   machine_mode mode = ALLOCNO_MODE (a);
     561     38789470 :   enum reg_class aclass = ALLOCNO_CLASS (a);
     562     38789470 :   int n = ira_reg_class_max_nregs[aclass][mode];
     563     38789470 :   int i;
     564              : 
     565     40365361 :   if (n != 2 || maybe_ne (GET_MODE_SIZE (mode), n * UNITS_PER_WORD))
     566              :     n = 1;
     567              : 
     568     38789470 :   ALLOCNO_NUM_OBJECTS (a) = n;
     569     78891838 :   for (i = 0; i < n; i++)
     570     40102368 :     ALLOCNO_OBJECT (a, i) = ira_create_object (a, i);
     571     38789470 : }
     572              : 
     573              : /* For each allocno, set ALLOCNO_NUM_OBJECTS and create the
     574              :    ALLOCNO_OBJECT structures.  This must be called after the allocno
     575              :    classes are known.  */
     576              : static void
     577      1474414 : create_allocno_objects (void)
     578              : {
     579      1474414 :   ira_allocno_t a;
     580      1474414 :   ira_allocno_iterator ai;
     581              : 
     582     36605892 :   FOR_EACH_ALLOCNO (a, ai)
     583     35131478 :     ira_create_allocno_objects (a);
     584      1474414 : }
     585              : 
     586              : /* Merge hard register conflict information for all objects associated with
     587              :    allocno TO into the corresponding objects associated with FROM.
     588              :    If TOTAL_ONLY is true, we only merge OBJECT_TOTAL_CONFLICT_HARD_REGS.  */
     589              : static void
     590      6575826 : merge_hard_reg_conflicts (ira_allocno_t from, ira_allocno_t to,
     591              :                           bool total_only)
     592              : {
     593      6575826 :   int i;
     594      6575826 :   gcc_assert (ALLOCNO_NUM_OBJECTS (to) == ALLOCNO_NUM_OBJECTS (from));
     595     13267007 :   for (i = 0; i < ALLOCNO_NUM_OBJECTS (to); i++)
     596              :     {
     597      6691181 :       ira_object_t from_obj = ALLOCNO_OBJECT (from, i);
     598      6691181 :       ira_object_t to_obj = ALLOCNO_OBJECT (to, i);
     599              : 
     600      6691181 :       if (!total_only)
     601              :         OBJECT_CONFLICT_HARD_REGS (to_obj)
     602      6691181 :           |= OBJECT_CONFLICT_HARD_REGS (from_obj);
     603      6691181 :       OBJECT_TOTAL_CONFLICT_HARD_REGS (to_obj)
     604     13382362 :         |= OBJECT_TOTAL_CONFLICT_HARD_REGS (from_obj);
     605              :     }
     606              : #ifdef STACK_REGS
     607      6575826 :   if (!total_only && ALLOCNO_NO_STACK_REG_P (from))
     608        21703 :     ALLOCNO_NO_STACK_REG_P (to) = true;
     609      6575826 :   if (ALLOCNO_TOTAL_NO_STACK_REG_P (from))
     610        23709 :     ALLOCNO_TOTAL_NO_STACK_REG_P (to) = true;
     611              : #endif
     612      6575826 : }
     613              : 
     614              : /* Update hard register conflict information for all objects associated with
     615              :    A to include the regs in SET.  */
     616              : void
     617      4475214 : ior_hard_reg_conflicts (ira_allocno_t a, const_hard_reg_set set)
     618              : {
     619      4475214 :   ira_allocno_object_iterator i;
     620      4475214 :   ira_object_t obj;
     621              : 
     622      4475214 :   FOR_EACH_ALLOCNO_OBJECT (a, obj, i)
     623              :     {
     624     13692564 :       OBJECT_CONFLICT_HARD_REGS (obj) |= set;
     625      9039402 :       OBJECT_TOTAL_CONFLICT_HARD_REGS (obj) |= set;
     626              :     }
     627      4475214 : }
     628              : 
     629              : /* Return TRUE if a conflict vector with NUM elements is more
     630              :    profitable than a conflict bit vector for OBJ.  */
     631              : bool
     632     25382779 : ira_conflict_vector_profitable_p (ira_object_t obj, int num)
     633              : {
     634     25382779 :   int nbytes;
     635     25382779 :   int max = OBJECT_MAX (obj);
     636     25382779 :   int min = OBJECT_MIN (obj);
     637              : 
     638     25382779 :   if (max < min)
     639              :     /* We prefer a bit vector in such case because it does not result
     640              :        in allocation.  */
     641              :     return false;
     642              : 
     643     24489492 :   nbytes = (max - min) / 8 + 1;
     644     24489492 :   STATIC_ASSERT (sizeof (ira_object_t) <= 8);
     645              :   /* Don't use sizeof (ira_object_t), use constant 8.  Size of ira_object_t (a
     646              :      pointer) is different on 32-bit and 64-bit targets.  Usage sizeof
     647              :      (ira_object_t) can result in different code generation by GCC built as 32-
     648              :      and 64-bit program.  In any case the profitability is just an estimation
     649              :      and border cases are rare.  */
     650     24489492 :   return (2 * 8 /* sizeof (ira_object_t) */ * (num + 1) < 3 * nbytes);
     651              : }
     652              : 
     653              : /* Allocates and initialize the conflict vector of OBJ for NUM
     654              :    conflicting objects.  */
     655              : void
     656      5137859 : ira_allocate_conflict_vec (ira_object_t obj, int num)
     657              : {
     658      5137859 :   int size;
     659      5137859 :   ira_object_t *vec;
     660              : 
     661      5137859 :   ira_assert (OBJECT_CONFLICT_ARRAY (obj) == NULL);
     662      5137859 :   num++; /* for NULL end marker  */
     663      5137859 :   size = sizeof (ira_object_t) * num;
     664      5137859 :   OBJECT_CONFLICT_ARRAY (obj) = ira_allocate (size);
     665      5137859 :   vec = (ira_object_t *) OBJECT_CONFLICT_ARRAY (obj);
     666      5137859 :   vec[0] = NULL;
     667      5137859 :   OBJECT_NUM_CONFLICTS (obj) = 0;
     668      5137859 :   OBJECT_CONFLICT_ARRAY_SIZE (obj) = size;
     669      5137859 :   OBJECT_CONFLICT_VEC_P (obj) = true;
     670      5137859 : }
     671              : 
     672              : /* Allocate and initialize the conflict bit vector of OBJ.  */
     673              : static void
     674         3281 : allocate_conflict_bit_vec (ira_object_t obj)
     675              : {
     676         3281 :   unsigned int size;
     677              : 
     678         3281 :   ira_assert (OBJECT_CONFLICT_ARRAY (obj) == NULL);
     679         3281 :   size = ((OBJECT_MAX (obj) - OBJECT_MIN (obj) + IRA_INT_BITS)
     680         3281 :           / IRA_INT_BITS * sizeof (IRA_INT_TYPE));
     681         3281 :   OBJECT_CONFLICT_ARRAY (obj) = ira_allocate (size);
     682         3281 :   memset (OBJECT_CONFLICT_ARRAY (obj), 0, size);
     683         3281 :   OBJECT_CONFLICT_ARRAY_SIZE (obj) = size;
     684         3281 :   OBJECT_CONFLICT_VEC_P (obj) = false;
     685         3281 : }
     686              : 
     687              : /* Allocate and initialize the conflict vector or conflict bit vector
     688              :    of OBJ for NUM conflicting allocnos whatever is more profitable.  */
     689              : void
     690         4667 : ira_allocate_object_conflicts (ira_object_t obj, int num)
     691              : {
     692         4667 :   if (ira_conflict_vector_profitable_p (obj, num))
     693         1386 :     ira_allocate_conflict_vec (obj, num);
     694              :   else
     695         3281 :     allocate_conflict_bit_vec (obj);
     696         4667 : }
     697              : 
     698              : /* Add OBJ2 to the conflicts of OBJ1.  */
     699              : static void
     700            0 : add_to_conflicts (ira_object_t obj1, ira_object_t obj2)
     701              : {
     702            0 :   int num;
     703            0 :   unsigned int size;
     704              : 
     705            0 :   if (OBJECT_CONFLICT_VEC_P (obj1))
     706              :     {
     707            0 :       ira_object_t *vec = OBJECT_CONFLICT_VEC (obj1);
     708            0 :       int curr_num = OBJECT_NUM_CONFLICTS (obj1);
     709            0 :       num = curr_num + 2;
     710            0 :       if (OBJECT_CONFLICT_ARRAY_SIZE (obj1) < num * sizeof (ira_object_t))
     711              :         {
     712            0 :           ira_object_t *newvec;
     713            0 :           size = (3 * num / 2 + 1) * sizeof (ira_object_t);
     714            0 :           newvec = (ira_object_t *) ira_allocate (size);
     715            0 :           memcpy (newvec, vec, curr_num * sizeof (ira_object_t));
     716            0 :           ira_free (vec);
     717            0 :           vec = newvec;
     718            0 :           OBJECT_CONFLICT_ARRAY (obj1) = vec;
     719            0 :           OBJECT_CONFLICT_ARRAY_SIZE (obj1) = size;
     720              :         }
     721            0 :       vec[num - 2] = obj2;
     722            0 :       vec[num - 1] = NULL;
     723            0 :       OBJECT_NUM_CONFLICTS (obj1)++;
     724              :     }
     725              :   else
     726              :     {
     727            0 :       int nw, added_head_nw, id;
     728            0 :       IRA_INT_TYPE *vec = OBJECT_CONFLICT_BITVEC (obj1);
     729              : 
     730            0 :       id = OBJECT_CONFLICT_ID (obj2);
     731            0 :       if (OBJECT_MIN (obj1) > id)
     732              :         {
     733              :           /* Expand head of the bit vector.  */
     734            0 :           added_head_nw = (OBJECT_MIN (obj1) - id - 1) / IRA_INT_BITS + 1;
     735            0 :           nw = (OBJECT_MAX (obj1) - OBJECT_MIN (obj1)) / IRA_INT_BITS + 1;
     736            0 :           size = (nw + added_head_nw) * sizeof (IRA_INT_TYPE);
     737            0 :           if (OBJECT_CONFLICT_ARRAY_SIZE (obj1) >= size)
     738              :             {
     739            0 :               memmove ((char *) vec + added_head_nw * sizeof (IRA_INT_TYPE),
     740            0 :                        vec, nw * sizeof (IRA_INT_TYPE));
     741            0 :               memset (vec, 0, added_head_nw * sizeof (IRA_INT_TYPE));
     742              :             }
     743              :           else
     744              :             {
     745            0 :               size
     746            0 :                 = (3 * (nw + added_head_nw) / 2 + 1) * sizeof (IRA_INT_TYPE);
     747            0 :               vec = (IRA_INT_TYPE *) ira_allocate (size);
     748            0 :               memcpy ((char *) vec + added_head_nw * sizeof (IRA_INT_TYPE),
     749            0 :                       OBJECT_CONFLICT_ARRAY (obj1), nw * sizeof (IRA_INT_TYPE));
     750            0 :               memset (vec, 0, added_head_nw * sizeof (IRA_INT_TYPE));
     751            0 :               memset ((char *) vec
     752              :                       + (nw + added_head_nw) * sizeof (IRA_INT_TYPE),
     753            0 :                       0, size - (nw + added_head_nw) * sizeof (IRA_INT_TYPE));
     754            0 :               ira_free (OBJECT_CONFLICT_ARRAY (obj1));
     755            0 :               OBJECT_CONFLICT_ARRAY (obj1) = vec;
     756            0 :               OBJECT_CONFLICT_ARRAY_SIZE (obj1) = size;
     757              :             }
     758            0 :           OBJECT_MIN (obj1) -= added_head_nw * IRA_INT_BITS;
     759              :         }
     760            0 :       else if (OBJECT_MAX (obj1) < id)
     761              :         {
     762            0 :           nw = (id - OBJECT_MIN (obj1)) / IRA_INT_BITS + 1;
     763            0 :           size = nw * sizeof (IRA_INT_TYPE);
     764            0 :           if (OBJECT_CONFLICT_ARRAY_SIZE (obj1) < size)
     765              :             {
     766              :               /* Expand tail of the bit vector.  */
     767            0 :               size = (3 * nw / 2 + 1) * sizeof (IRA_INT_TYPE);
     768            0 :               vec = (IRA_INT_TYPE *) ira_allocate (size);
     769            0 :               memcpy (vec, OBJECT_CONFLICT_ARRAY (obj1), OBJECT_CONFLICT_ARRAY_SIZE (obj1));
     770            0 :               memset ((char *) vec + OBJECT_CONFLICT_ARRAY_SIZE (obj1),
     771            0 :                       0, size - OBJECT_CONFLICT_ARRAY_SIZE (obj1));
     772            0 :               ira_free (OBJECT_CONFLICT_ARRAY (obj1));
     773            0 :               OBJECT_CONFLICT_ARRAY (obj1) = vec;
     774            0 :               OBJECT_CONFLICT_ARRAY_SIZE (obj1) = size;
     775              :             }
     776            0 :           OBJECT_MAX (obj1) = id;
     777              :         }
     778            0 :       SET_MINMAX_SET_BIT (vec, id, OBJECT_MIN (obj1), OBJECT_MAX (obj1));
     779              :     }
     780            0 : }
     781              : 
     782              : /* Add OBJ1 to the conflicts of OBJ2 and vice versa.  */
     783              : static void
     784            0 : ira_add_conflict (ira_object_t obj1, ira_object_t obj2)
     785              : {
     786            0 :   add_to_conflicts (obj1, obj2);
     787            0 :   add_to_conflicts (obj2, obj1);
     788            0 : }
     789              : 
     790              : /* Clear all conflicts of OBJ.  */
     791              : static void
     792            0 : clear_conflicts (ira_object_t obj)
     793              : {
     794            0 :   if (OBJECT_CONFLICT_VEC_P (obj))
     795              :     {
     796            0 :       OBJECT_NUM_CONFLICTS (obj) = 0;
     797            0 :       OBJECT_CONFLICT_VEC (obj)[0] = NULL;
     798              :     }
     799            0 :   else if (OBJECT_CONFLICT_ARRAY_SIZE (obj) != 0)
     800              :     {
     801            0 :       int nw;
     802              : 
     803            0 :       nw = (OBJECT_MAX (obj) - OBJECT_MIN (obj)) / IRA_INT_BITS + 1;
     804            0 :       memset (OBJECT_CONFLICT_BITVEC (obj), 0, nw * sizeof (IRA_INT_TYPE));
     805              :     }
     806            0 : }
     807              : 
     808              : /* The array used to find duplications in conflict vectors of
     809              :    allocnos.  */
     810              : static int *conflict_check;
     811              : 
     812              : /* The value used to mark allocation presence in conflict vector of
     813              :    the current allocno.  */
     814              : static int curr_conflict_check_tick;
     815              : 
     816              : /* Remove duplications in conflict vector of OBJ.  */
     817              : static void
     818            0 : compress_conflict_vec (ira_object_t obj)
     819              : {
     820            0 :   ira_object_t *vec, conflict_obj;
     821            0 :   int i, j;
     822              : 
     823            0 :   ira_assert (OBJECT_CONFLICT_VEC_P (obj));
     824            0 :   vec = OBJECT_CONFLICT_VEC (obj);
     825            0 :   curr_conflict_check_tick++;
     826            0 :   for (i = j = 0; (conflict_obj = vec[i]) != NULL; i++)
     827              :     {
     828            0 :       int id = OBJECT_CONFLICT_ID (conflict_obj);
     829            0 :       if (conflict_check[id] != curr_conflict_check_tick)
     830              :         {
     831            0 :           conflict_check[id] = curr_conflict_check_tick;
     832            0 :           vec[j++] = conflict_obj;
     833              :         }
     834              :     }
     835            0 :   OBJECT_NUM_CONFLICTS (obj) = j;
     836            0 :   vec[j] = NULL;
     837            0 : }
     838              : 
     839              : /* Remove duplications in conflict vectors of all allocnos.  */
     840              : static void
     841            0 : compress_conflict_vecs (void)
     842              : {
     843            0 :   ira_object_t obj;
     844            0 :   ira_object_iterator oi;
     845              : 
     846            0 :   conflict_check = (int *) ira_allocate (sizeof (int) * ira_objects_num);
     847            0 :   memset (conflict_check, 0, sizeof (int) * ira_objects_num);
     848            0 :   curr_conflict_check_tick = 0;
     849            0 :   FOR_EACH_OBJECT (obj, oi)
     850              :     {
     851            0 :       if (OBJECT_CONFLICT_VEC_P (obj))
     852            0 :         compress_conflict_vec (obj);
     853              :     }
     854            0 :   ira_free (conflict_check);
     855            0 : }
     856              : 
     857              : /* This recursive function outputs allocno A and if it is a cap the
     858              :    function outputs its members.  */
     859              : void
     860          959 : ira_print_expanded_allocno (ira_allocno_t a)
     861              : {
     862          959 :   basic_block bb;
     863              : 
     864          959 :   fprintf (ira_dump_file, " a%d(r%d", ALLOCNO_NUM (a), ALLOCNO_REGNO (a));
     865          959 :   if ((bb = ALLOCNO_LOOP_TREE_NODE (a)->bb) != NULL)
     866            0 :     fprintf (ira_dump_file, ",b%d", bb->index);
     867              :   else
     868          959 :     fprintf (ira_dump_file, ",l%d", ALLOCNO_LOOP_TREE_NODE (a)->loop_num);
     869          959 :   if (ALLOCNO_CAP_MEMBER (a) != NULL)
     870              :     {
     871            0 :       fprintf (ira_dump_file, ":");
     872            0 :       ira_print_expanded_allocno (ALLOCNO_CAP_MEMBER (a));
     873              :     }
     874          959 :   fprintf (ira_dump_file, ")");
     875          959 : }
     876              : 
     877              : /* Create and return the cap representing allocno A in the
     878              :    parent loop.  */
     879              : static ira_allocno_t
     880      3653325 : create_cap_allocno (ira_allocno_t a)
     881              : {
     882      3653325 :   ira_allocno_t cap;
     883      3653325 :   ira_loop_tree_node_t parent;
     884      3653325 :   enum reg_class aclass;
     885              : 
     886      3653325 :   parent = ALLOCNO_LOOP_TREE_NODE (a)->parent;
     887      3653325 :   cap = ira_create_allocno (ALLOCNO_REGNO (a), true, parent);
     888      3653325 :   ALLOCNO_MODE (cap) = ALLOCNO_MODE (a);
     889      3653325 :   ALLOCNO_WMODE (cap) = ALLOCNO_WMODE (a);
     890      3653325 :   aclass = ALLOCNO_CLASS (a);
     891      3653325 :   ira_set_allocno_class (cap, aclass);
     892      3653325 :   ira_create_allocno_objects (cap);
     893      3653325 :   ALLOCNO_CAP_MEMBER (cap) = a;
     894      3653325 :   ALLOCNO_CAP (a) = cap;
     895      3653325 :   ALLOCNO_CLASS_COST (cap) = ALLOCNO_CLASS_COST (a);
     896      3653325 :   ALLOCNO_MEMORY_COST (cap) = ALLOCNO_MEMORY_COST (a);
     897      3653325 :   ira_allocate_and_copy_costs
     898      3653325 :     (&ALLOCNO_HARD_REG_COSTS (cap), aclass, ALLOCNO_HARD_REG_COSTS (a));
     899      3653325 :   ira_allocate_and_copy_costs
     900      3653325 :     (&ALLOCNO_CONFLICT_HARD_REG_COSTS (cap), aclass,
     901              :      ALLOCNO_CONFLICT_HARD_REG_COSTS (a));
     902      3653325 :   ALLOCNO_BAD_SPILL_P (cap) = ALLOCNO_BAD_SPILL_P (a);
     903      3653325 :   ALLOCNO_NREFS (cap) = ALLOCNO_NREFS (a);
     904      3653325 :   ALLOCNO_FREQ (cap) = ALLOCNO_FREQ (a);
     905      3653325 :   ALLOCNO_CALL_FREQ (cap) = ALLOCNO_CALL_FREQ (a);
     906      3653325 :   ALLOCNO_SET_REGISTER_FILTERS (cap, ALLOCNO_REGISTER_FILTERS (a));
     907              : 
     908      3653325 :   merge_hard_reg_conflicts (a, cap, false);
     909              : 
     910      3653325 :   ALLOCNO_CALLS_CROSSED_NUM (cap) = ALLOCNO_CALLS_CROSSED_NUM (a);
     911      3653325 :   ALLOCNO_CHEAP_CALLS_CROSSED_NUM (cap) = ALLOCNO_CHEAP_CALLS_CROSSED_NUM (a);
     912      3653325 :   ALLOCNO_CROSSED_CALLS_ABIS (cap) = ALLOCNO_CROSSED_CALLS_ABIS (a);
     913      3653325 :   ALLOCNO_CROSSED_CALLS_CLOBBERED_REGS (cap)
     914      3653325 :     = ALLOCNO_CROSSED_CALLS_CLOBBERED_REGS (a);
     915      3653325 :   if (internal_flag_ira_verbose > 2 && ira_dump_file != NULL)
     916              :     {
     917            0 :       fprintf (ira_dump_file, "    Creating cap ");
     918            0 :       ira_print_expanded_allocno (cap);
     919            0 :       fprintf (ira_dump_file, "\n");
     920              :     }
     921      3653325 :   return cap;
     922              : }
     923              : 
     924              : /* Create and return a live range for OBJECT with given attributes.  */
     925              : live_range_t
     926     62682454 : ira_create_live_range (ira_object_t obj, int start, int finish,
     927              :                        live_range_t next)
     928              : {
     929     62682454 :   live_range_t p;
     930              : 
     931     62682454 :   p = live_range_pool.allocate ();
     932     62682454 :   p->object = obj;
     933     62682454 :   p->start = start;
     934     62682454 :   p->finish = finish;
     935     62682454 :   p->next = next;
     936     62682454 :   return p;
     937              : }
     938              : 
     939              : /* Create a new live range for OBJECT and queue it at the head of its
     940              :    live range list.  */
     941              : void
     942     62682454 : ira_add_live_range_to_object (ira_object_t object, int start, int finish)
     943              : {
     944     62682454 :   live_range_t p;
     945     62682454 :   p = ira_create_live_range (object, start, finish,
     946              :                              OBJECT_LIVE_RANGES (object));
     947     62682454 :   OBJECT_LIVE_RANGES (object) = p;
     948     62682454 : }
     949              : 
     950              : /* Copy allocno live range R and return the result.  */
     951              : static live_range_t
     952            0 : copy_live_range (live_range_t r)
     953              : {
     954            0 :   live_range_t p;
     955              : 
     956            0 :   p = live_range_pool.allocate ();
     957            0 :   *p = *r;
     958            0 :   return p;
     959              : }
     960              : 
     961              : /* Copy allocno live range list given by its head R and return the
     962              :    result.  */
     963              : live_range_t
     964            0 : ira_copy_live_range_list (live_range_t r)
     965              : {
     966            0 :   live_range_t p, first, last;
     967              : 
     968            0 :   if (r == NULL)
     969              :     return NULL;
     970            0 :   for (first = last = NULL; r != NULL; r = r->next)
     971              :     {
     972            0 :       p = copy_live_range (r);
     973            0 :       if (first == NULL)
     974              :         first = p;
     975              :       else
     976            0 :         last->next = p;
     977            0 :       last = p;
     978              :     }
     979              :   return first;
     980              : }
     981              : 
     982              : /* Merge ranges R1 and R2 and returns the result.  The function
     983              :    maintains the order of ranges and tries to minimize number of the
     984              :    result ranges.  */
     985              : live_range_t
     986      2465174 : ira_merge_live_ranges (live_range_t r1, live_range_t r2)
     987              : {
     988      2465174 :   live_range_t first, last;
     989              : 
     990      2465174 :   if (r1 == NULL)
     991              :     return r2;
     992      2465171 :   if (r2 == NULL)
     993              :     return r1;
     994     18847389 :   for (first = last = NULL; r1 != NULL && r2 != NULL;)
     995              :     {
     996     16384056 :       if (r1->start < r2->start)
     997     12149396 :         std::swap (r1, r2);
     998     16384056 :       if (r1->start <= r2->finish + 1)
     999              :         {
    1000              :           /* Intersected ranges: merge r1 and r2 into r1.  */
    1001      1012545 :           r1->start = r2->start;
    1002      1012545 :           if (r1->finish < r2->finish)
    1003            0 :             r1->finish = r2->finish;
    1004      1012545 :           live_range_t temp = r2;
    1005      1012545 :           r2 = r2->next;
    1006      1012545 :           ira_finish_live_range (temp);
    1007      1012545 :           if (r2 == NULL)
    1008              :             {
    1009              :               /* To try to merge with subsequent ranges in r1.  */
    1010       964061 :               r2 = r1->next;
    1011       964061 :               r1->next = NULL;
    1012              :             }
    1013              :         }
    1014              :       else
    1015              :         {
    1016              :           /* Add r1 to the result.  */
    1017     15371511 :           if (first == NULL)
    1018              :             first = last = r1;
    1019              :           else
    1020              :             {
    1021     13259058 :               last->next = r1;
    1022     13259058 :               last = r1;
    1023              :             }
    1024     15371511 :           r1 = r1->next;
    1025     15371511 :           if (r1 == NULL)
    1026              :             {
    1027              :               /* To try to merge with subsequent ranges in r2.  */
    1028     13531204 :               r1 = r2->next;
    1029     13531204 :               r2->next = NULL;
    1030              :             }
    1031              :         }
    1032              :     }
    1033      2463333 :   if (r1 != NULL)
    1034              :     {
    1035       358197 :       if (first == NULL)
    1036              :         first = r1;
    1037              :       else
    1038         7317 :         last->next = r1;
    1039       358197 :       ira_assert (r1->next == NULL);
    1040              :     }
    1041      2105136 :   else if (r2 != NULL)
    1042              :     {
    1043      2105136 :       if (first == NULL)
    1044              :         first = r2;
    1045              :       else
    1046      2105136 :         last->next = r2;
    1047      2105136 :       ira_assert (r2->next == NULL);
    1048              :     }
    1049              :   else
    1050              :     {
    1051            0 :       ira_assert (last->next == NULL);
    1052              :     }
    1053              :   return first;
    1054              : }
    1055              : 
    1056              : /* Return TRUE if live ranges R1 and R2 intersect.  */
    1057              : bool
    1058     19564520 : ira_live_ranges_intersect_p (live_range_t r1, live_range_t r2)
    1059              : {
    1060              :   /* Remember the live ranges are always kept ordered.  */
    1061     45394409 :   while (r1 != NULL && r2 != NULL)
    1062              :     {
    1063     27014186 :       if (r1->start > r2->finish)
    1064     18766269 :         r1 = r1->next;
    1065      8247917 :       else if (r2->start > r1->finish)
    1066      7063620 :         r2 = r2->next;
    1067              :       else
    1068              :         return true;
    1069              :     }
    1070              :   return false;
    1071              : }
    1072              : 
    1073              : /* Free allocno live range R.  */
    1074              : void
    1075     62682454 : ira_finish_live_range (live_range_t r)
    1076              : {
    1077     62682454 :   live_range_pool.remove (r);
    1078     62682454 : }
    1079              : 
    1080              : /* Free list of allocno live ranges starting with R.  */
    1081              : void
    1082     40102368 : ira_finish_live_range_list (live_range_t r)
    1083              : {
    1084     40102368 :   live_range_t next_r;
    1085              : 
    1086     89263105 :   for (; r != NULL; r = next_r)
    1087              :     {
    1088     49160737 :       next_r = r->next;
    1089     49160737 :       ira_finish_live_range (r);
    1090              :     }
    1091     40102368 : }
    1092              : 
    1093              : /* Free updated register costs of allocno A.  */
    1094              : void
    1095     57845695 : ira_free_allocno_updated_costs (ira_allocno_t a)
    1096              : {
    1097     57845695 :   enum reg_class aclass;
    1098              : 
    1099     57845695 :   aclass = ALLOCNO_CLASS (a);
    1100     57845695 :   if (ALLOCNO_UPDATED_HARD_REG_COSTS (a) != NULL)
    1101     13102940 :     ira_free_cost_vector (ALLOCNO_UPDATED_HARD_REG_COSTS (a), aclass);
    1102     57845695 :   ALLOCNO_UPDATED_HARD_REG_COSTS (a) = NULL;
    1103     57845695 :   if (ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (a) != NULL)
    1104      7297290 :     ira_free_cost_vector (ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (a),
    1105              :                           aclass);
    1106     57845695 :   ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (a) = NULL;
    1107     57845695 : }
    1108              : 
    1109              : /* Free and nullify all cost vectors allocated earlier for allocno
    1110              :    A.  */
    1111              : static void
    1112     38789470 : ira_free_allocno_costs (ira_allocno_t a)
    1113              : {
    1114     38789470 :   enum reg_class aclass = ALLOCNO_CLASS (a);
    1115     38789470 :   ira_object_t obj;
    1116     38789470 :   ira_allocno_object_iterator oi;
    1117              : 
    1118     78891838 :   FOR_EACH_ALLOCNO_OBJECT (a, obj, oi)
    1119              :     {
    1120     40102368 :       ira_finish_live_range_list (OBJECT_LIVE_RANGES (obj));
    1121     40102368 :       ira_object_id_map[OBJECT_CONFLICT_ID (obj)] = NULL;
    1122     40102368 :       if (OBJECT_CONFLICT_ARRAY (obj) != NULL)
    1123     24489492 :         ira_free (OBJECT_CONFLICT_ARRAY (obj));
    1124     40102368 :       object_pool.remove (obj);
    1125              :     }
    1126              : 
    1127     38789470 :   ira_allocnos[ALLOCNO_NUM (a)] = NULL;
    1128     38789470 :   if (ALLOCNO_HARD_REG_COSTS (a) != NULL)
    1129     10118248 :     ira_free_cost_vector (ALLOCNO_HARD_REG_COSTS (a), aclass);
    1130     38789470 :   if (ALLOCNO_CONFLICT_HARD_REG_COSTS (a) != NULL)
    1131      1180418 :     ira_free_cost_vector (ALLOCNO_CONFLICT_HARD_REG_COSTS (a), aclass);
    1132     38789470 :   if (ALLOCNO_UPDATED_HARD_REG_COSTS (a) != NULL)
    1133            0 :     ira_free_cost_vector (ALLOCNO_UPDATED_HARD_REG_COSTS (a), aclass);
    1134     38789470 :   if (ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (a) != NULL)
    1135            0 :     ira_free_cost_vector (ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (a),
    1136              :                           aclass);
    1137     38789470 :   ALLOCNO_HARD_REG_COSTS (a) = NULL;
    1138     38789470 :   ALLOCNO_CONFLICT_HARD_REG_COSTS (a) = NULL;
    1139     38789470 :   ALLOCNO_UPDATED_HARD_REG_COSTS (a) = NULL;
    1140     38789470 :   ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (a) = NULL;
    1141     38789470 : }
    1142              : 
    1143              : /* Free the memory allocated for allocno A.  */
    1144              : static void
    1145     38789470 : finish_allocno (ira_allocno_t a)
    1146              : {
    1147     38789470 :   ira_free_allocno_costs (a);
    1148     38789470 :   allocno_pool.remove (a);
    1149     38789470 : }
    1150              : 
    1151              : /* Free the memory allocated for all allocnos.  */
    1152              : static void
    1153      1474414 : finish_allocnos (void)
    1154              : {
    1155      1474414 :   ira_allocno_t a;
    1156      1474414 :   ira_allocno_iterator ai;
    1157              : 
    1158     37804738 :   FOR_EACH_ALLOCNO (a, ai)
    1159     36330324 :     finish_allocno (a);
    1160      1474414 :   ira_free (ira_regno_allocno_map);
    1161      1474414 :   ira_object_id_map_vec.release ();
    1162      1474414 :   allocno_vec.release ();
    1163      1474414 :   allocno_pool.release ();
    1164      1474414 :   object_pool.release ();
    1165      1474414 :   live_range_pool.release ();
    1166      1474414 : }
    1167              : 
    1168              : 
    1169              : 
    1170              : /* Pools for allocno preferences.  */
    1171              : static object_allocator <ira_allocno_pref> pref_pool ("prefs");
    1172              : 
    1173              : /* Vec containing references to all created preferences.  It is a
    1174              :    container of array ira_prefs.  */
    1175              : static vec<ira_pref_t> pref_vec;
    1176              : 
    1177              : /* The function initializes data concerning allocno prefs.  */
    1178              : static void
    1179      1474414 : initiate_prefs (void)
    1180              : {
    1181      1474414 :   pref_vec.create (get_max_uid ());
    1182      1474414 :   ira_prefs = NULL;
    1183      1474414 :   ira_prefs_num = 0;
    1184      1474414 : }
    1185              : 
    1186              : /* Return pref for A and HARD_REGNO if any.  */
    1187              : static ira_pref_t
    1188      7550981 : find_allocno_pref (ira_allocno_t a, int hard_regno)
    1189              : {
    1190      7550981 :   ira_pref_t pref;
    1191              : 
    1192      7605495 :   for (pref = ALLOCNO_PREFS (a); pref != NULL; pref = pref->next_pref)
    1193       506086 :     if (pref->allocno == a && pref->hard_regno == hard_regno)
    1194              :       return pref;
    1195              :   return NULL;
    1196              : }
    1197              : 
    1198              : /* Create and return pref with given attributes A, HARD_REGNO, and FREQ.  */
    1199              : ira_pref_t
    1200      7099409 : ira_create_pref (ira_allocno_t a, int hard_regno, int freq)
    1201              : {
    1202      7099409 :   ira_pref_t pref;
    1203              : 
    1204      7099409 :   pref = pref_pool.allocate ();
    1205      7099409 :   pref->num = ira_prefs_num;
    1206      7099409 :   pref->allocno = a;
    1207      7099409 :   pref->hard_regno = hard_regno;
    1208      7099409 :   pref->freq = freq;
    1209      7099409 :   pref_vec.safe_push (pref);
    1210      7099409 :   ira_prefs = pref_vec.address ();
    1211      7099409 :   ira_prefs_num = pref_vec.length ();
    1212      7099409 :   return pref;
    1213              : }
    1214              : 
    1215              : /* Attach a pref PREF to the corresponding allocno.  */
    1216              : static void
    1217      7099409 : add_allocno_pref_to_list (ira_pref_t pref)
    1218              : {
    1219      7099409 :   ira_allocno_t a = pref->allocno;
    1220              : 
    1221      7099409 :   pref->next_pref = ALLOCNO_PREFS (a);
    1222      7099409 :   ALLOCNO_PREFS (a) = pref;
    1223      7099409 : }
    1224              : 
    1225              : /* Create (or update frequency if the pref already exists) the pref of
    1226              :    allocnos A preferring HARD_REGNO with frequency FREQ.  */
    1227              : void
    1228      7599381 : ira_add_allocno_pref (ira_allocno_t a, int hard_regno, int freq)
    1229              : {
    1230      7599381 :   ira_pref_t pref;
    1231              : 
    1232      7599381 :   if (freq <= 0)
    1233              :     return;
    1234     15101962 :   if ((pref = find_allocno_pref (a, hard_regno)) != NULL)
    1235              :     {
    1236       451572 :       pref->freq += freq;
    1237       451572 :       return;
    1238              :     }
    1239      7099409 :   pref = ira_create_pref (a, hard_regno, freq);
    1240      7099409 :   ira_assert (a != NULL);
    1241      7099409 :   add_allocno_pref_to_list (pref);
    1242              : }
    1243              : 
    1244              : /* Print info about PREF into file F.  */
    1245              : static void
    1246          191 : print_pref (FILE *f, ira_pref_t pref)
    1247              : {
    1248          191 :   fprintf (f, "  pref%d:a%d(r%d)<-hr%d@%d\n", pref->num,
    1249          191 :            ALLOCNO_NUM (pref->allocno), ALLOCNO_REGNO (pref->allocno),
    1250              :            pref->hard_regno, pref->freq);
    1251          191 : }
    1252              : 
    1253              : /* Print info about PREF into stderr.  */
    1254              : void
    1255            0 : ira_debug_pref (ira_pref_t pref)
    1256              : {
    1257            0 :   print_pref (stderr, pref);
    1258            0 : }
    1259              : 
    1260              : /* Print info about all prefs into file F.  */
    1261              : static void
    1262           95 : print_prefs (FILE *f)
    1263              : {
    1264           95 :   ira_pref_t pref;
    1265           95 :   ira_pref_iterator pi;
    1266              : 
    1267          286 :   FOR_EACH_PREF (pref, pi)
    1268          191 :     print_pref (f, pref);
    1269           95 : }
    1270              : 
    1271              : /* Print info about all prefs into stderr.  */
    1272              : void
    1273            0 : ira_debug_prefs (void)
    1274              : {
    1275            0 :   print_prefs (stderr);
    1276            0 : }
    1277              : 
    1278              : /* Print info about prefs involving allocno A into file F.  */
    1279              : static void
    1280            0 : print_allocno_prefs (FILE *f, ira_allocno_t a)
    1281              : {
    1282            0 :   ira_pref_t pref;
    1283              : 
    1284            0 :   fprintf (f, " a%d(r%d):", ALLOCNO_NUM (a), ALLOCNO_REGNO (a));
    1285            0 :   for (pref = ALLOCNO_PREFS (a); pref != NULL; pref = pref->next_pref)
    1286            0 :     fprintf (f, " pref%d:hr%d@%d", pref->num, pref->hard_regno, pref->freq);
    1287            0 :   fprintf (f, "\n");
    1288            0 : }
    1289              : 
    1290              : /* Print info about prefs involving allocno A into stderr.  */
    1291              : void
    1292            0 : ira_debug_allocno_prefs (ira_allocno_t a)
    1293              : {
    1294            0 :   print_allocno_prefs (stderr, a);
    1295            0 : }
    1296              : 
    1297              : /* The function frees memory allocated for PREF.  */
    1298              : static void
    1299      7099409 : finish_pref (ira_pref_t pref)
    1300              : {
    1301      7099409 :   ira_prefs[pref->num] = NULL;
    1302      7099409 :   pref_pool.remove (pref);
    1303      7099409 : }
    1304              : 
    1305              : /* Remove PREF from the list of allocno prefs and free memory for
    1306              :    it.  */
    1307              : void
    1308       835445 : ira_remove_pref (ira_pref_t pref)
    1309              : {
    1310       835445 :   ira_pref_t cpref, prev;
    1311              : 
    1312       835445 :   if (internal_flag_ira_verbose > 1 && ira_dump_file != NULL)
    1313           14 :     fprintf (ira_dump_file, " Removing pref%d:hr%d@%d\n",
    1314              :              pref->num, pref->hard_regno, pref->freq);
    1315       835445 :   for (prev = NULL, cpref = ALLOCNO_PREFS (pref->allocno);
    1316       841230 :        cpref != NULL;
    1317         5785 :        prev = cpref, cpref = cpref->next_pref)
    1318       841230 :     if (cpref == pref)
    1319              :       break;
    1320       835445 :   ira_assert (cpref != NULL);
    1321       835445 :   if (prev == NULL)
    1322       829662 :     ALLOCNO_PREFS (pref->allocno) = pref->next_pref;
    1323              :   else
    1324         5783 :     prev->next_pref = pref->next_pref;
    1325       835445 :   finish_pref (pref);
    1326       835445 : }
    1327              : 
    1328              : /* Remove all prefs of allocno A.  */
    1329              : void
    1330      2459146 : ira_remove_allocno_prefs (ira_allocno_t a)
    1331              : {
    1332      2459146 :   ira_pref_t pref, next_pref;
    1333              : 
    1334      2502466 :   for (pref = ALLOCNO_PREFS (a); pref != NULL; pref = next_pref)
    1335              :     {
    1336        43320 :       next_pref = pref->next_pref;
    1337        43320 :       finish_pref (pref);
    1338              :     }
    1339      2459146 :   ALLOCNO_PREFS (a) = NULL;
    1340      2459146 : }
    1341              : 
    1342              : /* Free memory allocated for all prefs.  */
    1343              : static void
    1344      1474414 : finish_prefs (void)
    1345              : {
    1346      1474414 :   ira_pref_t pref;
    1347      1474414 :   ira_pref_iterator pi;
    1348              : 
    1349      7695058 :   FOR_EACH_PREF (pref, pi)
    1350      6220644 :     finish_pref (pref);
    1351      1474414 :   pref_vec.release ();
    1352      1474414 :   pref_pool.release ();
    1353      1474414 : }
    1354              : 
    1355              : 
    1356              : 
    1357              : /* Pools for copies.  */
    1358              : static object_allocator<ira_allocno_copy> copy_pool ("copies");
    1359              : 
    1360              : /* Vec containing references to all created copies.  It is a
    1361              :    container of array ira_copies.  */
    1362              : static vec<ira_copy_t> copy_vec;
    1363              : 
    1364              : /* The function initializes data concerning allocno copies.  */
    1365              : static void
    1366      1474414 : initiate_copies (void)
    1367              : {
    1368      1474414 :   copy_vec.create (get_max_uid ());
    1369      1474414 :   ira_copies = NULL;
    1370      1474414 :   ira_copies_num = 0;
    1371      1474414 : }
    1372              : 
    1373              : /* Return copy connecting A1 and A2 and originated from INSN of
    1374              :    LOOP_TREE_NODE if any.  */
    1375              : static ira_copy_t
    1376      9338958 : find_allocno_copy (ira_allocno_t a1, ira_allocno_t a2, rtx_insn *insn,
    1377              :                    ira_loop_tree_node_t loop_tree_node)
    1378              : {
    1379      9338958 :   ira_copy_t cp, next_cp;
    1380      9338958 :   ira_allocno_t another_a;
    1381              : 
    1382     18441992 :   for (cp = ALLOCNO_COPIES (a1); cp != NULL; cp = next_cp)
    1383              :     {
    1384      9156113 :       if (cp->first == a1)
    1385              :         {
    1386      6914424 :           next_cp = cp->next_first_allocno_copy;
    1387      6914424 :           another_a = cp->second;
    1388              :         }
    1389      2241689 :       else if (cp->second == a1)
    1390              :         {
    1391      2241689 :           next_cp = cp->next_second_allocno_copy;
    1392      2241689 :           another_a = cp->first;
    1393              :         }
    1394              :       else
    1395            0 :         gcc_unreachable ();
    1396      9156113 :       if (another_a == a2 && cp->insn == insn
    1397        53140 :           && cp->loop_tree_node == loop_tree_node)
    1398              :         return cp;
    1399              :     }
    1400              :   return NULL;
    1401              : }
    1402              : 
    1403              : /* Create and return copy with given attributes LOOP_TREE_NODE, FIRST,
    1404              :    SECOND, FREQ, CONSTRAINT_P, and INSN.  */
    1405              : ira_copy_t
    1406      9285879 : ira_create_copy (ira_allocno_t first, ira_allocno_t second, int freq,
    1407              :                  bool constraint_p, rtx_insn *insn,
    1408              :                  ira_loop_tree_node_t loop_tree_node)
    1409              : {
    1410      9285879 :   ira_copy_t cp;
    1411              : 
    1412      9285879 :   cp = copy_pool.allocate ();
    1413      9285879 :   cp->num = ira_copies_num;
    1414      9285879 :   cp->first = first;
    1415      9285879 :   cp->second = second;
    1416      9285879 :   cp->freq = freq;
    1417      9285879 :   cp->constraint_p = constraint_p;
    1418      9285879 :   cp->insn = insn;
    1419      9285879 :   cp->loop_tree_node = loop_tree_node;
    1420      9285879 :   copy_vec.safe_push (cp);
    1421      9285879 :   ira_copies = copy_vec.address ();
    1422      9285879 :   ira_copies_num = copy_vec.length ();
    1423      9285879 :   return cp;
    1424              : }
    1425              : 
    1426              : /* Attach a copy CP to allocnos involved into the copy.  */
    1427              : static void
    1428      9285879 : add_allocno_copy_to_list (ira_copy_t cp)
    1429              : {
    1430      9285879 :   ira_allocno_t first = cp->first, second = cp->second;
    1431              : 
    1432      9285879 :   cp->prev_first_allocno_copy = NULL;
    1433      9285879 :   cp->prev_second_allocno_copy = NULL;
    1434      9285879 :   cp->next_first_allocno_copy = ALLOCNO_COPIES (first);
    1435      9285879 :   if (cp->next_first_allocno_copy != NULL)
    1436              :     {
    1437      3805368 :       if (cp->next_first_allocno_copy->first == first)
    1438      2577458 :         cp->next_first_allocno_copy->prev_first_allocno_copy = cp;
    1439              :       else
    1440      1227910 :         cp->next_first_allocno_copy->prev_second_allocno_copy = cp;
    1441              :     }
    1442      9285879 :   cp->next_second_allocno_copy = ALLOCNO_COPIES (second);
    1443      9285879 :   if (cp->next_second_allocno_copy != NULL)
    1444              :     {
    1445      2952005 :       if (cp->next_second_allocno_copy->second == second)
    1446       483503 :         cp->next_second_allocno_copy->prev_second_allocno_copy = cp;
    1447              :       else
    1448      2468502 :         cp->next_second_allocno_copy->prev_first_allocno_copy = cp;
    1449              :     }
    1450      9285879 :   ALLOCNO_COPIES (first) = cp;
    1451      9285879 :   ALLOCNO_COPIES (second) = cp;
    1452      9285879 : }
    1453              : 
    1454              : /* Make a copy CP a canonical copy where number of the
    1455              :    first allocno is less than the second one.  */
    1456              : static void
    1457      9285879 : swap_allocno_copy_ends_if_necessary (ira_copy_t cp)
    1458              : {
    1459      9285879 :   if (ALLOCNO_NUM (cp->first) <= ALLOCNO_NUM (cp->second))
    1460              :     return;
    1461              : 
    1462      5943822 :   std::swap (cp->first, cp->second);
    1463      5943822 :   std::swap (cp->prev_first_allocno_copy, cp->prev_second_allocno_copy);
    1464      5943822 :   std::swap (cp->next_first_allocno_copy, cp->next_second_allocno_copy);
    1465              : }
    1466              : 
    1467              : /* Create (or update frequency if the copy already exists) and return
    1468              :    the copy of allocnos FIRST and SECOND with frequency FREQ
    1469              :    corresponding to move insn INSN (if any) and originated from
    1470              :    LOOP_TREE_NODE.  */
    1471              : ira_copy_t
    1472      9338958 : ira_add_allocno_copy (ira_allocno_t first, ira_allocno_t second, int freq,
    1473              :                       bool constraint_p, rtx_insn *insn,
    1474              :                       ira_loop_tree_node_t loop_tree_node)
    1475              : {
    1476      9338958 :   ira_copy_t cp;
    1477              : 
    1478      9338958 :   if ((cp = find_allocno_copy (first, second, insn, loop_tree_node)) != NULL)
    1479              :     {
    1480        53079 :       cp->freq += freq;
    1481        53079 :       return cp;
    1482              :     }
    1483      9285879 :   cp = ira_create_copy (first, second, freq, constraint_p, insn,
    1484              :                         loop_tree_node);
    1485      9285879 :   ira_assert (first != NULL && second != NULL);
    1486      9285879 :   add_allocno_copy_to_list (cp);
    1487      9285879 :   swap_allocno_copy_ends_if_necessary (cp);
    1488      9285879 :   return cp;
    1489              : }
    1490              : 
    1491              : /* Print info about copy CP into file F.  */
    1492              : static void
    1493          160 : print_copy (FILE *f, ira_copy_t cp)
    1494              : {
    1495          320 :   fprintf (f, "  cp%d:a%d(r%d)<->a%d(r%d)@%d:%s\n", cp->num,
    1496          160 :            ALLOCNO_NUM (cp->first), ALLOCNO_REGNO (cp->first),
    1497          160 :            ALLOCNO_NUM (cp->second), ALLOCNO_REGNO (cp->second), cp->freq,
    1498          160 :            cp->insn != NULL
    1499          120 :            ? "move" : cp->constraint_p ? "constraint" : "shuffle");
    1500          160 : }
    1501              : 
    1502              : DEBUG_FUNCTION void
    1503            0 : debug (ira_allocno_copy &ref)
    1504              : {
    1505            0 :   print_copy (stderr, &ref);
    1506            0 : }
    1507              : 
    1508              : DEBUG_FUNCTION void
    1509            0 : debug (ira_allocno_copy *ptr)
    1510              : {
    1511            0 :   if (ptr)
    1512            0 :     debug (*ptr);
    1513              :   else
    1514            0 :     fprintf (stderr, "<nil>\n");
    1515            0 : }
    1516              : 
    1517              : /* Print info about copy CP into stderr.  */
    1518              : void
    1519            0 : ira_debug_copy (ira_copy_t cp)
    1520              : {
    1521            0 :   print_copy (stderr, cp);
    1522            0 : }
    1523              : 
    1524              : /* Print info about all copies into file F.  */
    1525              : static void
    1526           95 : print_copies (FILE *f)
    1527              : {
    1528           95 :   ira_copy_t cp;
    1529           95 :   ira_copy_iterator ci;
    1530              : 
    1531          255 :   FOR_EACH_COPY (cp, ci)
    1532          160 :     print_copy (f, cp);
    1533           95 : }
    1534              : 
    1535              : /* Print info about all copies into stderr.  */
    1536              : void
    1537            0 : ira_debug_copies (void)
    1538              : {
    1539            0 :   print_copies (stderr);
    1540            0 : }
    1541              : 
    1542              : /* Print info about copies involving allocno A into file F.  */
    1543              : static void
    1544            0 : print_allocno_copies (FILE *f, ira_allocno_t a)
    1545              : {
    1546            0 :   ira_allocno_t another_a;
    1547            0 :   ira_copy_t cp, next_cp;
    1548              : 
    1549            0 :   fprintf (f, " a%d(r%d):", ALLOCNO_NUM (a), ALLOCNO_REGNO (a));
    1550            0 :   for (cp = ALLOCNO_COPIES (a); cp != NULL; cp = next_cp)
    1551              :     {
    1552            0 :       if (cp->first == a)
    1553              :         {
    1554            0 :           next_cp = cp->next_first_allocno_copy;
    1555            0 :           another_a = cp->second;
    1556              :         }
    1557            0 :       else if (cp->second == a)
    1558              :         {
    1559            0 :           next_cp = cp->next_second_allocno_copy;
    1560            0 :           another_a = cp->first;
    1561              :         }
    1562              :       else
    1563            0 :         gcc_unreachable ();
    1564            0 :       fprintf (f, " cp%d:a%d(r%d)@%d", cp->num,
    1565              :                ALLOCNO_NUM (another_a), ALLOCNO_REGNO (another_a), cp->freq);
    1566              :     }
    1567            0 :   fprintf (f, "\n");
    1568            0 : }
    1569              : 
    1570              : DEBUG_FUNCTION void
    1571            0 : debug (ira_allocno &ref)
    1572              : {
    1573            0 :   print_allocno_copies (stderr, &ref);
    1574            0 : }
    1575              : 
    1576              : DEBUG_FUNCTION void
    1577            0 : debug (ira_allocno *ptr)
    1578              : {
    1579            0 :   if (ptr)
    1580            0 :     debug (*ptr);
    1581              :   else
    1582            0 :     fprintf (stderr, "<nil>\n");
    1583            0 : }
    1584              : 
    1585              : 
    1586              : /* Print info about copies involving allocno A into stderr.  */
    1587              : void
    1588            0 : ira_debug_allocno_copies (ira_allocno_t a)
    1589              : {
    1590            0 :   print_allocno_copies (stderr, a);
    1591            0 : }
    1592              : 
    1593              : /* The function frees memory allocated for copy CP.  */
    1594              : static void
    1595      9285879 : finish_copy (ira_copy_t cp)
    1596              : {
    1597            0 :   copy_pool.remove (cp);
    1598      9285879 : }
    1599              : 
    1600              : 
    1601              : /* Free memory allocated for all copies.  */
    1602              : static void
    1603      1474414 : finish_copies (void)
    1604              : {
    1605      1474414 :   ira_copy_t cp;
    1606      1474414 :   ira_copy_iterator ci;
    1607              : 
    1608     10760293 :   FOR_EACH_COPY (cp, ci)
    1609      9285879 :     finish_copy (cp);
    1610      1474414 :   copy_vec.release ();
    1611      1474414 :   copy_pool.release ();
    1612      1474414 : }
    1613              : 
    1614              : 
    1615              : 
    1616              : /* Pools for cost vectors.  It is defined only for allocno classes.  */
    1617              : static pool_allocator *cost_vector_pool[N_REG_CLASSES];
    1618              : 
    1619              : /* The function initiates work with hard register cost vectors.  It
    1620              :    creates allocation pool for each allocno class.  */
    1621              : static void
    1622      1474414 : initiate_cost_vectors (void)
    1623              : {
    1624      1474414 :   int i;
    1625      1474414 :   enum reg_class aclass;
    1626              : 
    1627     38315166 :   for (i = 0; i < ira_allocno_classes_num; i++)
    1628              :     {
    1629     36840752 :       aclass = ira_allocno_classes[i];
    1630     36840752 :       cost_vector_pool[aclass] = new pool_allocator
    1631     36840752 :         ("cost vectors", sizeof (int) * (ira_class_hard_regs_num[aclass]));
    1632              :     }
    1633      1474414 : }
    1634              : 
    1635              : /* Allocate and return a cost vector VEC for ACLASS.  */
    1636              : int *
    1637     31698896 : ira_allocate_cost_vector (reg_class_t aclass)
    1638              : {
    1639     31698896 :   return (int*) cost_vector_pool[(int) aclass]->allocate ();
    1640              : }
    1641              : 
    1642              : /* Free a cost vector VEC for ACLASS.  */
    1643              : void
    1644     31698896 : ira_free_cost_vector (int *vec, reg_class_t aclass)
    1645              : {
    1646     31698896 :   ira_assert (vec != NULL);
    1647     31698896 :   cost_vector_pool[(int) aclass]->remove (vec);
    1648     31698896 : }
    1649              : 
    1650              : /* Finish work with hard register cost vectors.  Release allocation
    1651              :    pool for each allocno class.  */
    1652              : static void
    1653      1474414 : finish_cost_vectors (void)
    1654              : {
    1655      1474414 :   int i;
    1656      1474414 :   enum reg_class aclass;
    1657              : 
    1658     38315166 :   for (i = 0; i < ira_allocno_classes_num; i++)
    1659              :     {
    1660     36840752 :       aclass = ira_allocno_classes[i];
    1661     73681504 :       delete cost_vector_pool[aclass];
    1662              :     }
    1663      1474414 : }
    1664              : 
    1665              : 
    1666              : 
    1667              : /* Compute a post-ordering of the reverse control flow of the loop body
    1668              :    designated by the children nodes of LOOP_NODE, whose body nodes in
    1669              :    pre-order are input as LOOP_PREORDER.  Return a VEC with a post-order
    1670              :    of the reverse loop body.
    1671              : 
    1672              :    For the post-order of the reverse CFG, we visit the basic blocks in
    1673              :    LOOP_PREORDER array in the reverse order of where they appear.
    1674              :    This is important: We do not just want to compute a post-order of
    1675              :    the reverse CFG, we want to make a best-guess for a visiting order that
    1676              :    minimizes the number of chain elements per allocno live range.  If the
    1677              :    blocks would be visited in a different order, we would still compute a
    1678              :    correct post-ordering but it would be less likely that two nodes
    1679              :    connected by an edge in the CFG are neighbors in the topsort.  */
    1680              : 
    1681              : static vec<ira_loop_tree_node_t>
    1682      2087861 : ira_loop_tree_body_rev_postorder (ira_loop_tree_node_t loop_node ATTRIBUTE_UNUSED,
    1683              :                                   const vec<ira_loop_tree_node_t> &loop_preorder)
    1684              : {
    1685      2087861 :   vec<ira_loop_tree_node_t> topsort_nodes = vNULL;
    1686      2087861 :   unsigned int n_loop_preorder;
    1687              : 
    1688      2087861 :   n_loop_preorder = loop_preorder.length ();
    1689      2087861 :   if (n_loop_preorder != 0)
    1690              :     {
    1691      2087861 :       ira_loop_tree_node_t subloop_node;
    1692      2087861 :       unsigned int i;
    1693      2087861 :       auto_vec<ira_loop_tree_node_t> dfs_stack;
    1694              : 
    1695              :       /* This is a bit of strange abuse of the BB_VISITED flag:  We use
    1696              :          the flag to mark blocks we still have to visit to add them to
    1697              :          our post-order.  Define an alias to avoid confusion.  */
    1698              : #define BB_TO_VISIT BB_VISITED
    1699              : 
    1700     16411039 :       FOR_EACH_VEC_ELT (loop_preorder, i, subloop_node)
    1701              :         {
    1702     14323178 :           gcc_checking_assert (! (subloop_node->bb->flags & BB_TO_VISIT));
    1703     14323178 :           subloop_node->bb->flags |= BB_TO_VISIT;
    1704              :         }
    1705              : 
    1706      2087861 :       topsort_nodes.create (n_loop_preorder);
    1707      2087861 :       dfs_stack.create (n_loop_preorder);
    1708              : 
    1709     20586761 :       FOR_EACH_VEC_ELT_REVERSE (loop_preorder, i, subloop_node)
    1710              :         {
    1711     14323178 :           if (! (subloop_node->bb->flags & BB_TO_VISIT))
    1712      3974006 :             continue;
    1713              : 
    1714     10349172 :           subloop_node->bb->flags &= ~BB_TO_VISIT;
    1715     10349172 :           dfs_stack.quick_push (subloop_node);
    1716     31324348 :           while (! dfs_stack.is_empty ())
    1717              :             {
    1718     17001170 :               edge e;
    1719     17001170 :               edge_iterator ei;
    1720              : 
    1721     17001170 :               ira_loop_tree_node_t n = dfs_stack.last ();
    1722     42395083 :               FOR_EACH_EDGE (e, ei, n->bb->preds)
    1723              :                 {
    1724     25393913 :                   ira_loop_tree_node_t pred_node;
    1725     25393913 :                   basic_block pred_bb = e->src;
    1726              : 
    1727     25393913 :                   if (e->src == ENTRY_BLOCK_PTR_FOR_FN (cfun))
    1728      1474414 :                     continue;
    1729              : 
    1730     23919499 :                   pred_node = IRA_BB_NODE_BY_INDEX (pred_bb->index);
    1731     23919499 :                   if (pred_node != n
    1732     23617751 :                       && (pred_node->bb->flags & BB_TO_VISIT))
    1733              :                     {
    1734      3974006 :                       pred_node->bb->flags &= ~BB_TO_VISIT;
    1735      3974006 :                       dfs_stack.quick_push (pred_node);
    1736              :                     }
    1737              :                 }
    1738     17001170 :               if (n == dfs_stack.last ())
    1739              :                 {
    1740     14323178 :                   dfs_stack.pop ();
    1741     14323178 :                   topsort_nodes.quick_push (n);
    1742              :                 }
    1743              :             }
    1744              :         }
    1745              : 
    1746              : #undef BB_TO_VISIT
    1747      2087861 :     }
    1748              : 
    1749      4175722 :   gcc_assert (topsort_nodes.length () == n_loop_preorder);
    1750      2087861 :   return topsort_nodes;
    1751              : }
    1752              : 
    1753              : /* The current loop tree node and its regno allocno map.  */
    1754              : ira_loop_tree_node_t ira_curr_loop_tree_node;
    1755              : ira_allocno_t *ira_curr_regno_allocno_map;
    1756              : 
    1757              : /* This recursive function traverses loop tree with root LOOP_NODE
    1758              :    calling non-null functions PREORDER_FUNC and POSTORDER_FUNC
    1759              :    correspondingly in preorder and postorder.  The function sets up
    1760              :    IRA_CURR_LOOP_TREE_NODE and IRA_CURR_REGNO_ALLOCNO_MAP.  If BB_P,
    1761              :    basic block nodes of LOOP_NODE is also processed (before its
    1762              :    subloop nodes).
    1763              : 
    1764              :    If BB_P is set and POSTORDER_FUNC is given, the basic blocks in
    1765              :    the loop are passed in the *reverse* post-order of the *reverse*
    1766              :    CFG.  This is only used by ira_create_allocno_live_ranges, which
    1767              :    wants to visit basic blocks in this order to minimize the number
    1768              :    of elements per live range chain.
    1769              :    Note that the loop tree nodes are still visited in the normal,
    1770              :    forward post-order of  the loop tree.  */
    1771              : 
    1772              : void
    1773     13722115 : ira_traverse_loop_tree (bool bb_p, ira_loop_tree_node_t loop_node,
    1774              :                         void (*preorder_func) (ira_loop_tree_node_t),
    1775              :                         void (*postorder_func) (ira_loop_tree_node_t))
    1776              : {
    1777     13722115 :   ira_loop_tree_node_t subloop_node;
    1778              : 
    1779     13722115 :   ira_assert (loop_node->bb == NULL);
    1780     13722115 :   ira_curr_loop_tree_node = loop_node;
    1781     13722115 :   ira_curr_regno_allocno_map = ira_curr_loop_tree_node->regno_allocno_map;
    1782              : 
    1783     13722115 :   if (preorder_func != NULL)
    1784      9979460 :     (*preorder_func) (loop_node);
    1785              : 
    1786     13722115 :   if (bb_p)
    1787              :     {
    1788     10859098 :       auto_vec<ira_loop_tree_node_t> loop_preorder;
    1789     10859098 :       unsigned int i;
    1790              : 
    1791              :       /* Add all nodes to the set of nodes to visit.  The IRA loop tree
    1792              :          is set up such that nodes in the loop body appear in a pre-order
    1793              :          of their place in the CFG.  */
    1794     10859098 :       for (subloop_node = loop_node->children;
    1795     91998756 :            subloop_node != NULL;
    1796     81139658 :            subloop_node = subloop_node->next)
    1797     81139658 :         if (subloop_node->bb != NULL)
    1798     77783435 :           loop_preorder.safe_push (subloop_node);
    1799              : 
    1800     10859098 :       if (preorder_func != NULL)
    1801     72231494 :         FOR_EACH_VEC_ELT (loop_preorder, i, subloop_node)
    1802     63460257 :           (*preorder_func) (subloop_node);
    1803              : 
    1804     10859098 :       if (postorder_func != NULL)
    1805              :         {
    1806      2087861 :           vec<ira_loop_tree_node_t> loop_rev_postorder =
    1807      2087861 :             ira_loop_tree_body_rev_postorder (loop_node, loop_preorder);
    1808     18498900 :           FOR_EACH_VEC_ELT_REVERSE (loop_rev_postorder, i, subloop_node)
    1809     14323178 :             (*postorder_func) (subloop_node);
    1810      2087861 :           loop_rev_postorder.release ();
    1811              :         }
    1812     10859098 :     }
    1813              : 
    1814     13722115 :   for (subloop_node = loop_node->subloops;
    1815     17858371 :        subloop_node != NULL;
    1816      4136256 :        subloop_node = subloop_node->subloop_next)
    1817              :     {
    1818      4136256 :       ira_assert (subloop_node->bb == NULL);
    1819      4136256 :       ira_traverse_loop_tree (bb_p, subloop_node,
    1820              :                               preorder_func, postorder_func);
    1821              :     }
    1822              : 
    1823     13722115 :   ira_curr_loop_tree_node = loop_node;
    1824     13722115 :   ira_curr_regno_allocno_map = ira_curr_loop_tree_node->regno_allocno_map;
    1825              : 
    1826     13722115 :   if (postorder_func != NULL)
    1827      3742655 :     (*postorder_func) (loop_node);
    1828     13722115 : }
    1829              : 
    1830              : 
    1831              : 
    1832              : /* The basic block currently being processed.  */
    1833              : static basic_block curr_bb;
    1834              : 
    1835              : /* This recursive function creates allocnos corresponding to
    1836              :    pseudo-registers containing in X.  True OUTPUT_P means that X is
    1837              :    an lvalue.  OUTER corresponds to the parent expression of X.  */
    1838              : static void
    1839    452649818 : create_insn_allocnos (rtx x, rtx outer, bool output_p)
    1840              : {
    1841    452649818 :   int i, j;
    1842    452649818 :   const char *fmt;
    1843    452649818 :   enum rtx_code code = GET_CODE (x);
    1844              : 
    1845    452649818 :   if (code == REG)
    1846              :     {
    1847    148806729 :       int regno;
    1848              : 
    1849    148806729 :       if ((regno = REGNO (x)) >= FIRST_PSEUDO_REGISTER)
    1850              :         {
    1851     83783928 :           ira_allocno_t a;
    1852              : 
    1853     83783928 :           if ((a = ira_curr_regno_allocno_map[regno]) == NULL)
    1854     28897638 :             a = ira_create_allocno (regno, false, ira_curr_loop_tree_node);
    1855              : 
    1856              :           /* This used to only trigger at allocno creation which seems
    1857              :              wrong.  We care about the WMODE propery across all the uses.  */
    1858     83783928 :           if (outer != NULL && GET_CODE (outer) == SUBREG)
    1859              :             {
    1860      2902914 :               machine_mode wmode = GET_MODE (outer);
    1861      2902914 :               if (partial_subreg_p (ALLOCNO_WMODE (a), wmode))
    1862       533325 :                 ALLOCNO_WMODE (a) = wmode;
    1863              :             }
    1864              : 
    1865     83783928 :           ALLOCNO_NREFS (a)++;
    1866     83783928 :           ALLOCNO_FREQ (a) += REG_FREQ_FROM_BB (curr_bb);
    1867     83783928 :           if (output_p)
    1868     33850237 :             bitmap_set_bit (ira_curr_loop_tree_node->modified_regnos, regno);
    1869              :         }
    1870    148806729 :       return;
    1871              :     }
    1872              :   else if (code == SET)
    1873              :     {
    1874     78569423 :       create_insn_allocnos (SET_DEST (x), NULL, true);
    1875     78569423 :       create_insn_allocnos (SET_SRC (x), NULL, false);
    1876     78569423 :       return;
    1877              :     }
    1878              :   else if (code == CLOBBER)
    1879              :     {
    1880     10787785 :       create_insn_allocnos (XEXP (x, 0), NULL, true);
    1881     10787785 :       return;
    1882              :     }
    1883              :   else if (code == MEM)
    1884              :     {
    1885     34092308 :       create_insn_allocnos (XEXP (x, 0), NULL, false);
    1886     34092308 :       return;
    1887              :     }
    1888              :   else if (code == PRE_DEC || code == POST_DEC || code == PRE_INC ||
    1889              :            code == POST_INC || code == POST_MODIFY || code == PRE_MODIFY)
    1890              :     {
    1891      1845391 :       create_insn_allocnos (XEXP (x, 0), NULL, true);
    1892      1845391 :       create_insn_allocnos (XEXP (x, 0), NULL, false);
    1893      1845391 :       return;
    1894              :     }
    1895              : 
    1896    178548182 :   fmt = GET_RTX_FORMAT (code);
    1897    430938230 :   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
    1898              :     {
    1899    252390048 :       if (fmt[i] == 'e')
    1900    137114998 :         create_insn_allocnos (XEXP (x, i), x, output_p);
    1901    115275050 :       else if (fmt[i] == 'E')
    1902     40198840 :         for (j = 0; j < XVECLEN (x, i); j++)
    1903     26897852 :           create_insn_allocnos (XVECEXP (x, i, j), x, output_p);
    1904              :     }
    1905              : }
    1906              : 
    1907              : /* Create allocnos corresponding to pseudo-registers living in the
    1908              :    basic block represented by the corresponding loop tree node
    1909              :    BB_NODE.  */
    1910              : static void
    1911     14323178 : create_bb_allocnos (ira_loop_tree_node_t bb_node)
    1912              : {
    1913     14323178 :   basic_block bb;
    1914     14323178 :   rtx_insn *insn;
    1915     14323178 :   unsigned int i;
    1916     14323178 :   bitmap_iterator bi;
    1917              : 
    1918     14323178 :   curr_bb = bb = bb_node->bb;
    1919     14323178 :   ira_assert (bb != NULL);
    1920    171844965 :   FOR_BB_INSNS_REVERSE (bb, insn)
    1921    157521787 :     if (NONDEBUG_INSN_P (insn))
    1922     82927247 :       create_insn_allocnos (PATTERN (insn), NULL, false);
    1923              :   /* It might be a allocno living through from one subloop to
    1924              :      another.  */
    1925    151743049 :   EXECUTE_IF_SET_IN_REG_SET (df_get_live_in (bb), FIRST_PSEUDO_REGISTER, i, bi)
    1926    137419871 :     if (ira_curr_regno_allocno_map[i] == NULL)
    1927       646956 :       ira_create_allocno (i, false, ira_curr_loop_tree_node);
    1928     14323178 : }
    1929              : 
    1930              : /* Create allocnos corresponding to pseudo-registers living on edge E
    1931              :    (a loop entry or exit).  Also mark the allocnos as living on the
    1932              :    loop border. */
    1933              : static void
    1934      1744451 : create_loop_allocnos (edge e)
    1935              : {
    1936      1744451 :   unsigned int i;
    1937      1744451 :   bitmap live_in_regs, border_allocnos;
    1938      1744451 :   bitmap_iterator bi;
    1939      1744451 :   ira_loop_tree_node_t parent;
    1940              : 
    1941      1744451 :   live_in_regs = df_get_live_in (e->dest);
    1942      1744451 :   border_allocnos = ira_curr_loop_tree_node->border_allocnos;
    1943     19008127 :   EXECUTE_IF_SET_IN_REG_SET (df_get_live_out (e->src),
    1944              :                              FIRST_PSEUDO_REGISTER, i, bi)
    1945     17263676 :     if (bitmap_bit_p (live_in_regs, i))
    1946              :       {
    1947     11655977 :         if (ira_curr_regno_allocno_map[i] == NULL)
    1948              :           {
    1949              :             /* The order of creations is important for right
    1950              :                ira_regno_allocno_map.  */
    1951      5586360 :             if ((parent = ira_curr_loop_tree_node->parent) != NULL
    1952      5586360 :                 && parent->regno_allocno_map[i] == NULL)
    1953          524 :               ira_create_allocno (i, false, parent);
    1954      5586360 :             ira_create_allocno (i, false, ira_curr_loop_tree_node);
    1955              :           }
    1956     11655977 :         bitmap_set_bit (border_allocnos,
    1957     11655977 :                         ALLOCNO_NUM (ira_curr_regno_allocno_map[i]));
    1958              :       }
    1959      1744451 : }
    1960              : 
    1961              : /* Create allocnos corresponding to pseudo-registers living in loop
    1962              :    represented by the corresponding loop tree node LOOP_NODE.  This
    1963              :    function is called by ira_traverse_loop_tree.  */
    1964              : static void
    1965     16411039 : create_loop_tree_node_allocnos (ira_loop_tree_node_t loop_node)
    1966              : {
    1967     16411039 :   if (loop_node->bb != NULL)
    1968     14323178 :     create_bb_allocnos (loop_node);
    1969      2087861 :   else if (loop_node != ira_loop_tree_root)
    1970              :     {
    1971       613447 :       int i;
    1972       613447 :       edge_iterator ei;
    1973       613447 :       edge e;
    1974              : 
    1975       613447 :       ira_assert (current_loops != NULL);
    1976      1913141 :       FOR_EACH_EDGE (e, ei, loop_node->loop->header->preds)
    1977      1299694 :         if (e->src != loop_node->loop->latch)
    1978       702806 :           create_loop_allocnos (e);
    1979              : 
    1980       613447 :       auto_vec<edge> edges = get_loop_exit_edges (loop_node->loop);
    1981      2874941 :       FOR_EACH_VEC_ELT (edges, i, e)
    1982      1041645 :         create_loop_allocnos (e);
    1983       613447 :     }
    1984     16411039 : }
    1985              : 
    1986              : /* Propagate information about allocnos modified inside the loop given
    1987              :    by its LOOP_TREE_NODE to its parent.  */
    1988              : static void
    1989      1654794 : propagate_modified_regnos (ira_loop_tree_node_t loop_tree_node)
    1990              : {
    1991      1654794 :   if (loop_tree_node == ira_loop_tree_root)
    1992              :     return;
    1993       613302 :   ira_assert (loop_tree_node->bb == NULL);
    1994       613302 :   bitmap_ior_into (loop_tree_node->parent->modified_regnos,
    1995       613302 :                    loop_tree_node->modified_regnos);
    1996              : }
    1997              : 
    1998              : /* Propagate ALLOCNO_HARD_REG_COSTS from A to PARENT_A.  Use SPILL_COST
    1999              :    as the cost of spilling a register throughout A (which we have to do
    2000              :    for PARENT_A allocations that conflict with A).  */
    2001              : static void
    2002      3129090 : ira_propagate_hard_reg_costs (ira_allocno_t parent_a, ira_allocno_t a,
    2003              :                               int spill_cost)
    2004              : {
    2005      3129090 :   HARD_REG_SET conflicts = ira_total_conflict_hard_regs (a);
    2006      3129090 :   if (ira_caller_save_loop_spill_p (parent_a, a, spill_cost))
    2007       850914 :     conflicts |= ira_need_caller_save_regs (a);
    2008      3129090 :   conflicts &= ~ira_total_conflict_hard_regs (parent_a);
    2009              : 
    2010      3129090 :   auto costs = ALLOCNO_HARD_REG_COSTS (a);
    2011      6258180 :   if (!hard_reg_set_empty_p (conflicts))
    2012       536027 :     ALLOCNO_MIGHT_CONFLICT_WITH_PARENT_P (a) = true;
    2013      2593063 :   else if (!costs)
    2014      2432199 :     return;
    2015              : 
    2016       696891 :   auto aclass = ALLOCNO_CLASS (a);
    2017       696891 :   ira_allocate_and_set_costs (&ALLOCNO_HARD_REG_COSTS (parent_a),
    2018              :                               aclass, ALLOCNO_CLASS_COST (parent_a));
    2019       696891 :   auto parent_costs = ALLOCNO_HARD_REG_COSTS (parent_a);
    2020      9826978 :   for (int i = 0; i < ira_class_hard_regs_num[aclass]; ++i)
    2021      9130087 :     if (TEST_HARD_REG_BIT (conflicts, ira_class_hard_regs[aclass][i]))
    2022      2432998 :       parent_costs[i] += spill_cost;
    2023      6697089 :     else if (costs)
    2024              :       /* The cost to A of allocating this register to PARENT_A can't
    2025              :          be more than the cost of spilling the register throughout A.  */
    2026      2945986 :       parent_costs[i] += MIN (costs[i], spill_cost);
    2027              : }
    2028              : 
    2029              : /* Propagate new info about allocno A (see comments about accumulated
    2030              :    info in allocno definition) to the corresponding allocno on upper
    2031              :    loop tree level.  So allocnos on upper levels accumulate
    2032              :    information about the corresponding allocnos in nested regions.
    2033              :    The new info means allocno info finally calculated in this
    2034              :    file.  */
    2035              : static void
    2036        35188 : propagate_allocno_info (void)
    2037              : {
    2038        35188 :   int i;
    2039        35188 :   ira_allocno_t a, parent_a;
    2040        35188 :   ira_loop_tree_node_t parent;
    2041        35188 :   enum reg_class aclass;
    2042              : 
    2043        35188 :   if (flag_ira_region != IRA_REGION_ALL
    2044        35188 :       && flag_ira_region != IRA_REGION_MIXED)
    2045              :     return;
    2046     10677875 :   for (i = max_reg_num () - 1; i >= FIRST_PSEUDO_REGISTER; i--)
    2047     10642687 :     for (a = ira_regno_allocno_map[i];
    2048     18479225 :          a != NULL;
    2049      7836538 :          a = ALLOCNO_NEXT_REGNO_ALLOCNO (a))
    2050      7836538 :       if ((parent = ALLOCNO_LOOP_TREE_NODE (a)->parent) != NULL
    2051      5035696 :           && (parent_a = parent->regno_allocno_map[i]) != NULL
    2052              :           /* There are no caps yet at this point.  So use
    2053              :              border_allocnos to find allocnos for the propagation.  */
    2054     10967256 :           && bitmap_bit_p (ALLOCNO_LOOP_TREE_NODE (a)->border_allocnos,
    2055              :                            ALLOCNO_NUM (a)))
    2056              :         {
    2057              :           /* Calculate the cost of storing to memory on entry to A's loop,
    2058              :              referencing as memory within A's loop, and restoring from
    2059              :              memory on exit from A's loop.  */
    2060      3129090 :           ira_loop_border_costs border_costs (a);
    2061      3129090 :           int spill_cost = INT_MAX;
    2062      3129090 :           if (ira_subloop_allocnos_can_differ_p (parent_a))
    2063      2665735 :             spill_cost = (border_costs.spill_inside_loop_cost ()
    2064      2665735 :                           + ALLOCNO_MEMORY_COST (a));
    2065              : 
    2066      3129090 :           if (! ALLOCNO_BAD_SPILL_P (a))
    2067      2931382 :             ALLOCNO_BAD_SPILL_P (parent_a) = false;
    2068      3129090 :           ALLOCNO_NREFS (parent_a) += ALLOCNO_NREFS (a);
    2069      3129090 :           ALLOCNO_FREQ (parent_a) += ALLOCNO_FREQ (a);
    2070      3129090 :           ALLOCNO_SET_REGISTER_FILTERS (parent_a,
    2071              :                                         ALLOCNO_REGISTER_FILTERS (parent_a)
    2072              :                                         | ALLOCNO_REGISTER_FILTERS (a));
    2073              : 
    2074              :           /* If A's allocation can differ from PARENT_A's, we can if necessary
    2075              :              spill PARENT_A on entry to A's loop and restore it afterwards.
    2076              :              Doing that has cost SPILL_COST.  */
    2077      3129090 :           if (!ira_subloop_allocnos_can_differ_p (parent_a))
    2078       463355 :             merge_hard_reg_conflicts (a, parent_a, true);
    2079              : 
    2080      3129090 :           if (!ira_caller_save_loop_spill_p (parent_a, a, spill_cost))
    2081              :             {
    2082      2703633 :               ALLOCNO_CALL_FREQ (parent_a) += ALLOCNO_CALL_FREQ (a);
    2083      2703633 :               ALLOCNO_CALLS_CROSSED_NUM (parent_a)
    2084      2703633 :                 += ALLOCNO_CALLS_CROSSED_NUM (a);
    2085      2703633 :               ALLOCNO_CHEAP_CALLS_CROSSED_NUM (parent_a)
    2086      2703633 :                 += ALLOCNO_CHEAP_CALLS_CROSSED_NUM (a);
    2087      2703633 :               ALLOCNO_CROSSED_CALLS_ABIS (parent_a)
    2088      2703633 :                 |= ALLOCNO_CROSSED_CALLS_ABIS (a);
    2089      2703633 :               ALLOCNO_CROSSED_CALLS_CLOBBERED_REGS (parent_a)
    2090      2703633 :                 |= ALLOCNO_CROSSED_CALLS_CLOBBERED_REGS (a);
    2091              :             }
    2092      3129090 :           ALLOCNO_EXCESS_PRESSURE_POINTS_NUM (parent_a)
    2093      3129090 :             += ALLOCNO_EXCESS_PRESSURE_POINTS_NUM (a);
    2094      3129090 :           aclass = ALLOCNO_CLASS (a);
    2095      3129090 :           ira_assert (aclass == ALLOCNO_CLASS (parent_a));
    2096      3129090 :           ira_propagate_hard_reg_costs (parent_a, a, spill_cost);
    2097      3129090 :           ira_allocate_and_accumulate_costs
    2098      3129090 :             (&ALLOCNO_CONFLICT_HARD_REG_COSTS (parent_a),
    2099              :              aclass,
    2100              :              ALLOCNO_CONFLICT_HARD_REG_COSTS (a));
    2101              :           /* The cost to A of allocating a register to PARENT_A can't be
    2102              :              more than the cost of spilling the register throughout A.  */
    2103      3129090 :           ALLOCNO_CLASS_COST (parent_a)
    2104      3129090 :             += MIN (ALLOCNO_CLASS_COST (a), spill_cost);
    2105      3129090 :           ALLOCNO_MEMORY_COST (parent_a) += ALLOCNO_MEMORY_COST (a);
    2106              :         }
    2107              : }
    2108              : 
    2109              : /* Create allocnos corresponding to pseudo-registers in the current
    2110              :    function.  Traverse the loop tree for this.  */
    2111              : static void
    2112      1474414 : create_allocnos (void)
    2113              : {
    2114              :   /* We need to process BB first to correctly link allocnos by member
    2115              :      next_regno_allocno.  */
    2116      1474414 :   ira_traverse_loop_tree (true, ira_loop_tree_root,
    2117              :                           create_loop_tree_node_allocnos, NULL);
    2118      1474414 :   if (optimize)
    2119      1041492 :     ira_traverse_loop_tree (false, ira_loop_tree_root, NULL,
    2120              :                             propagate_modified_regnos);
    2121      1474414 : }
    2122              : 
    2123              : 
    2124              : 
    2125              : /* The page contains function to remove some regions from a separate
    2126              :    register allocation.  We remove regions whose separate allocation
    2127              :    will hardly improve the result.  As a result we speed up regional
    2128              :    register allocation.  */
    2129              : 
    2130              : /* The function changes the object in range list given by R to OBJ.  */
    2131              : static void
    2132            0 : change_object_in_range_list (live_range_t r, ira_object_t obj)
    2133              : {
    2134      5128978 :   for (; r != NULL; r = r->next)
    2135      2663804 :     r->object = obj;
    2136            0 : }
    2137              : 
    2138              : /* Move all live ranges associated with allocno FROM to allocno TO.  */
    2139              : static void
    2140      2459146 : move_allocno_live_ranges (ira_allocno_t from, ira_allocno_t to)
    2141              : {
    2142      2459146 :   int i;
    2143      2459146 :   int n = ALLOCNO_NUM_OBJECTS (from);
    2144              : 
    2145      2459146 :   gcc_assert (n == ALLOCNO_NUM_OBJECTS (to));
    2146              : 
    2147      4924320 :   for (i = 0; i < n; i++)
    2148              :     {
    2149      2465174 :       ira_object_t from_obj = ALLOCNO_OBJECT (from, i);
    2150      2465174 :       ira_object_t to_obj = ALLOCNO_OBJECT (to, i);
    2151      2465174 :       live_range_t lr = OBJECT_LIVE_RANGES (from_obj);
    2152              : 
    2153      2465174 :       if (internal_flag_ira_verbose > 4 && ira_dump_file != NULL)
    2154              :         {
    2155          138 :           fprintf (ira_dump_file,
    2156              :                    "      Moving ranges of a%dr%d to a%dr%d: ",
    2157              :                    ALLOCNO_NUM (from), ALLOCNO_REGNO (from),
    2158              :                    ALLOCNO_NUM (to), ALLOCNO_REGNO (to));
    2159          138 :           ira_print_live_range_list (ira_dump_file, lr);
    2160              :         }
    2161      2465174 :       change_object_in_range_list (lr, to_obj);
    2162      2465174 :       OBJECT_LIVE_RANGES (to_obj)
    2163      2465174 :         = ira_merge_live_ranges (lr, OBJECT_LIVE_RANGES (to_obj));
    2164      2465174 :       OBJECT_LIVE_RANGES (from_obj) = NULL;
    2165              :     }
    2166      2459146 : }
    2167              : 
    2168              : static void
    2169            0 : copy_allocno_live_ranges (ira_allocno_t from, ira_allocno_t to)
    2170              : {
    2171            0 :   int i;
    2172            0 :   int n = ALLOCNO_NUM_OBJECTS (from);
    2173              : 
    2174            0 :   gcc_assert (n == ALLOCNO_NUM_OBJECTS (to));
    2175              : 
    2176            0 :   for (i = 0; i < n; i++)
    2177              :     {
    2178            0 :       ira_object_t from_obj = ALLOCNO_OBJECT (from, i);
    2179            0 :       ira_object_t to_obj = ALLOCNO_OBJECT (to, i);
    2180            0 :       live_range_t lr = OBJECT_LIVE_RANGES (from_obj);
    2181              : 
    2182            0 :       if (internal_flag_ira_verbose > 4 && ira_dump_file != NULL)
    2183              :         {
    2184            0 :           fprintf (ira_dump_file, "      Copying ranges of a%dr%d to a%dr%d: ",
    2185              :                    ALLOCNO_NUM (from), ALLOCNO_REGNO (from),
    2186              :                    ALLOCNO_NUM (to), ALLOCNO_REGNO (to));
    2187            0 :           ira_print_live_range_list (ira_dump_file, lr);
    2188              :         }
    2189            0 :       lr = ira_copy_live_range_list (lr);
    2190            0 :       change_object_in_range_list (lr, to_obj);
    2191            0 :       OBJECT_LIVE_RANGES (to_obj)
    2192            0 :         = ira_merge_live_ranges (lr, OBJECT_LIVE_RANGES (to_obj));
    2193              :     }
    2194            0 : }
    2195              : 
    2196              : /* Return TRUE if NODE represents a loop with low register
    2197              :    pressure.  */
    2198              : static bool
    2199      1054866 : low_pressure_loop_node_p (ira_loop_tree_node_t node)
    2200              : {
    2201      1054866 :   int i;
    2202      1054866 :   enum reg_class pclass;
    2203              : 
    2204      1054866 :   if (node->bb != NULL)
    2205              :     return false;
    2206              : 
    2207      4609706 :   for (i = 0; i < ira_pressure_classes_num; i++)
    2208              :     {
    2209      3726868 :       pclass = ira_pressure_classes[i];
    2210      3726868 :       if (node->reg_pressure[pclass] > ira_class_hard_regs_num[pclass]
    2211       172028 :           && ira_class_hard_regs_num[pclass] > 1)
    2212              :         return false;
    2213              :     }
    2214              :   return true;
    2215              : }
    2216              : 
    2217              : #ifdef STACK_REGS
    2218              : /* Return TRUE if LOOP has a complex enter or exit edge.  We don't
    2219              :    form a region from such loop if the target use stack register
    2220              :    because reg-stack.cc cannot deal with such edges.  */
    2221              : static bool
    2222       172028 : loop_with_complex_edge_p (class loop *loop)
    2223              : {
    2224       172028 :   int i;
    2225       172028 :   edge_iterator ei;
    2226       172028 :   edge e;
    2227       172028 :   bool res;
    2228              : 
    2229       551121 :   FOR_EACH_EDGE (e, ei, loop->header->preds)
    2230       379093 :     if (e->flags & EDGE_EH)
    2231              :       return true;
    2232       172028 :   auto_vec<edge> edges = get_loop_exit_edges (loop);
    2233       172028 :   res = false;
    2234       676270 :   FOR_EACH_VEC_ELT (edges, i, e)
    2235       333401 :     if (e->flags & EDGE_COMPLEX)
    2236              :       {
    2237              :         res = true;
    2238              :         break;
    2239              :       }
    2240       172028 :   return res;
    2241       172028 : }
    2242              : #endif
    2243              : 
    2244              : /* Sort loops for marking them for removal.  We put already marked
    2245              :    loops first, then less frequent loops next, and then outer loops
    2246              :    next.  */
    2247              : static int
    2248      7936552 : loop_compare_func (const void *v1p, const void *v2p)
    2249              : {
    2250      7936552 :   int diff;
    2251      7936552 :   ira_loop_tree_node_t l1 = *(const ira_loop_tree_node_t *) v1p;
    2252      7936552 :   ira_loop_tree_node_t l2 = *(const ira_loop_tree_node_t *) v2p;
    2253              : 
    2254      7936552 :   ira_assert (l1->parent != NULL && l2->parent != NULL);
    2255      7936552 :   if (l1->to_remove_p && ! l2->to_remove_p)
    2256              :     return -1;
    2257      7861642 :   if (! l1->to_remove_p && l2->to_remove_p)
    2258              :     return 1;
    2259     15589762 :   if ((diff = l1->loop->header->count.to_frequency (cfun)
    2260      7794881 :               - l2->loop->header->count.to_frequency (cfun)) != 0)
    2261              :     return diff;
    2262      9363906 :   if ((diff = (int) loop_depth (l1->loop) - (int) loop_depth (l2->loop)) != 0)
    2263              :     return diff;
    2264              :   /* Make sorting stable.  */
    2265      2837162 :   return l1->loop_num - l2->loop_num;
    2266              : }
    2267              : 
    2268              : /* Mark loops which should be removed from regional allocation.  We
    2269              :    remove a loop with low register pressure inside another loop with
    2270              :    register pressure.  In this case a separate allocation of the loop
    2271              :    hardly helps (for irregular register file architecture it could
    2272              :    help by choosing a better hard register in the loop but we prefer
    2273              :    faster allocation even in this case).  We also remove cheap loops
    2274              :    if there are more than param_ira_max_loops_num of them.  Loop with EH
    2275              :    exit or enter edges are removed too because the allocation might
    2276              :    require put pseudo moves on the EH edges (we could still do this
    2277              :    for pseudos with caller saved hard registers in some cases but it
    2278              :    is impossible to say here or during top-down allocation pass what
    2279              :    hard register the pseudos get finally).  */
    2280              : static void
    2281       995626 : mark_loops_for_removal (void)
    2282              : {
    2283       995626 :   int i, n;
    2284       995626 :   ira_loop_tree_node_t *sorted_loops;
    2285       995626 :   loop_p loop;
    2286              : 
    2287       995626 :   ira_assert (current_loops != NULL);
    2288       995626 :   sorted_loops
    2289       995626 :     = (ira_loop_tree_node_t *) ira_allocate (sizeof (ira_loop_tree_node_t)
    2290       995626 :                                              * number_of_loops (cfun));
    2291      4610348 :   for (n = i = 0; vec_safe_iterate (get_loops (cfun), i, &loop); i++)
    2292      1623470 :     if (ira_loop_nodes[i].regno_allocno_map != NULL)
    2293              :       {
    2294      1609073 :         if (ira_loop_nodes[i].parent == NULL)
    2295              :           {
    2296              :             /* Don't remove the root.  */
    2297       995626 :             ira_loop_nodes[i].to_remove_p = false;
    2298       995626 :             continue;
    2299              :           }
    2300       613447 :         sorted_loops[n++] = &ira_loop_nodes[i];
    2301      1226894 :         ira_loop_nodes[i].to_remove_p
    2302       613447 :           = ((low_pressure_loop_node_p (ira_loop_nodes[i].parent)
    2303       441419 :               && low_pressure_loop_node_p (&ira_loop_nodes[i]))
    2304              : #ifdef STACK_REGS
    2305       613447 :              || loop_with_complex_edge_p (ira_loop_nodes[i].loop)
    2306              : #endif
    2307              :              );
    2308              :       }
    2309       995626 :   qsort (sorted_loops, n, sizeof (ira_loop_tree_node_t), loop_compare_func);
    2310      2016219 :   for (i = 0; i < n - param_ira_max_loops_num; i++)
    2311              :     {
    2312        24967 :       sorted_loops[i]->to_remove_p = true;
    2313        24967 :       if (internal_flag_ira_verbose > 1 && ira_dump_file != NULL)
    2314            0 :         fprintf
    2315            0 :           (ira_dump_file,
    2316              :            "  Mark loop %d (header %d, freq %d, depth %d) for removal (%s)\n",
    2317            0 :            sorted_loops[i]->loop_num, sorted_loops[i]->loop->header->index,
    2318            0 :            sorted_loops[i]->loop->header->count.to_frequency (cfun),
    2319            0 :            loop_depth (sorted_loops[i]->loop),
    2320            0 :            low_pressure_loop_node_p (sorted_loops[i]->parent)
    2321            0 :            && low_pressure_loop_node_p (sorted_loops[i])
    2322              :            ? "low pressure" : "cheap loop");
    2323              :     }
    2324       995626 :   ira_free (sorted_loops);
    2325       995626 : }
    2326              : 
    2327              : /* Mark all loops but root for removing.  */
    2328              : static void
    2329            0 : mark_all_loops_for_removal (void)
    2330              : {
    2331            0 :   int i;
    2332            0 :   loop_p loop;
    2333              : 
    2334            0 :   ira_assert (current_loops != NULL);
    2335            0 :   FOR_EACH_VEC_SAFE_ELT (get_loops (cfun), i, loop)
    2336            0 :     if (ira_loop_nodes[i].regno_allocno_map != NULL)
    2337              :       {
    2338            0 :         if (ira_loop_nodes[i].parent == NULL)
    2339              :           {
    2340              :             /* Don't remove the root.  */
    2341            0 :             ira_loop_nodes[i].to_remove_p = false;
    2342            0 :             continue;
    2343              :           }
    2344            0 :         ira_loop_nodes[i].to_remove_p = true;
    2345            0 :         if (internal_flag_ira_verbose > 1 && ira_dump_file != NULL)
    2346            0 :           fprintf
    2347            0 :             (ira_dump_file,
    2348              :              "  Mark loop %d (header %d, freq %d, depth %d) for removal\n",
    2349              :              ira_loop_nodes[i].loop_num,
    2350            0 :              ira_loop_nodes[i].loop->header->index,
    2351            0 :              ira_loop_nodes[i].loop->header->count.to_frequency (cfun),
    2352            0 :              loop_depth (ira_loop_nodes[i].loop));
    2353              :       }
    2354            0 : }
    2355              : 
    2356              : /* Definition of vector of loop tree nodes.  */
    2357              : 
    2358              : /* Vec containing references to all removed loop tree nodes.  */
    2359              : static vec<ira_loop_tree_node_t> removed_loop_vec;
    2360              : 
    2361              : /* Vec containing references to all children of loop tree nodes.  */
    2362              : static vec<ira_loop_tree_node_t> children_vec;
    2363              : 
    2364              : /* Remove subregions of NODE if their separate allocation will not
    2365              :    improve the result.  */
    2366              : static void
    2367      1609073 : remove_uneccesary_loop_nodes_from_loop_tree (ira_loop_tree_node_t node)
    2368              : {
    2369      1609073 :   unsigned int start;
    2370      1609073 :   bool remove_p;
    2371      1609073 :   ira_loop_tree_node_t subnode;
    2372              : 
    2373      1609073 :   remove_p = node->to_remove_p;
    2374      1609073 :   if (! remove_p)
    2375      1162357 :     children_vec.safe_push (node);
    2376      1609073 :   start = children_vec.length ();
    2377     12820691 :   for (subnode = node->children; subnode != NULL; subnode = subnode->next)
    2378     11211618 :     if (subnode->bb == NULL)
    2379       613447 :       remove_uneccesary_loop_nodes_from_loop_tree (subnode);
    2380              :     else
    2381     10598171 :       children_vec.safe_push (subnode);
    2382      1609073 :   node->children = node->subloops = NULL;
    2383      1609073 :   if (remove_p)
    2384              :     {
    2385       446716 :       removed_loop_vec.safe_push (node);
    2386       446716 :       return;
    2387              :     }
    2388     11927259 :   while (children_vec.length () > start)
    2389              :     {
    2390     10764902 :       subnode = children_vec.pop ();
    2391     10764902 :       subnode->parent = node;
    2392     10764902 :       subnode->next = node->children;
    2393     10764902 :       node->children = subnode;
    2394     10764902 :       if (subnode->bb == NULL)
    2395              :         {
    2396       166731 :           subnode->subloop_next = node->subloops;
    2397       166731 :           node->subloops = subnode;
    2398              :         }
    2399              :     }
    2400              : }
    2401              : 
    2402              : /* Return TRUE if NODE is inside PARENT.  */
    2403              : static bool
    2404        87710 : loop_is_inside_p (ira_loop_tree_node_t node, ira_loop_tree_node_t parent)
    2405              : {
    2406       126617 :   for (node = node->parent; node != NULL; node = node->parent)
    2407        80270 :     if (node == parent)
    2408              :       return true;
    2409              :   return false;
    2410              : }
    2411              : 
    2412              : /* Sort allocnos according to their order in regno allocno list.  */
    2413              : static int
    2414        53778 : regno_allocno_order_compare_func (const void *v1p, const void *v2p)
    2415              : {
    2416        53778 :   ira_allocno_t a1 = *(const ira_allocno_t *) v1p;
    2417        53778 :   ira_allocno_t a2 = *(const ira_allocno_t *) v2p;
    2418        53778 :   ira_loop_tree_node_t n1 = ALLOCNO_LOOP_TREE_NODE (a1);
    2419        53778 :   ira_loop_tree_node_t n2 = ALLOCNO_LOOP_TREE_NODE (a2);
    2420              : 
    2421       107556 :   if (loop_is_inside_p (n1, n2))
    2422              :     return -1;
    2423        67864 :   else if (loop_is_inside_p (n2, n1))
    2424              :     return 1;
    2425              :   /* If allocnos are equally good, sort by allocno numbers, so that
    2426              :      the results of qsort leave nothing to chance.  We put allocnos
    2427              :      with higher number first in the list because it is the original
    2428              :      order for allocnos from loops on the same levels.  */
    2429        12415 :   return ALLOCNO_NUM (a2) - ALLOCNO_NUM (a1);
    2430              : }
    2431              : 
    2432              : /* This array is used to sort allocnos to restore allocno order in
    2433              :    the regno allocno list.  */
    2434              : static ira_allocno_t *regno_allocnos;
    2435              : 
    2436              : /* Restore allocno order for REGNO in the regno allocno list.  */
    2437              : static void
    2438      1592338 : ira_rebuild_regno_allocno_list (int regno)
    2439              : {
    2440      1592338 :   int i, n;
    2441      1592338 :   ira_allocno_t a;
    2442              : 
    2443      1592338 :   for (n = 0, a = ira_regno_allocno_map[regno];
    2444      3194731 :        a != NULL;
    2445      1602393 :        a = ALLOCNO_NEXT_REGNO_ALLOCNO (a))
    2446      1602393 :     regno_allocnos[n++] = a;
    2447      1592338 :   ira_assert (n > 0);
    2448      1592338 :   qsort (regno_allocnos, n, sizeof (ira_allocno_t),
    2449              :          regno_allocno_order_compare_func);
    2450      3194731 :   for (i = 1; i < n; i++)
    2451        10055 :     ALLOCNO_NEXT_REGNO_ALLOCNO (regno_allocnos[i - 1]) = regno_allocnos[i];
    2452      1592338 :   ALLOCNO_NEXT_REGNO_ALLOCNO (regno_allocnos[n - 1]) = NULL;
    2453      1592338 :   ira_regno_allocno_map[regno] = regno_allocnos[0];
    2454      1592338 :   if (internal_flag_ira_verbose > 1 && ira_dump_file != NULL)
    2455           67 :     fprintf (ira_dump_file, " Rebuilding regno allocno list for %d\n", regno);
    2456      1592338 : }
    2457              : 
    2458              : /* Propagate info from allocno FROM_A to allocno A.  */
    2459              : static void
    2460      2459146 : propagate_some_info_from_allocno (ira_allocno_t a, ira_allocno_t from_a)
    2461              : {
    2462      2459146 :   enum reg_class aclass;
    2463              : 
    2464      2459146 :   merge_hard_reg_conflicts (from_a, a, false);
    2465      2459146 :   ALLOCNO_NREFS (a) += ALLOCNO_NREFS (from_a);
    2466      2459146 :   ALLOCNO_FREQ (a) += ALLOCNO_FREQ (from_a);
    2467      2459146 :   ALLOCNO_CALL_FREQ (a) += ALLOCNO_CALL_FREQ (from_a);
    2468      2459146 :   ALLOCNO_CALLS_CROSSED_NUM (a) += ALLOCNO_CALLS_CROSSED_NUM (from_a);
    2469      2459146 :   ALLOCNO_CHEAP_CALLS_CROSSED_NUM (a)
    2470      2459146 :     += ALLOCNO_CHEAP_CALLS_CROSSED_NUM (from_a);
    2471      2459146 :   ALLOCNO_CROSSED_CALLS_ABIS (a) |= ALLOCNO_CROSSED_CALLS_ABIS (from_a);
    2472      2459146 :   ALLOCNO_CROSSED_CALLS_CLOBBERED_REGS (a)
    2473      2459146 :     |= ALLOCNO_CROSSED_CALLS_CLOBBERED_REGS (from_a);
    2474      2459146 :   ALLOCNO_SET_REGISTER_FILTERS (a,
    2475              :                                 ALLOCNO_REGISTER_FILTERS (from_a)
    2476              :                                 | ALLOCNO_REGISTER_FILTERS (a));
    2477              : 
    2478      2459146 :   ALLOCNO_EXCESS_PRESSURE_POINTS_NUM (a)
    2479      2459146 :     += ALLOCNO_EXCESS_PRESSURE_POINTS_NUM (from_a);
    2480      2459146 :   if (! ALLOCNO_BAD_SPILL_P (from_a))
    2481      1510060 :     ALLOCNO_BAD_SPILL_P (a) = false;
    2482      2459146 :   aclass = ALLOCNO_CLASS (from_a);
    2483      2459146 :   ira_assert (aclass == ALLOCNO_CLASS (a));
    2484      2459146 :   ira_allocate_and_accumulate_costs (&ALLOCNO_HARD_REG_COSTS (a), aclass,
    2485              :                                      ALLOCNO_HARD_REG_COSTS (from_a));
    2486      2459146 :   ira_allocate_and_accumulate_costs (&ALLOCNO_CONFLICT_HARD_REG_COSTS (a),
    2487              :                                      aclass,
    2488              :                                      ALLOCNO_CONFLICT_HARD_REG_COSTS (from_a));
    2489      2459146 :   ALLOCNO_CLASS_COST (a) += ALLOCNO_CLASS_COST (from_a);
    2490      2459146 :   ALLOCNO_MEMORY_COST (a) += ALLOCNO_MEMORY_COST (from_a);
    2491      2459146 : }
    2492              : 
    2493              : /* Remove allocnos from loops removed from the allocation
    2494              :    consideration.  */
    2495              : static void
    2496       995626 : remove_unnecessary_allocnos (void)
    2497              : {
    2498       995626 :   int regno;
    2499       995626 :   bool merged_p, rebuild_p;
    2500       995626 :   ira_allocno_t a, prev_a, next_a, parent_a;
    2501       995626 :   ira_loop_tree_node_t a_node, parent;
    2502              : 
    2503       995626 :   merged_p = false;
    2504       995626 :   regno_allocnos = NULL;
    2505     49628610 :   for (regno = max_reg_num () - 1; regno >= FIRST_PSEUDO_REGISTER; regno--)
    2506              :     {
    2507     48632984 :       rebuild_p = false;
    2508     48632984 :       for (prev_a = NULL, a = ira_regno_allocno_map[regno];
    2509     71802803 :            a != NULL;
    2510              :            a = next_a)
    2511              :         {
    2512     23169819 :           next_a = ALLOCNO_NEXT_REGNO_ALLOCNO (a);
    2513     23169819 :           a_node = ALLOCNO_LOOP_TREE_NODE (a);
    2514     23169819 :           if (! a_node->to_remove_p)
    2515              :             prev_a = a;
    2516              :           else
    2517              :             {
    2518      4051484 :               for (parent = a_node->parent;
    2519      4354666 :                    (parent_a = parent->regno_allocno_map[regno]) == NULL
    2520      4354666 :                      && parent->to_remove_p;
    2521       303182 :                    parent = parent->parent)
    2522              :                 ;
    2523      4051484 :               if (parent_a == NULL)
    2524              :                 {
    2525              :                   /* There are no allocnos with the same regno in
    2526              :                      upper region -- just move the allocno to the
    2527              :                      upper region.  */
    2528      1592338 :                   prev_a = a;
    2529      1592338 :                   ALLOCNO_LOOP_TREE_NODE (a) = parent;
    2530      1592338 :                   parent->regno_allocno_map[regno] = a;
    2531      1592338 :                   bitmap_set_bit (parent->all_allocnos, ALLOCNO_NUM (a));
    2532      1592338 :                   rebuild_p = true;
    2533              :                 }
    2534              :               else
    2535              :                 {
    2536              :                   /* Remove the allocno and update info of allocno in
    2537              :                      the upper region.  */
    2538      2459146 :                   if (prev_a == NULL)
    2539      2313897 :                     ira_regno_allocno_map[regno] = next_a;
    2540              :                   else
    2541       145249 :                     ALLOCNO_NEXT_REGNO_ALLOCNO (prev_a) = next_a;
    2542      2459146 :                   move_allocno_live_ranges (a, parent_a);
    2543      2459146 :                   merged_p = true;
    2544      2459146 :                   propagate_some_info_from_allocno (parent_a, a);
    2545              :                   /* Remove it from the corresponding regno allocno
    2546              :                      map to avoid info propagation of subsequent
    2547              :                      allocno into this already removed allocno.  */
    2548      2459146 :                   a_node->regno_allocno_map[regno] = NULL;
    2549      2459146 :                   ira_remove_allocno_prefs (a);
    2550      2459146 :                   finish_allocno (a);
    2551              :                 }
    2552              :             }
    2553              :         }
    2554     48632984 :       if (rebuild_p)
    2555              :         /* We need to restore the order in regno allocno list.  */
    2556              :         {
    2557      1592338 :           if (regno_allocnos == NULL)
    2558       131936 :             regno_allocnos
    2559       131936 :               = (ira_allocno_t *) ira_allocate (sizeof (ira_allocno_t)
    2560       131936 :                                                 * ira_allocnos_num);
    2561      1592338 :           ira_rebuild_regno_allocno_list (regno);
    2562              :         }
    2563              :     }
    2564       995626 :   if (merged_p)
    2565       159907 :     ira_rebuild_start_finish_chains ();
    2566       995626 :   if (regno_allocnos != NULL)
    2567       131936 :     ira_free (regno_allocnos);
    2568       995626 : }
    2569              : 
    2570              : /* Remove allocnos from all loops but the root.  */
    2571              : static void
    2572            0 : remove_low_level_allocnos (void)
    2573              : {
    2574            0 :   int regno;
    2575            0 :   bool merged_p, propagate_p;
    2576            0 :   ira_allocno_t a, top_a;
    2577            0 :   ira_loop_tree_node_t a_node, parent;
    2578            0 :   ira_allocno_iterator ai;
    2579              : 
    2580            0 :   merged_p = false;
    2581            0 :   FOR_EACH_ALLOCNO (a, ai)
    2582              :     {
    2583            0 :       a_node = ALLOCNO_LOOP_TREE_NODE (a);
    2584            0 :       if (a_node == ira_loop_tree_root || ALLOCNO_CAP_MEMBER (a) != NULL)
    2585            0 :         continue;
    2586            0 :       regno = ALLOCNO_REGNO (a);
    2587            0 :       if ((top_a = ira_loop_tree_root->regno_allocno_map[regno]) == NULL)
    2588              :         {
    2589            0 :           ALLOCNO_LOOP_TREE_NODE (a) = ira_loop_tree_root;
    2590            0 :           ira_loop_tree_root->regno_allocno_map[regno] = a;
    2591            0 :           continue;
    2592              :         }
    2593            0 :       propagate_p = a_node->parent->regno_allocno_map[regno] == NULL;
    2594              :       /* Remove the allocno and update info of allocno in the upper
    2595              :          region.  */
    2596            0 :       move_allocno_live_ranges (a, top_a);
    2597            0 :       merged_p = true;
    2598            0 :       if (propagate_p)
    2599            0 :         propagate_some_info_from_allocno (top_a, a);
    2600              :     }
    2601            0 :   FOR_EACH_ALLOCNO (a, ai)
    2602              :     {
    2603            0 :       a_node = ALLOCNO_LOOP_TREE_NODE (a);
    2604            0 :       if (a_node == ira_loop_tree_root)
    2605            0 :         continue;
    2606            0 :       parent = a_node->parent;
    2607            0 :       regno = ALLOCNO_REGNO (a);
    2608            0 :       if (ALLOCNO_CAP_MEMBER (a) != NULL)
    2609            0 :         ira_assert (ALLOCNO_CAP (a) != NULL);
    2610            0 :       else if (ALLOCNO_CAP (a) == NULL)
    2611            0 :         ira_assert (parent->regno_allocno_map[regno] != NULL);
    2612              :     }
    2613            0 :   FOR_EACH_ALLOCNO (a, ai)
    2614              :     {
    2615            0 :       regno = ALLOCNO_REGNO (a);
    2616            0 :       if (ira_loop_tree_root->regno_allocno_map[regno] == a)
    2617              :         {
    2618            0 :           ira_object_t obj;
    2619            0 :           ira_allocno_object_iterator oi;
    2620              : 
    2621            0 :           ira_regno_allocno_map[regno] = a;
    2622            0 :           ALLOCNO_NEXT_REGNO_ALLOCNO (a) = NULL;
    2623            0 :           ALLOCNO_CAP_MEMBER (a) = NULL;
    2624            0 :           FOR_EACH_ALLOCNO_OBJECT (a, obj, oi)
    2625            0 :             OBJECT_CONFLICT_HARD_REGS (obj)
    2626            0 :               = OBJECT_TOTAL_CONFLICT_HARD_REGS (obj);
    2627              : #ifdef STACK_REGS
    2628            0 :           if (ALLOCNO_TOTAL_NO_STACK_REG_P (a))
    2629            0 :             ALLOCNO_NO_STACK_REG_P (a) = true;
    2630              : #endif
    2631              :         }
    2632              :       else
    2633              :         {
    2634            0 :           ira_remove_allocno_prefs (a);
    2635            0 :           finish_allocno (a);
    2636              :         }
    2637              :     }
    2638            0 :   if (merged_p)
    2639            0 :     ira_rebuild_start_finish_chains ();
    2640            0 : }
    2641              : 
    2642              : /* Remove loops from consideration.  We remove all loops except for
    2643              :    root if ALL_P or loops for which a separate allocation will not
    2644              :    improve the result.  We have to do this after allocno creation and
    2645              :    their costs and allocno class evaluation because only after that
    2646              :    the register pressure can be known and is calculated.  */
    2647              : static void
    2648      1474414 : remove_unnecessary_regions (bool all_p)
    2649              : {
    2650      1474414 :   if (current_loops == NULL)
    2651              :     return;
    2652       995626 :   if (all_p)
    2653            0 :     mark_all_loops_for_removal ();
    2654              :   else
    2655       995626 :     mark_loops_for_removal ();
    2656      1991252 :   children_vec.create (last_basic_block_for_fn (cfun)
    2657      1991252 :                        + number_of_loops (cfun));
    2658      1991252 :   removed_loop_vec.create (last_basic_block_for_fn (cfun)
    2659      1991252 :                            + number_of_loops (cfun));
    2660       995626 :   remove_uneccesary_loop_nodes_from_loop_tree (ira_loop_tree_root);
    2661       995626 :   children_vec.release ();
    2662       995626 :   if (all_p)
    2663            0 :     remove_low_level_allocnos ();
    2664              :   else
    2665       995626 :     remove_unnecessary_allocnos ();
    2666      1442342 :   while (removed_loop_vec.length () > 0)
    2667       446716 :     finish_loop_tree_node (removed_loop_vec.pop ());
    2668       995626 :   removed_loop_vec.release ();
    2669              : }
    2670              : 
    2671              : 
    2672              : 
    2673              : /* At this point true value of allocno attribute bad_spill_p means
    2674              :    that there is an insn where allocno occurs and where the allocno
    2675              :    cannot be used as memory.  The function updates the attribute, now
    2676              :    it can be true only for allocnos which cannot be used as memory in
    2677              :    an insn and in whose live ranges there is other allocno deaths.
    2678              :    Spilling allocnos with true value will not improve the code because
    2679              :    it will not make other allocnos colorable and additional reloads
    2680              :    for the corresponding pseudo will be generated in reload pass for
    2681              :    each insn it occurs.
    2682              : 
    2683              :    This is a trick mentioned in one classic article of Chaitin etc
    2684              :    which is frequently omitted in other implementations of RA based on
    2685              :    graph coloring.  */
    2686              : static void
    2687      1474414 : update_bad_spill_attribute (void)
    2688              : {
    2689      1474414 :   int i;
    2690      1474414 :   ira_allocno_t a;
    2691      1474414 :   ira_allocno_iterator ai;
    2692      1474414 :   ira_allocno_object_iterator aoi;
    2693      1474414 :   ira_object_t obj;
    2694      1474414 :   live_range_t r;
    2695      1474414 :   enum reg_class aclass;
    2696     50130076 :   bitmap_head dead_points[N_REG_CLASSES];
    2697              : 
    2698     38315166 :   for (i = 0; i < ira_allocno_classes_num; i++)
    2699              :     {
    2700     36840752 :       aclass = ira_allocno_classes[i];
    2701     36840752 :       bitmap_initialize (&dead_points[aclass], &reg_obstack);
    2702              :     }
    2703     35621160 :   FOR_EACH_ALLOCNO (a, ai)
    2704              :     {
    2705     32672332 :       aclass = ALLOCNO_CLASS (a);
    2706     32672332 :       if (aclass == NO_REGS)
    2707       550600 :         continue;
    2708     99654086 :       FOR_EACH_ALLOCNO_OBJECT (a, obj, aoi)
    2709     73256419 :         for (r = OBJECT_LIVE_RANGES (obj); r != NULL; r = r->next)
    2710     39870811 :           bitmap_set_bit (&dead_points[aclass], r->finish);
    2711              :     }
    2712     35621160 :   FOR_EACH_ALLOCNO (a, ai)
    2713              :     {
    2714     32672332 :       aclass = ALLOCNO_CLASS (a);
    2715     32672332 :       if (aclass == NO_REGS)
    2716       550600 :         continue;
    2717     32121732 :       if (! ALLOCNO_BAD_SPILL_P (a))
    2718     17929733 :         continue;
    2719     58471265 :       FOR_EACH_ALLOCNO_OBJECT (a, obj, aoi)
    2720              :         {
    2721     25259703 :           for (r = OBJECT_LIVE_RANGES (obj); r != NULL; r = r->next)
    2722              :             {
    2723     23687992 :               for (i = r->start + 1; i < r->finish; i++)
    2724     12722627 :                 if (bitmap_bit_p (&dead_points[aclass], i))
    2725              :                   break;
    2726     15127183 :               if (i < r->finish)
    2727              :                 break;
    2728              :             }
    2729     14294338 :           if (r != NULL)
    2730              :             {
    2731      4161818 :               ALLOCNO_BAD_SPILL_P (a) = false;
    2732      4161818 :               break;
    2733              :             }
    2734              :         }
    2735              :     }
    2736     38315166 :   for (i = 0; i < ira_allocno_classes_num; i++)
    2737              :     {
    2738     36840752 :       aclass = ira_allocno_classes[i];
    2739     36840752 :       bitmap_clear (&dead_points[aclass]);
    2740              :     }
    2741      1474414 : }
    2742              : 
    2743              : 
    2744              : 
    2745              : /* Set up minimal and maximal live range points for allocnos.  */
    2746              : static void
    2747      1474414 : setup_min_max_allocno_live_range_point (void)
    2748              : {
    2749      1474414 :   int i;
    2750      1474414 :   ira_allocno_t a, parent_a, cap;
    2751      1474414 :   ira_allocno_iterator ai;
    2752              : #ifdef ENABLE_IRA_CHECKING
    2753      1474414 :   ira_object_iterator oi;
    2754      1474414 :   ira_object_t obj;
    2755              : #endif
    2756      1474414 :   live_range_t r;
    2757      1474414 :   ira_loop_tree_node_t parent;
    2758              : 
    2759     37800071 :   FOR_EACH_ALLOCNO (a, ai)
    2760              :     {
    2761     36325657 :       int n = ALLOCNO_NUM_OBJECTS (a);
    2762              : 
    2763     73958184 :       for (i = 0; i < n; i++)
    2764              :         {
    2765     37632527 :           ira_object_t obj = ALLOCNO_OBJECT (a, i);
    2766     37632527 :           r = OBJECT_LIVE_RANGES (obj);
    2767     37632527 :           if (r == NULL)
    2768      3702810 :             continue;
    2769     33929717 :           OBJECT_MAX (obj) = r->finish;
    2770     40585441 :           for (; r->next != NULL; r = r->next)
    2771              :             ;
    2772     33929717 :           OBJECT_MIN (obj) = r->start;
    2773              :         }
    2774              :     }
    2775     66767974 :   for (i = max_reg_num () - 1; i >= FIRST_PSEUDO_REGISTER; i--)
    2776     65293560 :     for (a = ira_regno_allocno_map[i];
    2777     97965892 :          a != NULL;
    2778     32672332 :          a = ALLOCNO_NEXT_REGNO_ALLOCNO (a))
    2779              :       {
    2780     32672332 :         int j;
    2781     32672332 :         int n = ALLOCNO_NUM_OBJECTS (a);
    2782              : 
    2783     66608540 :         for (j = 0; j < n; j++)
    2784              :           {
    2785     33936208 :             ira_object_t obj = ALLOCNO_OBJECT (a, j);
    2786     33936208 :             ira_object_t parent_obj;
    2787              : 
    2788     33936208 :             if (OBJECT_MAX (obj) < 0)
    2789              :               {
    2790              :                 /* The object is not used and hence does not live.  */
    2791            0 :                 ira_assert (OBJECT_LIVE_RANGES (obj) == NULL);
    2792            0 :                 OBJECT_MAX (obj) = 0;
    2793            0 :                 OBJECT_MIN (obj) = 1;
    2794            0 :                 continue;
    2795              :               }
    2796     33936208 :             ira_assert (ALLOCNO_CAP_MEMBER (a) == NULL);
    2797              :             /* Accumulation of range info.  */
    2798     33936208 :             if (ALLOCNO_CAP (a) != NULL)
    2799              :               {
    2800      5629876 :                 for (cap = ALLOCNO_CAP (a); cap != NULL; cap = ALLOCNO_CAP (cap))
    2801              :                   {
    2802      3696319 :                     ira_object_t cap_obj = ALLOCNO_OBJECT (cap, j);
    2803      3696319 :                     if (OBJECT_MAX (cap_obj) < OBJECT_MAX (obj))
    2804      3696319 :                       OBJECT_MAX (cap_obj) = OBJECT_MAX (obj);
    2805      3696319 :                     if (OBJECT_MIN (cap_obj) > OBJECT_MIN (obj))
    2806      3696319 :                       OBJECT_MIN (cap_obj) = OBJECT_MIN (obj);
    2807              :                   }
    2808      1933557 :                 continue;
    2809      1933557 :               }
    2810     32002651 :             if ((parent = ALLOCNO_LOOP_TREE_NODE (a)->parent) == NULL)
    2811     28807228 :               continue;
    2812      3195423 :             parent_a = parent->regno_allocno_map[i];
    2813      3195423 :             parent_obj = ALLOCNO_OBJECT (parent_a, j);
    2814      3195423 :             if (OBJECT_MAX (parent_obj) < OBJECT_MAX (obj))
    2815      1903646 :               OBJECT_MAX (parent_obj) = OBJECT_MAX (obj);
    2816      3195423 :             if (OBJECT_MIN (parent_obj) > OBJECT_MIN (obj))
    2817         6783 :               OBJECT_MIN (parent_obj) = OBJECT_MIN (obj);
    2818              :           }
    2819              :       }
    2820              : #ifdef ENABLE_IRA_CHECKING
    2821     39106941 :   FOR_EACH_OBJECT (obj, oi)
    2822              :     {
    2823     37632527 :       if ((OBJECT_MIN (obj) >= 0 && OBJECT_MIN (obj) <= ira_max_point)
    2824     37632527 :           && (OBJECT_MAX (obj) >= 0 && OBJECT_MAX (obj) <= ira_max_point))
    2825     37632527 :         continue;
    2826            0 :       gcc_unreachable ();
    2827              :     }
    2828              : #endif
    2829      1474414 : }
    2830              : 
    2831              : /* Sort allocnos according to their live ranges.  Allocnos with
    2832              :    smaller allocno class are put first unless we use priority
    2833              :    coloring.  Allocnos with the same class are ordered according
    2834              :    their start (min).  Allocnos with the same start are ordered
    2835              :    according their finish (max).  */
    2836              : static int
    2837   1311600866 : object_range_compare_func (const void *v1p, const void *v2p)
    2838              : {
    2839   1311600866 :   int diff;
    2840   1311600866 :   ira_object_t obj1 = *(const ira_object_t *) v1p;
    2841   1311600866 :   ira_object_t obj2 = *(const ira_object_t *) v2p;
    2842   1311600866 :   ira_allocno_t a1 = OBJECT_ALLOCNO (obj1);
    2843   1311600866 :   ira_allocno_t a2 = OBJECT_ALLOCNO (obj2);
    2844              : 
    2845   1311600866 :   if ((diff = OBJECT_MIN (obj1) - OBJECT_MIN (obj2)) != 0)
    2846              :     return diff;
    2847    206364604 :   if ((diff = OBJECT_MAX (obj1) - OBJECT_MAX (obj2)) != 0)
    2848              :      return diff;
    2849    165078294 :   return ALLOCNO_NUM (a1) - ALLOCNO_NUM (a2);
    2850              : }
    2851              : 
    2852              : /* Sort ira_object_id_map and set up conflict id of allocnos.  */
    2853              : static void
    2854      1474414 : sort_conflict_id_map (void)
    2855              : {
    2856      1474414 :   int i, num;
    2857      1474414 :   ira_allocno_t a;
    2858      1474414 :   ira_allocno_iterator ai;
    2859              : 
    2860      1474414 :   num = 0;
    2861     39274485 :   FOR_EACH_ALLOCNO (a, ai)
    2862              :     {
    2863              :       ira_allocno_object_iterator oi;
    2864              :       ira_object_t obj;
    2865              : 
    2866    111758255 :       FOR_EACH_ALLOCNO_OBJECT (a, obj, oi)
    2867     37632527 :         ira_object_id_map[num++] = obj;
    2868              :     }
    2869      1474414 :   if (num > 1)
    2870      1189096 :     qsort (ira_object_id_map, num, sizeof (ira_object_t),
    2871              :            object_range_compare_func);
    2872     39106941 :   for (i = 0; i < num; i++)
    2873              :     {
    2874     37632527 :       ira_object_t obj = ira_object_id_map[i];
    2875              : 
    2876     37632527 :       gcc_assert (obj != NULL);
    2877     37632527 :       OBJECT_CONFLICT_ID (obj) = i;
    2878              :     }
    2879      3939588 :   for (i = num; i < ira_objects_num; i++)
    2880      2465174 :     ira_object_id_map[i] = NULL;
    2881      1474414 : }
    2882              : 
    2883              : /* Set up minimal and maximal conflict ids of allocnos with which
    2884              :    given allocno can conflict.  */
    2885              : static void
    2886      1474414 : setup_min_max_conflict_allocno_ids (void)
    2887              : {
    2888      1474414 :   int aclass;
    2889      1474414 :   int i, j, min, max, start, finish, first_not_finished, filled_area_start;
    2890      1474414 :   int *live_range_min, *last_lived;
    2891      1474414 :   int word0_min, word0_max;
    2892      1474414 :   ira_allocno_t a;
    2893      1474414 :   ira_allocno_iterator ai;
    2894              : 
    2895      1474414 :   live_range_min = (int *) ira_allocate (sizeof (int) * ira_objects_num);
    2896      1474414 :   aclass = -1;
    2897      1474414 :   first_not_finished = -1;
    2898     41572115 :   for (i = 0; i < ira_objects_num; i++)
    2899              :     {
    2900     40097701 :       ira_object_t obj = ira_object_id_map[i];
    2901              : 
    2902     40097701 :       if (obj == NULL)
    2903      2465174 :         continue;
    2904              : 
    2905     37632527 :       a = OBJECT_ALLOCNO (obj);
    2906              : 
    2907     37632527 :       if (aclass < 0)
    2908              :         {
    2909      1272812 :           aclass = ALLOCNO_CLASS (a);
    2910      1272812 :           min = i;
    2911      1272812 :           first_not_finished = i;
    2912              :         }
    2913              :       else
    2914              :         {
    2915     36359715 :           start = OBJECT_MIN (obj);
    2916              :           /* If we skip an allocno, the allocno with smaller ids will
    2917              :              be also skipped because of the secondary sorting the
    2918              :              range finishes (see function
    2919              :              object_range_compare_func).  */
    2920     36359715 :           while (first_not_finished < i
    2921     51060608 :                  && start > OBJECT_MAX (ira_object_id_map
    2922              :                                         [first_not_finished]))
    2923     14700893 :             first_not_finished++;
    2924              :           min = first_not_finished;
    2925              :         }
    2926     37632527 :       if (min == i)
    2927              :         /* We could increase min further in this case but it is good
    2928              :            enough.  */
    2929      7401790 :         min++;
    2930     37632527 :       live_range_min[i] = OBJECT_MIN (obj);
    2931     37632527 :       OBJECT_MIN (obj) = min;
    2932              :     }
    2933      1474414 :   last_lived = (int *) ira_allocate (sizeof (int) * ira_max_point);
    2934      1474414 :   aclass = -1;
    2935      1474414 :   filled_area_start = -1;
    2936     41572115 :   for (i = ira_objects_num - 1; i >= 0; i--)
    2937              :     {
    2938     40097701 :       ira_object_t obj = ira_object_id_map[i];
    2939              : 
    2940     40097701 :       if (obj == NULL)
    2941      2465174 :         continue;
    2942              : 
    2943     37632527 :       a = OBJECT_ALLOCNO (obj);
    2944     37632527 :       if (aclass < 0)
    2945              :         {
    2946      1272812 :           aclass = ALLOCNO_CLASS (a);
    2947     48603148 :           for (j = 0; j < ira_max_point; j++)
    2948     47330336 :             last_lived[j] = -1;
    2949              :           filled_area_start = ira_max_point;
    2950              :         }
    2951     37632527 :       min = live_range_min[i];
    2952     37632527 :       finish = OBJECT_MAX (obj);
    2953     37632527 :       max = last_lived[finish];
    2954     37632527 :       if (max < 0)
    2955              :         /* We could decrease max further in this case but it is good
    2956              :            enough.  */
    2957     15830036 :         max = OBJECT_CONFLICT_ID (obj) - 1;
    2958     37632527 :       OBJECT_MAX (obj) = max;
    2959              :       /* In filling, we can go further A range finish to recognize
    2960              :          intersection quickly because if the finish of subsequently
    2961              :          processed allocno (it has smaller conflict id) range is
    2962              :          further A range finish than they are definitely intersected
    2963              :          (the reason for this is the allocnos with bigger conflict id
    2964              :          have their range starts not smaller than allocnos with
    2965              :          smaller ids.  */
    2966     84962863 :       for (j = min; j < filled_area_start; j++)
    2967     47330336 :         last_lived[j] = i;
    2968              :       filled_area_start = min;
    2969              :     }
    2970      1474414 :   ira_free (last_lived);
    2971      1474414 :   ira_free (live_range_min);
    2972              : 
    2973              :   /* For allocnos with more than one object, we may later record extra conflicts in
    2974              :      subobject 0 that we cannot really know about here.
    2975              :      For now, simply widen the min/max range of these subobjects.  */
    2976              : 
    2977      1474414 :   word0_min = INT_MAX;
    2978      1474414 :   word0_max = INT_MIN;
    2979              : 
    2980     37800071 :   FOR_EACH_ALLOCNO (a, ai)
    2981              :     {
    2982     36325657 :       int n = ALLOCNO_NUM_OBJECTS (a);
    2983     36325657 :       ira_object_t obj0;
    2984              : 
    2985     36325657 :       if (n < 2)
    2986     35018787 :         continue;
    2987      1306870 :       obj0 = ALLOCNO_OBJECT (a, 0);
    2988      1306870 :       if (OBJECT_CONFLICT_ID (obj0) < word0_min)
    2989              :         word0_min = OBJECT_CONFLICT_ID (obj0);
    2990      1306870 :       if (OBJECT_CONFLICT_ID (obj0) > word0_max)
    2991              :         word0_max = OBJECT_CONFLICT_ID (obj0);
    2992              :     }
    2993     37800071 :   FOR_EACH_ALLOCNO (a, ai)
    2994              :     {
    2995     36325657 :       int n = ALLOCNO_NUM_OBJECTS (a);
    2996     36325657 :       ira_object_t obj0;
    2997              : 
    2998     36325657 :       if (n < 2)
    2999     35018787 :         continue;
    3000      1306870 :       obj0 = ALLOCNO_OBJECT (a, 0);
    3001      1306870 :       if (OBJECT_MIN (obj0) > word0_min)
    3002       814580 :         OBJECT_MIN (obj0) = word0_min;
    3003      1306870 :       if (OBJECT_MAX (obj0) < word0_max)
    3004      1037441 :         OBJECT_MAX (obj0) = word0_max;
    3005              :     }
    3006      1474414 : }
    3007              : 
    3008              : 
    3009              : 
    3010              : static void
    3011        35188 : create_caps (void)
    3012              : {
    3013        35188 :   ira_allocno_t a;
    3014        35188 :   ira_allocno_iterator ai;
    3015        35188 :   ira_loop_tree_node_t loop_tree_node;
    3016              : 
    3017     11525051 :   FOR_EACH_ALLOCNO (a, ai)
    3018              :     {
    3019     11489863 :       if (ALLOCNO_LOOP_TREE_NODE (a) == ira_loop_tree_root)
    3020      4707448 :         continue;
    3021      6782415 :       if (ALLOCNO_CAP_MEMBER (a) != NULL)
    3022      1746719 :         create_cap_allocno (a);
    3023      5035696 :       else if (ALLOCNO_CAP (a) == NULL)
    3024              :         {
    3025      5035696 :           loop_tree_node = ALLOCNO_LOOP_TREE_NODE (a);
    3026      5035696 :           if (!bitmap_bit_p (loop_tree_node->border_allocnos, ALLOCNO_NUM (a)))
    3027      1906606 :             create_cap_allocno (a);
    3028              :         }
    3029              :     }
    3030        35188 : }
    3031              : 
    3032              : 
    3033              : 
    3034              : /* The page contains code transforming more one region internal
    3035              :    representation (IR) to one region IR which is necessary for reload.
    3036              :    This transformation is called IR flattening.  We might just rebuild
    3037              :    the IR for one region but we don't do it because it takes a lot of
    3038              :    time.  */
    3039              : 
    3040              : /* Map: regno -> allocnos which will finally represent the regno for
    3041              :    IR with one region.  */
    3042              : static ira_allocno_t *regno_top_level_allocno_map;
    3043              : 
    3044              : /* Find the allocno that corresponds to A at a level one higher up in the
    3045              :    loop tree.  Returns NULL if A is a cap, or if it has no parent.  */
    3046              : ira_allocno_t
    3047    251166516 : ira_parent_allocno (ira_allocno_t a)
    3048              : {
    3049    251166516 :   ira_loop_tree_node_t parent;
    3050              : 
    3051    251166516 :   if (ALLOCNO_CAP (a) != NULL)
    3052              :     return NULL;
    3053              : 
    3054    251166516 :   parent = ALLOCNO_LOOP_TREE_NODE (a)->parent;
    3055    251166516 :   if (parent == NULL)
    3056              :     return NULL;
    3057              : 
    3058    232331586 :   return parent->regno_allocno_map[ALLOCNO_REGNO (a)];
    3059              : }
    3060              : 
    3061              : /* Find the allocno that corresponds to A at a level one higher up in the
    3062              :    loop tree.  If ALLOCNO_CAP is set for A, return that.  */
    3063              : ira_allocno_t
    3064    360838333 : ira_parent_or_cap_allocno (ira_allocno_t a)
    3065              : {
    3066    360838333 :   if (ALLOCNO_CAP (a) != NULL)
    3067              :     return ALLOCNO_CAP (a);
    3068              : 
    3069    196810888 :   return ira_parent_allocno (a);
    3070              : }
    3071              : 
    3072              : /* Process all allocnos originated from pseudo REGNO and copy live
    3073              :    ranges, hard reg conflicts, and allocno stack reg attributes from
    3074              :    low level allocnos to final allocnos which are destinations of
    3075              :    removed stores at a loop exit.  Return true if we copied live
    3076              :    ranges.  */
    3077              : static bool
    3078            0 : copy_info_to_removed_store_destinations (int regno)
    3079              : {
    3080            0 :   ira_allocno_t a;
    3081            0 :   ira_allocno_t parent_a = NULL;
    3082            0 :   ira_loop_tree_node_t parent;
    3083            0 :   bool merged_p;
    3084              : 
    3085            0 :   merged_p = false;
    3086            0 :   for (a = ira_regno_allocno_map[regno];
    3087            0 :        a != NULL;
    3088            0 :        a = ALLOCNO_NEXT_REGNO_ALLOCNO (a))
    3089              :     {
    3090            0 :       if (a != regno_top_level_allocno_map[REGNO (allocno_emit_reg (a))])
    3091              :         /* This allocno will be removed.  */
    3092            0 :         continue;
    3093              : 
    3094              :       /* Caps will be removed.  */
    3095            0 :       ira_assert (ALLOCNO_CAP_MEMBER (a) == NULL);
    3096            0 :       for (parent = ALLOCNO_LOOP_TREE_NODE (a)->parent;
    3097            0 :            parent != NULL;
    3098            0 :            parent = parent->parent)
    3099            0 :         if ((parent_a = parent->regno_allocno_map[regno]) == NULL
    3100            0 :             || (parent_a
    3101            0 :                 == regno_top_level_allocno_map[REGNO
    3102            0 :                                                (allocno_emit_reg (parent_a))]
    3103            0 :                 && ALLOCNO_EMIT_DATA (parent_a)->mem_optimized_dest_p))
    3104              :           break;
    3105            0 :       if (parent == NULL || parent_a == NULL)
    3106            0 :         continue;
    3107              : 
    3108            0 :       copy_allocno_live_ranges (a, parent_a);
    3109            0 :       merge_hard_reg_conflicts (a, parent_a, true);
    3110              : 
    3111            0 :       ALLOCNO_CALL_FREQ (parent_a) += ALLOCNO_CALL_FREQ (a);
    3112            0 :       ALLOCNO_CALLS_CROSSED_NUM (parent_a)
    3113            0 :         += ALLOCNO_CALLS_CROSSED_NUM (a);
    3114            0 :       ALLOCNO_CHEAP_CALLS_CROSSED_NUM (parent_a)
    3115            0 :         += ALLOCNO_CHEAP_CALLS_CROSSED_NUM (a);
    3116            0 :       ALLOCNO_CROSSED_CALLS_ABIS (parent_a)
    3117            0 :         |= ALLOCNO_CROSSED_CALLS_ABIS (a);
    3118            0 :       ALLOCNO_CROSSED_CALLS_CLOBBERED_REGS (parent_a)
    3119            0 :         |= ALLOCNO_CROSSED_CALLS_CLOBBERED_REGS (a);
    3120            0 :       ALLOCNO_EXCESS_PRESSURE_POINTS_NUM (parent_a)
    3121            0 :         += ALLOCNO_EXCESS_PRESSURE_POINTS_NUM (a);
    3122            0 :       merged_p = true;
    3123              :     }
    3124            0 :   return merged_p;
    3125              : }
    3126              : 
    3127              : /* Flatten the IR.  In other words, this function transforms IR as if
    3128              :    it were built with one region (without loops).  We could make it
    3129              :    much simpler by rebuilding IR with one region, but unfortunately it
    3130              :    takes a lot of time.  MAX_REGNO_BEFORE_EMIT and
    3131              :    IRA_MAX_POINT_BEFORE_EMIT are correspondingly MAX_REG_NUM () and
    3132              :    IRA_MAX_POINT before emitting insns on the loop borders.  */
    3133              : void
    3134            0 : ira_flattening (int max_regno_before_emit, int ira_max_point_before_emit)
    3135              : {
    3136            0 :   int i, j;
    3137            0 :   bool keep_p;
    3138            0 :   int hard_regs_num;
    3139            0 :   bool new_pseudos_p, merged_p, mem_dest_p;
    3140            0 :   unsigned int n;
    3141            0 :   enum reg_class aclass;
    3142            0 :   ira_allocno_t a, parent_a, first, second, node_first, node_second;
    3143            0 :   ira_copy_t cp;
    3144            0 :   ira_loop_tree_node_t node;
    3145            0 :   live_range_t r;
    3146            0 :   ira_allocno_iterator ai;
    3147            0 :   ira_copy_iterator ci;
    3148              : 
    3149            0 :   regno_top_level_allocno_map
    3150            0 :     = (ira_allocno_t *) ira_allocate (max_reg_num ()
    3151              :                                       * sizeof (ira_allocno_t));
    3152            0 :   memset (regno_top_level_allocno_map, 0,
    3153            0 :           max_reg_num () * sizeof (ira_allocno_t));
    3154            0 :   new_pseudos_p = merged_p = false;
    3155            0 :   FOR_EACH_ALLOCNO (a, ai)
    3156              :     {
    3157            0 :       ira_allocno_object_iterator oi;
    3158            0 :       ira_object_t obj;
    3159              : 
    3160            0 :       if (ALLOCNO_CAP_MEMBER (a) != NULL)
    3161              :         /* Caps are not in the regno allocno maps and they are never
    3162              :            will be transformed into allocnos existing after IR
    3163              :            flattening.  */
    3164            0 :         continue;
    3165            0 :       FOR_EACH_ALLOCNO_OBJECT (a, obj, oi)
    3166            0 :         OBJECT_TOTAL_CONFLICT_HARD_REGS (obj)
    3167            0 :           = OBJECT_CONFLICT_HARD_REGS (obj);
    3168              : #ifdef STACK_REGS
    3169            0 :       ALLOCNO_TOTAL_NO_STACK_REG_P (a) = ALLOCNO_NO_STACK_REG_P (a);
    3170              : #endif
    3171              :     }
    3172              :   /* Fix final allocno attributes.  */
    3173            0 :   for (i = max_regno_before_emit - 1; i >= FIRST_PSEUDO_REGISTER; i--)
    3174              :     {
    3175            0 :       mem_dest_p = false;
    3176            0 :       for (a = ira_regno_allocno_map[i];
    3177            0 :            a != NULL;
    3178            0 :            a = ALLOCNO_NEXT_REGNO_ALLOCNO (a))
    3179              :         {
    3180            0 :           ira_emit_data_t parent_data, data = ALLOCNO_EMIT_DATA (a);
    3181              : 
    3182            0 :           ira_assert (ALLOCNO_CAP_MEMBER (a) == NULL);
    3183            0 :           if (data->somewhere_renamed_p)
    3184            0 :             new_pseudos_p = true;
    3185            0 :           parent_a = ira_parent_allocno (a);
    3186            0 :           if (parent_a == NULL)
    3187              :             {
    3188            0 :               ALLOCNO_COPIES (a) = NULL;
    3189            0 :               regno_top_level_allocno_map[REGNO (data->reg)] = a;
    3190            0 :               continue;
    3191              :             }
    3192            0 :           ira_assert (ALLOCNO_CAP_MEMBER (parent_a) == NULL);
    3193              : 
    3194            0 :           if (data->mem_optimized_dest != NULL)
    3195            0 :             mem_dest_p = true;
    3196            0 :           parent_data = ALLOCNO_EMIT_DATA (parent_a);
    3197            0 :           if (REGNO (data->reg) == REGNO (parent_data->reg))
    3198              :             {
    3199            0 :               merge_hard_reg_conflicts (a, parent_a, true);
    3200            0 :               move_allocno_live_ranges (a, parent_a);
    3201            0 :               merged_p = true;
    3202            0 :               parent_data->mem_optimized_dest_p
    3203            0 :                 = (parent_data->mem_optimized_dest_p
    3204            0 :                    || data->mem_optimized_dest_p);
    3205            0 :               continue;
    3206              :             }
    3207            0 :           new_pseudos_p = true;
    3208            0 :           for (;;)
    3209              :             {
    3210            0 :               ALLOCNO_NREFS (parent_a) -= ALLOCNO_NREFS (a);
    3211            0 :               ALLOCNO_FREQ (parent_a) -= ALLOCNO_FREQ (a);
    3212            0 :               ALLOCNO_CALL_FREQ (parent_a) -= ALLOCNO_CALL_FREQ (a);
    3213            0 :               ALLOCNO_CALLS_CROSSED_NUM (parent_a)
    3214            0 :                 -= ALLOCNO_CALLS_CROSSED_NUM (a);
    3215            0 :               ALLOCNO_CHEAP_CALLS_CROSSED_NUM (parent_a)
    3216            0 :                 -= ALLOCNO_CHEAP_CALLS_CROSSED_NUM (a);
    3217              :               /* Assume that ALLOCNO_CROSSED_CALLS_ABIS and
    3218              :                  ALLOCNO_CROSSED_CALLS_CLOBBERED_REGS stay the same.
    3219              :                  We'd need to rebuild the IR to do better.  */
    3220            0 :               ALLOCNO_EXCESS_PRESSURE_POINTS_NUM (parent_a)
    3221            0 :                 -= ALLOCNO_EXCESS_PRESSURE_POINTS_NUM (a);
    3222            0 :               ira_assert (ALLOCNO_CALLS_CROSSED_NUM (parent_a) >= 0
    3223              :                           && ALLOCNO_NREFS (parent_a) >= 0
    3224              :                           && ALLOCNO_FREQ (parent_a) >= 0);
    3225            0 :               aclass = ALLOCNO_CLASS (parent_a);
    3226            0 :               hard_regs_num = ira_class_hard_regs_num[aclass];
    3227            0 :               if (ALLOCNO_HARD_REG_COSTS (a) != NULL
    3228            0 :                   && ALLOCNO_HARD_REG_COSTS (parent_a) != NULL)
    3229            0 :                 for (j = 0; j < hard_regs_num; j++)
    3230            0 :                   ALLOCNO_HARD_REG_COSTS (parent_a)[j]
    3231            0 :                     -= ALLOCNO_HARD_REG_COSTS (a)[j];
    3232            0 :               if (ALLOCNO_CONFLICT_HARD_REG_COSTS (a) != NULL
    3233            0 :                   && ALLOCNO_CONFLICT_HARD_REG_COSTS (parent_a) != NULL)
    3234            0 :                 for (j = 0; j < hard_regs_num; j++)
    3235            0 :                   ALLOCNO_CONFLICT_HARD_REG_COSTS (parent_a)[j]
    3236            0 :                     -= ALLOCNO_CONFLICT_HARD_REG_COSTS (a)[j];
    3237            0 :               ALLOCNO_CLASS_COST (parent_a)
    3238            0 :                 -= ALLOCNO_CLASS_COST (a);
    3239            0 :               ALLOCNO_MEMORY_COST (parent_a) -= ALLOCNO_MEMORY_COST (a);
    3240            0 :               parent_a = ira_parent_allocno (parent_a);
    3241            0 :               if (parent_a == NULL)
    3242              :                 break;
    3243              :             }
    3244            0 :           ALLOCNO_COPIES (a) = NULL;
    3245            0 :           regno_top_level_allocno_map[REGNO (data->reg)] = a;
    3246              :         }
    3247            0 :       if (mem_dest_p && copy_info_to_removed_store_destinations (i))
    3248              :         merged_p = true;
    3249              :     }
    3250            0 :   ira_assert (new_pseudos_p || ira_max_point_before_emit == ira_max_point);
    3251            0 :   if (merged_p || ira_max_point_before_emit != ira_max_point)
    3252            0 :     ira_rebuild_start_finish_chains ();
    3253            0 :   if (new_pseudos_p)
    3254              :     {
    3255            0 :       sparseset objects_live;
    3256              : 
    3257              :       /* Rebuild conflicts.  */
    3258            0 :       FOR_EACH_ALLOCNO (a, ai)
    3259              :         {
    3260            0 :           ira_allocno_object_iterator oi;
    3261            0 :           ira_object_t obj;
    3262              : 
    3263            0 :           if (a != regno_top_level_allocno_map[REGNO (allocno_emit_reg (a))]
    3264            0 :               || ALLOCNO_CAP_MEMBER (a) != NULL)
    3265            0 :             continue;
    3266            0 :           FOR_EACH_ALLOCNO_OBJECT (a, obj, oi)
    3267              :             {
    3268            0 :               for (r = OBJECT_LIVE_RANGES (obj); r != NULL; r = r->next)
    3269            0 :                 ira_assert (r->object == obj);
    3270            0 :               clear_conflicts (obj);
    3271              :             }
    3272              :         }
    3273            0 :       objects_live = sparseset_alloc (ira_objects_num);
    3274            0 :       for (i = 0; i < ira_max_point; i++)
    3275              :         {
    3276            0 :           for (r = ira_start_point_ranges[i]; r != NULL; r = r->start_next)
    3277              :             {
    3278            0 :               ira_object_t obj = r->object;
    3279              : 
    3280            0 :               a = OBJECT_ALLOCNO (obj);
    3281            0 :               if (a != regno_top_level_allocno_map[REGNO (allocno_emit_reg (a))]
    3282            0 :                   || ALLOCNO_CAP_MEMBER (a) != NULL)
    3283            0 :                 continue;
    3284              : 
    3285            0 :               aclass = ALLOCNO_CLASS (a);
    3286            0 :               EXECUTE_IF_SET_IN_SPARSESET (objects_live, n)
    3287              :                 {
    3288            0 :                   ira_object_t live_obj = ira_object_id_map[n];
    3289            0 :                   ira_allocno_t live_a = OBJECT_ALLOCNO (live_obj);
    3290            0 :                   enum reg_class live_aclass = ALLOCNO_CLASS (live_a);
    3291              : 
    3292            0 :                   if (ira_reg_classes_intersect_p[aclass][live_aclass]
    3293              :                       /* Don't set up conflict for the allocno with itself.  */
    3294            0 :                       && live_a != a)
    3295            0 :                     ira_add_conflict (obj, live_obj);
    3296              :                 }
    3297            0 :               sparseset_set_bit (objects_live, OBJECT_CONFLICT_ID (obj));
    3298              :             }
    3299              : 
    3300            0 :           for (r = ira_finish_point_ranges[i]; r != NULL; r = r->finish_next)
    3301            0 :             sparseset_clear_bit (objects_live, OBJECT_CONFLICT_ID (r->object));
    3302              :         }
    3303            0 :       sparseset_free (objects_live);
    3304            0 :       compress_conflict_vecs ();
    3305              :     }
    3306              :   /* Mark some copies for removing and change allocnos in the rest
    3307              :      copies.  */
    3308            0 :   FOR_EACH_COPY (cp, ci)
    3309              :     {
    3310            0 :       if (ALLOCNO_CAP_MEMBER (cp->first) != NULL
    3311            0 :           || ALLOCNO_CAP_MEMBER (cp->second) != NULL)
    3312              :         {
    3313            0 :           if (internal_flag_ira_verbose > 4 && ira_dump_file != NULL)
    3314            0 :             fprintf
    3315            0 :               (ira_dump_file, "      Remove cp%d:%c%dr%d-%c%dr%d\n",
    3316              :                cp->num, ALLOCNO_CAP_MEMBER (cp->first) != NULL ? 'c' : 'a',
    3317              :                ALLOCNO_NUM (cp->first),
    3318            0 :                REGNO (allocno_emit_reg (cp->first)),
    3319            0 :                ALLOCNO_CAP_MEMBER (cp->second) != NULL ? 'c' : 'a',
    3320              :                ALLOCNO_NUM (cp->second),
    3321            0 :                REGNO (allocno_emit_reg (cp->second)));
    3322            0 :           cp->loop_tree_node = NULL;
    3323            0 :           continue;
    3324              :         }
    3325            0 :       first
    3326            0 :         = regno_top_level_allocno_map[REGNO (allocno_emit_reg (cp->first))];
    3327            0 :       second
    3328            0 :         = regno_top_level_allocno_map[REGNO (allocno_emit_reg (cp->second))];
    3329            0 :       node = cp->loop_tree_node;
    3330            0 :       if (node == NULL)
    3331              :         keep_p = true; /* It copy generated in ira-emit.cc.  */
    3332              :       else
    3333              :         {
    3334              :           /* Check that the copy was not propagated from level on
    3335              :              which we will have different pseudos.  */
    3336            0 :           node_first = node->regno_allocno_map[ALLOCNO_REGNO (cp->first)];
    3337            0 :           node_second = node->regno_allocno_map[ALLOCNO_REGNO (cp->second)];
    3338            0 :           keep_p = ((REGNO (allocno_emit_reg (first))
    3339            0 :                      == REGNO (allocno_emit_reg (node_first)))
    3340            0 :                      && (REGNO (allocno_emit_reg (second))
    3341            0 :                          == REGNO (allocno_emit_reg (node_second))));
    3342              :         }
    3343            0 :       if (keep_p)
    3344              :         {
    3345            0 :           cp->loop_tree_node = ira_loop_tree_root;
    3346            0 :           cp->first = first;
    3347            0 :           cp->second = second;
    3348              :         }
    3349              :       else
    3350              :         {
    3351            0 :           cp->loop_tree_node = NULL;
    3352            0 :           if (internal_flag_ira_verbose > 4 && ira_dump_file != NULL)
    3353            0 :             fprintf (ira_dump_file, "      Remove cp%d:a%dr%d-a%dr%d\n",
    3354              :                      cp->num, ALLOCNO_NUM (cp->first),
    3355            0 :                      REGNO (allocno_emit_reg (cp->first)),
    3356              :                      ALLOCNO_NUM (cp->second),
    3357            0 :                      REGNO (allocno_emit_reg (cp->second)));
    3358              :         }
    3359              :     }
    3360              :   /* Remove unnecessary allocnos on lower levels of the loop tree.  */
    3361            0 :   FOR_EACH_ALLOCNO (a, ai)
    3362              :     {
    3363            0 :       if (a != regno_top_level_allocno_map[REGNO (allocno_emit_reg (a))]
    3364            0 :           || ALLOCNO_CAP_MEMBER (a) != NULL)
    3365              :         {
    3366            0 :           if (internal_flag_ira_verbose > 4 && ira_dump_file != NULL)
    3367            0 :             fprintf (ira_dump_file, "      Remove a%dr%d\n",
    3368            0 :                      ALLOCNO_NUM (a), REGNO (allocno_emit_reg (a)));
    3369            0 :           ira_remove_allocno_prefs (a);
    3370            0 :           finish_allocno (a);
    3371            0 :           continue;
    3372              :         }
    3373            0 :       ALLOCNO_LOOP_TREE_NODE (a) = ira_loop_tree_root;
    3374            0 :       ALLOCNO_REGNO (a) = REGNO (allocno_emit_reg (a));
    3375            0 :       ALLOCNO_CAP (a) = NULL;
    3376              :       /* Restore updated costs for assignments from reload.  */
    3377            0 :       ALLOCNO_UPDATED_MEMORY_COST (a) = ALLOCNO_MEMORY_COST (a);
    3378            0 :       ALLOCNO_UPDATED_CLASS_COST (a) = ALLOCNO_CLASS_COST (a);
    3379            0 :       if (! ALLOCNO_ASSIGNED_P (a))
    3380            0 :         ira_free_allocno_updated_costs (a);
    3381            0 :       ira_assert (ALLOCNO_UPDATED_HARD_REG_COSTS (a) == NULL);
    3382            0 :       ira_assert (ALLOCNO_UPDATED_CONFLICT_HARD_REG_COSTS (a) == NULL);
    3383              :     }
    3384              :   /* Remove unnecessary copies.  */
    3385            0 :   FOR_EACH_COPY (cp, ci)
    3386              :     {
    3387            0 :       if (cp->loop_tree_node == NULL)
    3388              :         {
    3389            0 :           ira_copies[cp->num] = NULL;
    3390            0 :           finish_copy (cp);
    3391            0 :           continue;
    3392              :         }
    3393            0 :       ira_assert
    3394              :         (ALLOCNO_LOOP_TREE_NODE (cp->first) == ira_loop_tree_root
    3395              :          && ALLOCNO_LOOP_TREE_NODE (cp->second) == ira_loop_tree_root);
    3396            0 :       add_allocno_copy_to_list (cp);
    3397            0 :       swap_allocno_copy_ends_if_necessary (cp);
    3398              :     }
    3399            0 :   rebuild_regno_allocno_maps ();
    3400            0 :   if (ira_max_point != ira_max_point_before_emit)
    3401            0 :     ira_compress_allocno_live_ranges ();
    3402            0 :   ira_free (regno_top_level_allocno_map);
    3403            0 : }
    3404              : 
    3405              : 
    3406              : 
    3407              : #ifdef ENABLE_IRA_CHECKING
    3408              : /* Check creation of all allocnos.  Allocnos on lower levels should
    3409              :    have allocnos or caps on all upper levels.  */
    3410              : static void
    3411      1474414 : check_allocno_creation (void)
    3412              : {
    3413      1474414 :   ira_allocno_t a;
    3414      1474414 :   ira_allocno_iterator ai;
    3415      1474414 :   ira_loop_tree_node_t loop_tree_node;
    3416              : 
    3417     37800071 :   FOR_EACH_ALLOCNO (a, ai)
    3418              :     {
    3419     36325657 :       loop_tree_node = ALLOCNO_LOOP_TREE_NODE (a);
    3420     36325657 :       ira_assert (bitmap_bit_p (loop_tree_node->all_allocnos,
    3421              :                                 ALLOCNO_NUM (a)));
    3422     36325657 :       if (loop_tree_node == ira_loop_tree_root)
    3423     29543242 :         continue;
    3424      6782415 :       if (ALLOCNO_CAP_MEMBER (a) != NULL)
    3425      1746719 :         ira_assert (ALLOCNO_CAP (a) != NULL);
    3426      5035696 :       else if (ALLOCNO_CAP (a) == NULL)
    3427      3129090 :         ira_assert (loop_tree_node->parent
    3428              :                     ->regno_allocno_map[ALLOCNO_REGNO (a)] != NULL
    3429              :                     && bitmap_bit_p (loop_tree_node->border_allocnos,
    3430              :                                      ALLOCNO_NUM (a)));
    3431              :     }
    3432      1474414 : }
    3433              : #endif
    3434              : 
    3435              : /* Identify allocnos which prefer a register class with a single hard register.
    3436              :    Adjust ALLOCNO_CONFLICT_HARD_REG_COSTS so that conflicting allocnos are
    3437              :    less likely to use the preferred singleton register.  */
    3438              : static void
    3439      1474414 : update_conflict_hard_reg_costs (void)
    3440              : {
    3441      1474414 :   ira_allocno_t a;
    3442      1474414 :   ira_allocno_iterator ai;
    3443      1474414 :   int i, index, min;
    3444              : 
    3445     37800071 :   FOR_EACH_ALLOCNO (a, ai)
    3446              :     {
    3447     36325657 :       reg_class_t aclass = ALLOCNO_CLASS (a);
    3448     36325657 :       reg_class_t pref = reg_preferred_class (ALLOCNO_REGNO (a));
    3449     36325657 :       int singleton = ira_class_singleton[pref][ALLOCNO_MODE (a)];
    3450     36325657 :       if (singleton < 0)
    3451     28522264 :         continue;
    3452      7803393 :       index = ira_class_hard_reg_index[(int) aclass][singleton];
    3453      7803393 :       if (index < 0)
    3454            0 :         continue;
    3455      7803393 :       if (ALLOCNO_CONFLICT_HARD_REG_COSTS (a) == NULL
    3456       755102 :           || ALLOCNO_HARD_REG_COSTS (a) == NULL)
    3457      7170579 :         continue;
    3458       632814 :       min = INT_MAX;
    3459      9687833 :       for (i = ira_class_hard_regs_num[(int) aclass] - 1; i >= 0; i--)
    3460      9055019 :         if (ALLOCNO_HARD_REG_COSTS (a)[i] > ALLOCNO_CLASS_COST (a)
    3461      7893568 :             && min > ALLOCNO_HARD_REG_COSTS (a)[i])
    3462      9055019 :           min = ALLOCNO_HARD_REG_COSTS (a)[i];
    3463       632814 :       if (min == INT_MAX)
    3464         7678 :         continue;
    3465       625136 :       ira_allocate_and_set_costs (&ALLOCNO_CONFLICT_HARD_REG_COSTS (a),
    3466              :                                   aclass, 0);
    3467       625136 :       ALLOCNO_CONFLICT_HARD_REG_COSTS (a)[index]
    3468       625136 :         -= min - ALLOCNO_CLASS_COST (a);
    3469              :     }
    3470      1474414 : }
    3471              : 
    3472              : /* Create a internal representation (IR) for IRA (allocnos, copies,
    3473              :    loop tree nodes).  The function returns TRUE if we generate loop
    3474              :    structure (besides nodes representing all function and the basic
    3475              :    blocks) for regional allocation.  A true return means that we
    3476              :    really need to flatten IR before the reload.  */
    3477              : bool
    3478      1474414 : ira_build (void)
    3479              : {
    3480      1474414 :   bool loops_p;
    3481              : 
    3482      1474414 :   df_analyze ();
    3483      1474414 :   initiate_cost_vectors ();
    3484      1474414 :   initiate_allocnos ();
    3485      1474414 :   initiate_prefs ();
    3486      1474414 :   initiate_copies ();
    3487      1474414 :   create_loop_tree_nodes ();
    3488      1474414 :   form_loop_tree ();
    3489      1474414 :   create_allocnos ();
    3490      1474414 :   ira_costs ();
    3491      1474414 :   create_allocno_objects ();
    3492      1474414 :   ira_create_allocno_live_ranges ();
    3493      1474414 :   remove_unnecessary_regions (false);
    3494      1474414 :   ira_compress_allocno_live_ranges ();
    3495      1474414 :   update_bad_spill_attribute ();
    3496      1474414 :   loops_p = more_one_region_p ();
    3497      1474414 :   if (loops_p)
    3498              :     {
    3499        35188 :       propagate_allocno_info ();
    3500        35188 :       create_caps ();
    3501              :     }
    3502      1474414 :   ira_tune_allocno_costs ();
    3503              : #ifdef ENABLE_IRA_CHECKING
    3504      1474414 :   check_allocno_creation ();
    3505              : #endif
    3506      1474414 :   setup_min_max_allocno_live_range_point ();
    3507      1474414 :   sort_conflict_id_map ();
    3508      1474414 :   setup_min_max_conflict_allocno_ids ();
    3509      1474414 :   ira_build_conflicts ();
    3510      1474414 :   update_conflict_hard_reg_costs ();
    3511      1474414 :   if (! ira_conflicts_p)
    3512              :     {
    3513       432922 :       ira_allocno_t a;
    3514       432922 :       ira_allocno_iterator ai;
    3515              : 
    3516              :       /* Remove all regions but root one.  */
    3517       432922 :       if (loops_p)
    3518              :         {
    3519            0 :           remove_unnecessary_regions (true);
    3520            0 :           loops_p = false;
    3521              :         }
    3522              :       /* We don't save hard registers around calls for fast allocation
    3523              :          -- add caller clobbered registers as conflicting ones to
    3524              :          allocno crossing calls.  */
    3525     12290380 :       FOR_EACH_ALLOCNO (a, ai)
    3526     11424536 :         if (ALLOCNO_CALLS_CROSSED_NUM (a) != 0)
    3527       197792 :           ior_hard_reg_conflicts (a, ira_need_caller_save_regs (a));
    3528              :     }
    3529      1474414 :   if (internal_flag_ira_verbose > 2 && ira_dump_file != NULL)
    3530           95 :     print_copies (ira_dump_file);
    3531      1474414 :   if (internal_flag_ira_verbose > 2 && ira_dump_file != NULL)
    3532           95 :     print_prefs (ira_dump_file);
    3533      1474414 :   if (internal_flag_ira_verbose > 0 && ira_dump_file != NULL)
    3534              :     {
    3535           95 :       int n, nr, nr_big;
    3536           95 :       ira_allocno_t a;
    3537           95 :       live_range_t r;
    3538           95 :       ira_allocno_iterator ai;
    3539              : 
    3540           95 :       n = 0;
    3541           95 :       nr = 0;
    3542           95 :       nr_big = 0;
    3543          690 :       FOR_EACH_ALLOCNO (a, ai)
    3544              :         {
    3545          595 :           int j, nobj = ALLOCNO_NUM_OBJECTS (a);
    3546              : 
    3547          595 :           if (nobj > 1)
    3548            0 :             nr_big++;
    3549         1190 :           for (j = 0; j < nobj; j++)
    3550              :             {
    3551          595 :               ira_object_t obj = ALLOCNO_OBJECT (a, j);
    3552          595 :               n += OBJECT_NUM_CONFLICTS (obj);
    3553         1343 :               for (r = OBJECT_LIVE_RANGES (obj); r != NULL; r = r->next)
    3554          748 :                 nr++;
    3555              :             }
    3556              :         }
    3557          190 :       fprintf (ira_dump_file, "  regions=%d, blocks=%d, points=%d\n",
    3558          130 :                current_loops == NULL ? 1 : number_of_loops (cfun),
    3559           95 :                n_basic_blocks_for_fn (cfun), ira_max_point);
    3560           95 :       fprintf (ira_dump_file,
    3561              :                "    allocnos=%d (big %d), copies=%d, conflicts=%d, ranges=%d\n",
    3562              :                ira_allocnos_num, nr_big, ira_copies_num, n, nr);
    3563              :     }
    3564      1474414 :   return loops_p;
    3565              : }
    3566              : 
    3567              : /* Release the data created by function ira_build.  */
    3568              : void
    3569      1474414 : ira_destroy (void)
    3570              : {
    3571      1474414 :   finish_loop_tree_nodes ();
    3572      1474414 :   finish_prefs ();
    3573      1474414 :   finish_copies ();
    3574      1474414 :   finish_allocnos ();
    3575      1474414 :   finish_cost_vectors ();
    3576      1474414 :   ira_finish_allocno_live_ranges ();
    3577      1474414 : }
        

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.