LCOV - code coverage report
Current view: top level - gcc - df-scan.cc (source / functions) Coverage Total Hit
Test: gcc.info Lines: 85.6 % 1930 1652
Test Date: 2026-03-28 14:25:54 Functions: 92.8 % 97 90
Legend: Lines:     hit not hit

            Line data    Source code
       1              : /* Scanning of rtl for dataflow analysis.
       2              :    Copyright (C) 1999-2026 Free Software Foundation, Inc.
       3              :    Originally contributed by Michael P. Hayes
       4              :              (m.hayes@elec.canterbury.ac.nz, mhayes@redhat.com)
       5              :    Major rewrite contributed by Danny Berlin (dberlin@dberlin.org)
       6              :              and Kenneth Zadeck (zadeck@naturalbridge.com).
       7              : 
       8              : This file is part of GCC.
       9              : 
      10              : GCC is free software; you can redistribute it and/or modify it under
      11              : the terms of the GNU General Public License as published by the Free
      12              : Software Foundation; either version 3, or (at your option) any later
      13              : version.
      14              : 
      15              : GCC is distributed in the hope that it will be useful, but WITHOUT ANY
      16              : WARRANTY; without even the implied warranty of MERCHANTABILITY or
      17              : FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
      18              : for more details.
      19              : 
      20              : You should have received a copy of the GNU General Public License
      21              : along with GCC; see the file COPYING3.  If not see
      22              : <http://www.gnu.org/licenses/>.  */
      23              : 
      24              : #include "config.h"
      25              : #include "system.h"
      26              : #include "coretypes.h"
      27              : #include "backend.h"
      28              : #include "target.h"
      29              : #include "rtl.h"
      30              : #include "tree.h"
      31              : #include "df.h"
      32              : #include "memmodel.h"
      33              : #include "tm_p.h"
      34              : #include "regs.h"
      35              : #include "emit-rtl.h"  /* FIXME: Can go away once crtl is moved to rtl.h.  */
      36              : #include "dumpfile.h"
      37              : #include "calls.h"
      38              : #include "function-abi.h"
      39              : 
      40              : /* The set of hard registers in eliminables[i].from. */
      41              : 
      42              : static HARD_REG_SET elim_reg_set;
      43              : 
      44              : /* Initialize ur_in and ur_out as if all hard registers were partially
      45              :    available.  */
      46              : 
      47   1201691149 : class df_collection_rec
      48              : {
      49              : public:
      50              :   auto_vec<df_ref, 128> def_vec;
      51              :   auto_vec<df_ref, 32> use_vec;
      52              :   auto_vec<df_ref, 32> eq_use_vec;
      53              :   auto_vec<df_mw_hardreg *, 32> mw_vec;
      54              : };
      55              : 
      56              : static void df_ref_record (enum df_ref_class, class df_collection_rec *,
      57              :                            rtx, rtx *,
      58              :                            basic_block, struct df_insn_info *,
      59              :                            enum df_ref_type, int ref_flags);
      60              : static void df_def_record_1 (class df_collection_rec *, rtx *,
      61              :                              basic_block, struct df_insn_info *,
      62              :                              int ref_flags);
      63              : static void df_defs_record (class df_collection_rec *, rtx,
      64              :                             basic_block, struct df_insn_info *,
      65              :                             int ref_flags);
      66              : static void df_uses_record (class df_collection_rec *,
      67              :                             rtx *, enum df_ref_type,
      68              :                             basic_block, struct df_insn_info *,
      69              :                             int ref_flags);
      70              : 
      71              : static void df_install_ref_incremental (df_ref);
      72              : static void df_insn_refs_collect (class df_collection_rec*,
      73              :                                   basic_block, struct df_insn_info *);
      74              : static void df_canonize_collection_rec (class df_collection_rec *);
      75              : 
      76              : static void df_get_regular_block_artificial_uses (bitmap);
      77              : static void df_get_eh_block_artificial_uses (bitmap);
      78              : 
      79              : static void df_record_entry_block_defs (bitmap);
      80              : static void df_record_exit_block_uses (bitmap);
      81              : static void df_get_entry_block_def_set (bitmap);
      82              : static void df_grow_ref_info (struct df_ref_info *, unsigned int);
      83              : static void df_ref_chain_delete_du_chain (df_ref);
      84              : static void df_ref_chain_delete (df_ref);
      85              : 
      86              : static void df_refs_add_to_chains (class df_collection_rec *,
      87              :                                    basic_block, rtx_insn *, unsigned int);
      88              : 
      89              : static bool df_insn_refs_verify (class df_collection_rec *, basic_block,
      90              :                                  rtx_insn *, bool);
      91              : static void df_entry_block_defs_collect (class df_collection_rec *, bitmap);
      92              : static void df_exit_block_uses_collect (class df_collection_rec *, bitmap);
      93              : static void df_install_ref (df_ref, struct df_reg_info *,
      94              :                             struct df_ref_info *, bool);
      95              : 
      96              : static int df_ref_compare (df_ref, df_ref);
      97              : static int df_ref_ptr_compare (const void *, const void *);
      98              : static int df_mw_compare (const df_mw_hardreg *, const df_mw_hardreg *);
      99              : static int df_mw_ptr_compare (const void *, const void *);
     100              : 
     101              : static void df_insn_info_delete (unsigned int);
     102              : 
     103              : /* Indexed by hardware reg number, is true if that register is ever
     104              :    used in the current function.
     105              : 
     106              :    In df-scan.cc, this is set up to record the hard regs used
     107              :    explicitly.  Reload adds in the hard regs used for holding pseudo
     108              :    regs.  Final uses it to generate the code in the function prologue
     109              :    and epilogue to save and restore registers as needed.  */
     110              : 
     111              : static bool regs_ever_live[FIRST_PSEUDO_REGISTER];
     112              : 
     113              : /* Flags used to tell df_refs_add_to_chains() which vectors it should copy. */
     114              : static const unsigned int copy_defs = 0x1;
     115              : static const unsigned int copy_uses = 0x2;
     116              : static const unsigned int copy_eq_uses = 0x4;
     117              : static const unsigned int copy_mw = 0x8;
     118              : static const unsigned int copy_all = copy_defs | copy_uses | copy_eq_uses
     119              : | copy_mw;
     120              : 
     121              : /*----------------------------------------------------------------------------
     122              :    SCANNING DATAFLOW PROBLEM
     123              : 
     124              :    There are several ways in which scanning looks just like the other
     125              :    dataflow problems.  It shares the all the mechanisms for local info
     126              :    as well as basic block info.  Where it differs is when and how often
     127              :    it gets run.  It also has no need for the iterative solver.
     128              : ----------------------------------------------------------------------------*/
     129              : 
     130              : /* Problem data for the scanning dataflow function.  */
     131              : struct df_scan_problem_data
     132              : {
     133              :   object_allocator<df_base_ref> *ref_base_pool;
     134              :   object_allocator<df_artificial_ref> *ref_artificial_pool;
     135              :   object_allocator<df_regular_ref> *ref_regular_pool;
     136              :   object_allocator<df_insn_info> *insn_pool;
     137              :   object_allocator<df_reg_info> *reg_pool;
     138              :   object_allocator<df_mw_hardreg> *mw_reg_pool;
     139              : 
     140              :   bitmap_obstack reg_bitmaps;
     141              :   bitmap_obstack insn_bitmaps;
     142              : };
     143              : 
     144              : /* Internal function to shut down the scanning problem.  */
     145              : static void
     146      3060270 : df_scan_free_internal (void)
     147              : {
     148      3060270 :   struct df_scan_problem_data *problem_data
     149      3060270 :     = (struct df_scan_problem_data *) df_scan->problem_data;
     150              : 
     151      3060270 :   free (df->def_info.refs);
     152      3060270 :   free (df->def_info.begin);
     153      3060270 :   free (df->def_info.count);
     154      3060270 :   memset (&df->def_info, 0, (sizeof (struct df_ref_info)));
     155              : 
     156      3060270 :   free (df->use_info.refs);
     157      3060270 :   free (df->use_info.begin);
     158      3060270 :   free (df->use_info.count);
     159      3060270 :   memset (&df->use_info, 0, (sizeof (struct df_ref_info)));
     160              : 
     161      3060270 :   free (df->def_regs);
     162      3060270 :   df->def_regs = NULL;
     163      3060270 :   free (df->use_regs);
     164      3060270 :   df->use_regs = NULL;
     165      3060270 :   free (df->eq_use_regs);
     166      3060270 :   df->eq_use_regs = NULL;
     167      3060270 :   df->regs_size = 0;
     168      3060270 :   DF_REG_SIZE (df) = 0;
     169              : 
     170      3060270 :   free (df->insns);
     171      3060270 :   df->insns = NULL;
     172      3060270 :   DF_INSN_SIZE () = 0;
     173              : 
     174      3060270 :   free (df_scan->block_info);
     175      3060270 :   df_scan->block_info = NULL;
     176      3060270 :   df_scan->block_info_size = 0;
     177              : 
     178      3060270 :   bitmap_clear (&df->hardware_regs_used);
     179      3060270 :   bitmap_clear (&df->regular_block_artificial_uses);
     180      3060270 :   bitmap_clear (&df->eh_block_artificial_uses);
     181      3060270 :   BITMAP_FREE (df->entry_block_defs);
     182      3060270 :   BITMAP_FREE (df->exit_block_uses);
     183      3060270 :   bitmap_clear (&df->insns_to_delete);
     184      3060270 :   bitmap_clear (&df->insns_to_rescan);
     185      3060270 :   bitmap_clear (&df->insns_to_notes_rescan);
     186              : 
     187      6120540 :   delete problem_data->ref_base_pool;
     188      6120540 :   delete problem_data->ref_artificial_pool;
     189      6120540 :   delete problem_data->ref_regular_pool;
     190      6120540 :   delete problem_data->insn_pool;
     191      6120540 :   delete problem_data->reg_pool;
     192      6120540 :   delete problem_data->mw_reg_pool;
     193      3060270 :   bitmap_obstack_release (&problem_data->reg_bitmaps);
     194      3060270 :   bitmap_obstack_release (&problem_data->insn_bitmaps);
     195      3060270 :   free (df_scan->problem_data);
     196      3060270 : }
     197              : 
     198              : 
     199              : /* Free basic block info.  */
     200              : 
     201              : static void
     202      6753762 : df_scan_free_bb_info (basic_block bb, void *vbb_info)
     203              : {
     204      6753762 :   struct df_scan_bb_info *bb_info = (struct df_scan_bb_info *) vbb_info;
     205      6753762 :   unsigned int bb_index = bb->index;
     206      6753762 :   rtx_insn *insn;
     207              : 
     208      6753762 :   FOR_BB_INSNS (bb, insn)
     209            0 :     if (INSN_P (insn))
     210            0 :       df_insn_info_delete (INSN_UID (insn));
     211              : 
     212      6753762 :   if (bb_index < df_scan->block_info_size)
     213      6753762 :     bb_info = df_scan_get_bb_info (bb_index);
     214              : 
     215              :   /* Get rid of any artificial uses or defs.  */
     216      6753762 :   df_ref_chain_delete_du_chain (bb_info->artificial_defs);
     217      6753762 :   df_ref_chain_delete_du_chain (bb_info->artificial_uses);
     218     13507524 :   df_ref_chain_delete (bb_info->artificial_defs);
     219     13507524 :   df_ref_chain_delete (bb_info->artificial_uses);
     220      6753762 :   bb_info->artificial_defs = NULL;
     221      6753762 :   bb_info->artificial_uses = NULL;
     222      6753762 : }
     223              : 
     224              : 
     225              : /* Allocate the problem data for the scanning problem.  This should be
     226              :    called when the problem is created or when the entire function is to
     227              :    be rescanned.  */
     228              : void
     229      3060270 : df_scan_alloc (bitmap all_blocks ATTRIBUTE_UNUSED)
     230              : {
     231      3060270 :   struct df_scan_problem_data *problem_data;
     232      3060270 :   basic_block bb;
     233              : 
     234              :   /* Given the number of pools, this is really faster than tearing
     235              :      everything apart.  */
     236      3060270 :   if (df_scan->problem_data)
     237      1579320 :     df_scan_free_internal ();
     238              : 
     239      3060270 :   problem_data = XNEW (struct df_scan_problem_data);
     240      3060270 :   df_scan->problem_data = problem_data;
     241      3060270 :   df_scan->computed = true;
     242              : 
     243      6120540 :   problem_data->ref_base_pool = new object_allocator<df_base_ref>
     244      3060270 :     ("df_scan ref base");
     245      6120540 :   problem_data->ref_artificial_pool = new object_allocator<df_artificial_ref>
     246      3060270 :     ("df_scan ref artificial");
     247      6120540 :   problem_data->ref_regular_pool = new object_allocator<df_regular_ref>
     248      3060270 :     ("df_scan ref regular");
     249      6120540 :   problem_data->insn_pool = new object_allocator<df_insn_info>
     250      3060270 :     ("df_scan insn");
     251      6120540 :   problem_data->reg_pool = new object_allocator<df_reg_info>
     252      3060270 :     ("df_scan reg");
     253      6120540 :   problem_data->mw_reg_pool = new object_allocator<df_mw_hardreg>
     254      3060270 :     ("df_scan mw_reg");
     255              : 
     256      3060270 :   bitmap_obstack_initialize (&problem_data->reg_bitmaps);
     257      3060270 :   bitmap_obstack_initialize (&problem_data->insn_bitmaps);
     258              : 
     259      3060270 :   df_grow_reg_info ();
     260              : 
     261      3060270 :   df_grow_insn_info ();
     262      3060270 :   df_grow_bb_info (df_scan);
     263              : 
     264     39828182 :   FOR_ALL_BB_FN (bb, cfun)
     265              :     {
     266     36767912 :       unsigned int bb_index = bb->index;
     267     36767912 :       struct df_scan_bb_info *bb_info = df_scan_get_bb_info (bb_index);
     268     36767912 :       bb_info->artificial_defs = NULL;
     269     36767912 :       bb_info->artificial_uses = NULL;
     270              :     }
     271              : 
     272      3060270 :   bitmap_initialize (&df->hardware_regs_used, &problem_data->reg_bitmaps);
     273      3060270 :   bitmap_initialize (&df->regular_block_artificial_uses, &problem_data->reg_bitmaps);
     274      3060270 :   bitmap_initialize (&df->eh_block_artificial_uses, &problem_data->reg_bitmaps);
     275      3060270 :   df->entry_block_defs = BITMAP_ALLOC (&problem_data->reg_bitmaps);
     276      3060270 :   df->exit_block_uses = BITMAP_ALLOC (&problem_data->reg_bitmaps);
     277      3060270 :   bitmap_initialize (&df->insns_to_delete, &problem_data->insn_bitmaps);
     278      3060270 :   bitmap_initialize (&df->insns_to_rescan, &problem_data->insn_bitmaps);
     279      3060270 :   bitmap_initialize (&df->insns_to_notes_rescan, &problem_data->insn_bitmaps);
     280      3060270 :   df_scan->optional_p = false;
     281      3060270 : }
     282              : 
     283              : 
     284              : /* Free all of the data associated with the scan problem.  */
     285              : 
     286              : static void
     287      1480950 : df_scan_free (void)
     288              : {
     289      1480950 :   if (df_scan->problem_data)
     290      1480950 :     df_scan_free_internal ();
     291              : 
     292      1480950 :   if (df->blocks_to_analyze)
     293              :     {
     294            0 :       BITMAP_FREE (df->blocks_to_analyze);
     295            0 :       df->blocks_to_analyze = NULL;
     296              :     }
     297              : 
     298      1480950 :   free (df_scan);
     299      1480950 : }
     300              : 
     301              : /* Dump the preamble for DF_SCAN dump. */
     302              : static void
     303         3941 : df_scan_start_dump (FILE *file ATTRIBUTE_UNUSED)
     304              : {
     305         3941 :   int i;
     306         3941 :   int dcount = 0;
     307         3941 :   int ucount = 0;
     308         3941 :   int ecount = 0;
     309         3941 :   int icount = 0;
     310         3941 :   int ccount = 0;
     311         3941 :   basic_block bb;
     312         3941 :   rtx_insn *insn;
     313              : 
     314         3941 :   fprintf (file, ";;  fully invalidated by EH \t");
     315         3941 :   df_print_regset
     316         3941 :     (file, bitmap_view<HARD_REG_SET> (eh_edge_abi.full_reg_clobbers ()));
     317         3941 :   fprintf (file, ";;  hardware regs used \t");
     318         3941 :   df_print_regset (file, &df->hardware_regs_used);
     319         3941 :   fprintf (file, ";;  regular block artificial uses \t");
     320         3941 :   df_print_regset (file, &df->regular_block_artificial_uses);
     321         3941 :   fprintf (file, ";;  eh block artificial uses \t");
     322         3941 :   df_print_regset (file, &df->eh_block_artificial_uses);
     323         3941 :   fprintf (file, ";;  entry block defs \t");
     324         3941 :   df_print_regset (file, df->entry_block_defs);
     325         3941 :   fprintf (file, ";;  exit block uses \t");
     326         3941 :   df_print_regset (file, df->exit_block_uses);
     327         3941 :   fprintf (file, ";;  regs ever live \t");
     328       370454 :   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
     329       362572 :     if (df_regs_ever_live_p (i))
     330        20160 :       fprintf (file, " %d [%s]", i, reg_names[i]);
     331         3941 :   fprintf (file, "\n;;  ref usage \t");
     332              : 
     333       483729 :   for (i = 0; i < (int)df->regs_inited; i++)
     334       479788 :     if (DF_REG_DEF_COUNT (i) || DF_REG_USE_COUNT (i) || DF_REG_EQ_USE_COUNT (i))
     335              :       {
     336       211250 :         const char * sep = "";
     337              : 
     338       211250 :         fprintf (file, "r%d={", i);
     339       211250 :         if (DF_REG_DEF_COUNT (i))
     340              :           {
     341       211238 :             fprintf (file, "%dd", DF_REG_DEF_COUNT (i));
     342       211238 :             sep = ",";
     343       211238 :             dcount += DF_REG_DEF_COUNT (i);
     344              :           }
     345       211250 :         if (DF_REG_USE_COUNT (i))
     346              :           {
     347        51562 :             fprintf (file, "%s%du", sep, DF_REG_USE_COUNT (i));
     348        51562 :             sep = ",";
     349        51562 :             ucount += DF_REG_USE_COUNT (i);
     350              :           }
     351       211250 :         if (DF_REG_EQ_USE_COUNT (i))
     352              :           {
     353         2196 :             fprintf (file, "%s%de", sep, DF_REG_EQ_USE_COUNT (i));
     354         2196 :             ecount += DF_REG_EQ_USE_COUNT (i);
     355              :           }
     356       211250 :         fprintf (file, "} ");
     357              :       }
     358              : 
     359        29425 :   FOR_EACH_BB_FN (bb, cfun)
     360       194922 :     FOR_BB_INSNS (bb, insn)
     361       169438 :       if (INSN_P (insn))
     362              :         {
     363       116959 :           if (CALL_P (insn))
     364         6283 :             ccount++;
     365              :           else
     366       110676 :             icount++;
     367              :         }
     368              : 
     369         3941 :   fprintf (file, "\n;;    total ref usage %d{%dd,%du,%de}"
     370              :                  " in %d{%d regular + %d call} insns.\n",
     371         3941 :                  dcount + ucount + ecount, dcount, ucount, ecount,
     372              :                  icount + ccount, icount, ccount);
     373         3941 : }
     374              : 
     375              : /* Dump the bb_info for a given basic block. */
     376              : static void
     377         5480 : df_scan_start_block (basic_block bb, FILE *file)
     378              : {
     379         5480 :   struct df_scan_bb_info *bb_info
     380         5480 :     = df_scan_get_bb_info (bb->index);
     381              : 
     382         5480 :   if (bb_info)
     383              :     {
     384         5480 :       fprintf (file, ";; bb %d artificial_defs: ", bb->index);
     385         5480 :       df_refs_chain_dump (bb_info->artificial_defs, true, file);
     386         5480 :       fprintf (file, "\n;; bb %d artificial_uses: ", bb->index);
     387         5480 :       df_refs_chain_dump (bb_info->artificial_uses, true, file);
     388         5480 :       fprintf (file, "\n");
     389              :     }
     390              : #if 0
     391              :   {
     392              :     rtx_insn *insn;
     393              :     FOR_BB_INSNS (bb, insn)
     394              :       if (INSN_P (insn))
     395              :         df_insn_debug (insn, false, file);
     396              :   }
     397              : #endif
     398         5480 : }
     399              : 
     400              : static const struct df_problem problem_SCAN =
     401              : {
     402              :   DF_SCAN,                    /* Problem id.  */
     403              :   DF_NONE,                    /* Direction.  */
     404              :   df_scan_alloc,              /* Allocate the problem specific data.  */
     405              :   NULL,                       /* Reset global information.  */
     406              :   df_scan_free_bb_info,       /* Free basic block info.  */
     407              :   NULL,                       /* Local compute function.  */
     408              :   NULL,                       /* Init the solution specific data.  */
     409              :   NULL,                       /* Iterative solver.  */
     410              :   NULL,                       /* Confluence operator 0.  */
     411              :   NULL,                       /* Confluence operator n.  */
     412              :   NULL,                       /* Transfer function.  */
     413              :   NULL,                       /* Finalize function.  */
     414              :   df_scan_free,               /* Free all of the problem information.  */
     415              :   NULL,                       /* Remove this problem from the stack of dataflow problems.  */
     416              :   df_scan_start_dump,         /* Debugging.  */
     417              :   df_scan_start_block,        /* Debugging start block.  */
     418              :   NULL,                       /* Debugging end block.  */
     419              :   NULL,                       /* Debugging start insn.  */
     420              :   NULL,                       /* Debugging end insn.  */
     421              :   NULL,                       /* Incremental solution verify start.  */
     422              :   NULL,                       /* Incremental solution verify end.  */
     423              :   NULL,                       /* Dependent problem.  */
     424              :   sizeof (struct df_scan_bb_info),/* Size of entry of block_info array.  */
     425              :   TV_DF_SCAN,                 /* Timing variable.  */
     426              :   false                       /* Reset blocks on dropping out of blocks_to_analyze.  */
     427              : };
     428              : 
     429              : 
     430              : /* Create a new DATAFLOW instance and add it to an existing instance
     431              :    of DF.  The returned structure is what is used to get at the
     432              :    solution.  */
     433              : 
     434              : void
     435      1480950 : df_scan_add_problem (void)
     436              : {
     437      1480950 :   df_add_problem (&problem_SCAN);
     438      1480950 : }
     439              : 
     440              : 
     441              : /*----------------------------------------------------------------------------
     442              :    Storage Allocation Utilities
     443              : ----------------------------------------------------------------------------*/
     444              : 
     445              : 
     446              : /* First, grow the reg_info information.  If the current size is less than
     447              :    the number of pseudos, grow to 25% more than the number of
     448              :    pseudos.
     449              : 
     450              :    Second, assure that all of the slots up to max_reg_num have been
     451              :    filled with reg_info structures.  */
     452              : 
     453              : void
     454   1191312082 : df_grow_reg_info (void)
     455              : {
     456   1191312082 :   unsigned int max_reg = max_reg_num ();
     457   1191312082 :   unsigned int new_size = max_reg;
     458   1191312082 :   struct df_scan_problem_data *problem_data
     459   1191312082 :     = (struct df_scan_problem_data *) df_scan->problem_data;
     460   1191312082 :   unsigned int i;
     461              : 
     462   1191312082 :   if (df->regs_size < new_size)
     463              :     {
     464      3106233 :       new_size += new_size / 4;
     465      3106233 :       df->def_regs = XRESIZEVEC (struct df_reg_info *, df->def_regs, new_size);
     466      3106233 :       df->use_regs = XRESIZEVEC (struct df_reg_info *, df->use_regs, new_size);
     467      3106233 :       df->eq_use_regs = XRESIZEVEC (struct df_reg_info *, df->eq_use_regs,
     468              :                                     new_size);
     469      3106233 :       df->def_info.begin = XRESIZEVEC (unsigned, df->def_info.begin, new_size);
     470      3106233 :       df->def_info.count = XRESIZEVEC (unsigned, df->def_info.count, new_size);
     471      3106233 :       df->use_info.begin = XRESIZEVEC (unsigned, df->use_info.begin, new_size);
     472      3106233 :       df->use_info.count = XRESIZEVEC (unsigned, df->use_info.count, new_size);
     473      3106233 :       df->regs_size = new_size;
     474              :     }
     475              : 
     476   1632043182 :   for (i = df->regs_inited; i < max_reg; i++)
     477              :     {
     478    440731100 :       struct df_reg_info *reg_info;
     479              : 
     480              :       // TODO
     481    440731100 :       reg_info = problem_data->reg_pool->allocate ();
     482    440731100 :       memset (reg_info, 0, sizeof (struct df_reg_info));
     483    440731100 :       df->def_regs[i] = reg_info;
     484    440731100 :       reg_info = problem_data->reg_pool->allocate ();
     485    440731100 :       memset (reg_info, 0, sizeof (struct df_reg_info));
     486    440731100 :       df->use_regs[i] = reg_info;
     487    440731100 :       reg_info = problem_data->reg_pool->allocate ();
     488    440731100 :       memset (reg_info, 0, sizeof (struct df_reg_info));
     489    440731100 :       df->eq_use_regs[i] = reg_info;
     490    440731100 :       df->def_info.begin[i] = 0;
     491    440731100 :       df->def_info.count[i] = 0;
     492    440731100 :       df->use_info.begin[i] = 0;
     493    440731100 :       df->use_info.count[i] = 0;
     494              :     }
     495              : 
     496   1191312082 :   df->regs_inited = max_reg;
     497   1191312082 : }
     498              : 
     499              : 
     500              : /* Grow the ref information.  */
     501              : 
     502              : static void
     503      5990100 : df_grow_ref_info (struct df_ref_info *ref_info, unsigned int new_size)
     504              : {
     505      5990100 :   if (ref_info->refs_size < new_size)
     506              :     {
     507      5990100 :       ref_info->refs = XRESIZEVEC (df_ref, ref_info->refs, new_size);
     508      5990100 :       memset (ref_info->refs + ref_info->refs_size, 0,
     509      5990100 :               (new_size - ref_info->refs_size) *sizeof (df_ref));
     510      5990100 :       ref_info->refs_size = new_size;
     511              :     }
     512      5990100 : }
     513              : 
     514              : 
     515              : /* Check and grow the ref information if necessary.  This routine
     516              :    guarantees total_size + BITMAP_ADDEND amount of entries in refs
     517              :    array.  It updates ref_info->refs_size only and does not change
     518              :    ref_info->total_size.  */
     519              : 
     520              : static void
     521      7088626 : df_check_and_grow_ref_info (struct df_ref_info *ref_info,
     522              :                             unsigned bitmap_addend)
     523              : {
     524      7088626 :   if (ref_info->refs_size < ref_info->total_size + bitmap_addend)
     525              :     {
     526      5990100 :       int new_size = ref_info->total_size + bitmap_addend;
     527      5990100 :       new_size += ref_info->total_size / 4;
     528      5990100 :       df_grow_ref_info (ref_info, new_size);
     529              :     }
     530      7088626 : }
     531              : 
     532              : 
     533              : /* Grow the ref information.  If the current size is less than the
     534              :    number of instructions, grow to 25% more than the number of
     535              :    instructions.  */
     536              : 
     537              : void
     538    446582290 : df_grow_insn_info (void)
     539              : {
     540    446582290 :   unsigned int new_size = get_max_uid () + 1;
     541    446582290 :   if (DF_INSN_SIZE () < new_size)
     542              :     {
     543      4337610 :       new_size += new_size / 4;
     544      4337610 :       df->insns = XRESIZEVEC (struct df_insn_info *, df->insns, new_size);
     545      4337610 :       memset (df->insns + df->insns_size, 0,
     546      4337610 :               (new_size - DF_INSN_SIZE ()) *sizeof (struct df_insn_info *));
     547      4337610 :       DF_INSN_SIZE () = new_size;
     548              :     }
     549    446582290 : }
     550              : 
     551              : 
     552              : 
     553              : 
     554              : /*----------------------------------------------------------------------------
     555              :    PUBLIC INTERFACES FOR SMALL GRAIN CHANGES TO SCANNING.
     556              : ----------------------------------------------------------------------------*/
     557              : 
     558              : /* Rescan all of the block_to_analyze or all of the blocks in the
     559              :    function if df_set_blocks if blocks_to_analyze is NULL;  */
     560              : 
     561              : void
     562      3060270 : df_scan_blocks (void)
     563              : {
     564      3060270 :   basic_block bb;
     565              : 
     566      3060270 :   df->def_info.ref_order = DF_REF_ORDER_NO_TABLE;
     567      3060270 :   df->use_info.ref_order = DF_REF_ORDER_NO_TABLE;
     568              : 
     569      3060270 :   df_get_regular_block_artificial_uses (&df->regular_block_artificial_uses);
     570      3060270 :   df_get_eh_block_artificial_uses (&df->eh_block_artificial_uses);
     571              : 
     572      3060270 :   bitmap_ior_into (&df->eh_block_artificial_uses,
     573      3060270 :                    &df->regular_block_artificial_uses);
     574              : 
     575              :   /* ENTRY and EXIT blocks have special defs/uses.  */
     576      3060270 :   df_get_entry_block_def_set (df->entry_block_defs);
     577      3060270 :   df_record_entry_block_defs (df->entry_block_defs);
     578      3060270 :   df_get_exit_block_use_set (df->exit_block_uses);
     579      3060270 :   df_record_exit_block_uses (df->exit_block_uses);
     580      3060270 :   df_set_bb_dirty (BASIC_BLOCK_FOR_FN (cfun, ENTRY_BLOCK));
     581      3060270 :   df_set_bb_dirty (BASIC_BLOCK_FOR_FN (cfun, EXIT_BLOCK));
     582              : 
     583              :   /* Regular blocks */
     584     33707642 :   FOR_EACH_BB_FN (bb, cfun)
     585              :     {
     586     30647372 :       unsigned int bb_index = bb->index;
     587     30647372 :       df_bb_refs_record (bb_index, true);
     588              :     }
     589      3060270 : }
     590              : 
     591              : /* Create new refs under address LOC within INSN.  This function is
     592              :    only used externally.  REF_FLAGS must be either 0 or DF_REF_IN_NOTE,
     593              :    depending on whether LOC is inside PATTERN (INSN) or a note.  */
     594              : 
     595              : void
     596            0 : df_uses_create (rtx *loc, rtx_insn *insn, int ref_flags)
     597              : {
     598            0 :   gcc_assert (!(ref_flags & ~DF_REF_IN_NOTE));
     599            0 :   df_uses_record (NULL, loc, DF_REF_REG_USE,
     600            0 :                   BLOCK_FOR_INSN (insn),
     601            0 :                   DF_INSN_INFO_GET (insn),
     602              :                   ref_flags);
     603            0 : }
     604              : 
     605              : static void
     606            0 : df_install_ref_incremental (df_ref ref)
     607              : {
     608            0 :   struct df_reg_info **reg_info;
     609            0 :   struct df_ref_info *ref_info;
     610            0 :   df_ref *ref_ptr;
     611            0 :   bool add_to_table;
     612              : 
     613            0 :   rtx_insn *insn = DF_REF_INSN (ref);
     614            0 :   basic_block bb = BLOCK_FOR_INSN (insn);
     615              : 
     616            0 :   if (DF_REF_REG_DEF_P (ref))
     617              :     {
     618            0 :       reg_info = df->def_regs;
     619            0 :       ref_info = &df->def_info;
     620            0 :       ref_ptr = &DF_INSN_DEFS (insn);
     621            0 :       add_to_table = ref_info->ref_order != DF_REF_ORDER_NO_TABLE;
     622              :     }
     623            0 :   else if (DF_REF_FLAGS (ref) & DF_REF_IN_NOTE)
     624              :     {
     625            0 :       reg_info = df->eq_use_regs;
     626            0 :       ref_info = &df->use_info;
     627            0 :       ref_ptr = &DF_INSN_EQ_USES (insn);
     628            0 :       switch (ref_info->ref_order)
     629              :         {
     630              :         case DF_REF_ORDER_UNORDERED_WITH_NOTES:
     631              :         case DF_REF_ORDER_BY_REG_WITH_NOTES:
     632              :         case DF_REF_ORDER_BY_INSN_WITH_NOTES:
     633              :           add_to_table = true;
     634              :           break;
     635              :         default:
     636              :           add_to_table = false;
     637              :           break;
     638              :         }
     639              :     }
     640              :   else
     641              :     {
     642            0 :       reg_info = df->use_regs;
     643            0 :       ref_info = &df->use_info;
     644            0 :       ref_ptr = &DF_INSN_USES (insn);
     645            0 :       add_to_table = ref_info->ref_order != DF_REF_ORDER_NO_TABLE;
     646              :     }
     647              : 
     648              :   /* Do not add if ref is not in the right blocks.  */
     649            0 :   if (add_to_table && df->analyze_subset)
     650            0 :     add_to_table = bitmap_bit_p (df->blocks_to_analyze, bb->index);
     651              : 
     652            0 :   df_install_ref (ref, reg_info[DF_REF_REGNO (ref)], ref_info, add_to_table);
     653              : 
     654            0 :   if (add_to_table)
     655            0 :     switch (ref_info->ref_order)
     656              :       {
     657            0 :       case DF_REF_ORDER_UNORDERED_WITH_NOTES:
     658            0 :       case DF_REF_ORDER_BY_REG_WITH_NOTES:
     659            0 :       case DF_REF_ORDER_BY_INSN_WITH_NOTES:
     660            0 :         ref_info->ref_order = DF_REF_ORDER_UNORDERED_WITH_NOTES;
     661            0 :         break;
     662            0 :       default:
     663            0 :         ref_info->ref_order = DF_REF_ORDER_UNORDERED;
     664            0 :         break;
     665              :       }
     666              : 
     667            0 :   while (*ref_ptr && df_ref_compare (*ref_ptr, ref) < 0)
     668            0 :     ref_ptr = &DF_REF_NEXT_LOC (*ref_ptr);
     669              : 
     670            0 :   DF_REF_NEXT_LOC (ref) = *ref_ptr;
     671            0 :   *ref_ptr = ref;
     672              : 
     673              : #if 0
     674              :   if (dump_file)
     675              :     {
     676              :       fprintf (dump_file, "adding ref ");
     677              :       df_ref_debug (ref, dump_file);
     678              :     }
     679              : #endif
     680              :   /* By adding the ref directly, df_insn_rescan my not find any
     681              :      differences even though the block will have changed.  So we need
     682              :      to mark the block dirty ourselves.  */
     683            0 :   if (!DEBUG_INSN_P (DF_REF_INSN (ref)))
     684            0 :     df_set_bb_dirty (bb);
     685            0 : }
     686              : 
     687              : 
     688              : 
     689              : /*----------------------------------------------------------------------------
     690              :    UTILITIES TO CREATE AND DESTROY REFS AND CHAINS.
     691              : ----------------------------------------------------------------------------*/
     692              : 
     693              : static void
     694   7803533152 : df_free_ref (df_ref ref)
     695              : {
     696   7803533152 :   struct df_scan_problem_data *problem_data
     697   7803533152 :     = (struct df_scan_problem_data *) df_scan->problem_data;
     698              : 
     699   7803533152 :   switch (DF_REF_CLASS (ref))
     700              :     {
     701   5866427004 :     case DF_REF_BASE:
     702   5866427004 :       problem_data->ref_base_pool->remove ((df_base_ref *) (ref));
     703   5866427004 :       break;
     704              : 
     705    366210248 :     case DF_REF_ARTIFICIAL:
     706    366210248 :       problem_data->ref_artificial_pool->remove
     707    366210248 :         ((df_artificial_ref *) (ref));
     708    366210248 :       break;
     709              : 
     710   1570895900 :     case DF_REF_REGULAR:
     711   1570895900 :       problem_data->ref_regular_pool->remove
     712   1570895900 :         ((df_regular_ref *) (ref));
     713   1570895900 :       break;
     714              :     }
     715   7803533152 : }
     716              : 
     717              : 
     718              : /* Unlink and delete REF at the reg_use, reg_eq_use or reg_def chain.
     719              :    Also delete the def-use or use-def chain if it exists.  */
     720              : 
     721              : static void
     722    305268232 : df_reg_chain_unlink (df_ref ref)
     723              : {
     724    305268232 :   df_ref next = DF_REF_NEXT_REG (ref);
     725    305268232 :   df_ref prev = DF_REF_PREV_REG (ref);
     726    305268232 :   int id = DF_REF_ID (ref);
     727    305268232 :   struct df_reg_info *reg_info;
     728    305268232 :   df_ref *refs = NULL;
     729              : 
     730    305268232 :   if (DF_REF_REG_DEF_P (ref))
     731              :     {
     732    148284514 :       int regno = DF_REF_REGNO (ref);
     733    148284514 :       reg_info = DF_REG_DEF_GET (regno);
     734    148284514 :       refs = df->def_info.refs;
     735              :     }
     736              :   else
     737              :     {
     738    156983718 :       if (DF_REF_FLAGS (ref) & DF_REF_IN_NOTE)
     739              :         {
     740     11330033 :           reg_info = DF_REG_EQ_USE_GET (DF_REF_REGNO (ref));
     741     11330033 :           switch (df->use_info.ref_order)
     742              :             {
     743            0 :             case DF_REF_ORDER_UNORDERED_WITH_NOTES:
     744            0 :             case DF_REF_ORDER_BY_REG_WITH_NOTES:
     745            0 :             case DF_REF_ORDER_BY_INSN_WITH_NOTES:
     746            0 :               refs = df->use_info.refs;
     747            0 :               break;
     748              :             default:
     749              :               break;
     750              :             }
     751              :         }
     752              :       else
     753              :         {
     754    145653685 :           reg_info = DF_REG_USE_GET (DF_REF_REGNO (ref));
     755    145653685 :           refs = df->use_info.refs;
     756              :         }
     757              :     }
     758              : 
     759    293938199 :   if (refs)
     760              :     {
     761       975464 :       if (df->analyze_subset)
     762              :         {
     763       565871 :           if (bitmap_bit_p (df->blocks_to_analyze, DF_REF_BBNO (ref)))
     764       314104 :             refs[id] = NULL;
     765              :         }
     766              :       else
     767       409593 :         refs[id] = NULL;
     768              :     }
     769              : 
     770              :   /* Delete any def-use or use-def chains that start here. It is
     771              :      possible that there is trash in this field.  This happens for
     772              :      insns that have been deleted when rescanning has been deferred
     773              :      and the chain problem has also been deleted.  The chain tear down
     774              :      code skips deleted insns.  */
     775    305268232 :   if (df_chain && DF_REF_CHAIN (ref))
     776            0 :     df_chain_unlink (ref);
     777              : 
     778    305268232 :   reg_info->n_refs--;
     779    305268232 :   if (DF_REF_FLAGS_IS_SET (ref, DF_HARD_REG_LIVE))
     780              :     {
     781     87923710 :       gcc_assert (DF_REF_REGNO (ref) < FIRST_PSEUDO_REGISTER);
     782     87923710 :       df->hard_regs_live_count[DF_REF_REGNO (ref)]--;
     783              :     }
     784              : 
     785              :   /* Unlink from the reg chain.  If there is no prev, this is the
     786              :      first of the list.  If not, just join the next and prev.  */
     787    305268232 :   if (prev)
     788    206660231 :     DF_REF_NEXT_REG (prev) = next;
     789              :   else
     790              :     {
     791     98608001 :       gcc_assert (reg_info->reg_chain == ref);
     792     98608001 :       reg_info->reg_chain = next;
     793              :     }
     794    305268232 :   if (next)
     795    179258795 :     DF_REF_PREV_REG (next) = prev;
     796              : 
     797    305268232 :   df_free_ref (ref);
     798    305268232 : }
     799              : 
     800              : /* Initialize INSN_INFO to describe INSN.  */
     801              : 
     802              : static void
     803    463571378 : df_insn_info_init_fields (df_insn_info *insn_info, rtx_insn *insn)
     804              : {
     805    463571378 :   memset (insn_info, 0, sizeof (struct df_insn_info));
     806    463571378 :   insn_info->insn = insn;
     807            0 : }
     808              : 
     809              : /* Create the insn record for INSN.  If there was one there, zero it
     810              :    out.  */
     811              : 
     812              : struct df_insn_info *
     813    404745075 : df_insn_create_insn_record (rtx_insn *insn)
     814              : {
     815    404745075 :   struct df_scan_problem_data *problem_data
     816    404745075 :     = (struct df_scan_problem_data *) df_scan->problem_data;
     817    404745075 :   struct df_insn_info *insn_rec;
     818              : 
     819    404745075 :   df_grow_insn_info ();
     820    404745075 :   insn_rec = DF_INSN_INFO_GET (insn);
     821    404745075 :   if (!insn_rec)
     822              :     {
     823    404745075 :       insn_rec = problem_data->insn_pool->allocate ();
     824    404745075 :       DF_INSN_INFO_SET (insn, insn_rec);
     825              :     }
     826    404745075 :   df_insn_info_init_fields (insn_rec, insn);
     827    404745075 :   return insn_rec;
     828              : }
     829              : 
     830              : 
     831              : /* Delete all du chain (DF_REF_CHAIN()) of all refs in the ref chain.  */
     832              : 
     833              : static void
     834     20943814 : df_ref_chain_delete_du_chain (df_ref ref)
     835              : {
     836     80547618 :   for (; ref; ref = DF_REF_NEXT_LOC (ref))
     837              :     /* CHAIN is allocated by DF_CHAIN. So make sure to
     838              :        pass df_scan instance for the problem.  */
     839     59603804 :     if (DF_REF_CHAIN (ref))
     840       489079 :       df_chain_unlink (ref);
     841     20943814 : }
     842              : 
     843              : 
     844              : /* Delete all refs in the ref chain.  */
     845              : 
     846              : static void
     847    486197826 : df_ref_chain_delete (df_ref ref)
     848              : {
     849    486197826 :   df_ref next;
     850    784712296 :   for (; ref; ref = next)
     851              :     {
     852    305268232 :       next = DF_REF_NEXT_LOC (ref);
     853    305268232 :       df_reg_chain_unlink (ref);
     854              :     }
     855            0 : }
     856              : 
     857              : 
     858              : /* Delete the hardreg chain.  */
     859              : 
     860              : static void
     861    150209307 : df_mw_hardreg_chain_delete (struct df_mw_hardreg *hardregs)
     862              : {
     863    150209307 :   struct df_scan_problem_data *problem_data
     864    150209307 :     = (struct df_scan_problem_data *) df_scan->problem_data;
     865    150209307 :   df_mw_hardreg *next;
     866              : 
     867    152873989 :   for (; hardregs; hardregs = next)
     868              :     {
     869      2664682 :       next = DF_MWS_NEXT (hardregs);
     870      2664682 :       problem_data->mw_reg_pool->remove (hardregs);
     871              :     }
     872    150209307 : }
     873              : 
     874              : /* Remove the contents of INSN_INFO (but don't free INSN_INFO itself).  */
     875              : 
     876              : static void
     877    150070640 : df_insn_info_free_fields (df_insn_info *insn_info)
     878              : {
     879              :   /* In general, notes do not have the insn_info fields
     880              :      initialized.  However, combine deletes insns by changing them
     881              :      to notes.  How clever.  So we cannot just check if it is a
     882              :      valid insn before short circuiting this code, we need to see
     883              :      if we actually initialized it.  */
     884    150070640 :   df_mw_hardreg_chain_delete (insn_info->mw_hardregs);
     885              : 
     886    150070640 :   if (df_chain)
     887              :     {
     888       624807 :       df_ref_chain_delete_du_chain (insn_info->defs);
     889       624807 :       df_ref_chain_delete_du_chain (insn_info->uses);
     890       624807 :       df_ref_chain_delete_du_chain (insn_info->eq_uses);
     891              :     }
     892              : 
     893    150070640 :   df_ref_chain_delete (insn_info->defs);
     894    150070640 :   df_ref_chain_delete (insn_info->uses);
     895    150070640 :   df_ref_chain_delete (insn_info->eq_uses);
     896    150070640 : }
     897              : 
     898              : /* Delete all of the refs information from the insn with UID.
     899              :    Internal helper for df_insn_delete, df_insn_rescan, and other
     900              :    df-scan routines that don't have to work in deferred mode
     901              :    and do not have to mark basic blocks for re-processing.  */
     902              : 
     903              : static void
     904    101049259 : df_insn_info_delete (unsigned int uid)
     905              : {
     906    101049259 :   struct df_insn_info *insn_info = DF_INSN_UID_SAFE_GET (uid);
     907              : 
     908    101049259 :   bitmap_clear_bit (&df->insns_to_delete, uid);
     909    101049259 :   bitmap_clear_bit (&df->insns_to_rescan, uid);
     910    101049259 :   bitmap_clear_bit (&df->insns_to_notes_rescan, uid);
     911    101049259 :   if (insn_info)
     912              :     {
     913     91244337 :       struct df_scan_problem_data *problem_data
     914     91244337 :         = (struct df_scan_problem_data *) df_scan->problem_data;
     915              : 
     916     91244337 :       df_insn_info_free_fields (insn_info);
     917     91244337 :       problem_data->insn_pool->remove (insn_info);
     918     91244337 :       DF_INSN_UID_SET (uid, NULL);
     919              :     }
     920    101049259 : }
     921              : 
     922              : /* Delete all of the refs information from INSN, either right now
     923              :    or marked for later in deferred mode.  */
     924              : 
     925              : void
     926    107550882 : df_insn_delete (rtx_insn *insn)
     927              : {
     928    107550882 :   unsigned int uid;
     929    107550882 :   basic_block bb;
     930              : 
     931    107550882 :   gcc_checking_assert (INSN_P (insn));
     932              : 
     933    107550882 :   if (!df)
     934              :     return;
     935              : 
     936    101052082 :   uid = INSN_UID (insn);
     937    101052082 :   bb = BLOCK_FOR_INSN (insn);
     938              : 
     939              :   /* ??? bb can be NULL after pass_free_cfg.  At that point, DF should
     940              :      not exist anymore (as mentioned in df-core.cc: "The only requirement
     941              :      [for DF] is that there be a correct control flow graph."  Clearly
     942              :      that isn't the case after pass_free_cfg.  But DF is freed much later
     943              :      because some back-ends want to use DF info even though the CFG is
     944              :      already gone.  It's not clear to me whether that is safe, actually.
     945              :      In any case, we expect BB to be non-NULL at least up to register
     946              :      allocation, so disallow a non-NULL BB up to there.  Not perfect
     947              :      but better than nothing...  */
     948    101052082 :   gcc_checking_assert (bb != NULL || reload_completed);
     949              : 
     950    101052082 :   df_grow_bb_info (df_scan);
     951    101052082 :   df_grow_reg_info ();
     952              : 
     953              :   /* The block must be marked as dirty now, rather than later as in
     954              :      df_insn_rescan and df_notes_rescan because it may not be there at
     955              :      rescanning time and the mark would blow up.
     956              :      DEBUG_INSNs do not make a block's data flow solution dirty (at
     957              :      worst the LUIDs are no longer contiguous).  */
     958    101052082 :   if (bb != NULL && NONDEBUG_INSN_P (insn))
     959     51573526 :     df_set_bb_dirty (bb);
     960              : 
     961              :   /* The client has deferred rescanning.  */
     962    101052082 :   if (df->changeable_flags & DF_DEFER_INSN_RESCAN)
     963              :     {
     964      5146253 :       struct df_insn_info *insn_info = DF_INSN_UID_SAFE_GET (uid);
     965      5146253 :       if (insn_info)
     966              :         {
     967      5146253 :           bitmap_clear_bit (&df->insns_to_rescan, uid);
     968      5146253 :           bitmap_clear_bit (&df->insns_to_notes_rescan, uid);
     969      5146253 :           bitmap_set_bit (&df->insns_to_delete, uid);
     970              :         }
     971      5146253 :       if (dump_file)
     972          672 :         fprintf (dump_file, "deferring deletion of insn with uid = %d.\n", uid);
     973      5146253 :       return;
     974              :     }
     975              : 
     976     95905829 :   if (dump_file)
     977         1053 :     fprintf (dump_file, "deleting insn with uid = %d.\n", uid);
     978              : 
     979     95905829 :   df_insn_info_delete (uid);
     980              : }
     981              : 
     982              : 
     983              : /* Free all of the refs and the mw_hardregs in COLLECTION_REC.  */
     984              : 
     985              : static void
     986   1104262569 : df_free_collection_rec (class df_collection_rec *collection_rec)
     987              : {
     988   1104262569 :   unsigned int ix;
     989   1104262569 :   struct df_scan_problem_data *problem_data
     990   1104262569 :     = (struct df_scan_problem_data *) df_scan->problem_data;
     991   1104262569 :   df_ref ref;
     992   1104262569 :   struct df_mw_hardreg *mw;
     993              : 
     994   7469552962 :   FOR_EACH_VEC_ELT (collection_rec->def_vec, ix, ref)
     995   6365290393 :     df_free_ref (ref);
     996   2215218660 :   FOR_EACH_VEC_ELT (collection_rec->use_vec, ix, ref)
     997   1110956091 :     df_free_ref (ref);
     998   1125886179 :   FOR_EACH_VEC_ELT (collection_rec->eq_use_vec, ix, ref)
     999     21623610 :     df_free_ref (ref);
    1000   1110034455 :   FOR_EACH_VEC_ELT (collection_rec->mw_vec, ix, mw)
    1001      5771886 :     problem_data->mw_reg_pool->remove (mw);
    1002              : 
    1003   1104262569 :   collection_rec->def_vec.release ();
    1004   1104262569 :   collection_rec->use_vec.release ();
    1005   1104262569 :   collection_rec->eq_use_vec.release ();
    1006   1104262569 :   collection_rec->mw_vec.release ();
    1007   1104262569 : }
    1008              : 
    1009              : /* Rescan INSN.  Return TRUE if the rescanning produced any changes.  */
    1010              : 
    1011              : bool
    1012   1052703441 : df_insn_rescan (rtx_insn *insn)
    1013              : {
    1014   1052703441 :   unsigned int uid = INSN_UID (insn);
    1015   1052703441 :   struct df_insn_info *insn_info = NULL;
    1016   1052703441 :   basic_block bb = BLOCK_FOR_INSN (insn);
    1017   1052703441 :   class df_collection_rec collection_rec;
    1018              : 
    1019   1052703441 :   if ((!df) || (!INSN_P (insn)))
    1020              :     return false;
    1021              : 
    1022   1021905014 :   if (!bb)
    1023              :     {
    1024           64 :       if (dump_file)
    1025            0 :         fprintf (dump_file, "no bb for insn with uid = %d.\n", uid);
    1026           64 :       return false;
    1027              :     }
    1028              : 
    1029              :   /* The client has disabled rescanning and plans to do it itself.  */
    1030   1021904950 :   if (df->changeable_flags & DF_NO_INSN_RESCAN)
    1031              :     return false;
    1032              : 
    1033   1008157029 :   df_grow_bb_info (df_scan);
    1034   1008157029 :   df_grow_reg_info ();
    1035              : 
    1036   1008157029 :   insn_info = DF_INSN_UID_SAFE_GET (uid);
    1037              : 
    1038              :   /* The client has deferred rescanning.  */
    1039   1008157029 :   if (df->changeable_flags & DF_DEFER_INSN_RESCAN)
    1040              :     {
    1041    574247025 :       if (!insn_info)
    1042              :         {
    1043      3194791 :           insn_info = df_insn_create_insn_record (insn);
    1044      3194791 :           insn_info->defs = 0;
    1045      3194791 :           insn_info->uses = 0;
    1046      3194791 :           insn_info->eq_uses = 0;
    1047      3194791 :           insn_info->mw_hardregs = 0;
    1048              :         }
    1049    574247025 :       if (dump_file)
    1050        10289 :         fprintf (dump_file, "deferring rescan insn with uid = %d.\n", uid);
    1051              : 
    1052    574247025 :       bitmap_clear_bit (&df->insns_to_delete, uid);
    1053    574247025 :       bitmap_clear_bit (&df->insns_to_notes_rescan, uid);
    1054    574247025 :       bitmap_set_bit (&df->insns_to_rescan, INSN_UID (insn));
    1055    574247025 :       return false;
    1056              :     }
    1057              : 
    1058    433910004 :   bitmap_clear_bit (&df->insns_to_delete, uid);
    1059    433910004 :   bitmap_clear_bit (&df->insns_to_rescan, uid);
    1060    433910004 :   bitmap_clear_bit (&df->insns_to_notes_rescan, uid);
    1061    433910004 :   if (insn_info)
    1062              :     {
    1063    396467633 :       int luid;
    1064    396467633 :       bool the_same = df_insn_refs_verify (&collection_rec, bb, insn, false);
    1065              :       /* If there's no change, return false. */
    1066    396467633 :       if (the_same)
    1067              :         {
    1068    337641330 :           df_free_collection_rec (&collection_rec);
    1069    337641330 :           if (dump_file)
    1070         9383 :             fprintf (dump_file, "verify found no changes in insn with uid = %d.\n", uid);
    1071    337641330 :           return false;
    1072              :         }
    1073     58826303 :       if (dump_file)
    1074         5052 :         fprintf (dump_file, "rescanning insn with uid = %d.\n", uid);
    1075              : 
    1076              :       /* There's change - we need to delete the existing info.
    1077              :          Since the insn isn't moved, we can salvage its LUID.  */
    1078     58826303 :       luid = DF_INSN_LUID (insn);
    1079     58826303 :       df_insn_info_free_fields (insn_info);
    1080     58826303 :       df_insn_info_init_fields (insn_info, insn);
    1081     58826303 :       DF_INSN_LUID (insn) = luid;
    1082              :     }
    1083              :   else
    1084              :     {
    1085     37442371 :       struct df_insn_info *insn_info = df_insn_create_insn_record (insn);
    1086     37442371 :       df_insn_refs_collect (&collection_rec, bb, insn_info);
    1087     37442371 :       if (dump_file)
    1088         1205 :         fprintf (dump_file, "scanning new insn with uid = %d.\n", uid);
    1089              :     }
    1090              : 
    1091     96268674 :   df_refs_add_to_chains (&collection_rec, bb, insn, copy_all);
    1092     96268674 :   if (!DEBUG_INSN_P (insn))
    1093     90312312 :     df_set_bb_dirty (bb);
    1094              : 
    1095              :   return true;
    1096   1052703441 : }
    1097              : 
    1098              : /* Same as df_insn_rescan, but don't mark the basic block as
    1099              :    dirty.  */
    1100              : 
    1101              : bool
    1102       138667 : df_insn_rescan_debug_internal (rtx_insn *insn)
    1103              : {
    1104       138667 :   unsigned int uid = INSN_UID (insn);
    1105       138667 :   struct df_insn_info *insn_info;
    1106              : 
    1107       138667 :   gcc_assert (DEBUG_INSN_P (insn)
    1108              :               && VAR_LOC_UNKNOWN_P (INSN_VAR_LOCATION_LOC (insn)));
    1109              : 
    1110       138667 :   if (!df)
    1111              :     return false;
    1112              : 
    1113       138667 :   insn_info = DF_INSN_UID_SAFE_GET (INSN_UID (insn));
    1114       138667 :   if (!insn_info)
    1115              :     return false;
    1116              : 
    1117       138667 :   if (dump_file)
    1118            0 :     fprintf (dump_file, "deleting debug_insn with uid = %d.\n", uid);
    1119              : 
    1120       138667 :   bitmap_clear_bit (&df->insns_to_delete, uid);
    1121       138667 :   bitmap_clear_bit (&df->insns_to_rescan, uid);
    1122       138667 :   bitmap_clear_bit (&df->insns_to_notes_rescan, uid);
    1123              : 
    1124       138667 :   if (insn_info->defs == 0
    1125       138667 :       && insn_info->uses == 0
    1126            0 :       && insn_info->eq_uses == 0
    1127            0 :       && insn_info->mw_hardregs == 0)
    1128              :     return false;
    1129              : 
    1130       138667 :   df_mw_hardreg_chain_delete (insn_info->mw_hardregs);
    1131              : 
    1132       138667 :   if (df_chain)
    1133              :     {
    1134       124356 :       df_ref_chain_delete_du_chain (insn_info->defs);
    1135       124356 :       df_ref_chain_delete_du_chain (insn_info->uses);
    1136       124356 :       df_ref_chain_delete_du_chain (insn_info->eq_uses);
    1137              :     }
    1138              : 
    1139       138667 :   df_ref_chain_delete (insn_info->defs);
    1140       138667 :   df_ref_chain_delete (insn_info->uses);
    1141       138667 :   df_ref_chain_delete (insn_info->eq_uses);
    1142              : 
    1143       138667 :   insn_info->defs = 0;
    1144       138667 :   insn_info->uses = 0;
    1145       138667 :   insn_info->eq_uses = 0;
    1146       138667 :   insn_info->mw_hardregs = 0;
    1147              : 
    1148       138667 :   return true;
    1149              : }
    1150              : 
    1151              : 
    1152              : /* Rescan all of the insns in the function.  Note that the artificial
    1153              :    uses and defs are not touched.  This function will destroy def-use
    1154              :    or use-def chains.  */
    1155              : 
    1156              : void
    1157        34850 : df_insn_rescan_all (void)
    1158              : {
    1159        34850 :   bool no_insn_rescan = false;
    1160        34850 :   bool defer_insn_rescan = false;
    1161        34850 :   basic_block bb;
    1162        34850 :   bitmap_iterator bi;
    1163        34850 :   unsigned int uid;
    1164              : 
    1165        34850 :   if (df->changeable_flags & DF_NO_INSN_RESCAN)
    1166              :     {
    1167            0 :       df_clear_flags (DF_NO_INSN_RESCAN);
    1168            0 :       no_insn_rescan = true;
    1169              :     }
    1170              : 
    1171        34850 :   if (df->changeable_flags & DF_DEFER_INSN_RESCAN)
    1172              :     {
    1173            0 :       df_clear_flags (DF_DEFER_INSN_RESCAN);
    1174            0 :       defer_insn_rescan = true;
    1175              :     }
    1176              : 
    1177        34850 :   auto_bitmap tmp (&df_bitmap_obstack);
    1178        34850 :   bitmap_copy (tmp, &df->insns_to_delete);
    1179        34850 :   EXECUTE_IF_SET_IN_BITMAP (tmp, 0, uid, bi)
    1180              :     {
    1181            0 :       struct df_insn_info *insn_info = DF_INSN_UID_SAFE_GET (uid);
    1182            0 :       if (insn_info)
    1183            0 :         df_insn_info_delete (uid);
    1184              :     }
    1185              : 
    1186        34850 :   bitmap_clear (&df->insns_to_delete);
    1187        34850 :   bitmap_clear (&df->insns_to_rescan);
    1188        34850 :   bitmap_clear (&df->insns_to_notes_rescan);
    1189              : 
    1190      1260209 :   FOR_EACH_BB_FN (bb, cfun)
    1191              :     {
    1192      1225359 :       rtx_insn *insn;
    1193     13569511 :       FOR_BB_INSNS (bb, insn)
    1194              :         {
    1195     12344152 :           df_insn_rescan (insn);
    1196              :         }
    1197              :     }
    1198              : 
    1199        34850 :   if (no_insn_rescan)
    1200            0 :     df_set_flags (DF_NO_INSN_RESCAN);
    1201        34850 :   if (defer_insn_rescan)
    1202            0 :     df_set_flags (DF_DEFER_INSN_RESCAN);
    1203        34850 : }
    1204              : 
    1205              : 
    1206              : /* Process all of the deferred rescans or deletions.  */
    1207              : 
    1208              : void
    1209     87528178 : df_process_deferred_rescans (void)
    1210              : {
    1211     87528178 :   bool no_insn_rescan = false;
    1212     87528178 :   bool defer_insn_rescan = false;
    1213     87528178 :   bitmap_iterator bi;
    1214     87528178 :   unsigned int uid;
    1215              : 
    1216     87528178 :   if (df->changeable_flags & DF_NO_INSN_RESCAN)
    1217              :     {
    1218            0 :       df_clear_flags (DF_NO_INSN_RESCAN);
    1219            0 :       no_insn_rescan = true;
    1220              :     }
    1221              : 
    1222     87528178 :   if (df->changeable_flags & DF_DEFER_INSN_RESCAN)
    1223              :     {
    1224     11777778 :       df_clear_flags (DF_DEFER_INSN_RESCAN);
    1225     11777778 :       defer_insn_rescan = true;
    1226              :     }
    1227              : 
    1228     87528178 :   if (dump_file)
    1229         3402 :     fprintf (dump_file, "starting the processing of deferred insns\n");
    1230              : 
    1231     87528178 :   auto_bitmap tmp (&df_bitmap_obstack);
    1232     87528178 :   bitmap_copy (tmp, &df->insns_to_delete);
    1233     92671608 :   EXECUTE_IF_SET_IN_BITMAP (tmp, 0, uid, bi)
    1234              :     {
    1235      5143430 :       struct df_insn_info *insn_info = DF_INSN_UID_SAFE_GET (uid);
    1236      5143430 :       if (insn_info)
    1237      5143430 :         df_insn_info_delete (uid);
    1238              :     }
    1239              : 
    1240     87528178 :   bitmap_copy (tmp, &df->insns_to_rescan);
    1241    376858943 :   EXECUTE_IF_SET_IN_BITMAP (tmp, 0, uid, bi)
    1242              :     {
    1243    289330765 :       struct df_insn_info *insn_info = DF_INSN_UID_SAFE_GET (uid);
    1244    289330765 :       if (insn_info)
    1245    289330765 :         df_insn_rescan (insn_info->insn);
    1246              :     }
    1247              : 
    1248     87528178 :   bitmap_copy (tmp, &df->insns_to_notes_rescan);
    1249     87601462 :   EXECUTE_IF_SET_IN_BITMAP (tmp, 0, uid, bi)
    1250              :     {
    1251        73284 :       struct df_insn_info *insn_info = DF_INSN_UID_SAFE_GET (uid);
    1252        73284 :       if (insn_info)
    1253        73284 :         df_notes_rescan (insn_info->insn);
    1254              :     }
    1255              : 
    1256     87528178 :   if (dump_file)
    1257         3402 :     fprintf (dump_file, "ending the processing of deferred insns\n");
    1258              : 
    1259     87528178 :   bitmap_clear (&df->insns_to_delete);
    1260     87528178 :   bitmap_clear (&df->insns_to_rescan);
    1261     87528178 :   bitmap_clear (&df->insns_to_notes_rescan);
    1262              : 
    1263     87528178 :   if (no_insn_rescan)
    1264            0 :     df_set_flags (DF_NO_INSN_RESCAN);
    1265     87528178 :   if (defer_insn_rescan)
    1266     11777778 :     df_set_flags (DF_DEFER_INSN_RESCAN);
    1267              : 
    1268              :   /* If someone changed regs_ever_live during this pass, fix up the
    1269              :      entry and exit blocks.  */
    1270     87528178 :   if (df->redo_entry_and_exit)
    1271              :     {
    1272       885092 :       df_update_entry_exit_and_calls ();
    1273       885092 :       df->redo_entry_and_exit = false;
    1274              :     }
    1275     87528178 : }
    1276              : 
    1277              : 
    1278              : /* Count the number of refs. Include the defs if INCLUDE_DEFS. Include
    1279              :    the uses if INCLUDE_USES. Include the eq_uses if
    1280              :    INCLUDE_EQ_USES.  */
    1281              : 
    1282              : static unsigned int
    1283      5988724 : df_count_refs (bool include_defs, bool include_uses,
    1284              :                bool include_eq_uses)
    1285              : {
    1286      5988724 :   unsigned int regno;
    1287      5988724 :   int size = 0;
    1288      5988724 :   unsigned int m = df->regs_inited;
    1289              : 
    1290   1453199573 :   for (regno = 0; regno < m; regno++)
    1291              :     {
    1292   1447210849 :       if (include_defs)
    1293   1447210849 :         size += DF_REG_DEF_COUNT (regno);
    1294   1447210849 :       if (include_uses)
    1295            0 :         size += DF_REG_USE_COUNT (regno);
    1296   1447210849 :       if (include_eq_uses)
    1297            0 :         size += DF_REG_EQ_USE_COUNT (regno);
    1298              :     }
    1299      5988724 :   return size;
    1300              : }
    1301              : 
    1302              : 
    1303              : /* Take build ref table for either the uses or defs from the reg-use
    1304              :    or reg-def chains.  This version processes the refs in reg order
    1305              :    which is likely to be best if processing the whole function.  */
    1306              : 
    1307              : static void
    1308      4687002 : df_reorganize_refs_by_reg_by_reg (struct df_ref_info *ref_info,
    1309              :                                   bool include_defs,
    1310              :                                   bool include_uses,
    1311              :                                   bool include_eq_uses)
    1312              : {
    1313      4687002 :   unsigned int m = df->regs_inited;
    1314      4687002 :   unsigned int regno;
    1315      4687002 :   unsigned int offset = 0;
    1316      4687002 :   unsigned int start;
    1317              : 
    1318      4687002 :   if (df->changeable_flags & DF_NO_HARD_REGS)
    1319              :     {
    1320        22438 :       start = FIRST_PSEUDO_REGISTER;
    1321        22438 :       memset (ref_info->begin, 0, sizeof (int) * FIRST_PSEUDO_REGISTER);
    1322        22438 :       memset (ref_info->count, 0, sizeof (int) * FIRST_PSEUDO_REGISTER);
    1323              :     }
    1324              :   else
    1325              :     start = 0;
    1326              : 
    1327      4687002 :   ref_info->total_size
    1328      4687002 :     = df_count_refs (include_defs, include_uses, include_eq_uses);
    1329              : 
    1330      4687002 :   df_check_and_grow_ref_info (ref_info, 1);
    1331              : 
    1332    674442714 :   for (regno = start; regno < m; regno++)
    1333              :     {
    1334    669755712 :       int count = 0;
    1335    669755712 :       ref_info->begin[regno] = offset;
    1336    669755712 :       if (include_defs)
    1337              :         {
    1338    669755712 :           df_ref ref = DF_REG_DEF_CHAIN (regno);
    1339   2684179147 :           while (ref)
    1340              :             {
    1341   2014423435 :               ref_info->refs[offset] = ref;
    1342   2014423435 :               DF_REF_ID (ref) = offset++;
    1343   2014423435 :               count++;
    1344   2014423435 :               ref = DF_REF_NEXT_REG (ref);
    1345   2014423435 :               gcc_checking_assert (offset < ref_info->refs_size);
    1346              :             }
    1347              :         }
    1348    669755712 :       if (include_uses)
    1349              :         {
    1350            0 :           df_ref ref = DF_REG_USE_CHAIN (regno);
    1351            0 :           while (ref)
    1352              :             {
    1353            0 :               ref_info->refs[offset] = ref;
    1354            0 :               DF_REF_ID (ref) = offset++;
    1355            0 :               count++;
    1356            0 :               ref = DF_REF_NEXT_REG (ref);
    1357            0 :               gcc_checking_assert (offset < ref_info->refs_size);
    1358              :             }
    1359              :         }
    1360    669755712 :       if (include_eq_uses)
    1361              :         {
    1362            0 :           df_ref ref = DF_REG_EQ_USE_CHAIN (regno);
    1363            0 :           while (ref)
    1364              :             {
    1365            0 :               ref_info->refs[offset] = ref;
    1366            0 :               DF_REF_ID (ref) = offset++;
    1367            0 :               count++;
    1368            0 :               ref = DF_REF_NEXT_REG (ref);
    1369            0 :               gcc_checking_assert (offset < ref_info->refs_size);
    1370              :             }
    1371              :         }
    1372    669755712 :       ref_info->count[regno] = count;
    1373              :     }
    1374              : 
    1375              :   /* The bitmap size is not decremented when refs are deleted.  So
    1376              :      reset it now that we have squished out all of the empty
    1377              :      slots.  */
    1378      4687002 :   ref_info->table_size = offset;
    1379      4687002 : }
    1380              : 
    1381              : 
    1382              : /* Take build ref table for either the uses or defs from the reg-use
    1383              :    or reg-def chains.  This version processes the refs in insn order
    1384              :    which is likely to be best if processing some segment of the
    1385              :    function.  */
    1386              : 
    1387              : static void
    1388      1301722 : df_reorganize_refs_by_reg_by_insn (struct df_ref_info *ref_info,
    1389              :                                    bool include_defs,
    1390              :                                    bool include_uses,
    1391              :                                    bool include_eq_uses)
    1392              : {
    1393      1301722 :   bitmap_iterator bi;
    1394      1301722 :   unsigned int bb_index;
    1395      1301722 :   unsigned int m = df->regs_inited;
    1396      1301722 :   unsigned int offset = 0;
    1397      1301722 :   unsigned int r;
    1398      1301722 :   unsigned int start
    1399      1301722 :     = (df->changeable_flags & DF_NO_HARD_REGS) ? FIRST_PSEUDO_REGISTER : 0;
    1400              : 
    1401      1301722 :   memset (ref_info->begin, 0, sizeof (int) * df->regs_inited);
    1402      1301722 :   memset (ref_info->count, 0, sizeof (int) * df->regs_inited);
    1403              : 
    1404      1301722 :   ref_info->total_size = df_count_refs (include_defs, include_uses, include_eq_uses);
    1405      1301722 :   df_check_and_grow_ref_info (ref_info, 1);
    1406              : 
    1407      9226526 :   EXECUTE_IF_SET_IN_BITMAP (df->blocks_to_analyze, 0, bb_index, bi)
    1408              :     {
    1409      7924804 :       basic_block bb = BASIC_BLOCK_FOR_FN (cfun, bb_index);
    1410      7924804 :       rtx_insn *insn;
    1411      7924804 :       df_ref def, use;
    1412              : 
    1413      7924804 :       if (include_defs)
    1414     15921337 :         FOR_EACH_ARTIFICIAL_DEF (def, bb_index)
    1415              :           {
    1416        71729 :             unsigned int regno = DF_REF_REGNO (def);
    1417        71729 :             ref_info->count[regno]++;
    1418              :           }
    1419      7924804 :       if (include_uses)
    1420            0 :         FOR_EACH_ARTIFICIAL_USE (use, bb_index)
    1421              :           {
    1422            0 :             unsigned int regno = DF_REF_REGNO (use);
    1423            0 :             ref_info->count[regno]++;
    1424              :           }
    1425              : 
    1426     89215896 :       FOR_BB_INSNS (bb, insn)
    1427              :         {
    1428     81291092 :           if (INSN_P (insn))
    1429              :             {
    1430     67970685 :               struct df_insn_info *insn_info = DF_INSN_INFO_GET (insn);
    1431              : 
    1432     67970685 :               if (include_defs)
    1433    220040519 :                 FOR_EACH_INSN_INFO_DEF (def, insn_info)
    1434              :                   {
    1435    152069834 :                     unsigned int regno = DF_REF_REGNO (def);
    1436    152069834 :                     ref_info->count[regno]++;
    1437              :                   }
    1438     67970685 :               if (include_uses)
    1439            0 :                 FOR_EACH_INSN_INFO_USE (use, insn_info)
    1440              :                   {
    1441            0 :                     unsigned int regno = DF_REF_REGNO (use);
    1442            0 :                     ref_info->count[regno]++;
    1443              :                   }
    1444     67970685 :               if (include_eq_uses)
    1445            0 :                 FOR_EACH_INSN_INFO_EQ_USE (use, insn_info)
    1446              :                   {
    1447            0 :                     unsigned int regno = DF_REF_REGNO (use);
    1448            0 :                     ref_info->count[regno]++;
    1449              :                   }
    1450              :             }
    1451              :         }
    1452              :     }
    1453              : 
    1454    776692563 :   for (r = start; r < m; r++)
    1455              :     {
    1456    775390841 :       ref_info->begin[r] = offset;
    1457    775390841 :       offset += ref_info->count[r];
    1458    775390841 :       ref_info->count[r] = 0;
    1459              :     }
    1460              : 
    1461      9226526 :   EXECUTE_IF_SET_IN_BITMAP (df->blocks_to_analyze, 0, bb_index, bi)
    1462              :     {
    1463      7924804 :       basic_block bb = BASIC_BLOCK_FOR_FN (cfun, bb_index);
    1464      7924804 :       rtx_insn *insn;
    1465      7924804 :       df_ref def, use;
    1466              : 
    1467      7924804 :       if (include_defs)
    1468     15921337 :         FOR_EACH_ARTIFICIAL_DEF (def, bb_index)
    1469              :           {
    1470        71729 :             unsigned int regno = DF_REF_REGNO (def);
    1471        71729 :             if (regno >= start)
    1472              :               {
    1473        71729 :                 unsigned int id
    1474        71729 :                   = ref_info->begin[regno] + ref_info->count[regno]++;
    1475        71729 :                 DF_REF_ID (def) = id;
    1476        71729 :                 ref_info->refs[id] = def;
    1477              :               }
    1478              :           }
    1479      7924804 :       if (include_uses)
    1480            0 :         FOR_EACH_ARTIFICIAL_USE (use, bb_index)
    1481              :           {
    1482            0 :             unsigned int regno = DF_REF_REGNO (def);
    1483            0 :             if (regno >= start)
    1484              :               {
    1485            0 :                 unsigned int id
    1486            0 :                   = ref_info->begin[regno] + ref_info->count[regno]++;
    1487            0 :                 DF_REF_ID (use) = id;
    1488            0 :                 ref_info->refs[id] = use;
    1489              :               }
    1490              :           }
    1491              : 
    1492     89215896 :       FOR_BB_INSNS (bb, insn)
    1493              :         {
    1494     81291092 :           if (INSN_P (insn))
    1495              :             {
    1496     67970685 :               struct df_insn_info *insn_info = DF_INSN_INFO_GET (insn);
    1497              : 
    1498     67970685 :               if (include_defs)
    1499    220040519 :                 FOR_EACH_INSN_INFO_DEF (def, insn_info)
    1500              :                   {
    1501    152069834 :                     unsigned int regno = DF_REF_REGNO (def);
    1502    152069834 :                     if (regno >= start)
    1503              :                       {
    1504    152069834 :                         unsigned int id
    1505    152069834 :                           = ref_info->begin[regno] + ref_info->count[regno]++;
    1506    152069834 :                         DF_REF_ID (def) = id;
    1507    152069834 :                         ref_info->refs[id] = def;
    1508              :                       }
    1509              :                   }
    1510     67970685 :               if (include_uses)
    1511            0 :                 FOR_EACH_INSN_INFO_USE (use, insn_info)
    1512              :                   {
    1513            0 :                     unsigned int regno = DF_REF_REGNO (use);
    1514            0 :                     if (regno >= start)
    1515              :                       {
    1516            0 :                         unsigned int id
    1517            0 :                           = ref_info->begin[regno] + ref_info->count[regno]++;
    1518            0 :                         DF_REF_ID (use) = id;
    1519            0 :                         ref_info->refs[id] = use;
    1520              :                       }
    1521              :                   }
    1522     67970685 :               if (include_eq_uses)
    1523            0 :                 FOR_EACH_INSN_INFO_EQ_USE (use, insn_info)
    1524              :                   {
    1525            0 :                     unsigned int regno = DF_REF_REGNO (use);
    1526            0 :                     if (regno >= start)
    1527              :                       {
    1528            0 :                         unsigned int id
    1529            0 :                           = ref_info->begin[regno] + ref_info->count[regno]++;
    1530            0 :                         DF_REF_ID (use) = id;
    1531            0 :                         ref_info->refs[id] = use;
    1532              :                       }
    1533              :                   }
    1534              :             }
    1535              :         }
    1536              :     }
    1537              : 
    1538              :   /* The bitmap size is not decremented when refs are deleted.  So
    1539              :      reset it now that we have squished out all of the empty
    1540              :      slots.  */
    1541              : 
    1542      1301722 :   ref_info->table_size = offset;
    1543      1301722 : }
    1544              : 
    1545              : /* Take build ref table for either the uses or defs from the reg-use
    1546              :    or reg-def chains.  */
    1547              : 
    1548              : static void
    1549      5988724 : df_reorganize_refs_by_reg (struct df_ref_info *ref_info,
    1550              :                            bool include_defs,
    1551              :                            bool include_uses,
    1552              :                            bool include_eq_uses)
    1553              : {
    1554      5988724 :   if (df->analyze_subset)
    1555      1301722 :     df_reorganize_refs_by_reg_by_insn (ref_info, include_defs,
    1556              :                                        include_uses, include_eq_uses);
    1557              :   else
    1558      4687002 :     df_reorganize_refs_by_reg_by_reg (ref_info, include_defs,
    1559              :                                        include_uses, include_eq_uses);
    1560      5988724 : }
    1561              : 
    1562              : 
    1563              : /* Add the refs in REF_VEC to the table in REF_INFO starting at OFFSET.  */
    1564              : static unsigned int
    1565            0 : df_add_refs_to_table (unsigned int offset,
    1566              :                       struct df_ref_info *ref_info,
    1567              :                       df_ref ref)
    1568              : {
    1569            0 :   for (; ref; ref = DF_REF_NEXT_LOC (ref))
    1570            0 :     if (!(df->changeable_flags & DF_NO_HARD_REGS)
    1571            0 :         || (DF_REF_REGNO (ref) >= FIRST_PSEUDO_REGISTER))
    1572              :       {
    1573            0 :         ref_info->refs[offset] = ref;
    1574            0 :         DF_REF_ID (ref) = offset++;
    1575              :       }
    1576            0 :   return offset;
    1577              : }
    1578              : 
    1579              : 
    1580              : /* Count the number of refs in all of the insns of BB. Include the
    1581              :    defs if INCLUDE_DEFS. Include the uses if INCLUDE_USES. Include the
    1582              :    eq_uses if INCLUDE_EQ_USES.  */
    1583              : 
    1584              : static unsigned int
    1585            0 : df_reorganize_refs_by_insn_bb (basic_block bb, unsigned int offset,
    1586              :                                struct df_ref_info *ref_info,
    1587              :                                bool include_defs, bool include_uses,
    1588              :                                bool include_eq_uses)
    1589              : {
    1590            0 :   rtx_insn *insn;
    1591              : 
    1592            0 :   if (include_defs)
    1593            0 :     offset = df_add_refs_to_table (offset, ref_info,
    1594            0 :                                    df_get_artificial_defs (bb->index));
    1595            0 :   if (include_uses)
    1596            0 :     offset = df_add_refs_to_table (offset, ref_info,
    1597            0 :                                    df_get_artificial_uses (bb->index));
    1598              : 
    1599            0 :   FOR_BB_INSNS (bb, insn)
    1600            0 :     if (INSN_P (insn))
    1601              :       {
    1602            0 :         unsigned int uid = INSN_UID (insn);
    1603            0 :         if (include_defs)
    1604            0 :           offset = df_add_refs_to_table (offset, ref_info,
    1605            0 :                                          DF_INSN_UID_DEFS (uid));
    1606            0 :         if (include_uses)
    1607            0 :           offset = df_add_refs_to_table (offset, ref_info,
    1608            0 :                                          DF_INSN_UID_USES (uid));
    1609            0 :         if (include_eq_uses)
    1610            0 :           offset = df_add_refs_to_table (offset, ref_info,
    1611            0 :                                          DF_INSN_UID_EQ_USES (uid));
    1612              :       }
    1613            0 :   return offset;
    1614              : }
    1615              : 
    1616              : 
    1617              : /* Organize the refs by insn into the table in REF_INFO.  If
    1618              :    blocks_to_analyze is defined, use that set, otherwise the entire
    1619              :    program.  Include the defs if INCLUDE_DEFS. Include the uses if
    1620              :    INCLUDE_USES. Include the eq_uses if INCLUDE_EQ_USES.  */
    1621              : 
    1622              : static void
    1623            0 : df_reorganize_refs_by_insn (struct df_ref_info *ref_info,
    1624              :                             bool include_defs, bool include_uses,
    1625              :                             bool include_eq_uses)
    1626              : {
    1627            0 :   basic_block bb;
    1628            0 :   unsigned int offset = 0;
    1629              : 
    1630            0 :   ref_info->total_size = df_count_refs (include_defs, include_uses, include_eq_uses);
    1631            0 :   df_check_and_grow_ref_info (ref_info, 1);
    1632            0 :   if (df->blocks_to_analyze)
    1633              :     {
    1634            0 :       bitmap_iterator bi;
    1635            0 :       unsigned int index;
    1636              : 
    1637            0 :       EXECUTE_IF_SET_IN_BITMAP (df->blocks_to_analyze, 0, index, bi)
    1638              :         {
    1639            0 :           offset = df_reorganize_refs_by_insn_bb (BASIC_BLOCK_FOR_FN (cfun,
    1640              :                                                                       index),
    1641              :                                                   offset, ref_info,
    1642              :                                                   include_defs, include_uses,
    1643              :                                                   include_eq_uses);
    1644              :         }
    1645              : 
    1646            0 :       ref_info->table_size = offset;
    1647              :     }
    1648              :   else
    1649              :     {
    1650            0 :       FOR_ALL_BB_FN (bb, cfun)
    1651            0 :         offset = df_reorganize_refs_by_insn_bb (bb, offset, ref_info,
    1652              :                                                 include_defs, include_uses,
    1653              :                                                 include_eq_uses);
    1654            0 :       ref_info->table_size = offset;
    1655              :     }
    1656            0 : }
    1657              : 
    1658              : 
    1659              : /* If the use refs in DF are not organized, reorganize them.  */
    1660              : 
    1661              : void
    1662     42073662 : df_maybe_reorganize_use_refs (enum df_ref_order order)
    1663              : {
    1664     42073662 :   if (order == df->use_info.ref_order)
    1665              :     return;
    1666              : 
    1667            0 :   switch (order)
    1668              :     {
    1669            0 :     case DF_REF_ORDER_BY_REG:
    1670            0 :       df_reorganize_refs_by_reg (&df->use_info, false, true, false);
    1671            0 :       break;
    1672              : 
    1673            0 :     case DF_REF_ORDER_BY_REG_WITH_NOTES:
    1674            0 :       df_reorganize_refs_by_reg (&df->use_info, false, true, true);
    1675            0 :       break;
    1676              : 
    1677            0 :     case DF_REF_ORDER_BY_INSN:
    1678            0 :       df_reorganize_refs_by_insn (&df->use_info, false, true, false);
    1679            0 :       break;
    1680              : 
    1681            0 :     case DF_REF_ORDER_BY_INSN_WITH_NOTES:
    1682            0 :       df_reorganize_refs_by_insn (&df->use_info, false, true, true);
    1683            0 :       break;
    1684              : 
    1685            0 :     case DF_REF_ORDER_NO_TABLE:
    1686            0 :       free (df->use_info.refs);
    1687            0 :       df->use_info.refs = NULL;
    1688            0 :       df->use_info.refs_size = 0;
    1689            0 :       break;
    1690              : 
    1691            0 :     case DF_REF_ORDER_UNORDERED:
    1692            0 :     case DF_REF_ORDER_UNORDERED_WITH_NOTES:
    1693            0 :       gcc_unreachable ();
    1694            0 :       break;
    1695              :     }
    1696              : 
    1697            0 :   df->use_info.ref_order = order;
    1698              : }
    1699              : 
    1700              : 
    1701              : /* If the def refs in DF are not organized, reorganize them.  */
    1702              : 
    1703              : void
    1704     48062386 : df_maybe_reorganize_def_refs (enum df_ref_order order)
    1705              : {
    1706     48062386 :   if (order == df->def_info.ref_order)
    1707              :     return;
    1708              : 
    1709     11977448 :   switch (order)
    1710              :     {
    1711      5988724 :     case DF_REF_ORDER_BY_REG:
    1712      5988724 :       df_reorganize_refs_by_reg (&df->def_info, true, false, false);
    1713      5988724 :       break;
    1714              : 
    1715            0 :     case DF_REF_ORDER_BY_INSN:
    1716            0 :       df_reorganize_refs_by_insn (&df->def_info, true, false, false);
    1717            0 :       break;
    1718              : 
    1719      5988724 :     case DF_REF_ORDER_NO_TABLE:
    1720      5988724 :       free (df->def_info.refs);
    1721      5988724 :       df->def_info.refs = NULL;
    1722      5988724 :       df->def_info.refs_size = 0;
    1723      5988724 :       break;
    1724              : 
    1725            0 :     case DF_REF_ORDER_BY_INSN_WITH_NOTES:
    1726            0 :     case DF_REF_ORDER_BY_REG_WITH_NOTES:
    1727            0 :     case DF_REF_ORDER_UNORDERED:
    1728            0 :     case DF_REF_ORDER_UNORDERED_WITH_NOTES:
    1729            0 :       gcc_unreachable ();
    1730     11977448 :       break;
    1731              :     }
    1732              : 
    1733     11977448 :   df->def_info.ref_order = order;
    1734              : }
    1735              : 
    1736              : 
    1737              : /* Change all of the basic block references in INSN to use the insn's
    1738              :    current basic block.  This function is called from routines that move
    1739              :    instructions from one block to another.  */
    1740              : 
    1741              : void
    1742    291746916 : df_insn_change_bb (rtx_insn *insn, basic_block new_bb)
    1743              : {
    1744    291746916 :   basic_block old_bb = BLOCK_FOR_INSN (insn);
    1745    291746916 :   struct df_insn_info *insn_info;
    1746    291746916 :   unsigned int uid = INSN_UID (insn);
    1747              : 
    1748    291746916 :   if (old_bb == new_bb)
    1749              :     return;
    1750              : 
    1751    258918648 :   set_block_for_insn (insn, new_bb);
    1752              : 
    1753    258918648 :   if (!df)
    1754              :     return;
    1755              : 
    1756     31351325 :   if (dump_file)
    1757         5864 :     fprintf (dump_file, "changing bb of uid %d\n", uid);
    1758              : 
    1759     31351325 :   insn_info = DF_INSN_UID_SAFE_GET (uid);
    1760     31173720 :   if (insn_info == NULL)
    1761              :     {
    1762     11901152 :       if (dump_file)
    1763         5541 :         fprintf (dump_file, "  unscanned insn\n");
    1764     11901152 :       df_insn_rescan (insn);
    1765     11901152 :       return;
    1766              :     }
    1767              : 
    1768     19450173 :   if (!INSN_P (insn))
    1769              :     return;
    1770              : 
    1771     17304301 :   if (!DEBUG_INSN_P (insn))
    1772     13672289 :     df_set_bb_dirty (new_bb);
    1773     17304301 :   if (old_bb)
    1774              :     {
    1775     17299430 :       if (dump_file)
    1776          288 :         fprintf (dump_file, "  from %d to %d\n",
    1777              :                  old_bb->index, new_bb->index);
    1778     17299430 :       if (!DEBUG_INSN_P (insn))
    1779     13667462 :         df_set_bb_dirty (old_bb);
    1780              :     }
    1781              :   else
    1782         4871 :     if (dump_file)
    1783            0 :       fprintf (dump_file, "  to %d\n", new_bb->index);
    1784              : }
    1785              : 
    1786              : 
    1787              : /* Helper function for df_ref_change_reg_with_loc.  */
    1788              : 
    1789              : static void
    1790    105211041 : df_ref_change_reg_with_loc_1 (struct df_reg_info *old_df,
    1791              :                               struct df_reg_info *new_df,
    1792              :                               unsigned int new_regno, rtx loc)
    1793              : {
    1794    105211041 :   df_ref the_ref = old_df->reg_chain;
    1795              : 
    1796    196207101 :   while (the_ref)
    1797              :     {
    1798     90996060 :       if ((!DF_REF_IS_ARTIFICIAL (the_ref))
    1799     90996060 :           && DF_REF_LOC (the_ref)
    1800     90996060 :           && (*DF_REF_LOC (the_ref) == loc))
    1801              :         {
    1802     84286471 :           df_ref next_ref = DF_REF_NEXT_REG (the_ref);
    1803     84286471 :           df_ref prev_ref = DF_REF_PREV_REG (the_ref);
    1804     84286471 :           df_ref *ref_ptr;
    1805     84286471 :           struct df_insn_info *insn_info = DF_REF_INSN_INFO (the_ref);
    1806              : 
    1807     84286471 :           DF_REF_REGNO (the_ref) = new_regno;
    1808     84286471 :           DF_REF_REG (the_ref) = regno_reg_rtx[new_regno];
    1809              : 
    1810              :           /* Pull the_ref out of the old regno chain.  */
    1811     84286471 :           if (prev_ref)
    1812      2610432 :             DF_REF_NEXT_REG (prev_ref) = next_ref;
    1813              :           else
    1814     81676039 :             old_df->reg_chain = next_ref;
    1815     84286471 :           if (next_ref)
    1816     29221882 :             DF_REF_PREV_REG (next_ref) = prev_ref;
    1817     84286471 :           old_df->n_refs--;
    1818              : 
    1819              :           /* Put the ref into the new regno chain.  */
    1820     84286471 :           DF_REF_PREV_REG (the_ref) = NULL;
    1821     84286471 :           DF_REF_NEXT_REG (the_ref) = new_df->reg_chain;
    1822     84286471 :           if (new_df->reg_chain)
    1823     80448711 :             DF_REF_PREV_REG (new_df->reg_chain) = the_ref;
    1824     84286471 :           new_df->reg_chain = the_ref;
    1825     84286471 :           new_df->n_refs++;
    1826     84286471 :           if (DF_REF_BB (the_ref))
    1827     84286471 :             df_set_bb_dirty (DF_REF_BB (the_ref));
    1828              : 
    1829              :           /* Need to sort the record again that the ref was in because
    1830              :              the regno is a sorting key.  First, find the right
    1831              :              record.  */
    1832     84286471 :           if (DF_REF_REG_DEF_P (the_ref))
    1833     32047709 :             ref_ptr = &insn_info->defs;
    1834     52238762 :           else if (DF_REF_FLAGS (the_ref) & DF_REF_IN_NOTE)
    1835      1778927 :             ref_ptr = &insn_info->eq_uses;
    1836              :           else
    1837     50459835 :             ref_ptr = &insn_info->uses;
    1838     84286471 :           if (dump_file)
    1839         2322 :             fprintf (dump_file, "changing reg in insn %d\n",
    1840         2322 :                      DF_REF_INSN_UID (the_ref));
    1841              : 
    1842              :           /* Stop if we find the current reference or where the reference
    1843              :              needs to be.  */
    1844     91506115 :           while (*ref_ptr != the_ref && df_ref_compare (*ref_ptr, the_ref) < 0)
    1845      7219644 :             ref_ptr = &DF_REF_NEXT_LOC (*ref_ptr);
    1846     84286471 :           if (*ref_ptr != the_ref)
    1847              :             {
    1848              :               /* The reference needs to be promoted up the list.  */
    1849     16264826 :               df_ref next = DF_REF_NEXT_LOC (the_ref);
    1850     16264826 :               DF_REF_NEXT_LOC (the_ref) = *ref_ptr;
    1851     16264826 :               *ref_ptr = the_ref;
    1852     33982939 :               do
    1853     33982939 :                 ref_ptr = &DF_REF_NEXT_LOC (*ref_ptr);
    1854     33982939 :               while (*ref_ptr != the_ref);
    1855     16264826 :               *ref_ptr = next;
    1856              :             }
    1857     68021645 :           else if (DF_REF_NEXT_LOC (the_ref)
    1858     68021645 :                    && df_ref_compare (the_ref, DF_REF_NEXT_LOC (the_ref)) > 0)
    1859              :             {
    1860              :               /* The reference needs to be demoted down the list.  */
    1861            0 :               *ref_ptr = DF_REF_NEXT_LOC (the_ref);
    1862            0 :               do
    1863            0 :                 ref_ptr = &DF_REF_NEXT_LOC (*ref_ptr);
    1864            0 :               while (*ref_ptr && df_ref_compare (the_ref, *ref_ptr) > 0);
    1865            0 :               DF_REF_NEXT_LOC (the_ref) = *ref_ptr;
    1866            0 :               *ref_ptr = the_ref;
    1867              :             }
    1868              : 
    1869              :           the_ref = next_ref;
    1870              :         }
    1871              :       else
    1872      6709589 :         the_ref = DF_REF_NEXT_REG (the_ref);
    1873              :     }
    1874    105211041 : }
    1875              : 
    1876              : 
    1877              : /* Change the regno of register LOC to NEW_REGNO and update the df
    1878              :    information accordingly.  Refs that do not match LOC are not changed
    1879              :    which means that artificial refs are not changed since they have no loc.
    1880              :    This call is to support the SET_REGNO macro. */
    1881              : 
    1882              : void
    1883     35070347 : df_ref_change_reg_with_loc (rtx loc, unsigned int new_regno)
    1884              : {
    1885     35070347 :   unsigned int old_regno = REGNO (loc);
    1886     35070347 :   if (old_regno == new_regno)
    1887              :     return;
    1888              : 
    1889     35070347 :   if (df)
    1890              :     {
    1891     35070347 :       df_grow_reg_info ();
    1892              : 
    1893     35070347 :       df_ref_change_reg_with_loc_1 (DF_REG_DEF_GET (old_regno),
    1894     35070347 :                                     DF_REG_DEF_GET (new_regno),
    1895              :                                     new_regno, loc);
    1896     35070347 :       df_ref_change_reg_with_loc_1 (DF_REG_USE_GET (old_regno),
    1897     35070347 :                                     DF_REG_USE_GET (new_regno),
    1898              :                                     new_regno, loc);
    1899     35070347 :       df_ref_change_reg_with_loc_1 (DF_REG_EQ_USE_GET (old_regno),
    1900     35070347 :                                     DF_REG_EQ_USE_GET (new_regno),
    1901              :                                     new_regno, loc);
    1902              :     }
    1903     35070347 :   set_mode_and_regno (loc, GET_MODE (loc), new_regno);
    1904              : }
    1905              : 
    1906              : 
    1907              : /* Delete the mw_hardregs that point into the eq_notes.  */
    1908              : 
    1909              : static void
    1910     16873580 : df_mw_hardreg_chain_delete_eq_uses (struct df_insn_info *insn_info)
    1911              : {
    1912     16873580 :   struct df_mw_hardreg **mw_ptr = &insn_info->mw_hardregs;
    1913     16873580 :   struct df_scan_problem_data *problem_data
    1914     16873580 :     = (struct df_scan_problem_data *) df_scan->problem_data;
    1915              : 
    1916     16891761 :   while (*mw_ptr)
    1917              :     {
    1918        18181 :       df_mw_hardreg *mw = *mw_ptr;
    1919        18181 :       if (mw->flags & DF_REF_IN_NOTE)
    1920              :         {
    1921            2 :           *mw_ptr = DF_MWS_NEXT (mw);
    1922            2 :           problem_data->mw_reg_pool->remove (mw);
    1923              :         }
    1924              :       else
    1925        18179 :         mw_ptr = &DF_MWS_NEXT (mw);
    1926              :     }
    1927     16873580 : }
    1928              : 
    1929              : 
    1930              : /* Rescan only the REG_EQUIV/REG_EQUAL notes part of INSN.  */
    1931              : 
    1932              : void
    1933     44293812 : df_notes_rescan (rtx_insn *insn)
    1934              : {
    1935     44293812 :   struct df_insn_info *insn_info;
    1936     44293812 :   unsigned int uid = INSN_UID (insn);
    1937              : 
    1938     44293812 :   if (!df)
    1939              :     return;
    1940              : 
    1941              :   /* The client has disabled rescanning and plans to do it itself.  */
    1942     40343590 :   if (df->changeable_flags & DF_NO_INSN_RESCAN)
    1943              :     return;
    1944              : 
    1945              :   /* Do nothing if the insn hasn't been emitted yet.  */
    1946     40324293 :   if (!BLOCK_FOR_INSN (insn))
    1947              :     return;
    1948              : 
    1949     40308752 :   df_grow_bb_info (df_scan);
    1950     40308752 :   df_grow_reg_info ();
    1951              : 
    1952     40308752 :   insn_info = DF_INSN_UID_SAFE_GET (INSN_UID (insn));
    1953              : 
    1954              :   /* The client has deferred rescanning.  */
    1955     40308752 :   if (df->changeable_flags & DF_DEFER_INSN_RESCAN)
    1956              :     {
    1957     23435172 :       if (!insn_info)
    1958              :         {
    1959            0 :           insn_info = df_insn_create_insn_record (insn);
    1960            0 :           insn_info->defs = 0;
    1961            0 :           insn_info->uses = 0;
    1962            0 :           insn_info->eq_uses = 0;
    1963            0 :           insn_info->mw_hardregs = 0;
    1964              :         }
    1965              : 
    1966     23435172 :       bitmap_clear_bit (&df->insns_to_delete, uid);
    1967              :       /* If the insn is set to be rescanned, it does not need to also
    1968              :          be notes rescanned.  */
    1969     23435172 :       if (!bitmap_bit_p (&df->insns_to_rescan, uid))
    1970      2603638 :         bitmap_set_bit (&df->insns_to_notes_rescan, INSN_UID (insn));
    1971     23435172 :       return;
    1972              :     }
    1973              : 
    1974     16873580 :   bitmap_clear_bit (&df->insns_to_delete, uid);
    1975     16873580 :   bitmap_clear_bit (&df->insns_to_notes_rescan, uid);
    1976              : 
    1977     16873580 :   if (insn_info)
    1978              :     {
    1979     16873580 :       basic_block bb = BLOCK_FOR_INSN (insn);
    1980     16873580 :       rtx note;
    1981     16873580 :       class df_collection_rec collection_rec;
    1982     16873580 :       unsigned int i;
    1983              : 
    1984     16873580 :       df_mw_hardreg_chain_delete_eq_uses (insn_info);
    1985     16873580 :       df_ref_chain_delete (insn_info->eq_uses);
    1986     16873580 :       insn_info->eq_uses = NULL;
    1987              : 
    1988              :       /* Process REG_EQUIV/REG_EQUAL notes */
    1989     38661147 :       for (note = REG_NOTES (insn); note;
    1990     21787567 :            note = XEXP (note, 1))
    1991              :         {
    1992     21787567 :           switch (REG_NOTE_KIND (note))
    1993              :             {
    1994     12128125 :             case REG_EQUIV:
    1995     12128125 :             case REG_EQUAL:
    1996     12128125 :               df_uses_record (&collection_rec,
    1997              :                               &XEXP (note, 0), DF_REF_REG_USE,
    1998              :                               bb, insn_info, DF_REF_IN_NOTE);
    1999     21787567 :             default:
    2000     21787567 :               break;
    2001              :             }
    2002              :         }
    2003              : 
    2004              :       /* Find some place to put any new mw_hardregs.  */
    2005     16873580 :       df_canonize_collection_rec (&collection_rec);
    2006     16873580 :       struct df_mw_hardreg **mw_ptr = &insn_info->mw_hardregs, *mw;
    2007     16873580 :       FOR_EACH_VEC_ELT (collection_rec.mw_vec, i, mw)
    2008              :         {
    2009            0 :           while (*mw_ptr && df_mw_compare (*mw_ptr, mw) < 0)
    2010            0 :             mw_ptr = &DF_MWS_NEXT (*mw_ptr);
    2011            0 :           DF_MWS_NEXT (mw) = *mw_ptr;
    2012            0 :           *mw_ptr = mw;
    2013            0 :           mw_ptr = &DF_MWS_NEXT (mw);
    2014              :         }
    2015     16873580 :       df_refs_add_to_chains (&collection_rec, bb, insn, copy_eq_uses);
    2016     16873580 :     }
    2017              :   else
    2018            0 :     df_insn_rescan (insn);
    2019              : 
    2020              : }
    2021              : 
    2022              : 
    2023              : /*----------------------------------------------------------------------------
    2024              :    Hard core instruction scanning code.  No external interfaces here,
    2025              :    just a lot of routines that look inside insns.
    2026              : ----------------------------------------------------------------------------*/
    2027              : 
    2028              : 
    2029              : /* Return true if the contents of two df_ref's are identical.
    2030              :    It ignores DF_REF_MARKER.  */
    2031              : 
    2032              : static bool
    2033   8194073319 : df_ref_equal_p (df_ref ref1, df_ref ref2)
    2034              : {
    2035   8194073319 :   if (!ref2)
    2036              :     return false;
    2037              : 
    2038   8194073319 :   if (ref1 == ref2)
    2039              :     return true;
    2040              : 
    2041   8194073319 :   if (DF_REF_CLASS (ref1) != DF_REF_CLASS (ref2)
    2042   8103117103 :       || DF_REF_REGNO (ref1) != DF_REF_REGNO (ref2)
    2043   7594002900 :       || DF_REF_REG (ref1) != DF_REF_REG (ref2)
    2044   7593475211 :       || DF_REF_TYPE (ref1) != DF_REF_TYPE (ref2)
    2045   7588294873 :       || ((DF_REF_FLAGS (ref1) & ~(DF_REF_REG_MARKER + DF_REF_MW_HARDREG))
    2046   7588294873 :           != (DF_REF_FLAGS (ref2) & ~(DF_REF_REG_MARKER + DF_REF_MW_HARDREG)))
    2047   7585881153 :       || DF_REF_BB (ref1) != DF_REF_BB (ref2)
    2048  15779954472 :       || DF_REF_INSN_INFO (ref1) != DF_REF_INSN_INFO (ref2))
    2049              :     return false;
    2050              : 
    2051   7585881153 :   switch (DF_REF_CLASS (ref1))
    2052              :     {
    2053              :     case DF_REF_ARTIFICIAL:
    2054              :     case DF_REF_BASE:
    2055              :       return true;
    2056              : 
    2057   1426029548 :     case DF_REF_REGULAR:
    2058   1426029548 :       return DF_REF_LOC (ref1) == DF_REF_LOC (ref2);
    2059              : 
    2060            0 :     default:
    2061            0 :       gcc_unreachable ();
    2062              :     }
    2063              : }
    2064              : 
    2065              : 
    2066              : /* Compare REF1 and REF2 for sorting.  This is only called from places
    2067              :    where all of the refs are of the same type, in the same insn, and
    2068              :    have the same bb.  So these fields are not checked.  */
    2069              : 
    2070              : static int
    2071  11341461546 : df_ref_compare (df_ref ref1, df_ref ref2)
    2072              : {
    2073  11341461546 :   if (DF_REF_CLASS (ref1) != DF_REF_CLASS (ref2))
    2074    760779121 :     return (int)DF_REF_CLASS (ref1) - (int)DF_REF_CLASS (ref2);
    2075              : 
    2076  10580682425 :   if (DF_REF_REGNO (ref1) != DF_REF_REGNO (ref2))
    2077  10514165533 :     return (int)DF_REF_REGNO (ref1) - (int)DF_REF_REGNO (ref2);
    2078              : 
    2079     66516892 :   if (DF_REF_TYPE (ref1) != DF_REF_TYPE (ref2))
    2080     14491186 :     return (int)DF_REF_TYPE (ref1) - (int)DF_REF_TYPE (ref2);
    2081              : 
    2082     52025706 :   if (DF_REF_REG (ref1) != DF_REF_REG (ref2))
    2083       525794 :     return (int)DF_REF_ORDER (ref1) - (int)DF_REF_ORDER (ref2);
    2084              : 
    2085              :   /* Cannot look at the LOC field on artificial refs.  */
    2086     51499912 :   if (DF_REF_CLASS (ref1) != DF_REF_ARTIFICIAL
    2087     51499912 :       && DF_REF_LOC (ref1) != DF_REF_LOC (ref2))
    2088     39399893 :     return (int)DF_REF_ORDER (ref1) - (int)DF_REF_ORDER (ref2);
    2089              : 
    2090     12100019 :   if (DF_REF_FLAGS (ref1) != DF_REF_FLAGS (ref2))
    2091              :     {
    2092              :       /* If two refs are identical except that one of them has is from
    2093              :          a mw and one is not, we need to have the one with the mw
    2094              :          first.  */
    2095      9380758 :       if (DF_REF_FLAGS_IS_SET (ref1, DF_REF_MW_HARDREG) ==
    2096      9380758 :           DF_REF_FLAGS_IS_SET (ref2, DF_REF_MW_HARDREG))
    2097      9380758 :         return DF_REF_FLAGS (ref1) - DF_REF_FLAGS (ref2);
    2098            0 :       else if (DF_REF_FLAGS_IS_SET (ref1, DF_REF_MW_HARDREG))
    2099              :         return -1;
    2100              :       else
    2101            0 :         return 1;
    2102              :     }
    2103              : 
    2104      2719261 :   return (int)DF_REF_ORDER (ref1) - (int)DF_REF_ORDER (ref2);
    2105              : }
    2106              : 
    2107              : /* Like df_ref_compare, but compare two df_ref* pointers R1 and R2.  */
    2108              : 
    2109              : static int
    2110   3701732529 : df_ref_ptr_compare (const void *r1, const void *r2)
    2111              : {
    2112   3701732529 :   return df_ref_compare (*(const df_ref *) r1, *(const df_ref *) r2);
    2113              : }
    2114              : 
    2115              : /* Sort and compress a set of refs.  */
    2116              : 
    2117              : static void
    2118   4673926188 : df_sort_and_compress_refs (vec<df_ref, va_heap> *ref_vec)
    2119              : {
    2120   4673926188 :   unsigned int count;
    2121   4673926188 :   unsigned int i;
    2122   4673926188 :   unsigned int dist = 0;
    2123              : 
    2124   4673926188 :   count = ref_vec->length ();
    2125              : 
    2126              :   /* If there are 1 or 0 elements, there is nothing to do.  */
    2127   4673925464 :   if (count < 2)
    2128              :     return;
    2129    567578430 :   else if (count == 2)
    2130              :     {
    2131    347674479 :       df_ref r0 = (*ref_vec)[0];
    2132    347674479 :       df_ref r1 = (*ref_vec)[1];
    2133    347674479 :       if (df_ref_compare (r0, r1) > 0)
    2134    159116068 :         std::swap ((*ref_vec)[0], (*ref_vec)[1]);
    2135              :     }
    2136              :   else
    2137              :     {
    2138   7425999018 :       for (i = 0; i < count - 1; i++)
    2139              :         {
    2140   7260896802 :           df_ref r0 = (*ref_vec)[i];
    2141   7260896802 :           df_ref r1 = (*ref_vec)[i + 1];
    2142   7260896802 :           if (df_ref_compare (r0, r1) >= 0)
    2143              :             break;
    2144              :         }
    2145              :       /* If the array is already strictly ordered,
    2146              :          which is the most common case for large COUNT case
    2147              :          (which happens for CALL INSNs),
    2148              :          no need to sort and filter out duplicate.
    2149              :          Simply return the count.
    2150              :          Make sure DF_GET_ADD_REFS adds refs in the increasing order
    2151              :          of DF_REF_COMPARE.  */
    2152    219903951 :       if (i == count - 1)
    2153              :         return;
    2154     54801735 :       ref_vec->qsort (df_ref_ptr_compare);
    2155              :     }
    2156              : 
    2157   1390293844 :   for (i=0; i<count-dist; i++)
    2158              :     {
    2159              :       /* Find the next ref that is not equal to the current ref.  */
    2160    988212456 :       while (i + dist + 1 < count
    2161   1573948698 :              && df_ref_equal_p ((*ref_vec)[i],
    2162    585736242 :                                 (*ref_vec)[i + dist + 1]))
    2163              :         {
    2164       394826 :           df_free_ref ((*ref_vec)[i + dist + 1]);
    2165       394826 :           dist++;
    2166              :         }
    2167              :       /* Copy it down to the next position.  */
    2168    987817630 :       if (dist && i + dist + 1 < count)
    2169       108356 :         (*ref_vec)[i + 1] = (*ref_vec)[i + dist + 1];
    2170              :     }
    2171              : 
    2172    402476214 :   count -= dist;
    2173    402476214 :   ref_vec->truncate (count);
    2174              : }
    2175              : 
    2176              : 
    2177              : /* Return true if the contents of two df_ref's are identical.
    2178              :    It ignores DF_REF_MARKER.  */
    2179              : 
    2180              : static bool
    2181      6585186 : df_mw_equal_p (struct df_mw_hardreg *mw1, struct df_mw_hardreg *mw2)
    2182              : {
    2183      6585186 :   if (!mw2)
    2184              :     return false;
    2185      6585186 :   return (mw1 == mw2) ||
    2186      6585186 :     (mw1->mw_reg == mw2->mw_reg
    2187      6049975 :      && mw1->type == mw2->type
    2188      5799609 :      && mw1->flags == mw2->flags
    2189      5796317 :      && mw1->start_regno == mw2->start_regno
    2190      5796317 :      && mw1->end_regno == mw2->end_regno);
    2191              : }
    2192              : 
    2193              : 
    2194              : /* Compare MW1 and MW2 for sorting.  */
    2195              : 
    2196              : static int
    2197      1753950 : df_mw_compare (const df_mw_hardreg *mw1, const df_mw_hardreg *mw2)
    2198              : {
    2199      1753950 :   if (mw1->type != mw2->type)
    2200      1152084 :     return mw1->type - mw2->type;
    2201              : 
    2202       601866 :   if (mw1->flags != mw2->flags)
    2203        30288 :     return mw1->flags - mw2->flags;
    2204              : 
    2205       571578 :   if (mw1->start_regno != mw2->start_regno)
    2206       450281 :     return mw1->start_regno - mw2->start_regno;
    2207              : 
    2208       121297 :   if (mw1->end_regno != mw2->end_regno)
    2209            0 :     return mw1->end_regno - mw2->end_regno;
    2210              : 
    2211       121297 :   return mw1->mw_order - mw2->mw_order;
    2212              : }
    2213              : 
    2214              : /* Like df_mw_compare, but compare two df_mw_hardreg** pointers R1 and R2.  */
    2215              : 
    2216              : static int
    2217      1120019 : df_mw_ptr_compare (const void *m1, const void *m2)
    2218              : {
    2219      1120019 :   return df_mw_compare (*(const df_mw_hardreg *const *) m1,
    2220      1120019 :                         *(const df_mw_hardreg *const *) m2);
    2221              : }
    2222              : 
    2223              : /* Sort and compress a set of refs.  */
    2224              : 
    2225              : static void
    2226   1557975396 : df_sort_and_compress_mws (vec<df_mw_hardreg *, va_heap> *mw_vec)
    2227              : {
    2228   1557975396 :   unsigned int count;
    2229   1557975396 :   struct df_scan_problem_data *problem_data
    2230   1557975396 :     = (struct df_scan_problem_data *) df_scan->problem_data;
    2231   1557975396 :   unsigned int i;
    2232   1557975396 :   unsigned int dist = 0;
    2233              : 
    2234   1557975396 :   count = mw_vec->length ();
    2235   1557975396 :   if (count < 2)
    2236              :     return;
    2237       710164 :   else if (count == 2)
    2238              :     {
    2239       633931 :       struct df_mw_hardreg *m0 = (*mw_vec)[0];
    2240       633931 :       struct df_mw_hardreg *m1 = (*mw_vec)[1];
    2241       633931 :       if (df_mw_compare (m0, m1) > 0)
    2242              :         {
    2243       135804 :           struct df_mw_hardreg *tmp = (*mw_vec)[0];
    2244       135804 :           (*mw_vec)[0] = (*mw_vec)[1];
    2245       135804 :           (*mw_vec)[1] = tmp;
    2246              :         }
    2247              :     }
    2248              :   else
    2249        76233 :     mw_vec->qsort (df_mw_ptr_compare);
    2250              : 
    2251      2207158 :   for (i=0; i<count-dist; i++)
    2252              :     {
    2253              :       /* Find the next ref that is not equal to the current ref.  */
    2254      1521425 :       while (i + dist + 1 < count
    2255      1521425 :              && df_mw_equal_p ((*mw_vec)[i], (*mw_vec)[i + dist + 1]))
    2256              :         {
    2257        24431 :           problem_data->mw_reg_pool->remove ((*mw_vec)[i + dist + 1]);
    2258        24431 :           dist++;
    2259              :         }
    2260              :       /* Copy it down to the next position.  */
    2261      1496994 :       if (dist && i + dist + 1 < count)
    2262         4468 :         (*mw_vec)[i + 1] = (*mw_vec)[i + dist + 1];
    2263              :     }
    2264              : 
    2265       710164 :   count -= dist;
    2266       710164 :   mw_vec->truncate (count);
    2267              : }
    2268              : 
    2269              : 
    2270              : /* Sort and remove duplicates from the COLLECTION_REC.  */
    2271              : 
    2272              : static void
    2273   1557975396 : df_canonize_collection_rec (class df_collection_rec *collection_rec)
    2274              : {
    2275   1557975396 :   df_sort_and_compress_refs (&collection_rec->def_vec);
    2276   1557975396 :   df_sort_and_compress_refs (&collection_rec->use_vec);
    2277   1557975396 :   df_sort_and_compress_refs (&collection_rec->eq_use_vec);
    2278   1557975396 :   df_sort_and_compress_mws (&collection_rec->mw_vec);
    2279   1557975396 : }
    2280              : 
    2281              : 
    2282              : /* Add the new df_ref to appropriate reg_info/ref_info chains.  */
    2283              : 
    2284              : static void
    2285   1877580236 : df_install_ref (df_ref this_ref,
    2286              :                 struct df_reg_info *reg_info,
    2287              :                 struct df_ref_info *ref_info,
    2288              :                 bool add_to_table)
    2289              : {
    2290   1877580236 :   unsigned int regno = DF_REF_REGNO (this_ref);
    2291              :   /* Add the ref to the reg_{def,use,eq_use} chain.  */
    2292   1877580236 :   df_ref head = reg_info->reg_chain;
    2293              : 
    2294   1877580236 :   reg_info->reg_chain = this_ref;
    2295   1877580236 :   reg_info->n_refs++;
    2296              : 
    2297   1877580236 :   if (DF_REF_FLAGS_IS_SET (this_ref, DF_HARD_REG_LIVE))
    2298              :     {
    2299    356097306 :       gcc_assert (regno < FIRST_PSEUDO_REGISTER);
    2300    356097306 :       df->hard_regs_live_count[regno]++;
    2301              :     }
    2302              : 
    2303   1877580236 :   gcc_checking_assert (DF_REF_NEXT_REG (this_ref) == NULL
    2304              :                        && DF_REF_PREV_REG (this_ref) == NULL);
    2305              : 
    2306   1877580236 :   DF_REF_NEXT_REG (this_ref) = head;
    2307              : 
    2308              :   /* We cannot actually link to the head of the chain.  */
    2309   1877580236 :   DF_REF_PREV_REG (this_ref) = NULL;
    2310              : 
    2311   1877580236 :   if (head)
    2312   1524598030 :     DF_REF_PREV_REG (head) = this_ref;
    2313              : 
    2314   1877580236 :   if (add_to_table)
    2315              :     {
    2316      1099902 :       gcc_assert (ref_info->ref_order != DF_REF_ORDER_NO_TABLE);
    2317      1099902 :       df_check_and_grow_ref_info (ref_info, 1);
    2318      1099902 :       DF_REF_ID (this_ref) = ref_info->table_size;
    2319              :       /* Add the ref to the big array of defs.  */
    2320      1099902 :       ref_info->refs[ref_info->table_size] = this_ref;
    2321      1099902 :       ref_info->table_size++;
    2322              :     }
    2323              :   else
    2324   1876480334 :     DF_REF_ID (this_ref) = -1;
    2325              : 
    2326   1877580236 :   ref_info->total_size++;
    2327   1877580236 : }
    2328              : 
    2329              : 
    2330              : /* This function takes one of the groups of refs (defs, uses or
    2331              :    eq_uses) and installs the entire group into the insn.  It also adds
    2332              :    each of these refs into the appropriate chains.  */
    2333              : 
    2334              : static df_ref
    2335   1278849783 : df_install_refs (basic_block bb,
    2336              :                  const vec<df_ref, va_heap> *old_vec,
    2337              :                  struct df_reg_info **reg_info,
    2338              :                  struct df_ref_info *ref_info,
    2339              :                  bool is_notes)
    2340              : {
    2341   1278849783 :   unsigned int count = old_vec->length ();
    2342   1278849783 :   if (count)
    2343              :     {
    2344    515604498 :       bool add_to_table;
    2345    515604498 :       df_ref this_ref;
    2346    515604498 :       unsigned int ix;
    2347              : 
    2348    515604498 :       switch (ref_info->ref_order)
    2349              :         {
    2350            0 :         case DF_REF_ORDER_UNORDERED_WITH_NOTES:
    2351            0 :         case DF_REF_ORDER_BY_REG_WITH_NOTES:
    2352            0 :         case DF_REF_ORDER_BY_INSN_WITH_NOTES:
    2353            0 :           ref_info->ref_order = DF_REF_ORDER_UNORDERED_WITH_NOTES;
    2354            0 :           add_to_table = true;
    2355            0 :           break;
    2356      1879857 :         case DF_REF_ORDER_UNORDERED:
    2357      1879857 :         case DF_REF_ORDER_BY_REG:
    2358      1879857 :         case DF_REF_ORDER_BY_INSN:
    2359      1879857 :           ref_info->ref_order = DF_REF_ORDER_UNORDERED;
    2360      1879857 :           add_to_table = !is_notes;
    2361      1879857 :           break;
    2362              :         default:
    2363              :           add_to_table = false;
    2364              :           break;
    2365              :         }
    2366              : 
    2367              :       /* Do not add if ref is not in the right blocks.  */
    2368      1879857 :       if (add_to_table && df->analyze_subset)
    2369      1316673 :         add_to_table = bitmap_bit_p (df->blocks_to_analyze, bb->index);
    2370              : 
    2371   2393184734 :       FOR_EACH_VEC_ELT (*old_vec, ix, this_ref)
    2372              :         {
    2373   1877580236 :           DF_REF_NEXT_LOC (this_ref) = (ix + 1 < old_vec->length ()
    2374   1877580236 :                                         ? (*old_vec)[ix + 1]
    2375              :                                         : NULL);
    2376   1877580236 :           df_install_ref (this_ref, reg_info[DF_REF_REGNO (this_ref)],
    2377              :                           ref_info, add_to_table);
    2378              :         }
    2379    515604498 :       return (*old_vec)[0];
    2380              :     }
    2381              :   else
    2382              :     return 0;
    2383              : }
    2384              : 
    2385              : 
    2386              : /* This function takes the mws installs the entire group into the
    2387              :    insn.  */
    2388              : 
    2389              : static struct df_mw_hardreg *
    2390    388297709 : df_install_mws (const vec<df_mw_hardreg *, va_heap> *old_vec)
    2391              : {
    2392    388297709 :   unsigned int count = old_vec->length ();
    2393    388297709 :   if (count)
    2394              :     {
    2395      3229624 :       for (unsigned int i = 0; i < count - 1; i++)
    2396       293650 :         DF_MWS_NEXT ((*old_vec)[i]) = (*old_vec)[i + 1];
    2397      2935974 :       DF_MWS_NEXT ((*old_vec)[count - 1]) = 0;
    2398      2935974 :       return (*old_vec)[0];
    2399              :     }
    2400              :   else
    2401              :     return 0;
    2402              : }
    2403              : 
    2404              : 
    2405              : /* Add a chain of df_refs to appropriate ref chain/reg_info/ref_info
    2406              :    chains and update other necessary information.  */
    2407              : 
    2408              : static void
    2409    453712827 : df_refs_add_to_chains (class df_collection_rec *collection_rec,
    2410              :                        basic_block bb, rtx_insn *insn, unsigned int flags)
    2411              : {
    2412    453712827 :   if (insn)
    2413              :     {
    2414    405171289 :       struct df_insn_info *insn_rec = DF_INSN_INFO_GET (insn);
    2415              :       /* If there is a vector in the collection rec, add it to the
    2416              :          insn.  A null rec is a signal that the caller will handle the
    2417              :          chain specially.  */
    2418    405171289 :       if (flags & copy_defs)
    2419              :         {
    2420    388297709 :           gcc_checking_assert (!insn_rec->defs);
    2421    388297709 :           insn_rec->defs
    2422    388297709 :             = df_install_refs (bb, &collection_rec->def_vec,
    2423              :                                df->def_regs,
    2424              :                                &df->def_info, false);
    2425              :         }
    2426    405171289 :       if (flags & copy_uses)
    2427              :         {
    2428    388297709 :           gcc_checking_assert (!insn_rec->uses);
    2429    388297709 :           insn_rec->uses
    2430    388297709 :             = df_install_refs (bb, &collection_rec->use_vec,
    2431              :                                df->use_regs,
    2432    388297709 :                                &df->use_info, false);
    2433              :         }
    2434    405171289 :       if (flags & copy_eq_uses)
    2435              :         {
    2436    405171289 :           gcc_checking_assert (!insn_rec->eq_uses);
    2437    405171289 :           insn_rec->eq_uses
    2438    405171289 :             = df_install_refs (bb, &collection_rec->eq_use_vec,
    2439              :                                df->eq_use_regs,
    2440    405171289 :                                &df->use_info, true);
    2441              :         }
    2442    405171289 :       if (flags & copy_mw)
    2443              :         {
    2444    388297709 :           gcc_checking_assert (!insn_rec->mw_hardregs);
    2445    388297709 :           insn_rec->mw_hardregs
    2446    388297709 :             = df_install_mws (&collection_rec->mw_vec);
    2447              :         }
    2448              :     }
    2449              :   else
    2450              :     {
    2451     48541538 :       struct df_scan_bb_info *bb_info = df_scan_get_bb_info (bb->index);
    2452              : 
    2453     48541538 :       gcc_checking_assert (!bb_info->artificial_defs);
    2454     48541538 :       bb_info->artificial_defs
    2455     48541538 :         = df_install_refs (bb, &collection_rec->def_vec,
    2456              :                            df->def_regs,
    2457              :                            &df->def_info, false);
    2458     48541538 :       gcc_checking_assert (!bb_info->artificial_uses);
    2459     48541538 :       bb_info->artificial_uses
    2460     48541538 :         = df_install_refs (bb, &collection_rec->use_vec,
    2461              :                            df->use_regs,
    2462     48541538 :                            &df->use_info, false);
    2463              :     }
    2464    453712827 : }
    2465              : 
    2466              : 
    2467              : /* Allocate a ref and initialize its fields.  */
    2468              : 
    2469              : static df_ref
    2470   9375845156 : df_ref_create_structure (enum df_ref_class cl,
    2471              :                          class df_collection_rec *collection_rec,
    2472              :                          rtx reg, rtx *loc,
    2473              :                          basic_block bb, struct df_insn_info *info,
    2474              :                          enum df_ref_type ref_type,
    2475              :                          int ref_flags)
    2476              : {
    2477   9375845156 :   const unsigned int regno
    2478   9375845156 :     = REGNO (GET_CODE (reg) == SUBREG ? SUBREG_REG (reg) : reg);
    2479   9375845156 :   struct df_scan_problem_data *problem_data
    2480   9375845156 :     = (struct df_scan_problem_data *) df_scan->problem_data;
    2481   9375845156 :   df_ref this_ref;
    2482              : 
    2483   9375845156 :   switch (cl)
    2484              :     {
    2485   6923433572 :     case DF_REF_BASE:
    2486   6923433572 :       this_ref = (df_ref) (problem_data->ref_base_pool->allocate ());
    2487   6923433572 :       gcc_checking_assert (loc == NULL);
    2488              :       break;
    2489              : 
    2490    512564153 :     case DF_REF_ARTIFICIAL:
    2491    512564153 :       this_ref = (df_ref) (problem_data->ref_artificial_pool->allocate ());
    2492    512564153 :       this_ref->artificial_ref.bb = bb;
    2493    512564153 :       gcc_checking_assert (loc == NULL);
    2494              :       break;
    2495              : 
    2496   1939847431 :     case DF_REF_REGULAR:
    2497   1939847431 :       this_ref = (df_ref) (problem_data->ref_regular_pool->allocate ());
    2498   1939847431 :       this_ref->regular_ref.loc = loc;
    2499   1939847431 :       gcc_checking_assert (loc);
    2500              :       break;
    2501              : 
    2502            0 :     default:
    2503            0 :       gcc_unreachable ();
    2504              :     }
    2505              : 
    2506   9375845156 :   DF_REF_CLASS (this_ref) = cl;
    2507   9375845156 :   DF_REF_ID (this_ref) = -1;
    2508   9375845156 :   DF_REF_REG (this_ref) = reg;
    2509   9375845156 :   DF_REF_REGNO (this_ref) = regno;
    2510   9375845156 :   DF_REF_TYPE (this_ref) = ref_type;
    2511   9375845156 :   DF_REF_INSN_INFO (this_ref) = info;
    2512   9375845156 :   DF_REF_CHAIN (this_ref) = NULL;
    2513   9375845156 :   DF_REF_FLAGS (this_ref) = ref_flags;
    2514   9375845156 :   DF_REF_NEXT_REG (this_ref) = NULL;
    2515   9375845156 :   DF_REF_PREV_REG (this_ref) = NULL;
    2516   9375845156 :   DF_REF_ORDER (this_ref) = df->ref_order++;
    2517              : 
    2518              :   /* We need to clear the DF_HARD_REG_LIVE bit because fwprop, and in the
    2519              :      future possibly other optimizations, sometimes create new refs using
    2520              :      live refs as the model.  */
    2521   9375845156 :   DF_REF_FLAGS_CLEAR (this_ref, DF_HARD_REG_LIVE);
    2522              : 
    2523              :   /* Now see if this ref really needs to have the bit set.  */
    2524   9375845156 :   if (regno < FIRST_PSEUDO_REGISTER
    2525   9375845156 :       && cl != DF_REF_ARTIFICIAL
    2526   8243480520 :       && !DEBUG_INSN_P (info->insn))
    2527              :     {
    2528   8177305158 :       if (ref_type == DF_REF_REG_DEF)
    2529              :         {
    2530   7337833336 :           if (!DF_REF_FLAGS_IS_SET (this_ref, DF_REF_MAY_CLOBBER))
    2531    523167556 :             DF_REF_FLAGS_SET (this_ref, DF_HARD_REG_LIVE);
    2532              :         }
    2533    839471822 :       else if (!(TEST_HARD_REG_BIT (elim_reg_set, regno)
    2534     86977201 :                  && (regno == FRAME_POINTER_REGNUM
    2535     86977201 :                      || regno == ARG_POINTER_REGNUM)))
    2536    752494621 :         DF_REF_FLAGS_SET (this_ref, DF_HARD_REG_LIVE);
    2537              :     }
    2538              : 
    2539   9375845156 :   if (collection_rec)
    2540              :     {
    2541   9375845156 :       if (DF_REF_REG_DEF_P (this_ref))
    2542   7752668522 :         collection_rec->def_vec.safe_push (this_ref);
    2543   1623176634 :       else if (DF_REF_FLAGS (this_ref) & DF_REF_IN_NOTE)
    2544     41262154 :         collection_rec->eq_use_vec.safe_push (this_ref);
    2545              :       else
    2546   1581914480 :         collection_rec->use_vec.safe_push (this_ref);
    2547              :     }
    2548              :   else
    2549            0 :     df_install_ref_incremental (this_ref);
    2550              : 
    2551   9375845156 :   return this_ref;
    2552              : }
    2553              : 
    2554              : 
    2555              : /* Create new references of type DF_REF_TYPE for each part of register REG
    2556              :    at address LOC within INSN of BB.  */
    2557              : 
    2558              : 
    2559              : static void
    2560   9366819215 : df_ref_record (enum df_ref_class cl,
    2561              :                class df_collection_rec *collection_rec,
    2562              :                rtx reg, rtx *loc,
    2563              :                basic_block bb, struct df_insn_info *insn_info,
    2564              :                enum df_ref_type ref_type,
    2565              :                int ref_flags)
    2566              : {
    2567   9366819215 :   unsigned int regno;
    2568              : 
    2569   9366819215 :   gcc_checking_assert (REG_P (reg) || GET_CODE (reg) == SUBREG);
    2570              : 
    2571   9366819215 :   regno = REGNO (GET_CODE (reg) == SUBREG ? SUBREG_REG (reg) : reg);
    2572   9366819215 :   if (regno < FIRST_PSEUDO_REGISTER)
    2573              :     {
    2574   8747018732 :       struct df_mw_hardreg *hardreg = NULL;
    2575   8747018732 :       struct df_scan_problem_data *problem_data
    2576   8747018732 :         = (struct df_scan_problem_data *) df_scan->problem_data;
    2577   8747018732 :       unsigned int i;
    2578   8747018732 :       unsigned int endregno;
    2579   8747018732 :       df_ref ref;
    2580              : 
    2581   8747018732 :       if (GET_CODE (reg) == SUBREG)
    2582              :         {
    2583       350774 :           int off = subreg_regno_offset (regno, GET_MODE (SUBREG_REG (reg)),
    2584       175387 :                                          SUBREG_BYTE (reg), GET_MODE (reg));
    2585       175387 :           unsigned int nregno = regno + off;
    2586       175387 :           endregno = nregno + subreg_nregs (reg);
    2587       175387 :           if (off < 0 && regno < (unsigned) -off)
    2588              :             /* Deal with paradoxical SUBREGs on big endian where
    2589              :                in debug insns the hard reg number might be smaller
    2590              :                than -off, such as (subreg:DI (reg:SI 0 [+4 ]) 0));
    2591              :                RA decisions shouldn't be affected by debug insns
    2592              :                and so RA can decide to put pseudo into a hard reg
    2593              :                with small REGNO, even when it is referenced in
    2594              :                a paradoxical SUBREG in a debug insn.  */
    2595              :             regno = 0;
    2596              :           else
    2597       175387 :             regno = nregno;
    2598              :         }
    2599              :       else
    2600   8746843345 :         endregno = END_REGNO (reg);
    2601              : 
    2602              :       /*  If this is a multiword hardreg, we create some extra
    2603              :           datastructures that will enable us to easily build REG_DEAD
    2604              :           and REG_UNUSED notes.  */
    2605   8747018732 :       if (collection_rec
    2606   8747018732 :           && (endregno != regno + 1) && insn_info)
    2607              :         {
    2608              :           /* Sets to a subreg of a multiword register are partial.
    2609              :              Sets to a non-subreg of a multiword register are not.  */
    2610      9025941 :           if (GET_CODE (reg) == SUBREG)
    2611            0 :             ref_flags |= DF_REF_PARTIAL;
    2612      9025941 :           ref_flags |= DF_REF_MW_HARDREG;
    2613              : 
    2614      9025941 :           gcc_assert (regno < endregno);
    2615              : 
    2616      9025941 :           hardreg = problem_data->mw_reg_pool->allocate ();
    2617      9025941 :           hardreg->type = ref_type;
    2618      9025941 :           hardreg->flags = ref_flags;
    2619      9025941 :           hardreg->mw_reg = reg;
    2620      9025941 :           hardreg->start_regno = regno;
    2621      9025941 :           hardreg->end_regno = endregno - 1;
    2622      9025941 :           hardreg->mw_order = df->ref_order++;
    2623      9025941 :           collection_rec->mw_vec.safe_push (hardreg);
    2624              :         }
    2625              : 
    2626  17503063405 :       for (i = regno; i < endregno; i++)
    2627              :         {
    2628   8756044673 :           ref = df_ref_create_structure (cl, collection_rec, regno_reg_rtx[i], loc,
    2629              :                                          bb, insn_info, ref_type, ref_flags);
    2630              : 
    2631   8756044673 :           gcc_assert (ORIGINAL_REGNO (DF_REF_REG (ref)) == i);
    2632              :         }
    2633              :     }
    2634              :   else
    2635              :     {
    2636    619800483 :       df_ref_create_structure (cl, collection_rec, reg, loc, bb, insn_info,
    2637              :                                ref_type, ref_flags);
    2638              :     }
    2639   9366819215 : }
    2640              : 
    2641              : 
    2642              : /* Process all the registers defined in the rtx pointed by LOC.
    2643              :    Autoincrement/decrement definitions will be picked up by df_uses_record.
    2644              :    Any change here has to be matched in df_find_hard_reg_defs_1.  */
    2645              : 
    2646              : static void
    2647    955616913 : df_def_record_1 (class df_collection_rec *collection_rec,
    2648              :                  rtx *loc, basic_block bb, struct df_insn_info *insn_info,
    2649              :                  int flags)
    2650              : {
    2651    955616913 :   rtx dst = *loc;
    2652              : 
    2653              :   /* It is legal to have a set destination be a parallel. */
    2654    955616913 :   if (GET_CODE (dst) == PARALLEL)
    2655              :     {
    2656       158840 :       int i;
    2657       425713 :       for (i = XVECLEN (dst, 0) - 1; i >= 0; i--)
    2658              :         {
    2659       266873 :           rtx temp = XVECEXP (dst, 0, i);
    2660       266873 :           gcc_assert (GET_CODE (temp) == EXPR_LIST);
    2661       266873 :           df_def_record_1 (collection_rec, &XEXP (temp, 0),
    2662              :                            bb, insn_info, flags);
    2663              :         }
    2664              :       return;
    2665              :     }
    2666              : 
    2667    955458073 :   if (GET_CODE (dst) == STRICT_LOW_PART)
    2668              :     {
    2669       126704 :       flags |= DF_REF_READ_WRITE | DF_REF_PARTIAL | DF_REF_STRICT_LOW_PART;
    2670              : 
    2671       126704 :       loc = &XEXP (dst, 0);
    2672       126704 :       dst = *loc;
    2673              :     }
    2674              : 
    2675    955458073 :   if (GET_CODE (dst) == ZERO_EXTRACT)
    2676              :     {
    2677        70621 :       flags |= DF_REF_READ_WRITE | DF_REF_PARTIAL | DF_REF_ZERO_EXTRACT;
    2678              : 
    2679        70621 :       loc = &XEXP (dst, 0);
    2680        70621 :       dst = *loc;
    2681              :     }
    2682              : 
    2683              :   /* At this point if we do not have a reg or a subreg, just return.  */
    2684    955458073 :   if (REG_P (dst))
    2685              :     {
    2686    707806557 :       df_ref_record (DF_REF_REGULAR, collection_rec,
    2687              :                      dst, loc, bb, insn_info, DF_REF_REG_DEF, flags);
    2688              : 
    2689              :       /* We want to keep sp alive everywhere - by making all
    2690              :          writes to sp also use of sp. */
    2691    707806557 :       if (REGNO (dst) == STACK_POINTER_REGNUM)
    2692     24863158 :         df_ref_record (DF_REF_BASE, collection_rec,
    2693              :                        dst, NULL, bb, insn_info, DF_REF_REG_USE, flags);
    2694              :     }
    2695    247651516 :   else if (GET_CODE (dst) == SUBREG && REG_P (SUBREG_REG (dst)))
    2696              :     {
    2697      3167190 :       if (read_modify_subreg_p (dst))
    2698      1810096 :         flags |= DF_REF_READ_WRITE | DF_REF_PARTIAL;
    2699              : 
    2700      3167190 :       flags |= DF_REF_SUBREG;
    2701              : 
    2702      3167190 :       df_ref_record (DF_REF_REGULAR, collection_rec,
    2703              :                      dst, loc, bb, insn_info, DF_REF_REG_DEF, flags);
    2704              :     }
    2705              : }
    2706              : 
    2707              : 
    2708              : /* Process all the registers defined in the pattern rtx, X.  Any change
    2709              :    here has to be matched in df_find_hard_reg_defs.  */
    2710              : 
    2711              : static void
    2712   1655398783 : df_defs_record (class df_collection_rec *collection_rec,
    2713              :                 rtx x, basic_block bb, struct df_insn_info *insn_info,
    2714              :                 int flags)
    2715              : {
    2716   1655398783 :   RTX_CODE code = GET_CODE (x);
    2717   1655398783 :   int i;
    2718              : 
    2719   1655398783 :   switch (code)
    2720              :     {
    2721    831353710 :     case SET:
    2722    831353710 :       df_def_record_1 (collection_rec, &SET_DEST (x), bb, insn_info, flags);
    2723    831353710 :       break;
    2724              : 
    2725    123996330 :     case CLOBBER:
    2726    123996330 :       flags |= DF_REF_MUST_CLOBBER;
    2727    123996330 :       df_def_record_1 (collection_rec, &XEXP (x, 0), bb, insn_info, flags);
    2728    123996330 :       break;
    2729              : 
    2730            0 :     case COND_EXEC:
    2731            0 :       df_defs_record (collection_rec, COND_EXEC_CODE (x),
    2732              :                       bb, insn_info, DF_REF_CONDITIONAL);
    2733            0 :       break;
    2734              : 
    2735              :     case PARALLEL:
    2736    351717564 :       for (i = 0; i < XVECLEN (x, 0); i++)
    2737    237382894 :         df_defs_record (collection_rec, XVECEXP (x, 0, i),
    2738              :                         bb, insn_info, flags);
    2739              :       break;
    2740              :     default:
    2741              :       /* No DEFs to record in other cases */
    2742              :       break;
    2743              :     }
    2744   1655398783 : }
    2745              : 
    2746              : /* Set bits in *DEFS for hard registers found in the rtx DST, which is the
    2747              :    destination of a set or clobber.  This has to match the logic in
    2748              :    df_defs_record_1.  */
    2749              : 
    2750              : static void
    2751     37116522 : df_find_hard_reg_defs_1 (rtx dst, HARD_REG_SET *defs)
    2752              : {
    2753              :   /* It is legal to have a set destination be a parallel. */
    2754     37116522 :   if (GET_CODE (dst) == PARALLEL)
    2755              :     {
    2756       158840 :       int i;
    2757       425713 :       for (i = XVECLEN (dst, 0) - 1; i >= 0; i--)
    2758              :         {
    2759       266873 :           rtx temp = XVECEXP (dst, 0, i);
    2760       266873 :           gcc_assert (GET_CODE (temp) == EXPR_LIST);
    2761       266873 :           df_find_hard_reg_defs_1 (XEXP (temp, 0), defs);
    2762              :         }
    2763              :       return;
    2764              :     }
    2765              : 
    2766     36957682 :   if (GET_CODE (dst) == STRICT_LOW_PART)
    2767            0 :       dst = XEXP (dst, 0);
    2768              : 
    2769     36957682 :   if (GET_CODE (dst) == ZERO_EXTRACT)
    2770            0 :       dst = XEXP (dst, 0);
    2771              : 
    2772              :   /* At this point if we do not have a reg or a subreg, just return.  */
    2773     36957682 :   if (REG_P (dst) && HARD_REGISTER_P (dst))
    2774     36957682 :     SET_HARD_REG_BIT (*defs, REGNO (dst));
    2775            0 :   else if (GET_CODE (dst) == SUBREG
    2776            0 :            && REG_P (SUBREG_REG (dst)) && HARD_REGISTER_P (dst))
    2777            0 :     SET_HARD_REG_BIT (*defs, REGNO (SUBREG_REG (dst)));
    2778              : }
    2779              : 
    2780              : /* Set bits in *DEFS for hard registers defined in the pattern X.  This
    2781              :    has to match the logic in df_defs_record.  */
    2782              : 
    2783              : static void
    2784     88889069 : df_find_hard_reg_defs (rtx x, HARD_REG_SET *defs)
    2785              : {
    2786     88889069 :   RTX_CODE code = GET_CODE (x);
    2787     88889069 :   int i;
    2788              : 
    2789     88889069 :   switch (code)
    2790              :     {
    2791     36811433 :     case SET:
    2792     36811433 :       df_find_hard_reg_defs_1 (SET_DEST (x), defs);
    2793     36811433 :       break;
    2794              : 
    2795        38216 :     case CLOBBER:
    2796        38216 :       df_find_hard_reg_defs_1 (XEXP (x, 0), defs);
    2797        38216 :       break;
    2798              : 
    2799            0 :     case COND_EXEC:
    2800            0 :       df_find_hard_reg_defs (COND_EXEC_CODE (x), defs);
    2801            0 :       break;
    2802              : 
    2803              :     case PARALLEL:
    2804      7234724 :       for (i = 0; i < XVECLEN (x, 0); i++)
    2805      4835888 :         df_find_hard_reg_defs (XVECEXP (x, 0, i), defs);
    2806              :       break;
    2807              :     default:
    2808              :       /* No DEFs to record in other cases */
    2809              :       break;
    2810              :     }
    2811     88889069 : }
    2812              : 
    2813              : 
    2814              : /* Process all the registers used in the rtx at address LOC.  */
    2815              : 
    2816              : static void
    2817   3623347004 : df_uses_record (class df_collection_rec *collection_rec,
    2818              :                 rtx *loc, enum df_ref_type ref_type,
    2819              :                 basic_block bb, struct df_insn_info *insn_info,
    2820              :                 int flags)
    2821              : {
    2822   5325607076 :   RTX_CODE code;
    2823   5325607076 :   rtx x;
    2824              : 
    2825   5325607076 :  retry:
    2826   5325607076 :   x = *loc;
    2827   5325607076 :   if (!x)
    2828              :     return;
    2829   5325607076 :   code = GET_CODE (x);
    2830   5325607076 :   switch (code)
    2831              :     {
    2832              :     case LABEL_REF:
    2833              :     case SYMBOL_REF:
    2834              :     case CONST:
    2835              :     CASE_CONST_ANY:
    2836              :     case PC:
    2837              :     case ADDR_VEC:
    2838              :     case ADDR_DIFF_VEC:
    2839              :       return;
    2840              : 
    2841    306944425 :     case CLOBBER:
    2842              :       /* If we are clobbering a MEM, mark any registers inside the address
    2843              :          as being used.  */
    2844    306944425 :       if (MEM_P (XEXP (x, 0)))
    2845      3887106 :         df_uses_record (collection_rec,
    2846              :                         &XEXP (XEXP (x, 0), 0),
    2847              :                         DF_REF_REG_MEM_STORE,
    2848              :                         bb, insn_info,
    2849              :                         flags);
    2850              : 
    2851              :       /* If we're clobbering a REG then we have a def so ignore.  */
    2852              :       return;
    2853              : 
    2854    283774838 :     case MEM:
    2855    283774838 :       df_uses_record (collection_rec,
    2856              :                       &XEXP (x, 0), DF_REF_REG_MEM_LOAD,
    2857              :                       bb, insn_info, flags & DF_REF_IN_NOTE);
    2858    283774838 :       return;
    2859              : 
    2860     14598519 :     case SUBREG:
    2861              :       /* While we're here, optimize this case.  */
    2862     14598519 :       flags |= DF_REF_PARTIAL;
    2863              :       /* In case the SUBREG is not of a REG, do not optimize.  */
    2864     14598519 :       if (!REG_P (SUBREG_REG (x)))
    2865              :         {
    2866       836470 :           loc = &SUBREG_REG (x);
    2867       836470 :           df_uses_record (collection_rec, loc, ref_type, bb, insn_info, flags);
    2868       836470 :           return;
    2869              :         }
    2870              :       /* Fall through */
    2871              : 
    2872   1194878979 :     case REG:
    2873   1194878979 :       df_ref_record (DF_REF_REGULAR, collection_rec,
    2874              :                      x, loc, bb, insn_info,
    2875              :                      ref_type, flags);
    2876   1194878979 :       return;
    2877              : 
    2878       406128 :     case SIGN_EXTRACT:
    2879       406128 :     case ZERO_EXTRACT:
    2880       406128 :       {
    2881       406128 :         df_uses_record (collection_rec,
    2882              :                         &XEXP (x, 1), ref_type, bb, insn_info, flags);
    2883       406128 :         df_uses_record (collection_rec,
    2884              :                         &XEXP (x, 2), ref_type, bb, insn_info, flags);
    2885              : 
    2886              :         /* If the parameters to the zero or sign extract are
    2887              :            constants, strip them off and recurse, otherwise there is
    2888              :            no information that we can gain from this operation.  */
    2889       406128 :         if (code == ZERO_EXTRACT)
    2890       371594 :           flags |= DF_REF_ZERO_EXTRACT;
    2891              :         else
    2892        34534 :           flags |= DF_REF_SIGN_EXTRACT;
    2893              : 
    2894       406128 :         df_uses_record (collection_rec,
    2895              :                         &XEXP (x, 0), ref_type, bb, insn_info, flags);
    2896       406128 :         return;
    2897              :       }
    2898    831353710 :       break;
    2899              : 
    2900    831353710 :     case SET:
    2901    831353710 :       {
    2902    831353710 :         rtx dst = SET_DEST (x);
    2903    831353710 :         gcc_assert (!(flags & DF_REF_IN_NOTE));
    2904    831353710 :         df_uses_record (collection_rec,
    2905              :                         &SET_SRC (x), DF_REF_REG_USE, bb, insn_info, flags);
    2906              : 
    2907    831353710 :         switch (GET_CODE (dst))
    2908              :           {
    2909      3123800 :             case SUBREG:
    2910      3123800 :               if (read_modify_subreg_p (dst))
    2911              :                 {
    2912      1798236 :                   df_uses_record (collection_rec, &SUBREG_REG (dst),
    2913              :                                   DF_REF_REG_USE, bb, insn_info,
    2914              :                                   flags | DF_REF_READ_WRITE | DF_REF_SUBREG);
    2915      1798236 :                   break;
    2916              :                 }
    2917              :               /* Fall through.  */
    2918              :             case REG:
    2919              :             case PARALLEL:
    2920              :             case SCRATCH:
    2921              :             case PC:
    2922              :                 break;
    2923    136538845 :             case MEM:
    2924    136538845 :               df_uses_record (collection_rec, &XEXP (dst, 0),
    2925              :                               DF_REF_REG_MEM_STORE, bb, insn_info, flags);
    2926    136538845 :               break;
    2927       126704 :             case STRICT_LOW_PART:
    2928       126704 :               {
    2929       126704 :                 rtx *temp = &XEXP (dst, 0);
    2930              :                 /* A strict_low_part uses the whole REG and not just the
    2931              :                  SUBREG.  */
    2932       126704 :                 dst = XEXP (dst, 0);
    2933        39224 :                 df_uses_record (collection_rec,
    2934       126704 :                                 (GET_CODE (dst) == SUBREG) ? &SUBREG_REG (dst) : temp,
    2935              :                                 DF_REF_REG_USE, bb, insn_info,
    2936              :                                 DF_REF_READ_WRITE | DF_REF_STRICT_LOW_PART);
    2937              :               }
    2938       126704 :               break;
    2939        70621 :             case ZERO_EXTRACT:
    2940        70621 :               {
    2941        70621 :                 df_uses_record (collection_rec, &XEXP (dst, 1),
    2942              :                                 DF_REF_REG_USE, bb, insn_info, flags);
    2943        70621 :                 df_uses_record (collection_rec, &XEXP (dst, 2),
    2944              :                                 DF_REF_REG_USE, bb, insn_info, flags);
    2945        70621 :                 if (GET_CODE (XEXP (dst,0)) == MEM)
    2946         6414 :                   df_uses_record (collection_rec, &XEXP (dst, 0),
    2947              :                                   DF_REF_REG_USE, bb, insn_info,
    2948              :                                   flags);
    2949              :                 else
    2950        64207 :                   df_uses_record (collection_rec, &XEXP (dst, 0),
    2951              :                                   DF_REF_REG_USE, bb, insn_info,
    2952              :                                   DF_REF_READ_WRITE | DF_REF_ZERO_EXTRACT);
    2953              :               }
    2954              :               break;
    2955              : 
    2956            0 :             default:
    2957            0 :               gcc_unreachable ();
    2958              :           }
    2959              :         return;
    2960              :       }
    2961              : 
    2962              :     case RETURN:
    2963              :     case SIMPLE_RETURN:
    2964              :       break;
    2965              : 
    2966      6613862 :     case ASM_OPERANDS:
    2967      6613862 :     case UNSPEC_VOLATILE:
    2968      6613862 :     case TRAP_IF:
    2969      6613862 :     case ASM_INPUT:
    2970      6613862 :       {
    2971              :         /* Traditional and volatile asm instructions must be
    2972              :            considered to use and clobber all hard registers, all
    2973              :            pseudo-registers and all of memory.  So must TRAP_IF and
    2974              :            UNSPEC_VOLATILE operations.
    2975              : 
    2976              :            Consider for instance a volatile asm that changes the fpu
    2977              :            rounding mode.  An insn should not be moved across this
    2978              :            even if it only uses pseudo-regs because it might give an
    2979              :            incorrectly rounded result.
    2980              : 
    2981              :            However, flow.c's liveness computation did *not* do this,
    2982              :            giving the reasoning as " ?!? Unfortunately, marking all
    2983              :            hard registers as live causes massive problems for the
    2984              :            register allocator and marking all pseudos as live creates
    2985              :            mountains of uninitialized variable warnings."
    2986              : 
    2987              :            In order to maintain the status quo with regard to liveness
    2988              :            and uses, we do what flow.c did and just mark any regs we
    2989              :            can find in ASM_OPERANDS as used.  In global asm insns are
    2990              :            scanned and regs_asm_clobbered is filled out.
    2991              : 
    2992              :            For all ASM_OPERANDS, we must traverse the vector of input
    2993              :            operands.  We cannot just fall through here since then we
    2994              :            would be confused by the ASM_INPUT rtx inside ASM_OPERANDS,
    2995              :            which do not indicate traditional asms unlike their normal
    2996              :            usage.  */
    2997      6613862 :         if (code == ASM_OPERANDS)
    2998              :           {
    2999              :             int j;
    3000              : 
    3001      2568177 :             for (j = 0; j < ASM_OPERANDS_INPUT_LENGTH (x); j++)
    3002      1252167 :               df_uses_record (collection_rec, &ASM_OPERANDS_INPUT (x, j),
    3003              :                               DF_REF_REG_USE, bb, insn_info, flags);
    3004              :             return;
    3005              :           }
    3006              :         break;
    3007              :       }
    3008              : 
    3009    428501178 :     case VAR_LOCATION:
    3010    428501178 :       df_uses_record (collection_rec,
    3011              :                       &PAT_VAR_LOCATION_LOC (x),
    3012              :                       DF_REF_REG_USE, bb, insn_info, flags);
    3013    428501178 :       return;
    3014              : 
    3015     24968764 :     case PRE_DEC:
    3016     24968764 :     case POST_DEC:
    3017     24968764 :     case PRE_INC:
    3018     24968764 :     case POST_INC:
    3019     24968764 :     case PRE_MODIFY:
    3020     24968764 :     case POST_MODIFY:
    3021     24968764 :       gcc_assert (!DEBUG_INSN_P (insn_info->insn));
    3022              :       /* Catch the def of the register being modified.  */
    3023     24968764 :       df_ref_record (DF_REF_REGULAR, collection_rec, XEXP (x, 0), &XEXP (x, 0),
    3024              :                      bb, insn_info,
    3025              :                      DF_REF_REG_DEF,
    3026              :                      flags | DF_REF_READ_WRITE | DF_REF_PRE_POST_MODIFY);
    3027              : 
    3028              :       /* ... Fall through to handle uses ...  */
    3029              : 
    3030              :     default:
    3031              :       break;
    3032              :     }
    3033              : 
    3034              :   /* Recursively scan the operands of this expression.  */
    3035   1170950434 :   {
    3036   1170950434 :     const char *fmt = GET_RTX_FORMAT (code);
    3037   1170950434 :     int i;
    3038              : 
    3039   2288385224 :     for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
    3040              :       {
    3041   1963754736 :         if (fmt[i] == 'e')
    3042              :           {
    3043              :             /* Tail recursive case: save a function call level.  */
    3044   1729214922 :             if (i == 0)
    3045              :               {
    3046    846319946 :                 loc = &XEXP (x, 0);
    3047    846319946 :                 goto retry;
    3048              :               }
    3049    882894976 :             df_uses_record (collection_rec, &XEXP (x, i), ref_type,
    3050              :                             bb, insn_info, flags);
    3051              :           }
    3052    234539814 :         else if (fmt[i] == 'E')
    3053              :           {
    3054              :             int j;
    3055    401744596 :             for (j = 0; j < XVECLEN (x, i); j++)
    3056    270072969 :               df_uses_record (collection_rec,
    3057              :                               &XVECEXP (x, i, j), ref_type,
    3058              :                               bb, insn_info, flags);
    3059              :           }
    3060              :       }
    3061              :   }
    3062              : 
    3063              :   return;
    3064              : }
    3065              : 
    3066              : 
    3067              : /* For all DF_REF_CONDITIONAL defs, add a corresponding uses.  */
    3068              : 
    3069              : static void
    3070            0 : df_get_conditional_uses (class df_collection_rec *collection_rec)
    3071              : {
    3072            0 :   unsigned int ix;
    3073            0 :   df_ref ref;
    3074              : 
    3075            0 :   FOR_EACH_VEC_ELT (collection_rec->def_vec, ix, ref)
    3076              :     {
    3077            0 :       if (DF_REF_FLAGS_IS_SET (ref, DF_REF_CONDITIONAL))
    3078              :         {
    3079            0 :           df_ref use;
    3080              : 
    3081            0 :           use = df_ref_create_structure (DF_REF_CLASS (ref), collection_rec, DF_REF_REG (ref),
    3082            0 :                                          DF_REF_LOC (ref), DF_REF_BB (ref),
    3083              :                                          DF_REF_INSN_INFO (ref), DF_REF_REG_USE,
    3084              :                                          DF_REF_FLAGS (ref) & ~DF_REF_CONDITIONAL);
    3085            0 :           DF_REF_REGNO (use) = DF_REF_REGNO (ref);
    3086              :         }
    3087              :     }
    3088            0 : }
    3089              : 
    3090              : 
    3091              : /* Get call's extra defs and uses (track caller-saved registers). */
    3092              : 
    3093              : static void
    3094     84053181 : df_get_call_refs (class df_collection_rec *collection_rec,
    3095              :                   basic_block bb,
    3096              :                   struct df_insn_info *insn_info,
    3097              :                   int flags)
    3098              : {
    3099     84053181 :   rtx note;
    3100     84053181 :   bool is_sibling_call;
    3101     84053181 :   unsigned int i;
    3102     84053181 :   HARD_REG_SET defs_generated;
    3103              : 
    3104     84053181 :   CLEAR_HARD_REG_SET (defs_generated);
    3105     84053181 :   df_find_hard_reg_defs (PATTERN (insn_info->insn), &defs_generated);
    3106     84053181 :   is_sibling_call = SIBLING_CALL_P (insn_info->insn);
    3107     84053181 :   function_abi callee_abi = insn_callee_abi (insn_info->insn);
    3108              : 
    3109   7816945833 :   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
    3110              :     {
    3111   7732892652 :       if (i == STACK_POINTER_REGNUM
    3112   7732892652 :           && !FAKE_CALL_P (insn_info->insn))
    3113              :         /* The stack ptr is used (honorarily) by a CALL insn.  */
    3114     83888031 :         df_ref_record (DF_REF_BASE, collection_rec, regno_reg_rtx[i],
    3115              :                        NULL, bb, insn_info, DF_REF_REG_USE,
    3116              :                        DF_REF_CALL_STACK_USAGE | flags);
    3117   7649004621 :       else if (global_regs[i])
    3118              :         {
    3119              :           /* Calls to const functions cannot access any global registers and
    3120              :              calls to pure functions cannot set them.  All other calls may
    3121              :              reference any of the global registers, so they are recorded as
    3122              :              used. */
    3123         1296 :           if (!RTL_CONST_CALL_P (insn_info->insn))
    3124              :             {
    3125         1296 :               df_ref_record (DF_REF_BASE, collection_rec, regno_reg_rtx[i],
    3126              :                              NULL, bb, insn_info, DF_REF_REG_USE, flags);
    3127         1296 :               if (!RTL_PURE_CALL_P (insn_info->insn))
    3128         1161 :                 df_ref_record (DF_REF_BASE, collection_rec, regno_reg_rtx[i],
    3129              :                                NULL, bb, insn_info, DF_REF_REG_DEF, flags);
    3130              :             }
    3131              :         }
    3132   7649003325 :       else if (callee_abi.clobbers_full_reg_p (i)
    3133              :                /* no clobbers for regs that are the result of the call */
    3134   6849429097 :                && !TEST_HARD_REG_BIT (defs_generated, i)
    3135  14463669105 :                && (!is_sibling_call
    3136    148973490 :                    || !bitmap_bit_p (df->exit_block_uses, i)
    3137        11551 :                    || refers_to_regno_p (i, crtl->return_rtx)))
    3138   6814665780 :           df_ref_record (DF_REF_BASE, collection_rec, regno_reg_rtx[i],
    3139              :                          NULL, bb, insn_info, DF_REF_REG_DEF,
    3140              :                          DF_REF_MAY_CLOBBER | flags);
    3141              :     }
    3142              : 
    3143              :   /* Record the registers used to pass arguments, and explicitly
    3144              :      noted as clobbered.  */
    3145    262736564 :   for (note = CALL_INSN_FUNCTION_USAGE (insn_info->insn); note;
    3146    178683383 :        note = XEXP (note, 1))
    3147              :     {
    3148    178683383 :       if (GET_CODE (XEXP (note, 0)) == USE)
    3149    167891988 :         df_uses_record (collection_rec, &XEXP (XEXP (note, 0), 0),
    3150              :                         DF_REF_REG_USE, bb, insn_info, flags);
    3151     10791395 :       else if (GET_CODE (XEXP (note, 0)) == CLOBBER)
    3152              :         {
    3153      9029068 :           if (REG_P (XEXP (XEXP (note, 0), 0)))
    3154              :             {
    3155      9029068 :               unsigned int regno = REGNO (XEXP (XEXP (note, 0), 0));
    3156      9029068 :               if (!TEST_HARD_REG_BIT (defs_generated, regno))
    3157      9028201 :                 df_defs_record (collection_rec, XEXP (note, 0), bb,
    3158              :                                 insn_info, flags);
    3159              :             }
    3160              :           else
    3161            0 :             df_uses_record (collection_rec, &XEXP (note, 0),
    3162              :                             DF_REF_REG_USE, bb, insn_info, flags);
    3163              :         }
    3164              :     }
    3165              : 
    3166     84053181 :   return;
    3167              : }
    3168              : 
    3169              : /* Collect all refs in the INSN. This function is free of any
    3170              :    side-effect - it will create and return a lists of df_ref's in the
    3171              :    COLLECTION_REC without putting those refs into existing ref chains
    3172              :    and reg chains. */
    3173              : 
    3174              : static void
    3175   1408987688 : df_insn_refs_collect (class df_collection_rec *collection_rec,
    3176              :                       basic_block bb, struct df_insn_info *insn_info)
    3177              : {
    3178   1408987688 :   rtx note;
    3179   1408987688 :   bool is_cond_exec = (GET_CODE (PATTERN (insn_info->insn)) == COND_EXEC);
    3180              : 
    3181              :   /* Clear out the collection record.  */
    3182   1408987688 :   collection_rec->def_vec.truncate (0);
    3183   1408987688 :   collection_rec->use_vec.truncate (0);
    3184   1408987688 :   collection_rec->eq_use_vec.truncate (0);
    3185   1408987688 :   collection_rec->mw_vec.truncate (0);
    3186              : 
    3187              :   /* Process REG_EQUIV/REG_EQUAL notes.  */
    3188   2042848806 :   for (note = REG_NOTES (insn_info->insn); note;
    3189    633861118 :        note = XEXP (note, 1))
    3190              :     {
    3191    633861118 :       switch (REG_NOTE_KIND (note))
    3192              :         {
    3193     47811883 :         case REG_EQUIV:
    3194     47811883 :         case REG_EQUAL:
    3195     47811883 :           df_uses_record (collection_rec,
    3196              :                           &XEXP (note, 0), DF_REF_REG_USE,
    3197              :                           bb, insn_info, DF_REF_IN_NOTE);
    3198     47811883 :           break;
    3199         7073 :         case REG_NON_LOCAL_GOTO:
    3200              :           /* The frame ptr is used by a non-local goto.  */
    3201         7073 :           df_ref_record (DF_REF_BASE, collection_rec,
    3202         7073 :                          regno_reg_rtx[FRAME_POINTER_REGNUM],
    3203              :                          NULL, bb, insn_info,
    3204              :                          DF_REF_REG_USE, 0);
    3205         7073 :           if (!HARD_FRAME_POINTER_IS_FRAME_POINTER)
    3206         7073 :             df_ref_record (DF_REF_BASE, collection_rec,
    3207         7073 :                            regno_reg_rtx[HARD_FRAME_POINTER_REGNUM],
    3208              :                            NULL, bb, insn_info,
    3209              :                            DF_REF_REG_USE, 0);
    3210         7073 :           break;
    3211              :         default:
    3212              :           break;
    3213              :         }
    3214              :     }
    3215              : 
    3216   1408987688 :   int flags = (is_cond_exec) ? DF_REF_CONDITIONAL : 0;
    3217              :   /* For CALL_INSNs, first record DF_REF_BASE register defs, as well as
    3218              :      uses from CALL_INSN_FUNCTION_USAGE. */
    3219   1408987688 :   if (CALL_P (insn_info->insn))
    3220     84053181 :     df_get_call_refs (collection_rec, bb, insn_info, flags);
    3221              : 
    3222              :   /* Record other defs.  These should be mostly for DF_REF_REGULAR, so
    3223              :      that a qsort on the defs is unnecessary in most cases.  */
    3224   1408987688 :   df_defs_record (collection_rec,
    3225   1408987688 :                   PATTERN (insn_info->insn), bb, insn_info, 0);
    3226              : 
    3227              :   /* Record the register uses.  */
    3228   1408987688 :   df_uses_record (collection_rec,
    3229   1408987688 :                   &PATTERN (insn_info->insn), DF_REF_REG_USE, bb, insn_info, 0);
    3230              : 
    3231              :   /* DF_REF_CONDITIONAL needs corresponding USES. */
    3232   1408987688 :   if (is_cond_exec)
    3233            0 :     df_get_conditional_uses (collection_rec);
    3234              : 
    3235   1408987688 :   df_canonize_collection_rec (collection_rec);
    3236   1408987688 : }
    3237              : 
    3238              : /* Recompute the luids for the insns in BB.  */
    3239              : 
    3240              : void
    3241     23031423 : df_recompute_luids (basic_block bb)
    3242              : {
    3243     23031423 :   rtx_insn *insn;
    3244     23031423 :   int luid = 0;
    3245              : 
    3246     23031423 :   df_grow_insn_info ();
    3247              : 
    3248              :   /* Scan the block an insn at a time from beginning to end.  */
    3249    282314626 :   FOR_BB_INSNS (bb, insn)
    3250              :     {
    3251    259283203 :       struct df_insn_info *insn_info = DF_INSN_INFO_GET (insn);
    3252              :       /* Inserting labels does not always trigger the incremental
    3253              :          rescanning.  */
    3254    259283203 :       if (!insn_info)
    3255              :         {
    3256      2181710 :           gcc_assert (!INSN_P (insn));
    3257      2181710 :           insn_info = df_insn_create_insn_record (insn);
    3258              :         }
    3259              : 
    3260    259283203 :       DF_INSN_INFO_LUID (insn_info) = luid;
    3261    259283203 :       if (INSN_P (insn))
    3262    214381094 :         luid++;
    3263              :     }
    3264     23031423 : }
    3265              : 
    3266              : 
    3267              : /* Collect all artificial refs at the block level for BB and add them
    3268              :    to COLLECTION_REC.  */
    3269              : 
    3270              : static void
    3271    120804787 : df_bb_refs_collect (class df_collection_rec *collection_rec, basic_block bb)
    3272              : {
    3273    120804787 :   collection_rec->def_vec.truncate (0);
    3274    120804787 :   collection_rec->use_vec.truncate (0);
    3275    120804787 :   collection_rec->eq_use_vec.truncate (0);
    3276    120804787 :   collection_rec->mw_vec.truncate (0);
    3277              : 
    3278    120804787 :   if (bb->index == ENTRY_BLOCK)
    3279              :     {
    3280      6386643 :       df_entry_block_defs_collect (collection_rec, df->entry_block_defs);
    3281      6386643 :       return;
    3282              :     }
    3283    114418144 :   else if (bb->index == EXIT_BLOCK)
    3284              :     {
    3285      6386643 :       df_exit_block_uses_collect (collection_rec, df->exit_block_uses);
    3286      6386643 :       return;
    3287              :     }
    3288              : 
    3289    108031501 :   if (bb_has_eh_pred (bb))
    3290              :     {
    3291              :       unsigned int i;
    3292              :       /* Mark the registers that will contain data for the handler.  */
    3293      3259068 :       for (i = 0; ; ++i)
    3294              :         {
    3295      4888602 :           unsigned regno = EH_RETURN_DATA_REGNO (i);
    3296      3259068 :           if (regno == INVALID_REGNUM)
    3297              :             break;
    3298      3259068 :           df_ref_record (DF_REF_ARTIFICIAL, collection_rec, regno_reg_rtx[regno], NULL,
    3299              :                          bb, NULL, DF_REF_REG_DEF, DF_REF_AT_TOP);
    3300      3259068 :         }
    3301              :     }
    3302              : 
    3303              :   /* Add the hard_frame_pointer if this block is the target of a
    3304              :      non-local goto.  */
    3305    108031501 :   if (bb->flags & BB_NON_LOCAL_GOTO_TARGET)
    3306         8799 :     df_ref_record (DF_REF_ARTIFICIAL, collection_rec, hard_frame_pointer_rtx, NULL,
    3307              :                    bb, NULL, DF_REF_REG_DEF, DF_REF_AT_TOP);
    3308              : 
    3309              :   /* Add the artificial uses.  */
    3310    108031501 :   if (bb->index >= NUM_FIXED_BLOCKS)
    3311              :     {
    3312    108031501 :       bitmap_iterator bi;
    3313    108031501 :       unsigned int regno;
    3314    108031501 :       bitmap au = bb_has_eh_pred (bb)
    3315    108031501 :         ? &df->eh_block_artificial_uses
    3316    108031501 :         : &df->regular_block_artificial_uses;
    3317              : 
    3318    392043662 :       EXECUTE_IF_SET_IN_BITMAP (au, 0, regno, bi)
    3319              :         {
    3320    284012161 :           df_ref_record (DF_REF_ARTIFICIAL, collection_rec, regno_reg_rtx[regno], NULL,
    3321              :                          bb, NULL, DF_REF_REG_USE, 0);
    3322              :         }
    3323              :     }
    3324              : 
    3325    108031501 :   df_canonize_collection_rec (collection_rec);
    3326              : }
    3327              : 
    3328              : 
    3329              : /* Record all the refs within the basic block BB_INDEX and scan the instructions if SCAN_INSNS.  */
    3330              : 
    3331              : void
    3332     43704084 : df_bb_refs_record (int bb_index, bool scan_insns)
    3333              : {
    3334     43704084 :   basic_block bb = BASIC_BLOCK_FOR_FN (cfun, bb_index);
    3335     43704084 :   rtx_insn *insn;
    3336     43704084 :   int luid = 0;
    3337              : 
    3338     43704084 :   if (!df)
    3339      6471887 :     return;
    3340              : 
    3341     37232197 :   df_collection_rec collection_rec;
    3342     37232197 :   df_grow_bb_info (df_scan);
    3343     37232197 :   if (scan_insns)
    3344              :     /* Scan the block an insn at a time from beginning to end.  */
    3345    377424311 :     FOR_BB_INSNS (bb, insn)
    3346              :       {
    3347    346776939 :         struct df_insn_info *insn_info = DF_INSN_INFO_GET (insn);
    3348    346776939 :         gcc_assert (!insn_info);
    3349              : 
    3350    346776939 :         insn_info = df_insn_create_insn_record (insn);
    3351    346776939 :         if (INSN_P (insn))
    3352              :           {
    3353              :             /* Record refs within INSN.  */
    3354    292029035 :             DF_INSN_INFO_LUID (insn_info) = luid++;
    3355    292029035 :             df_insn_refs_collect (&collection_rec, bb, DF_INSN_INFO_GET (insn));
    3356    292029035 :             df_refs_add_to_chains (&collection_rec, bb, insn, copy_all);
    3357              :           }
    3358    346776939 :         DF_INSN_INFO_LUID (insn_info) = luid;
    3359              :       }
    3360              : 
    3361              :   /* Other block level artificial refs */
    3362     37232197 :   df_bb_refs_collect (&collection_rec, bb);
    3363     37232197 :   df_refs_add_to_chains (&collection_rec, bb, NULL, copy_all);
    3364              : 
    3365              :   /* Now that the block has been processed, set the block as dirty so
    3366              :      LR and LIVE will get it processed.  */
    3367     37232197 :   df_set_bb_dirty (bb);
    3368     37232197 : }
    3369              : 
    3370              : 
    3371              : /* Get the artificial use set for a regular (i.e. non-exit/non-entry)
    3372              :    block. */
    3373              : 
    3374              : static void
    3375      9446913 : df_get_regular_block_artificial_uses (bitmap regular_block_artificial_uses)
    3376              : {
    3377              : #ifdef EH_USES
    3378              :   unsigned int i;
    3379              : #endif
    3380              : 
    3381      9446913 :   bitmap_clear (regular_block_artificial_uses);
    3382              : 
    3383      9446913 :   if (reload_completed)
    3384              :     {
    3385      5134870 :       if (frame_pointer_needed)
    3386      1181904 :         bitmap_set_bit (regular_block_artificial_uses, HARD_FRAME_POINTER_REGNUM);
    3387              :     }
    3388              :   else
    3389              :     /* Before reload, there are a few registers that must be forced
    3390              :        live everywhere -- which might not already be the case for
    3391              :        blocks within infinite loops.  */
    3392              :     {
    3393      4312043 :       unsigned int picreg = PIC_OFFSET_TABLE_REGNUM;
    3394              : 
    3395              :       /* Any reference to any pseudo before reload is a potential
    3396              :          reference of the frame pointer.  */
    3397      4312043 :       bitmap_set_bit (regular_block_artificial_uses, FRAME_POINTER_REGNUM);
    3398              : 
    3399      4312043 :       if (!HARD_FRAME_POINTER_IS_FRAME_POINTER)
    3400      4312043 :         bitmap_set_bit (regular_block_artificial_uses,
    3401              :                         HARD_FRAME_POINTER_REGNUM);
    3402              : 
    3403              :       /* Pseudos with argument area equivalences may require
    3404              :          reloading via the argument pointer.  */
    3405      4312043 :       if (FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
    3406      4312043 :           && fixed_regs[ARG_POINTER_REGNUM])
    3407      4312043 :         bitmap_set_bit (regular_block_artificial_uses, ARG_POINTER_REGNUM);
    3408              : 
    3409              :       /* Any constant, or pseudo with constant equivalences, may
    3410              :          require reloading from memory using the pic register.  */
    3411      4312043 :       if (picreg != INVALID_REGNUM
    3412            0 :           && fixed_regs[picreg])
    3413            0 :         bitmap_set_bit (regular_block_artificial_uses, picreg);
    3414              :     }
    3415              :   /* The all-important stack pointer must always be live.  */
    3416      9446913 :   bitmap_set_bit (regular_block_artificial_uses, STACK_POINTER_REGNUM);
    3417              : 
    3418              : #ifdef EH_USES
    3419              :   /* EH_USES registers are used:
    3420              :      1) at all insns that might throw (calls or with -fnon-call-exceptions
    3421              :         trapping insns)
    3422              :      2) in all EH edges
    3423              :      3) to support backtraces and/or debugging, anywhere between their
    3424              :         initialization and where they the saved registers are restored
    3425              :         from them, including the cases where we don't reach the epilogue
    3426              :         (noreturn call or infinite loop).  */
    3427              :   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
    3428              :     if (EH_USES (i))
    3429              :       bitmap_set_bit (regular_block_artificial_uses, i);
    3430              : #endif
    3431      9446913 : }
    3432              : 
    3433              : 
    3434              : /* Get the artificial use set for an eh block. */
    3435              : 
    3436              : static void
    3437      9446913 : df_get_eh_block_artificial_uses (bitmap eh_block_artificial_uses)
    3438              : {
    3439      9446913 :   bitmap_clear (eh_block_artificial_uses);
    3440              : 
    3441              :   /* The following code (down through the arg_pointer setting APPEARS
    3442              :      to be necessary because there is nothing that actually
    3443              :      describes what the exception handling code may actually need
    3444              :      to keep alive.  */
    3445      9446913 :   if (reload_completed)
    3446              :     {
    3447      5134870 :       if (frame_pointer_needed)
    3448              :         {
    3449      1181904 :           bitmap_set_bit (eh_block_artificial_uses, FRAME_POINTER_REGNUM);
    3450      1181904 :           if (!HARD_FRAME_POINTER_IS_FRAME_POINTER)
    3451      1181904 :             bitmap_set_bit (eh_block_artificial_uses,
    3452              :                             HARD_FRAME_POINTER_REGNUM);
    3453              :         }
    3454      5134870 :       if (FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
    3455      5134870 :           && fixed_regs[ARG_POINTER_REGNUM])
    3456      5134870 :         bitmap_set_bit (eh_block_artificial_uses, ARG_POINTER_REGNUM);
    3457              :     }
    3458      9446913 : }
    3459              : 
    3460              : 
    3461              : 
    3462              : /*----------------------------------------------------------------------------
    3463              :    Specialized hard register scanning functions.
    3464              : ----------------------------------------------------------------------------*/
    3465              : 
    3466              : 
    3467              : /* Mark a register in SET.  Hard registers in large modes get all
    3468              :    of their component registers set as well.  */
    3469              : 
    3470              : static void
    3471      9731311 : df_mark_reg (rtx reg, void *vset)
    3472              : {
    3473      9730956 :   bitmap_set_range ((bitmap) vset, REGNO (reg), REG_NREGS (reg));
    3474          355 : }
    3475              : 
    3476              : 
    3477              : /* Set the bit for regs that are considered being defined at the entry. */
    3478              : 
    3479              : static void
    3480     16570090 : df_get_entry_block_def_set (bitmap entry_block_defs)
    3481              : {
    3482     16570090 :   rtx r;
    3483     16570090 :   int i;
    3484              : 
    3485     16570090 :   bitmap_clear (entry_block_defs);
    3486              : 
    3487              :   /* For separate shrink-wrapping we use LIVE to analyze which basic blocks
    3488              :      need a prologue for some component to be executed before that block,
    3489              :      and we do not care about any other registers.  Hence, we do not want
    3490              :      any register for any component defined in the entry block, and we can
    3491              :      just leave all registers undefined.  */
    3492     16570090 :   if (df_scan->local_flags & DF_SCAN_EMPTY_ENTRY_EXIT)
    3493              :     return;
    3494              : 
    3495   1472914284 :   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
    3496              :     {
    3497   1457076496 :       if (global_regs[i])
    3498         1742 :         bitmap_set_bit (entry_block_defs, i);
    3499   1457076496 :       if (FUNCTION_ARG_REGNO_P (i))
    3500    225780797 :         bitmap_set_bit (entry_block_defs, INCOMING_REGNO (i));
    3501              :     }
    3502              : 
    3503              :   /* The always important stack pointer.  */
    3504     15837788 :   bitmap_set_bit (entry_block_defs, STACK_POINTER_REGNUM);
    3505              : 
    3506              :   /* Once the prologue has been generated, all of these registers
    3507              :      should just show up in the first regular block.  */
    3508     15837788 :   if (targetm.have_prologue () && epilogue_completed)
    3509              :     {
    3510              :       /* Defs for the callee saved registers are inserted so that the
    3511              :          pushes have some defining location.  */
    3512    265683981 :       for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
    3513    262827164 :         if (!crtl->abi->clobbers_full_reg_p (i)
    3514     26056768 :             && !fixed_regs[i]
    3515    280292655 :             && df_regs_ever_live_p (i))
    3516      3807306 :           bitmap_set_bit (entry_block_defs, i);
    3517              :     }
    3518              : 
    3519     15837788 :   r = targetm.calls.struct_value_rtx (current_function_decl, true);
    3520     15837788 :   if (r && REG_P (r))
    3521            0 :     bitmap_set_bit (entry_block_defs, REGNO (r));
    3522              : 
    3523              :   /* If the function has an incoming STATIC_CHAIN, it has to show up
    3524              :      in the entry def set.  */
    3525     15837788 :   r = rtx_for_static_chain (current_function_decl, true);
    3526     15837788 :   if (r && REG_P (r))
    3527       212270 :     bitmap_set_bit (entry_block_defs, REGNO (r));
    3528              : 
    3529     15837788 :   if ((!reload_completed) || frame_pointer_needed)
    3530              :     {
    3531              :       /* Any reference to any pseudo before reload is a potential
    3532              :          reference of the frame pointer.  */
    3533      9286321 :       bitmap_set_bit (entry_block_defs, FRAME_POINTER_REGNUM);
    3534              : 
    3535              :       /* If they are different, also mark the hard frame pointer as live.  */
    3536      9286321 :       if (!HARD_FRAME_POINTER_IS_FRAME_POINTER
    3537              :           && !LOCAL_REGNO (HARD_FRAME_POINTER_REGNUM))
    3538      9286321 :         bitmap_set_bit (entry_block_defs, HARD_FRAME_POINTER_REGNUM);
    3539              :     }
    3540              : 
    3541              :   /* These registers are live everywhere.  */
    3542     15837788 :   if (!reload_completed)
    3543              :     {
    3544              :       /* Pseudos with argument area equivalences may require
    3545              :          reloading via the argument pointer.  */
    3546      7228045 :       if (FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
    3547      7228045 :           && fixed_regs[ARG_POINTER_REGNUM])
    3548      7228045 :         bitmap_set_bit (entry_block_defs, ARG_POINTER_REGNUM);
    3549              : 
    3550              :       /* Any constant, or pseudo with constant equivalences, may
    3551              :          require reloading from memory using the pic register.  */
    3552      7228045 :       unsigned int picreg = PIC_OFFSET_TABLE_REGNUM;
    3553            0 :       if (picreg != INVALID_REGNUM
    3554            0 :           && fixed_regs[picreg])
    3555            0 :         bitmap_set_bit (entry_block_defs, picreg);
    3556              :     }
    3557              : 
    3558              : #ifdef INCOMING_RETURN_ADDR_RTX
    3559     17279593 :   if (REG_P (INCOMING_RETURN_ADDR_RTX))
    3560            0 :     bitmap_set_bit (entry_block_defs, REGNO (INCOMING_RETURN_ADDR_RTX));
    3561              : #endif
    3562              : 
    3563     15837788 :   targetm.extra_live_on_entry (entry_block_defs);
    3564              : }
    3565              : 
    3566              : 
    3567              : /* Return the (conservative) set of hard registers that are defined on
    3568              :    entry to the function.
    3569              :    It uses df->entry_block_defs to determine which register
    3570              :    reference to include.  */
    3571              : 
    3572              : static void
    3573     12207904 : df_entry_block_defs_collect (class df_collection_rec *collection_rec,
    3574              :                              bitmap entry_block_defs)
    3575              : {
    3576     12207904 :   unsigned int i;
    3577     12207904 :   bitmap_iterator bi;
    3578              : 
    3579    206020833 :   EXECUTE_IF_SET_IN_BITMAP (entry_block_defs, 0, i, bi)
    3580              :     {
    3581    193812929 :       df_ref_record (DF_REF_ARTIFICIAL, collection_rec, regno_reg_rtx[i], NULL,
    3582    193812929 :                      ENTRY_BLOCK_PTR_FOR_FN (cfun), NULL, DF_REF_REG_DEF, 0);
    3583              :     }
    3584              : 
    3585     12207904 :   df_canonize_collection_rec (collection_rec);
    3586     12207904 : }
    3587              : 
    3588              : 
    3589              : /* Record the (conservative) set of hard registers that are defined on
    3590              :    entry to the function.  */
    3591              : 
    3592              : static void
    3593      5821261 : df_record_entry_block_defs (bitmap entry_block_defs)
    3594              : {
    3595      5821261 :   class df_collection_rec collection_rec;
    3596      5821261 :   df_entry_block_defs_collect (&collection_rec, entry_block_defs);
    3597              : 
    3598              :   /* Process bb_refs chain */
    3599      5821261 :   df_refs_add_to_chains (&collection_rec,
    3600      5821261 :                          BASIC_BLOCK_FOR_FN (cfun, ENTRY_BLOCK),
    3601              :                          NULL,
    3602              :                          copy_defs);
    3603      5821261 : }
    3604              : 
    3605              : 
    3606              : /* Update the defs in the entry block.  */
    3607              : 
    3608              : void
    3609      7123177 : df_update_entry_block_defs (void)
    3610              : {
    3611      7123177 :   bool changed = false;
    3612              : 
    3613      7123177 :   auto_bitmap refs (&df_bitmap_obstack);
    3614      7123177 :   df_get_entry_block_def_set (refs);
    3615      7123177 :   gcc_assert (df->entry_block_defs);
    3616      7123177 :   if (!bitmap_equal_p (df->entry_block_defs, refs))
    3617              :     {
    3618      2760991 :       struct df_scan_bb_info *bb_info = df_scan_get_bb_info (ENTRY_BLOCK);
    3619      2760991 :       df_ref_chain_delete_du_chain (bb_info->artificial_defs);
    3620      2760991 :       df_ref_chain_delete (bb_info->artificial_defs);
    3621      2760991 :       bb_info->artificial_defs = NULL;
    3622      2760991 :       changed = true;
    3623              :     }
    3624              : 
    3625      2760991 :   if (changed)
    3626              :     {
    3627      2760991 :       df_record_entry_block_defs (refs);
    3628      2760991 :       bitmap_copy (df->entry_block_defs, refs);
    3629      2760991 :       df_set_bb_dirty (BASIC_BLOCK_FOR_FN (cfun, ENTRY_BLOCK));
    3630              :     }
    3631      7123177 : }
    3632              : 
    3633              : 
    3634              : /* Return true if REGNO is used by the epilogue.  */
    3635              : bool
    3636   1662389498 : df_epilogue_uses_p (unsigned int regno)
    3637              : {
    3638   1662389498 :   return (EPILOGUE_USES (regno)
    3639   1662389498 :           || TEST_HARD_REG_BIT (crtl->must_be_zero_on_return, regno));
    3640              : }
    3641              : 
    3642              : /* Set the bit for regs that are considered being used at the exit. */
    3643              : 
    3644              : void
    3645     18801775 : df_get_exit_block_use_set (bitmap exit_block_uses)
    3646              : {
    3647     18801775 :   unsigned int i;
    3648     18801775 :   unsigned int picreg = PIC_OFFSET_TABLE_REGNUM;
    3649              : 
    3650     18801775 :   bitmap_clear (exit_block_uses);
    3651              : 
    3652              :   /* For separate shrink-wrapping we use LIVE to analyze which basic blocks
    3653              :      need an epilogue for some component to be executed after that block,
    3654              :      and we do not care about any other registers.  Hence, we do not want
    3655              :      any register for any component seen as used in the exit block, and we
    3656              :      can just say no registers at all are used.  */
    3657     18801775 :   if (df_scan->local_flags & DF_SCAN_EMPTY_ENTRY_EXIT)
    3658              :     return;
    3659              : 
    3660              :   /* Stack pointer is always live at the exit.  */
    3661     18069473 :   bitmap_set_bit (exit_block_uses, STACK_POINTER_REGNUM);
    3662              : 
    3663              :   /* Mark the frame pointer if needed at the end of the function.
    3664              :      If we end up eliminating it, it will be removed from the live
    3665              :      list of each basic block by reload.  */
    3666              : 
    3667     18069473 :   if ((!reload_completed) || frame_pointer_needed)
    3668              :     {
    3669     11517876 :       bitmap_set_bit (exit_block_uses, FRAME_POINTER_REGNUM);
    3670              : 
    3671              :       /* If they are different, also mark the hard frame pointer as live.  */
    3672     11517876 :       if (!HARD_FRAME_POINTER_IS_FRAME_POINTER
    3673              :           && !LOCAL_REGNO (HARD_FRAME_POINTER_REGNUM))
    3674     11517876 :         bitmap_set_bit (exit_block_uses, HARD_FRAME_POINTER_REGNUM);
    3675              :     }
    3676              : 
    3677              :   /* Many architectures have a GP register even without flag_pic.
    3678              :      Assume the pic register is not in use, or will be handled by
    3679              :      other means, if it is not fixed.  */
    3680     18069473 :   if (!PIC_OFFSET_TABLE_REG_CALL_CLOBBERED
    3681              :       && picreg != INVALID_REGNUM
    3682            0 :       && fixed_regs[picreg])
    3683            0 :     bitmap_set_bit (exit_block_uses, picreg);
    3684              : 
    3685              :   /* Mark all global registers, and all registers used by the
    3686              :      epilogue as being live at the end of the function since they
    3687              :      may be referenced by our caller.  */
    3688   1680460989 :   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
    3689   1662391516 :     if (global_regs[i] || df_epilogue_uses_p (i))
    3690         7953 :       bitmap_set_bit (exit_block_uses, i);
    3691              : 
    3692     18069473 :   if (targetm.have_epilogue () && epilogue_completed)
    3693              :     {
    3694              :       /* Mark all call-saved registers that we actually used.  */
    3695    265696071 :       for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
    3696    262839124 :         if (df_regs_ever_live_p (i)
    3697              :             && !LOCAL_REGNO (i)
    3698    262839124 :             && !crtl->abi->clobbers_full_reg_p (i))
    3699      5946711 :           bitmap_set_bit (exit_block_uses, i);
    3700              :     }
    3701              : 
    3702              :   /* Mark the registers that will contain data for the handler.  */
    3703     18069473 :   if (reload_completed && crtl->calls_eh_return)
    3704          172 :     IOR_REG_SET_HRS (exit_block_uses, eh_return_data_regs);
    3705              : 
    3706              : #ifdef EH_RETURN_STACKADJ_RTX
    3707     36138946 :   if ((!targetm.have_epilogue () || ! epilogue_completed)
    3708     33281999 :       && crtl->calls_eh_return)
    3709              :     {
    3710          459 :       rtx tmp = EH_RETURN_STACKADJ_RTX;
    3711          355 :       if (tmp && REG_P (tmp))
    3712          355 :         df_mark_reg (tmp, exit_block_uses);
    3713              :     }
    3714              : #endif
    3715              : 
    3716              : #ifdef EH_RETURN_TAKEN_RTX
    3717              :   if ((!targetm.have_epilogue () || ! epilogue_completed)
    3718              :       && crtl->calls_eh_return)
    3719              :     {
    3720              :       rtx tmp = EH_RETURN_TAKEN_RTX;
    3721              :       if (tmp && REG_P (tmp))
    3722              :         df_mark_reg (tmp, exit_block_uses);
    3723              :     }
    3724              : #endif
    3725              : 
    3726     18069473 :   if ((!targetm.have_epilogue () || ! epilogue_completed)
    3727              :       && crtl->calls_eh_return)
    3728              :     {
    3729     18069473 :       rtx tmp = EH_RETURN_HANDLER_RTX;
    3730     18069473 :       if (tmp && REG_P (tmp))
    3731              :         df_mark_reg (tmp, exit_block_uses);
    3732              :     }
    3733              : 
    3734              :   /* Mark function return value.  */
    3735     18069473 :   diddle_return_value (df_mark_reg, (void*) exit_block_uses);
    3736              : }
    3737              : 
    3738              : 
    3739              : /* Return the refs of hard registers that are used in the exit block.
    3740              :    It uses df->exit_block_uses to determine register to include.  */
    3741              : 
    3742              : static void
    3743     11874723 : df_exit_block_uses_collect (class df_collection_rec *collection_rec, bitmap exit_block_uses)
    3744              : {
    3745     11874723 :   unsigned int i;
    3746     11874723 :   bitmap_iterator bi;
    3747              : 
    3748     43345919 :   EXECUTE_IF_SET_IN_BITMAP (exit_block_uses, 0, i, bi)
    3749     31471196 :     df_ref_record (DF_REF_ARTIFICIAL, collection_rec, regno_reg_rtx[i], NULL,
    3750     31471196 :                    EXIT_BLOCK_PTR_FOR_FN (cfun), NULL, DF_REF_REG_USE, 0);
    3751              : 
    3752              :   /* It is deliberate that this is not put in the exit block uses but
    3753              :      I do not know why.  */
    3754     11874723 :   if (FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
    3755     11874723 :       && reload_completed
    3756      7562680 :       && !bitmap_bit_p (exit_block_uses, ARG_POINTER_REGNUM)
    3757      7562680 :       && bb_has_eh_pred (EXIT_BLOCK_PTR_FOR_FN (cfun))
    3758     11874723 :       && fixed_regs[ARG_POINTER_REGNUM])
    3759            0 :     df_ref_record (DF_REF_ARTIFICIAL, collection_rec, regno_reg_rtx[ARG_POINTER_REGNUM], NULL,
    3760              :                    EXIT_BLOCK_PTR_FOR_FN (cfun), NULL, DF_REF_REG_USE, 0);
    3761              : 
    3762     11874723 :   df_canonize_collection_rec (collection_rec);
    3763     11874723 : }
    3764              : 
    3765              : 
    3766              : /* Record the set of hard registers that are used in the exit block.
    3767              :    It uses df->exit_block_uses to determine which bit to include.  */
    3768              : 
    3769              : static void
    3770      5488080 : df_record_exit_block_uses (bitmap exit_block_uses)
    3771              : {
    3772      5488080 :   class df_collection_rec collection_rec;
    3773      5488080 :   df_exit_block_uses_collect (&collection_rec, exit_block_uses);
    3774              : 
    3775              :   /* Process bb_refs chain */
    3776      5488080 :   df_refs_add_to_chains (&collection_rec,
    3777      5488080 :                          BASIC_BLOCK_FOR_FN (cfun, EXIT_BLOCK),
    3778              :                          NULL,
    3779              :                          copy_uses);
    3780      5488080 : }
    3781              : 
    3782              : 
    3783              : /* Update the uses in the exit block.  */
    3784              : 
    3785              : void
    3786      8394510 : df_update_exit_block_uses (void)
    3787              : {
    3788      8394510 :   bool changed = false;
    3789              : 
    3790      8394510 :   auto_bitmap refs (&df_bitmap_obstack);
    3791      8394510 :   df_get_exit_block_use_set (refs);
    3792      8394510 :   gcc_assert (df->exit_block_uses);
    3793      8394510 :   if (!bitmap_equal_p (df->exit_block_uses, refs))
    3794              :     {
    3795      2427810 :       struct df_scan_bb_info *bb_info = df_scan_get_bb_info (EXIT_BLOCK);
    3796      2427810 :       df_ref_chain_delete_du_chain (bb_info->artificial_uses);
    3797      2427810 :       df_ref_chain_delete (bb_info->artificial_uses);
    3798      2427810 :       bb_info->artificial_uses = NULL;
    3799      2427810 :       changed = true;
    3800              :     }
    3801              : 
    3802      2427810 :   if (changed)
    3803              :     {
    3804      2427810 :       df_record_exit_block_uses (refs);
    3805      2427810 :       bitmap_copy (df->exit_block_uses, refs);
    3806      2427810 :       df_set_bb_dirty (BASIC_BLOCK_FOR_FN (cfun, EXIT_BLOCK));
    3807              :     }
    3808      8394510 : }
    3809              : 
    3810              : static bool initialized = false;
    3811              : 
    3812              : 
    3813              : /* Initialize some platform specific structures.  */
    3814              : 
    3815              : void
    3816      1480950 : df_hard_reg_init (void)
    3817              : {
    3818      1480950 :   int i;
    3819      1480950 :   static const struct {const int from, to; } eliminables[] = ELIMINABLE_REGS;
    3820              : 
    3821      1480950 :   if (initialized)
    3822              :     return;
    3823              : 
    3824              :   /* Record which registers will be eliminated.  We use this in
    3825              :      mark_used_regs.  */
    3826      1051165 :   CLEAR_HARD_REG_SET (elim_reg_set);
    3827              : 
    3828      1051165 :   for (i = 0; i < (int) ARRAY_SIZE (eliminables); i++)
    3829       840932 :     SET_HARD_REG_BIT (elim_reg_set, eliminables[i].from);
    3830              : 
    3831       210233 :   initialized = true;
    3832              : }
    3833              : 
    3834              : /* Recompute the parts of scanning that are based on regs_ever_live
    3835              :    because something changed in that array.  */
    3836              : 
    3837              : void
    3838      6691156 : df_update_entry_exit_and_calls (void)
    3839              : {
    3840      6691156 :   basic_block bb;
    3841              : 
    3842      6691156 :   df_update_entry_block_defs ();
    3843      6691156 :   df_update_exit_block_uses ();
    3844              : 
    3845              :   /* The call insns need to be rescanned because there may be changes
    3846              :      in the set of registers clobbered across the call.  */
    3847     79484076 :   FOR_EACH_BB_FN (bb, cfun)
    3848              :     {
    3849     72792920 :       rtx_insn *insn;
    3850    911507263 :       FOR_BB_INSNS (bb, insn)
    3851              :         {
    3852    838714343 :           if (INSN_P (insn) && CALL_P (insn))
    3853     29645268 :             df_insn_rescan (insn);
    3854              :         }
    3855              :     }
    3856      6691156 : }
    3857              : 
    3858              : 
    3859              : /* Return true if hard REG is actually used in the some instruction.
    3860              :    There are a fair number of conditions that affect the setting of
    3861              :    this array.  See the comment in df.h for df->hard_regs_live_count
    3862              :    for the conditions that this array is set. */
    3863              : 
    3864              : bool
    3865   4126063607 : df_hard_reg_used_p (unsigned int reg)
    3866              : {
    3867   4126063607 :   return df->hard_regs_live_count[reg] != 0;
    3868              : }
    3869              : 
    3870              : 
    3871              : /* A count of the number of times REG is actually used in the some
    3872              :    instruction.  There are a fair number of conditions that affect the
    3873              :    setting of this array.  See the comment in df.h for
    3874              :    df->hard_regs_live_count for the conditions that this array is
    3875              :    set. */
    3876              : 
    3877              : 
    3878              : unsigned int
    3879            0 : df_hard_reg_used_count (unsigned int reg)
    3880              : {
    3881            0 :   return df->hard_regs_live_count[reg];
    3882              : }
    3883              : 
    3884              : 
    3885              : /* Get the value of regs_ever_live[REGNO].  */
    3886              : 
    3887              : bool
    3888    731601432 : df_regs_ever_live_p (unsigned int regno)
    3889              : {
    3890    731601432 :   return regs_ever_live[regno];
    3891              : }
    3892              : 
    3893              : /* Set regs_ever_live[REGNO] to VALUE.  If this cause regs_ever_live
    3894              :    to change, schedule that change for the next update.  */
    3895              : 
    3896              : void
    3897    103692856 : df_set_regs_ever_live (unsigned int regno, bool value)
    3898              : {
    3899    103692856 :   if (regs_ever_live[regno] == value)
    3900              :     return;
    3901              : 
    3902      3606288 :   regs_ever_live[regno] = value;
    3903      3606288 :   if (df)
    3904      3606288 :     df->redo_entry_and_exit = true;
    3905              : }
    3906              : 
    3907              : 
    3908              : /* Compute "regs_ever_live" information from the underlying df
    3909              :    information.  Set the vector to all false if RESET.  */
    3910              : 
    3911              : void
    3912     47648533 : df_compute_regs_ever_live (bool reset)
    3913              : {
    3914     47648533 :   unsigned int i;
    3915     47648533 :   bool changed = df->redo_entry_and_exit;
    3916              : 
    3917     47648533 :   if (reset)
    3918      2555803 :     memset (regs_ever_live, 0, sizeof (regs_ever_live));
    3919              : 
    3920   4431313569 :   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
    3921   4383665036 :     if ((!regs_ever_live[i]) && df_hard_reg_used_p (i))
    3922              :       {
    3923     12519714 :         regs_ever_live[i] = true;
    3924     12519714 :         changed = true;
    3925              :       }
    3926     47648533 :   if (changed)
    3927      3292535 :     df_update_entry_exit_and_calls ();
    3928     47648533 :   df->redo_entry_and_exit = false;
    3929     47648533 : }
    3930              : 
    3931              : 
    3932              : /*----------------------------------------------------------------------------
    3933              :   Dataflow ref information verification functions.
    3934              : 
    3935              :   df_reg_chain_mark (refs, regno, is_def, is_eq_use)
    3936              :   df_reg_chain_verify_unmarked (refs)
    3937              :   df_refs_verify (vec<stack, va_df_ref>, ref*, bool)
    3938              :   df_mws_verify (mw*, mw*, bool)
    3939              :   df_insn_refs_verify (collection_rec, bb, insn, bool)
    3940              :   df_bb_refs_verify (bb, refs, bool)
    3941              :   df_bb_verify (bb)
    3942              :   df_exit_block_bitmap_verify (bool)
    3943              :   df_entry_block_bitmap_verify (bool)
    3944              :   df_scan_verify ()
    3945              : ----------------------------------------------------------------------------*/
    3946              : 
    3947              : 
    3948              : /* Mark all refs in the reg chain.  Verify that all of the registers
    3949              : are in the correct chain.  */
    3950              : 
    3951              : static unsigned int
    3952   2781070917 : df_reg_chain_mark (df_ref refs, unsigned int regno,
    3953              :                    bool is_def, bool is_eq_use)
    3954              : {
    3955   2781070917 :   unsigned int count = 0;
    3956   2781070917 :   df_ref ref;
    3957   6339087843 :   for (ref = refs; ref; ref = DF_REF_NEXT_REG (ref))
    3958              :     {
    3959   3558016926 :       gcc_assert (!DF_REF_IS_REG_MARKED (ref));
    3960              : 
    3961              :       /* If there are no def-use or use-def chains, make sure that all
    3962              :          of the chains are clear.  */
    3963   3558016926 :       if (!df_chain)
    3964   3256945709 :         gcc_assert (!DF_REF_CHAIN (ref));
    3965              : 
    3966              :       /* Check to make sure the ref is in the correct chain.  */
    3967   3558016926 :       gcc_assert (DF_REF_REGNO (ref) == regno);
    3968   3558016926 :       if (is_def)
    3969   2790773385 :         gcc_assert (DF_REF_REG_DEF_P (ref));
    3970              :       else
    3971    767243541 :         gcc_assert (!DF_REF_REG_DEF_P (ref));
    3972              : 
    3973   3558016926 :       if (is_eq_use)
    3974     17355871 :         gcc_assert ((DF_REF_FLAGS (ref) & DF_REF_IN_NOTE));
    3975              :       else
    3976   3540661055 :         gcc_assert ((DF_REF_FLAGS (ref) & DF_REF_IN_NOTE) == 0);
    3977              : 
    3978   3558016926 :       if (DF_REF_NEXT_REG (ref))
    3979   2965953573 :         gcc_assert (DF_REF_PREV_REG (DF_REF_NEXT_REG (ref)) == ref);
    3980   3558016926 :       count++;
    3981   3558016926 :       DF_REF_REG_MARK (ref);
    3982              :     }
    3983   2781070917 :   return count;
    3984              : }
    3985              : 
    3986              : 
    3987              : /* Verify that all of the registers in the chain are unmarked.  */
    3988              : 
    3989              : static void
    3990   2781070917 : df_reg_chain_verify_unmarked (df_ref refs)
    3991              : {
    3992   2781070917 :   df_ref ref;
    3993   6339087843 :   for (ref = refs; ref; ref = DF_REF_NEXT_REG (ref))
    3994   3558016926 :     gcc_assert (!DF_REF_IS_REG_MARKED (ref));
    3995   2781070917 : }
    3996              : 
    3997              : 
    3998              : /* Verify that NEW_REC and OLD_REC have exactly the same members. */
    3999              : 
    4000              : static bool
    4001   3342363547 : df_refs_verify (const vec<df_ref, va_heap> *new_rec, df_ref old_rec,
    4002              :                 bool abort_if_fail)
    4003              : {
    4004   3342363547 :   unsigned int ix;
    4005   3342363547 :   df_ref new_ref;
    4006              : 
    4007  10899811013 :   FOR_EACH_VEC_ELT (*new_rec, ix, new_ref)
    4008              :     {
    4009   7612555163 :       if (old_rec == NULL || !df_ref_equal_p (new_ref, old_rec))
    4010              :         {
    4011     55107697 :           if (abort_if_fail)
    4012            0 :             gcc_assert (0);
    4013              :           else
    4014              :             return false;
    4015              :         }
    4016              : 
    4017              :       /* Abort if fail is called from the function level verifier.  If
    4018              :          that is the context, mark this reg as being seem.  */
    4019   7557447466 :       if (abort_if_fail)
    4020              :         {
    4021   3558016926 :           gcc_assert (DF_REF_IS_REG_MARKED (old_rec));
    4022   3558016926 :           DF_REF_REG_UNMARK (old_rec);
    4023              :         }
    4024              : 
    4025   7557447466 :       old_rec = DF_REF_NEXT_LOC (old_rec);
    4026              :     }
    4027              : 
    4028   3287255850 :   if (abort_if_fail)
    4029   2216291127 :     gcc_assert (old_rec == NULL);
    4030              :   else
    4031   1070964723 :     return old_rec == NULL;
    4032              :   return false;
    4033              : }
    4034              : 
    4035              : 
    4036              : /* Verify that NEW_REC and OLD_REC have exactly the same members. */
    4037              : 
    4038              : static bool
    4039   1020692018 : df_mws_verify (const vec<df_mw_hardreg *, va_heap> *new_rec,
    4040              :                struct df_mw_hardreg *old_rec,
    4041              :                bool abort_if_fail)
    4042              : {
    4043   1020692018 :   unsigned int ix;
    4044   1020692018 :   struct df_mw_hardreg *new_reg;
    4045              : 
    4046   1026463904 :   FOR_EACH_VEC_ELT (*new_rec, ix, new_reg)
    4047              :     {
    4048      5773925 :       if (old_rec == NULL || !df_mw_equal_p (new_reg, old_rec))
    4049              :         {
    4050         2039 :           if (abort_if_fail)
    4051            0 :             gcc_assert (0);
    4052              :           else
    4053              :             return false;
    4054              :         }
    4055      5771886 :       old_rec = DF_MWS_NEXT (old_rec);
    4056              :     }
    4057              : 
    4058   1020689979 :   if (abort_if_fail)
    4059    683048649 :     gcc_assert (old_rec == NULL);
    4060              :   else
    4061    337641330 :     return old_rec == NULL;
    4062              :   return false;
    4063              : }
    4064              : 
    4065              : 
    4066              : /* Return true if the existing insn refs information is complete and
    4067              :    correct. Otherwise (i.e. if there's any missing or extra refs),
    4068              :    return the correct df_ref chain in REFS_RETURN.
    4069              : 
    4070              :    If ABORT_IF_FAIL, leave the refs that are verified (already in the
    4071              :    ref chain) as DF_REF_MARKED(). If it's false, then it's a per-insn
    4072              :    verification mode instead of the whole function, so unmark
    4073              :    everything.
    4074              : 
    4075              :    If ABORT_IF_FAIL is set, this function never returns false.  */
    4076              : 
    4077              : static bool
    4078   1079516282 : df_insn_refs_verify (class df_collection_rec *collection_rec,
    4079              :                      basic_block bb,
    4080              :                      rtx_insn *insn,
    4081              :                      bool abort_if_fail)
    4082              : {
    4083   1079516282 :   bool ret1, ret2, ret3;
    4084   1079516282 :   unsigned int uid = INSN_UID (insn);
    4085   1079516282 :   struct df_insn_info *insn_info = DF_INSN_INFO_GET (insn);
    4086              : 
    4087   1079516282 :   df_insn_refs_collect (collection_rec, bb, insn_info);
    4088              : 
    4089              :   /* Unfortunately we cannot opt out early if one of these is not
    4090              :      right and abort_if_fail is set because the marks will not get cleared.  */
    4091   1079516282 :   ret1 = df_refs_verify (&collection_rec->def_vec, DF_INSN_UID_DEFS (uid),
    4092              :                          abort_if_fail);
    4093   1079516282 :   if (!ret1 && !abort_if_fail)
    4094              :     return false;
    4095   1072665039 :   ret2 = df_refs_verify (&collection_rec->use_vec, DF_INSN_UID_USES (uid),
    4096              :                          abort_if_fail);
    4097   1072665039 :   if (!ret2 && !abort_if_fail)
    4098              :     return false;
    4099   1023037046 :   ret3 = df_refs_verify (&collection_rec->eq_use_vec, DF_INSN_UID_EQ_USES (uid),
    4100              :                          abort_if_fail);
    4101   1023037046 :   if (!ret3 && !abort_if_fail)
    4102              :     return false;
    4103   1020692018 :   if (! df_mws_verify (&collection_rec->mw_vec, DF_INSN_UID_MWS (uid),
    4104              :                        abort_if_fail))
    4105              :     return false;
    4106    337641330 :   return (ret1 && ret2 && ret3);
    4107              : }
    4108              : 
    4109              : 
    4110              : /* Return true if all refs in the basic block are correct and complete.
    4111              :    Due to df_ref_chain_verify, it will cause all refs
    4112              :    that are verified to have DF_REF_MARK bit set.  */
    4113              : 
    4114              : static bool
    4115     83572590 : df_bb_verify (basic_block bb)
    4116              : {
    4117     83572590 :   rtx_insn *insn;
    4118     83572590 :   struct df_scan_bb_info *bb_info = df_scan_get_bb_info (bb->index);
    4119     83572590 :   class df_collection_rec collection_rec;
    4120              : 
    4121     83572590 :   gcc_assert (bb_info);
    4122              : 
    4123              :   /* Scan the block, one insn at a time, from beginning to end.  */
    4124    901804835 :   FOR_BB_INSNS_REVERSE (bb, insn)
    4125              :     {
    4126    818232245 :       if (!INSN_P (insn))
    4127    135183596 :         continue;
    4128    683048649 :       df_insn_refs_verify (&collection_rec, bb, insn, true);
    4129    683048649 :       df_free_collection_rec (&collection_rec);
    4130              :     }
    4131              : 
    4132              :   /* Do the artificial defs and uses.  */
    4133     83572590 :   df_bb_refs_collect (&collection_rec, bb);
    4134    167145180 :   df_refs_verify (&collection_rec.def_vec, df_get_artificial_defs (bb->index), true);
    4135     83572590 :   df_refs_verify (&collection_rec.use_vec, df_get_artificial_uses (bb->index), true);
    4136     83572590 :   df_free_collection_rec (&collection_rec);
    4137              : 
    4138    167145180 :   return true;
    4139     83572590 : }
    4140              : 
    4141              : 
    4142              : /* Returns true if the entry block has correct and complete df_ref set.
    4143              :    If not it either aborts if ABORT_IF_FAIL is true or returns false.  */
    4144              : 
    4145              : static bool
    4146      6386643 : df_entry_block_bitmap_verify (bool abort_if_fail)
    4147              : {
    4148      6386643 :   bool is_eq;
    4149              : 
    4150      6386643 :   auto_bitmap entry_block_defs (&df_bitmap_obstack);
    4151      6386643 :   df_get_entry_block_def_set (entry_block_defs);
    4152              : 
    4153      6386643 :   is_eq = bitmap_equal_p (entry_block_defs, df->entry_block_defs);
    4154              : 
    4155      6386643 :   if (!is_eq && abort_if_fail)
    4156              :     {
    4157            0 :       fprintf (stderr, "entry_block_defs = ");
    4158            0 :       df_print_regset (stderr, entry_block_defs);
    4159            0 :       fprintf (stderr, "df->entry_block_defs = ");
    4160            0 :       df_print_regset (stderr, df->entry_block_defs);
    4161            0 :       gcc_assert (0);
    4162              :     }
    4163              : 
    4164      6386643 :   return is_eq;
    4165      6386643 : }
    4166              : 
    4167              : 
    4168              : /* Returns true if the exit block has correct and complete df_ref set.
    4169              :    If not it either aborts if ABORT_IF_FAIL is true or returns false. */
    4170              : 
    4171              : static bool
    4172      6386643 : df_exit_block_bitmap_verify (bool abort_if_fail)
    4173              : {
    4174      6386643 :   bool is_eq;
    4175              : 
    4176      6386643 :   auto_bitmap exit_block_uses (&df_bitmap_obstack);
    4177      6386643 :   df_get_exit_block_use_set (exit_block_uses);
    4178              : 
    4179      6386643 :   is_eq = bitmap_equal_p (exit_block_uses, df->exit_block_uses);
    4180              : 
    4181      6386643 :   if (!is_eq && abort_if_fail)
    4182              :     {
    4183            0 :       fprintf (stderr, "exit_block_uses = ");
    4184            0 :       df_print_regset (stderr, exit_block_uses);
    4185            0 :       fprintf (stderr, "df->exit_block_uses = ");
    4186            0 :       df_print_regset (stderr, df->exit_block_uses);
    4187            0 :       gcc_assert (0);
    4188              :     }
    4189              : 
    4190      6386643 :   return is_eq;
    4191      6386643 : }
    4192              : 
    4193              : 
    4194              : /* Return true if df_ref information for all insns in all blocks are
    4195              :    correct and complete.  */
    4196              : 
    4197              : void
    4198      6386643 : df_scan_verify (void)
    4199              : {
    4200      6386643 :   unsigned int i;
    4201      6386643 :   basic_block bb;
    4202              : 
    4203      6386643 :   if (!df)
    4204            0 :     return;
    4205              : 
    4206              :   /* Verification is a 4 step process. */
    4207              : 
    4208              :   /* (1) All of the refs are marked by going through the reg chains.  */
    4209    933410282 :   for (i = 0; i < DF_REG_SIZE (df); i++)
    4210              :     {
    4211    927023639 :       gcc_assert (df_reg_chain_mark (DF_REG_DEF_CHAIN (i), i, true, false)
    4212              :                   == DF_REG_DEF_COUNT (i));
    4213    927023639 :       gcc_assert (df_reg_chain_mark (DF_REG_USE_CHAIN (i), i, false, false)
    4214              :                   == DF_REG_USE_COUNT (i));
    4215    927023639 :       gcc_assert (df_reg_chain_mark (DF_REG_EQ_USE_CHAIN (i), i, false, true)
    4216              :                   == DF_REG_EQ_USE_COUNT (i));
    4217              :     }
    4218              : 
    4219              :   /* (2) There are various bitmaps whose value may change over the
    4220              :      course of the compilation.  This step recomputes them to make
    4221              :      sure that they have not slipped out of date.  */
    4222      6386643 :   auto_bitmap regular_block_artificial_uses (&df_bitmap_obstack);
    4223      6386643 :   auto_bitmap eh_block_artificial_uses (&df_bitmap_obstack);
    4224              : 
    4225      6386643 :   df_get_regular_block_artificial_uses (regular_block_artificial_uses);
    4226      6386643 :   df_get_eh_block_artificial_uses (eh_block_artificial_uses);
    4227              : 
    4228      6386643 :   bitmap_ior_into (eh_block_artificial_uses,
    4229      6386643 :                    regular_block_artificial_uses);
    4230              : 
    4231              :   /* Check artificial_uses bitmaps didn't change. */
    4232      6386643 :   gcc_assert (bitmap_equal_p (regular_block_artificial_uses,
    4233              :                               &df->regular_block_artificial_uses));
    4234      6386643 :   gcc_assert (bitmap_equal_p (eh_block_artificial_uses,
    4235              :                               &df->eh_block_artificial_uses));
    4236              : 
    4237              :   /* Verify entry block and exit block. These only verify the bitmaps,
    4238              :      the refs are verified in df_bb_verify.  */
    4239      6386643 :   df_entry_block_bitmap_verify (true);
    4240      6386643 :   df_exit_block_bitmap_verify (true);
    4241              : 
    4242              :   /* (3) All of the insns in all of the blocks are traversed and the
    4243              :      marks are cleared both in the artificial refs attached to the
    4244              :      blocks and the real refs inside the insns.  It is a failure to
    4245              :      clear a mark that has not been set as this means that the ref in
    4246              :      the block or insn was not in the reg chain.  */
    4247              : 
    4248     89959233 :   FOR_ALL_BB_FN (bb, cfun)
    4249     83572590 :     df_bb_verify (bb);
    4250              : 
    4251              :   /* (4) See if all reg chains are traversed a second time.  This time
    4252              :      a check is made that the marks are clear. A set mark would be a
    4253              :      from a reg that is not in any insn or basic block.  */
    4254              : 
    4255    933410282 :   for (i = 0; i < DF_REG_SIZE (df); i++)
    4256              :     {
    4257    927023639 :       df_reg_chain_verify_unmarked (DF_REG_DEF_CHAIN (i));
    4258    927023639 :       df_reg_chain_verify_unmarked (DF_REG_USE_CHAIN (i));
    4259    927023639 :       df_reg_chain_verify_unmarked (DF_REG_EQ_USE_CHAIN (i));
    4260              :     }
    4261      6386643 : }
        

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.