Home | History | Annotate | Line # | Download | only in gcc
      1  1.1  mrg /* Scanning of rtl for dataflow analysis.
      2  1.1  mrg    Copyright (C) 2007-2022 Free Software Foundation, Inc.
      3  1.1  mrg    Contributed by Kenneth Zadeck (zadeck (at) naturalbridge.com).
      4  1.1  mrg 
      5  1.1  mrg This file is part of GCC.
      6  1.1  mrg 
      7  1.1  mrg GCC is free software; you can redistribute it and/or modify it under
      8  1.1  mrg the terms of the GNU General Public License as published by the Free
      9  1.1  mrg Software Foundation; either version 3, or (at your option) any later
     10  1.1  mrg version.
     11  1.1  mrg 
     12  1.1  mrg GCC is distributed in the hope that it will be useful, but WITHOUT ANY
     13  1.1  mrg WARRANTY; without even the implied warranty of MERCHANTABILITY or
     14  1.1  mrg FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
     15  1.1  mrg for more details.
     16  1.1  mrg 
     17  1.1  mrg You should have received a copy of the GNU General Public License
     18  1.1  mrg along with GCC; see the file COPYING3.  If not see
     19  1.1  mrg <http://www.gnu.org/licenses/>.  */
     20  1.1  mrg 
     21  1.1  mrg 
     22  1.1  mrg #include "config.h"
     23  1.1  mrg #include "system.h"
     24  1.1  mrg #include "coretypes.h"
     25  1.1  mrg #include "backend.h"
     26  1.1  mrg #include "rtl.h"
     27  1.1  mrg #include "predict.h"
     28  1.1  mrg #include "df.h"
     29  1.1  mrg #include "regs.h"
     30  1.1  mrg 
     31  1.1  mrg 
     32  1.1  mrg struct regstat_n_sets_and_refs_t *regstat_n_sets_and_refs;
     33  1.1  mrg 
     34  1.1  mrg /*----------------------------------------------------------------------------
     35  1.1  mrg    REG_N_SETS and REG_N_REFS.
     36  1.1  mrg    ----------------------------------------------------------------------------*/
     37  1.1  mrg 
     38  1.1  mrg /* If a pass need to change these values in some magical way or the
     39  1.1  mrg    pass needs to have accurate values for these and is not using
     40  1.1  mrg    incremental df scanning, then it should use REG_N_SETS and
     41  1.1  mrg    REG_N_USES.  If the pass is doing incremental scanning then it
     42  1.1  mrg    should be getting the info from DF_REG_DEF_COUNT and
     43  1.1  mrg    DF_REG_USE_COUNT.  */
     44  1.1  mrg 
     45  1.1  mrg void
     46  1.1  mrg regstat_init_n_sets_and_refs (void)
     47  1.1  mrg {
     48  1.1  mrg   unsigned int i;
     49  1.1  mrg   unsigned int max_regno = max_reg_num ();
     50  1.1  mrg 
     51  1.1  mrg   timevar_push (TV_REG_STATS);
     52  1.1  mrg   df_grow_reg_info ();
     53  1.1  mrg   gcc_assert (!regstat_n_sets_and_refs);
     54  1.1  mrg 
     55  1.1  mrg   regstat_n_sets_and_refs = XNEWVEC (struct regstat_n_sets_and_refs_t, max_regno);
     56  1.1  mrg 
     57  1.1  mrg   if (MAY_HAVE_DEBUG_BIND_INSNS)
     58  1.1  mrg     for (i = 0; i < max_regno; i++)
     59  1.1  mrg       {
     60  1.1  mrg 	int use_count;
     61  1.1  mrg 	df_ref use;
     62  1.1  mrg 
     63  1.1  mrg 	use_count = DF_REG_USE_COUNT (i);
     64  1.1  mrg 	for (use = DF_REG_USE_CHAIN (i); use; use = DF_REF_NEXT_REG (use))
     65  1.1  mrg 	  if (DF_REF_INSN_INFO (use) && DEBUG_INSN_P (DF_REF_INSN (use)))
     66  1.1  mrg 	    use_count--;
     67  1.1  mrg 
     68  1.1  mrg 
     69  1.1  mrg 	SET_REG_N_SETS (i, DF_REG_DEF_COUNT (i));
     70  1.1  mrg 	SET_REG_N_REFS (i, use_count + REG_N_SETS (i));
     71  1.1  mrg       }
     72  1.1  mrg   else
     73  1.1  mrg     for (i = 0; i < max_regno; i++)
     74  1.1  mrg       {
     75  1.1  mrg 	SET_REG_N_SETS (i, DF_REG_DEF_COUNT (i));
     76  1.1  mrg 	SET_REG_N_REFS (i, DF_REG_USE_COUNT (i) + REG_N_SETS (i));
     77  1.1  mrg       }
     78  1.1  mrg   timevar_pop (TV_REG_STATS);
     79  1.1  mrg 
     80  1.1  mrg }
     81  1.1  mrg 
     82  1.1  mrg 
     83  1.1  mrg /* Free the array that holds the REG_N_SETS and REG_N_REFS.  */
     84  1.1  mrg 
     85  1.1  mrg void
     86  1.1  mrg regstat_free_n_sets_and_refs (void)
     87  1.1  mrg {
     88  1.1  mrg   gcc_assert (regstat_n_sets_and_refs);
     89  1.1  mrg   free (regstat_n_sets_and_refs);
     90  1.1  mrg   regstat_n_sets_and_refs = NULL;
     91  1.1  mrg }
     92  1.1  mrg 
     93  1.1  mrg 
     94  1.1  mrg /*----------------------------------------------------------------------------
     95  1.1  mrg    REGISTER INFORMATION
     96  1.1  mrg 
     97  1.1  mrg    Process REG_N_DEATHS, REG_N_CALLS_CROSSED, and REG_BASIC_BLOCK.
     98  1.1  mrg 
     99  1.1  mrg    ----------------------------------------------------------------------------*/
    100  1.1  mrg 
    101  1.1  mrg static bitmap setjmp_crosses;
    102  1.1  mrg struct reg_info_t *reg_info_p;
    103  1.1  mrg 
    104  1.1  mrg /* The number allocated elements of reg_info_p.  */
    105  1.1  mrg size_t reg_info_p_size;
    106  1.1  mrg 
    107  1.1  mrg /* Compute register info: lifetime, bb, and number of defs and uses
    108  1.1  mrg    for basic block BB.  LIVE is a scratch bitvector used here.  */
    109  1.1  mrg 
    110  1.1  mrg static void
    111  1.1  mrg regstat_bb_compute_ri (basic_block bb, bitmap live)
    112  1.1  mrg {
    113  1.1  mrg   rtx_insn *insn;
    114  1.1  mrg   df_ref def, use;
    115  1.1  mrg   bitmap_iterator bi;
    116  1.1  mrg   unsigned int regno;
    117  1.1  mrg 
    118  1.1  mrg   bitmap_copy (live, df_get_live_out (bb));
    119  1.1  mrg 
    120  1.1  mrg   /* Process the regs live at the end of the block.  Mark them as
    121  1.1  mrg      not local to any one basic block.  */
    122  1.1  mrg   EXECUTE_IF_SET_IN_BITMAP (live, 0, regno, bi)
    123  1.1  mrg     REG_BASIC_BLOCK (regno) = REG_BLOCK_GLOBAL;
    124  1.1  mrg 
    125  1.1  mrg   /* Process the artificial defs and uses at the bottom of the block
    126  1.1  mrg      to begin processing.  */
    127  1.1  mrg   FOR_EACH_ARTIFICIAL_DEF (def, bb->index)
    128  1.1  mrg     if ((DF_REF_FLAGS (def) & DF_REF_AT_TOP) == 0)
    129  1.1  mrg       bitmap_clear_bit (live, DF_REF_REGNO (def));
    130  1.1  mrg 
    131  1.1  mrg   FOR_EACH_ARTIFICIAL_USE (use, bb->index)
    132  1.1  mrg     if ((DF_REF_FLAGS (use) & DF_REF_AT_TOP) == 0)
    133  1.1  mrg       {
    134  1.1  mrg 	regno = DF_REF_REGNO (use);
    135  1.1  mrg 	bitmap_set_bit (live, regno);
    136  1.1  mrg       }
    137  1.1  mrg 
    138  1.1  mrg   FOR_BB_INSNS_REVERSE (bb, insn)
    139  1.1  mrg     {
    140  1.1  mrg       struct df_insn_info *insn_info = DF_INSN_INFO_GET (insn);
    141  1.1  mrg       bitmap_iterator bi;
    142  1.1  mrg       rtx link;
    143  1.1  mrg 
    144  1.1  mrg       if (!NONDEBUG_INSN_P (insn))
    145  1.1  mrg 	continue;
    146  1.1  mrg 
    147  1.1  mrg       link = REG_NOTES (insn);
    148  1.1  mrg       while (link)
    149  1.1  mrg 	{
    150  1.1  mrg 	  if (REG_NOTE_KIND (link) == REG_DEAD)
    151  1.1  mrg 	    REG_N_DEATHS (REGNO (XEXP (link, 0)))++;
    152  1.1  mrg 	  link = XEXP (link, 1);
    153  1.1  mrg 	}
    154  1.1  mrg 
    155  1.1  mrg       /* Process the defs.  */
    156  1.1  mrg       if (CALL_P (insn))
    157  1.1  mrg 	{
    158  1.1  mrg 	  bool set_jump = (find_reg_note (insn, REG_SETJMP, NULL) != NULL);
    159  1.1  mrg 	  EXECUTE_IF_SET_IN_BITMAP (live, 0, regno, bi)
    160  1.1  mrg 	    {
    161  1.1  mrg 	      REG_N_CALLS_CROSSED (regno)++;
    162  1.1  mrg 
    163  1.1  mrg 	      /* We have a problem with any pseudoreg that lives
    164  1.1  mrg 		 across the setjmp.  ANSI says that if a user variable
    165  1.1  mrg 		 does not change in value between the setjmp and the
    166  1.1  mrg 		 longjmp, then the longjmp preserves it.  This
    167  1.1  mrg 		 includes longjmp from a place where the pseudo
    168  1.1  mrg 		 appears dead.  (In principle, the value still exists
    169  1.1  mrg 		 if it is in scope.)  If the pseudo goes in a hard
    170  1.1  mrg 		 reg, some other value may occupy that hard reg where
    171  1.1  mrg 		 this pseudo is dead, thus clobbering the pseudo.
    172  1.1  mrg 		 Conclusion: such a pseudo must not go in a hard
    173  1.1  mrg 		 reg.  */
    174  1.1  mrg 	      if (set_jump)
    175  1.1  mrg 		bitmap_set_bit (setjmp_crosses, regno);
    176  1.1  mrg 	    }
    177  1.1  mrg 	}
    178  1.1  mrg 
    179  1.1  mrg       /* All of the defs except the return value are some sort of
    180  1.1  mrg 	 clobber.  This code is for the return.  */
    181  1.1  mrg       FOR_EACH_INSN_INFO_DEF (def, insn_info)
    182  1.1  mrg 	{
    183  1.1  mrg 	  if ((!CALL_P (insn))
    184  1.1  mrg 	      || (!(DF_REF_FLAGS (def)
    185  1.1  mrg 		    & (DF_REF_MUST_CLOBBER | DF_REF_MAY_CLOBBER))))
    186  1.1  mrg 	    {
    187  1.1  mrg 	      unsigned int dregno = DF_REF_REGNO (def);
    188  1.1  mrg 
    189  1.1  mrg 	      /* Kill this register if it is not a subreg store or
    190  1.1  mrg 		 conditional store.
    191  1.1  mrg 		 ??? This means that any partial store is live from
    192  1.1  mrg 		 the last use in a basic block to the start of this
    193  1.1  mrg 		 basic block.  */
    194  1.1  mrg 	      if (!(DF_REF_FLAGS (def)
    195  1.1  mrg 		    & (DF_REF_PARTIAL | DF_REF_CONDITIONAL)))
    196  1.1  mrg 		bitmap_clear_bit (live, dregno);
    197  1.1  mrg 
    198  1.1  mrg 	      if (dregno >= FIRST_PSEUDO_REGISTER)
    199  1.1  mrg 		{
    200  1.1  mrg 		  REG_FREQ (dregno) += REG_FREQ_FROM_BB (bb);
    201  1.1  mrg 		  REG_FREQ (dregno) =
    202  1.1  mrg 		    MIN (REG_FREQ (dregno), REG_FREQ_MAX);
    203  1.1  mrg 
    204  1.1  mrg 		  if (REG_BASIC_BLOCK (dregno) == REG_BLOCK_UNKNOWN)
    205  1.1  mrg 		    REG_BASIC_BLOCK (dregno) = bb->index;
    206  1.1  mrg 		  else if (REG_BASIC_BLOCK (dregno) != bb->index)
    207  1.1  mrg 		    REG_BASIC_BLOCK (dregno) = REG_BLOCK_GLOBAL;
    208  1.1  mrg 		}
    209  1.1  mrg 	    }
    210  1.1  mrg 	}
    211  1.1  mrg 
    212  1.1  mrg       FOR_EACH_INSN_INFO_USE (use, insn_info)
    213  1.1  mrg 	{
    214  1.1  mrg 	  unsigned int uregno = DF_REF_REGNO (use);
    215  1.1  mrg 
    216  1.1  mrg 	  if (uregno >= FIRST_PSEUDO_REGISTER)
    217  1.1  mrg 	    {
    218  1.1  mrg 	      REG_FREQ (uregno) += REG_FREQ_FROM_BB (bb);
    219  1.1  mrg 	      REG_FREQ (uregno) =
    220  1.1  mrg 		MIN (REG_FREQ (uregno), REG_FREQ_MAX);
    221  1.1  mrg 
    222  1.1  mrg 	      if (REG_BASIC_BLOCK (uregno) == REG_BLOCK_UNKNOWN)
    223  1.1  mrg 		REG_BASIC_BLOCK (uregno) = bb->index;
    224  1.1  mrg 	      else if (REG_BASIC_BLOCK (uregno) != bb->index)
    225  1.1  mrg 		REG_BASIC_BLOCK (uregno) = REG_BLOCK_GLOBAL;
    226  1.1  mrg 	    }
    227  1.1  mrg 	}
    228  1.1  mrg     }
    229  1.1  mrg }
    230  1.1  mrg 
    231  1.1  mrg 
    232  1.1  mrg /* Compute register info: lifetime, bb, and number of defs and uses.  */
    233  1.1  mrg void
    234  1.1  mrg regstat_compute_ri (void)
    235  1.1  mrg {
    236  1.1  mrg   basic_block bb;
    237  1.1  mrg   bitmap live = BITMAP_ALLOC (&df_bitmap_obstack);
    238  1.1  mrg   unsigned int regno;
    239  1.1  mrg   bitmap_iterator bi;
    240  1.1  mrg 
    241  1.1  mrg   /* Initialize everything.  */
    242  1.1  mrg 
    243  1.1  mrg   gcc_assert (!reg_info_p);
    244  1.1  mrg 
    245  1.1  mrg   timevar_push (TV_REG_STATS);
    246  1.1  mrg   setjmp_crosses = BITMAP_ALLOC (&df_bitmap_obstack);
    247  1.1  mrg   max_regno = max_reg_num ();
    248  1.1  mrg   reg_info_p_size = max_regno;
    249  1.1  mrg   reg_info_p = XCNEWVEC (struct reg_info_t, max_regno);
    250  1.1  mrg 
    251  1.1  mrg   FOR_EACH_BB_FN (bb, cfun)
    252  1.1  mrg     {
    253  1.1  mrg       regstat_bb_compute_ri (bb, live);
    254  1.1  mrg     }
    255  1.1  mrg 
    256  1.1  mrg   BITMAP_FREE (live);
    257  1.1  mrg 
    258  1.1  mrg   /* See the setjmp comment in regstat_bb_compute_ri.  */
    259  1.1  mrg   EXECUTE_IF_SET_IN_BITMAP (setjmp_crosses, FIRST_PSEUDO_REGISTER, regno, bi)
    260  1.1  mrg     {
    261  1.1  mrg       REG_BASIC_BLOCK (regno) = REG_BLOCK_UNKNOWN;
    262  1.1  mrg     }
    263  1.1  mrg 
    264  1.1  mrg   timevar_pop (TV_REG_STATS);
    265  1.1  mrg }
    266  1.1  mrg 
    267  1.1  mrg 
    268  1.1  mrg /* Free all storage associated with the problem.  */
    269  1.1  mrg 
    270  1.1  mrg void
    271  1.1  mrg regstat_free_ri (void)
    272  1.1  mrg {
    273  1.1  mrg   gcc_assert (reg_info_p);
    274  1.1  mrg   reg_info_p_size = 0;
    275  1.1  mrg   free (reg_info_p);
    276  1.1  mrg   reg_info_p = NULL;
    277  1.1  mrg 
    278  1.1  mrg   BITMAP_FREE (setjmp_crosses);
    279  1.1  mrg }
    280  1.1  mrg 
    281  1.1  mrg 
    282  1.1  mrg /* Return a bitmap containing the set of registers that cross a setjmp.
    283  1.1  mrg    The client should not change or delete this bitmap.  */
    284  1.1  mrg 
    285  1.1  mrg bitmap
    286  1.1  mrg regstat_get_setjmp_crosses (void)
    287  1.1  mrg {
    288  1.1  mrg   return setjmp_crosses;
    289  1.1  mrg }
    290  1.1  mrg 
    291  1.1  mrg /*----------------------------------------------------------------------------
    292  1.1  mrg    Process REG_N_CALLS_CROSSED.
    293  1.1  mrg 
    294  1.1  mrg    This is used by sched_deps.  A good implementation of sched-deps
    295  1.1  mrg    would really process the blocks directly rather than going through
    296  1.1  mrg    lists of insns.  If it did this, it could use the exact regs that
    297  1.1  mrg    cross an individual call rather than using this info that merges
    298  1.1  mrg    the info for all calls.
    299  1.1  mrg 
    300  1.1  mrg    ----------------------------------------------------------------------------*/
    301  1.1  mrg 
    302  1.1  mrg 
    303  1.1  mrg 
    304  1.1  mrg /* Compute calls crossed for BB. Live is a scratch bitvector.  */
    305  1.1  mrg 
    306  1.1  mrg static void
    307  1.1  mrg regstat_bb_compute_calls_crossed (unsigned int bb_index, bitmap live)
    308  1.1  mrg {
    309  1.1  mrg   basic_block bb = BASIC_BLOCK_FOR_FN (cfun, bb_index);
    310  1.1  mrg   rtx_insn *insn;
    311  1.1  mrg   df_ref def, use;
    312  1.1  mrg 
    313  1.1  mrg   bitmap_copy (live, df_get_live_out (bb));
    314  1.1  mrg 
    315  1.1  mrg   /* Process the artificial defs and uses at the bottom of the block
    316  1.1  mrg      to begin processing.  */
    317  1.1  mrg   FOR_EACH_ARTIFICIAL_DEF (def, bb_index)
    318  1.1  mrg     if ((DF_REF_FLAGS (def) & DF_REF_AT_TOP) == 0)
    319  1.1  mrg       bitmap_clear_bit (live, DF_REF_REGNO (def));
    320  1.1  mrg 
    321  1.1  mrg   FOR_EACH_ARTIFICIAL_USE (use, bb_index)
    322  1.1  mrg     if ((DF_REF_FLAGS (use) & DF_REF_AT_TOP) == 0)
    323  1.1  mrg       bitmap_set_bit (live, DF_REF_REGNO (use));
    324  1.1  mrg 
    325  1.1  mrg   FOR_BB_INSNS_REVERSE (bb, insn)
    326  1.1  mrg     {
    327  1.1  mrg       if (!NONDEBUG_INSN_P (insn))
    328  1.1  mrg 	continue;
    329  1.1  mrg 
    330  1.1  mrg       gcc_assert (INSN_UID (insn) < (int) DF_INSN_SIZE ());
    331  1.1  mrg       struct df_insn_info *insn_info = DF_INSN_INFO_GET (insn);
    332  1.1  mrg       unsigned int regno;
    333  1.1  mrg 
    334  1.1  mrg       /* Process the defs.  */
    335  1.1  mrg       if (CALL_P (insn))
    336  1.1  mrg 	{
    337  1.1  mrg 	  bitmap_iterator bi;
    338  1.1  mrg 	  EXECUTE_IF_SET_IN_BITMAP (live, 0, regno, bi)
    339  1.1  mrg 	    {
    340  1.1  mrg 	      REG_N_CALLS_CROSSED (regno)++;
    341  1.1  mrg 	    }
    342  1.1  mrg 	}
    343  1.1  mrg 
    344  1.1  mrg       /* All of the defs except the return value are some sort of
    345  1.1  mrg 	 clobber.  This code is for the return.  */
    346  1.1  mrg       FOR_EACH_INSN_INFO_DEF (def, insn_info)
    347  1.1  mrg 	{
    348  1.1  mrg 	  if ((!CALL_P (insn))
    349  1.1  mrg 	      || (!(DF_REF_FLAGS (def) & (DF_REF_MUST_CLOBBER | DF_REF_MAY_CLOBBER))))
    350  1.1  mrg 	    {
    351  1.1  mrg 	      /* Kill this register if it is not a subreg store or conditional store.  */
    352  1.1  mrg 	      if (!(DF_REF_FLAGS (def) & (DF_REF_PARTIAL | DF_REF_CONDITIONAL)))
    353  1.1  mrg 		bitmap_clear_bit (live, DF_REF_REGNO (def));
    354  1.1  mrg 	    }
    355  1.1  mrg 	}
    356  1.1  mrg 
    357  1.1  mrg       FOR_EACH_INSN_INFO_USE (use, insn_info)
    358  1.1  mrg 	bitmap_set_bit (live, DF_REF_REGNO (use));
    359  1.1  mrg     }
    360  1.1  mrg }
    361  1.1  mrg 
    362  1.1  mrg 
    363  1.1  mrg /* Compute register info: lifetime, bb, and number of defs and uses.  */
    364  1.1  mrg void
    365  1.1  mrg regstat_compute_calls_crossed (void)
    366  1.1  mrg {
    367  1.1  mrg   basic_block bb;
    368  1.1  mrg   bitmap live = BITMAP_ALLOC (&df_bitmap_obstack);
    369  1.1  mrg 
    370  1.1  mrg   /* Initialize everything.  */
    371  1.1  mrg   gcc_assert (!reg_info_p);
    372  1.1  mrg 
    373  1.1  mrg   timevar_push (TV_REG_STATS);
    374  1.1  mrg   max_regno = max_reg_num ();
    375  1.1  mrg   reg_info_p_size = max_regno;
    376  1.1  mrg   reg_info_p = XCNEWVEC (struct reg_info_t, max_regno);
    377  1.1  mrg 
    378  1.1  mrg   FOR_EACH_BB_FN (bb, cfun)
    379  1.1  mrg     {
    380  1.1  mrg       regstat_bb_compute_calls_crossed (bb->index, live);
    381  1.1  mrg     }
    382  1.1  mrg 
    383  1.1  mrg   BITMAP_FREE (live);
    384  1.1  mrg   timevar_pop (TV_REG_STATS);
    385  1.1  mrg }
    386  1.1  mrg 
    387  1.1  mrg 
    388  1.1  mrg /* Free all storage associated with the problem.  */
    389  1.1  mrg 
    390  1.1  mrg void
    391  1.1  mrg regstat_free_calls_crossed (void)
    392  1.1  mrg {
    393  1.1  mrg   gcc_assert (reg_info_p);
    394  1.1  mrg   reg_info_p_size = 0;
    395  1.1  mrg   free (reg_info_p);
    396  1.1  mrg   reg_info_p = NULL;
    397  1.1  mrg }
    398  1.1  mrg 
    399  1.1  mrg /* Dump the register info to FILE.  */
    400  1.1  mrg 
    401  1.1  mrg void
    402  1.1  mrg dump_reg_info (FILE *file)
    403  1.1  mrg {
    404  1.1  mrg   unsigned int i, max = max_reg_num ();
    405  1.1  mrg   if (reload_completed)
    406  1.1  mrg     return;
    407  1.1  mrg 
    408  1.1  mrg   if (reg_info_p_size < max)
    409  1.1  mrg     max = reg_info_p_size;
    410  1.1  mrg 
    411  1.1  mrg   fprintf (file, "%d registers.\n", max);
    412  1.1  mrg   for (i = FIRST_PSEUDO_REGISTER; i < max; i++)
    413  1.1  mrg     {
    414  1.1  mrg       enum reg_class rclass, altclass;
    415  1.1  mrg 
    416  1.1  mrg       if (regstat_n_sets_and_refs)
    417  1.1  mrg 	fprintf (file, "\nRegister %d used %d times",
    418  1.1  mrg 		 i, REG_N_REFS (i));
    419  1.1  mrg       else if (df)
    420  1.1  mrg 	fprintf (file, "\nRegister %d used %d times",
    421  1.1  mrg 		 i, DF_REG_USE_COUNT (i) + DF_REG_DEF_COUNT (i));
    422  1.1  mrg 
    423  1.1  mrg       if (REG_BASIC_BLOCK (i) >= NUM_FIXED_BLOCKS)
    424  1.1  mrg 	fprintf (file, " in block %d", REG_BASIC_BLOCK (i));
    425  1.1  mrg       if (regstat_n_sets_and_refs)
    426  1.1  mrg 	fprintf (file, "; set %d time%s", REG_N_SETS (i),
    427  1.1  mrg 		 (REG_N_SETS (i) == 1) ? "" : "s");
    428  1.1  mrg       else if (df)
    429  1.1  mrg 	fprintf (file, "; set %d time%s", DF_REG_DEF_COUNT (i),
    430  1.1  mrg 		 (DF_REG_DEF_COUNT (i) == 1) ? "" : "s");
    431  1.1  mrg       if (regno_reg_rtx[i] != NULL && REG_USERVAR_P (regno_reg_rtx[i]))
    432  1.1  mrg 	fputs ("; user var", file);
    433  1.1  mrg       if (REG_N_DEATHS (i) != 1)
    434  1.1  mrg 	fprintf (file, "; dies in %d places", REG_N_DEATHS (i));
    435  1.1  mrg       if (REG_N_CALLS_CROSSED (i) == 1)
    436  1.1  mrg 	fputs ("; crosses 1 call", file);
    437  1.1  mrg       else if (REG_N_CALLS_CROSSED (i))
    438  1.1  mrg 	fprintf (file, "; crosses %d calls", REG_N_CALLS_CROSSED (i));
    439  1.1  mrg       if (regno_reg_rtx[i] != NULL
    440  1.1  mrg 	  && maybe_ne (PSEUDO_REGNO_BYTES (i), UNITS_PER_WORD))
    441  1.1  mrg 	{
    442  1.1  mrg 	  fprintf (file, "; ");
    443  1.1  mrg 	  print_dec (PSEUDO_REGNO_BYTES (i), file, SIGNED);
    444  1.1  mrg 	  fprintf (file, " bytes");
    445  1.1  mrg 	}
    446  1.1  mrg 
    447  1.1  mrg       rclass = reg_preferred_class (i);
    448  1.1  mrg       altclass = reg_alternate_class (i);
    449  1.1  mrg       if (rclass != GENERAL_REGS || altclass != ALL_REGS)
    450  1.1  mrg 	{
    451  1.1  mrg 	  if (altclass == ALL_REGS || rclass == ALL_REGS)
    452  1.1  mrg 	    fprintf (file, "; pref %s", reg_class_names[(int) rclass]);
    453  1.1  mrg 	  else if (altclass == NO_REGS)
    454  1.1  mrg 	    fprintf (file, "; %s or none", reg_class_names[(int) rclass]);
    455  1.1  mrg 	  else
    456  1.1  mrg 	    fprintf (file, "; pref %s, else %s",
    457  1.1  mrg 		     reg_class_names[(int) rclass],
    458  1.1  mrg 		     reg_class_names[(int) altclass]);
    459  1.1  mrg 	}
    460  1.1  mrg 
    461  1.1  mrg       if (regno_reg_rtx[i] != NULL && REG_POINTER (regno_reg_rtx[i]))
    462  1.1  mrg 	fputs ("; pointer", file);
    463  1.1  mrg       fputs (".\n", file);
    464  1.1  mrg     }
    465  1.1  mrg }
    466  1.1  mrg 
    467