Home | History | Annotate | Line # | Download | only in gcc
      1  1.1  mrg /* LRA (local register allocator) driver and LRA utilities.
      2  1.1  mrg    Copyright (C) 2010-2022 Free Software Foundation, Inc.
      3  1.1  mrg    Contributed by Vladimir Makarov <vmakarov (at) redhat.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 /* The Local Register Allocator (LRA) is a replacement of former
     23  1.1  mrg    reload pass.	 It is focused to simplify code solving the reload
     24  1.1  mrg    pass tasks, to make the code maintenance easier, and to implement new
     25  1.1  mrg    perspective optimizations.
     26  1.1  mrg 
     27  1.1  mrg    The major LRA design solutions are:
     28  1.1  mrg      o division small manageable, separated sub-tasks
     29  1.1  mrg      o reflection of all transformations and decisions in RTL as more
     30  1.1  mrg        as possible
     31  1.1  mrg      o insn constraints as a primary source of the info (minimizing
     32  1.1  mrg        number of target-depended macros/hooks)
     33  1.1  mrg 
     34  1.1  mrg    In brief LRA works by iterative insn process with the final goal is
     35  1.1  mrg    to satisfy all insn and address constraints:
     36  1.1  mrg      o New reload insns (in brief reloads) and reload pseudos might be
     37  1.1  mrg        generated;
     38  1.1  mrg      o Some pseudos might be spilled to assign hard registers to
     39  1.1  mrg        new reload pseudos;
     40  1.1  mrg      o Recalculating spilled pseudo values (rematerialization);
     41  1.1  mrg      o Changing spilled pseudos to stack memory or their equivalences;
     42  1.1  mrg      o Allocation stack memory changes the address displacement and
     43  1.1  mrg        new iteration is needed.
     44  1.1  mrg 
     45  1.1  mrg    Here is block diagram of LRA passes:
     46  1.1  mrg 
     47  1.1  mrg                                 ------------------------
     48  1.1  mrg            ---------------     | Undo inheritance for   |     ---------------
     49  1.1  mrg           | Memory-memory |    | spilled pseudos,       |    | New (and old) |
     50  1.1  mrg           | move coalesce |<---| splits for pseudos got |<-- |   pseudos     |
     51  1.1  mrg            ---------------     | the same hard regs,    |    |  assignment   |
     52  1.1  mrg   Start           |            | and optional reloads   |     ---------------
     53  1.1  mrg     |             |             ------------------------            ^
     54  1.1  mrg     V             |              ----------------                   |
     55  1.1  mrg  -----------      V             | Update virtual |                  |
     56  1.1  mrg |  Remove   |----> ------------>|    register    |                  |
     57  1.1  mrg | scratches |     ^             |  displacements |                  |
     58  1.1  mrg  -----------      |              ----------------                   |
     59  1.1  mrg                   |                      |                          |
     60  1.1  mrg                   |                      V         New              |
     61  1.1  mrg                   |                 ------------  pseudos   -------------------
     62  1.1  mrg                   |                |Constraints:| or insns | Inheritance/split |
     63  1.1  mrg                   |                |    RTL     |--------->|  transformations  |
     64  1.1  mrg                   |                | transfor-  |          |    in EBB scope   |
     65  1.1  mrg                   | substi-        |  mations   |           -------------------
     66  1.1  mrg                   | tutions         ------------
     67  1.1  mrg                   |                     | No change
     68  1.1  mrg           ----------------              V
     69  1.1  mrg          | Spilled pseudo |      -------------------
     70  1.1  mrg          |    to memory   |<----| Rematerialization |
     71  1.1  mrg          |  substitution  |      -------------------
     72  1.1  mrg           ----------------
     73  1.1  mrg                   | No susbtitions
     74  1.1  mrg                   V
     75  1.1  mrg       -------------------------
     76  1.1  mrg      | Hard regs substitution, |
     77  1.1  mrg      |  devirtalization, and   |------> Finish
     78  1.1  mrg      | restoring scratches got |
     79  1.1  mrg      |         memory          |
     80  1.1  mrg       -------------------------
     81  1.1  mrg 
     82  1.1  mrg    To speed up the process:
     83  1.1  mrg      o We process only insns affected by changes on previous
     84  1.1  mrg        iterations;
     85  1.1  mrg      o We don't use DFA-infrastructure because it results in much slower
     86  1.1  mrg        compiler speed than a special IR described below does;
     87  1.1  mrg      o We use a special insn representation for quick access to insn
     88  1.1  mrg        info which is always *synchronized* with the current RTL;
     89  1.1  mrg        o Insn IR is minimized by memory.  It is divided on three parts:
     90  1.1  mrg 	 o one specific for each insn in RTL (only operand locations);
     91  1.1  mrg 	 o one common for all insns in RTL with the same insn code
     92  1.1  mrg 	   (different operand attributes from machine descriptions);
     93  1.1  mrg 	 o one oriented for maintenance of live info (list of pseudos).
     94  1.1  mrg        o Pseudo data:
     95  1.1  mrg 	 o all insns where the pseudo is referenced;
     96  1.1  mrg 	 o live info (conflicting hard regs, live ranges, # of
     97  1.1  mrg 	   references etc);
     98  1.1  mrg 	 o data used for assigning (preferred hard regs, costs etc).
     99  1.1  mrg 
    100  1.1  mrg    This file contains LRA driver, LRA utility functions and data, and
    101  1.1  mrg    code for dealing with scratches.  */
    102  1.1  mrg 
    103  1.1  mrg #include "config.h"
    104  1.1  mrg #include "system.h"
    105  1.1  mrg #include "coretypes.h"
    106  1.1  mrg #include "backend.h"
    107  1.1  mrg #include "target.h"
    108  1.1  mrg #include "rtl.h"
    109  1.1  mrg #include "tree.h"
    110  1.1  mrg #include "predict.h"
    111  1.1  mrg #include "df.h"
    112  1.1  mrg #include "memmodel.h"
    113  1.1  mrg #include "tm_p.h"
    114  1.1  mrg #include "optabs.h"
    115  1.1  mrg #include "regs.h"
    116  1.1  mrg #include "ira.h"
    117  1.1  mrg #include "recog.h"
    118  1.1  mrg #include "expr.h"
    119  1.1  mrg #include "cfgrtl.h"
    120  1.1  mrg #include "cfgbuild.h"
    121  1.1  mrg #include "lra.h"
    122  1.1  mrg #include "lra-int.h"
    123  1.1  mrg #include "print-rtl.h"
    124  1.1  mrg #include "function-abi.h"
    125  1.1  mrg 
    126  1.1  mrg /* Dump bitmap SET with TITLE and BB INDEX.  */
    127  1.1  mrg void
    128  1.1  mrg lra_dump_bitmap_with_title (const char *title, bitmap set, int index)
    129  1.1  mrg {
    130  1.1  mrg   unsigned int i;
    131  1.1  mrg   int count;
    132  1.1  mrg   bitmap_iterator bi;
    133  1.1  mrg   static const int max_nums_on_line = 10;
    134  1.1  mrg 
    135  1.1  mrg   if (bitmap_empty_p (set))
    136  1.1  mrg     return;
    137  1.1  mrg   fprintf (lra_dump_file, "  %s %d:", title, index);
    138  1.1  mrg   fprintf (lra_dump_file, "\n");
    139  1.1  mrg   count = max_nums_on_line + 1;
    140  1.1  mrg   EXECUTE_IF_SET_IN_BITMAP (set, 0, i, bi)
    141  1.1  mrg     {
    142  1.1  mrg       if (count > max_nums_on_line)
    143  1.1  mrg 	{
    144  1.1  mrg 	  fprintf (lra_dump_file, "\n    ");
    145  1.1  mrg 	  count = 0;
    146  1.1  mrg 	}
    147  1.1  mrg       fprintf (lra_dump_file, " %4u", i);
    148  1.1  mrg       count++;
    149  1.1  mrg     }
    150  1.1  mrg   fprintf (lra_dump_file, "\n");
    151  1.1  mrg }
    152  1.1  mrg 
    153  1.1  mrg /* Hard registers currently not available for allocation.  It can
    154  1.1  mrg    changed after some hard  registers become not eliminable.  */
    155  1.1  mrg HARD_REG_SET lra_no_alloc_regs;
    156  1.1  mrg 
    157  1.1  mrg static int get_new_reg_value (void);
    158  1.1  mrg static void expand_reg_info (void);
    159  1.1  mrg static void invalidate_insn_recog_data (int);
    160  1.1  mrg static int get_insn_freq (rtx_insn *);
    161  1.1  mrg static void invalidate_insn_data_regno_info (lra_insn_recog_data_t,
    162  1.1  mrg 					     rtx_insn *, int);
    163  1.1  mrg /* Expand all regno related info needed for LRA.  */
    164  1.1  mrg static void
    165  1.1  mrg expand_reg_data (int old)
    166  1.1  mrg {
    167  1.1  mrg   resize_reg_info ();
    168  1.1  mrg   expand_reg_info ();
    169  1.1  mrg   ira_expand_reg_equiv ();
    170  1.1  mrg   for (int i = (int) max_reg_num () - 1; i >= old; i--)
    171  1.1  mrg     lra_change_class (i, ALL_REGS, "      Set", true);
    172  1.1  mrg }
    173  1.1  mrg 
    174  1.1  mrg /* Create and return a new reg of ORIGINAL mode.  If ORIGINAL is NULL
    175  1.1  mrg    or of VOIDmode, use MD_MODE for the new reg.  Initialize its
    176  1.1  mrg    register class to RCLASS.  Print message about assigning class
    177  1.1  mrg    RCLASS containing new register name TITLE unless it is NULL.  Use
    178  1.1  mrg    attributes of ORIGINAL if it is a register.  The created register
    179  1.1  mrg    will have unique held value.  */
    180  1.1  mrg rtx
    181  1.1  mrg lra_create_new_reg_with_unique_value (machine_mode md_mode, rtx original,
    182  1.1  mrg 				      enum reg_class rclass,
    183  1.1  mrg 				      HARD_REG_SET *exclude_start_hard_regs,
    184  1.1  mrg 				      const char *title)
    185  1.1  mrg {
    186  1.1  mrg   machine_mode mode;
    187  1.1  mrg   rtx new_reg;
    188  1.1  mrg 
    189  1.1  mrg   if (original == NULL_RTX || (mode = GET_MODE (original)) == VOIDmode)
    190  1.1  mrg     mode = md_mode;
    191  1.1  mrg   lra_assert (mode != VOIDmode);
    192  1.1  mrg   new_reg = gen_reg_rtx (mode);
    193  1.1  mrg   if (original == NULL_RTX || ! REG_P (original))
    194  1.1  mrg     {
    195  1.1  mrg       if (lra_dump_file != NULL)
    196  1.1  mrg 	fprintf (lra_dump_file, "      Creating newreg=%i", REGNO (new_reg));
    197  1.1  mrg     }
    198  1.1  mrg   else
    199  1.1  mrg     {
    200  1.1  mrg       if (ORIGINAL_REGNO (original) >= FIRST_PSEUDO_REGISTER)
    201  1.1  mrg 	ORIGINAL_REGNO (new_reg) = ORIGINAL_REGNO (original);
    202  1.1  mrg       REG_USERVAR_P (new_reg) = REG_USERVAR_P (original);
    203  1.1  mrg       REG_POINTER (new_reg) = REG_POINTER (original);
    204  1.1  mrg       REG_ATTRS (new_reg) = REG_ATTRS (original);
    205  1.1  mrg       if (lra_dump_file != NULL)
    206  1.1  mrg 	fprintf (lra_dump_file, "      Creating newreg=%i from oldreg=%i",
    207  1.1  mrg 		 REGNO (new_reg), REGNO (original));
    208  1.1  mrg     }
    209  1.1  mrg   if (lra_dump_file != NULL)
    210  1.1  mrg     {
    211  1.1  mrg       if (title != NULL)
    212  1.1  mrg 	fprintf (lra_dump_file, ", assigning class %s to%s%s r%d",
    213  1.1  mrg 		 reg_class_names[rclass], *title == '\0' ? "" : " ",
    214  1.1  mrg 		 title, REGNO (new_reg));
    215  1.1  mrg       fprintf (lra_dump_file, "\n");
    216  1.1  mrg     }
    217  1.1  mrg   expand_reg_data (max_reg_num ());
    218  1.1  mrg   setup_reg_classes (REGNO (new_reg), rclass, NO_REGS, rclass);
    219  1.1  mrg   if (exclude_start_hard_regs != NULL)
    220  1.1  mrg     lra_reg_info[REGNO (new_reg)].exclude_start_hard_regs
    221  1.1  mrg       = *exclude_start_hard_regs;
    222  1.1  mrg   return new_reg;
    223  1.1  mrg }
    224  1.1  mrg 
    225  1.1  mrg /* Analogous to the previous function but also inherits value of
    226  1.1  mrg    ORIGINAL.  */
    227  1.1  mrg rtx
    228  1.1  mrg lra_create_new_reg (machine_mode md_mode, rtx original, enum reg_class rclass,
    229  1.1  mrg 		    HARD_REG_SET *exclude_start_hard_regs, const char *title)
    230  1.1  mrg {
    231  1.1  mrg   rtx new_reg;
    232  1.1  mrg 
    233  1.1  mrg   new_reg
    234  1.1  mrg     = lra_create_new_reg_with_unique_value (md_mode, original, rclass,
    235  1.1  mrg 					    exclude_start_hard_regs, title);
    236  1.1  mrg   if (original != NULL_RTX && REG_P (original))
    237  1.1  mrg     lra_assign_reg_val (REGNO (original), REGNO (new_reg));
    238  1.1  mrg   return new_reg;
    239  1.1  mrg }
    240  1.1  mrg 
    241  1.1  mrg /* Set up for REGNO unique hold value.	*/
    242  1.1  mrg void
    243  1.1  mrg lra_set_regno_unique_value (int regno)
    244  1.1  mrg {
    245  1.1  mrg   lra_reg_info[regno].val = get_new_reg_value ();
    246  1.1  mrg }
    247  1.1  mrg 
    248  1.1  mrg /* Invalidate INSN related info used by LRA.  The info should never be
    249  1.1  mrg    used after that.  */
    250  1.1  mrg void
    251  1.1  mrg lra_invalidate_insn_data (rtx_insn *insn)
    252  1.1  mrg {
    253  1.1  mrg   lra_invalidate_insn_regno_info (insn);
    254  1.1  mrg   invalidate_insn_recog_data (INSN_UID (insn));
    255  1.1  mrg }
    256  1.1  mrg 
    257  1.1  mrg /* Mark INSN deleted and invalidate the insn related info used by
    258  1.1  mrg    LRA.	 */
    259  1.1  mrg void
    260  1.1  mrg lra_set_insn_deleted (rtx_insn *insn)
    261  1.1  mrg {
    262  1.1  mrg   lra_invalidate_insn_data (insn);
    263  1.1  mrg   SET_INSN_DELETED (insn);
    264  1.1  mrg }
    265  1.1  mrg 
    266  1.1  mrg /* Delete an unneeded INSN and any previous insns who sole purpose is
    267  1.1  mrg    loading data that is dead in INSN.  */
    268  1.1  mrg void
    269  1.1  mrg lra_delete_dead_insn (rtx_insn *insn)
    270  1.1  mrg {
    271  1.1  mrg   rtx_insn *prev = prev_real_insn (insn);
    272  1.1  mrg   rtx prev_dest;
    273  1.1  mrg 
    274  1.1  mrg   /* If the previous insn sets a register that dies in our insn,
    275  1.1  mrg      delete it too.  */
    276  1.1  mrg   if (prev && GET_CODE (PATTERN (prev)) == SET
    277  1.1  mrg       && (prev_dest = SET_DEST (PATTERN (prev)), REG_P (prev_dest))
    278  1.1  mrg       && reg_mentioned_p (prev_dest, PATTERN (insn))
    279  1.1  mrg       && find_regno_note (insn, REG_DEAD, REGNO (prev_dest))
    280  1.1  mrg       && ! side_effects_p (SET_SRC (PATTERN (prev))))
    281  1.1  mrg     lra_delete_dead_insn (prev);
    282  1.1  mrg 
    283  1.1  mrg   lra_set_insn_deleted (insn);
    284  1.1  mrg }
    285  1.1  mrg 
    286  1.1  mrg /* Emit insn x = y + z.  Return NULL if we failed to do it.
    287  1.1  mrg    Otherwise, return the insn.  We don't use gen_add3_insn as it might
    288  1.1  mrg    clobber CC.  */
    289  1.1  mrg static rtx_insn *
    290  1.1  mrg emit_add3_insn (rtx x, rtx y, rtx z)
    291  1.1  mrg {
    292  1.1  mrg   rtx_insn *last;
    293  1.1  mrg 
    294  1.1  mrg   last = get_last_insn ();
    295  1.1  mrg 
    296  1.1  mrg   if (have_addptr3_insn (x, y, z))
    297  1.1  mrg     {
    298  1.1  mrg       rtx_insn *insn = gen_addptr3_insn (x, y, z);
    299  1.1  mrg 
    300  1.1  mrg       /* If the target provides an "addptr" pattern it hopefully does
    301  1.1  mrg 	 for a reason.  So falling back to the normal add would be
    302  1.1  mrg 	 a bug.  */
    303  1.1  mrg       lra_assert (insn != NULL_RTX);
    304  1.1  mrg       emit_insn (insn);
    305  1.1  mrg       return insn;
    306  1.1  mrg     }
    307  1.1  mrg 
    308  1.1  mrg   rtx_insn *insn = emit_insn (gen_rtx_SET (x, gen_rtx_PLUS (GET_MODE (y),
    309  1.1  mrg 							    y, z)));
    310  1.1  mrg   if (recog_memoized (insn) < 0)
    311  1.1  mrg     {
    312  1.1  mrg       delete_insns_since (last);
    313  1.1  mrg       insn = NULL;
    314  1.1  mrg     }
    315  1.1  mrg   return insn;
    316  1.1  mrg }
    317  1.1  mrg 
    318  1.1  mrg /* Emit insn x = x + y.  Return the insn.  We use gen_add2_insn as the
    319  1.1  mrg    last resort.  */
    320  1.1  mrg static rtx_insn *
    321  1.1  mrg emit_add2_insn (rtx x, rtx y)
    322  1.1  mrg {
    323  1.1  mrg   rtx_insn *insn = emit_add3_insn (x, x, y);
    324  1.1  mrg   if (insn == NULL_RTX)
    325  1.1  mrg     {
    326  1.1  mrg       insn = gen_add2_insn (x, y);
    327  1.1  mrg       if (insn != NULL_RTX)
    328  1.1  mrg 	emit_insn (insn);
    329  1.1  mrg     }
    330  1.1  mrg   return insn;
    331  1.1  mrg }
    332  1.1  mrg 
    333  1.1  mrg /* Target checks operands through operand predicates to recognize an
    334  1.1  mrg    insn.  We should have a special precaution to generate add insns
    335  1.1  mrg    which are frequent results of elimination.
    336  1.1  mrg 
    337  1.1  mrg    Emit insns for x = y + z.  X can be used to store intermediate
    338  1.1  mrg    values and should be not in Y and Z when we use X to store an
    339  1.1  mrg    intermediate value.  Y + Z should form [base] [+ index[ * scale]] [
    340  1.1  mrg    + disp] where base and index are registers, disp and scale are
    341  1.1  mrg    constants.  Y should contain base if it is present, Z should
    342  1.1  mrg    contain disp if any.  index[*scale] can be part of Y or Z.  */
    343  1.1  mrg void
    344  1.1  mrg lra_emit_add (rtx x, rtx y, rtx z)
    345  1.1  mrg {
    346  1.1  mrg   int old;
    347  1.1  mrg   rtx_insn *last;
    348  1.1  mrg   rtx a1, a2, base, index, disp, scale, index_scale;
    349  1.1  mrg   bool ok_p;
    350  1.1  mrg 
    351  1.1  mrg   rtx_insn *add3_insn = emit_add3_insn (x, y, z);
    352  1.1  mrg   old = max_reg_num ();
    353  1.1  mrg   if (add3_insn != NULL)
    354  1.1  mrg     ;
    355  1.1  mrg   else
    356  1.1  mrg     {
    357  1.1  mrg       disp = a2 = NULL_RTX;
    358  1.1  mrg       if (GET_CODE (y) == PLUS)
    359  1.1  mrg 	{
    360  1.1  mrg 	  a1 = XEXP (y, 0);
    361  1.1  mrg 	  a2 = XEXP (y, 1);
    362  1.1  mrg 	  disp = z;
    363  1.1  mrg 	}
    364  1.1  mrg       else
    365  1.1  mrg 	{
    366  1.1  mrg 	  a1 = y;
    367  1.1  mrg 	  if (CONSTANT_P (z))
    368  1.1  mrg 	    disp = z;
    369  1.1  mrg 	  else
    370  1.1  mrg 	    a2 = z;
    371  1.1  mrg 	}
    372  1.1  mrg       index_scale = scale = NULL_RTX;
    373  1.1  mrg       if (GET_CODE (a1) == MULT)
    374  1.1  mrg 	{
    375  1.1  mrg 	  index_scale = a1;
    376  1.1  mrg 	  index = XEXP (a1, 0);
    377  1.1  mrg 	  scale = XEXP (a1, 1);
    378  1.1  mrg 	  base = a2;
    379  1.1  mrg 	}
    380  1.1  mrg       else if (a2 != NULL_RTX && GET_CODE (a2) == MULT)
    381  1.1  mrg 	{
    382  1.1  mrg 	  index_scale = a2;
    383  1.1  mrg 	  index = XEXP (a2, 0);
    384  1.1  mrg 	  scale = XEXP (a2, 1);
    385  1.1  mrg 	  base = a1;
    386  1.1  mrg 	}
    387  1.1  mrg       else
    388  1.1  mrg 	{
    389  1.1  mrg 	  base = a1;
    390  1.1  mrg 	  index = a2;
    391  1.1  mrg 	}
    392  1.1  mrg       if ((base != NULL_RTX && ! (REG_P (base) || GET_CODE (base) == SUBREG))
    393  1.1  mrg 	  || (index != NULL_RTX
    394  1.1  mrg 	      && ! (REG_P (index) || GET_CODE (index) == SUBREG))
    395  1.1  mrg 	  || (disp != NULL_RTX && ! CONSTANT_P (disp))
    396  1.1  mrg 	  || (scale != NULL_RTX && ! CONSTANT_P (scale)))
    397  1.1  mrg 	{
    398  1.1  mrg 	  /* Probably we have no 3 op add.  Last chance is to use 2-op
    399  1.1  mrg 	     add insn.  To succeed, don't move Z to X as an address
    400  1.1  mrg 	     segment always comes in Y.  Otherwise, we might fail when
    401  1.1  mrg 	     adding the address segment to register.  */
    402  1.1  mrg 	  lra_assert (x != y && x != z);
    403  1.1  mrg 	  emit_move_insn (x, y);
    404  1.1  mrg 	  rtx_insn *insn = emit_add2_insn (x, z);
    405  1.1  mrg 	  lra_assert (insn != NULL_RTX);
    406  1.1  mrg 	}
    407  1.1  mrg       else
    408  1.1  mrg 	{
    409  1.1  mrg 	  if (index_scale == NULL_RTX)
    410  1.1  mrg 	    index_scale = index;
    411  1.1  mrg 	  if (disp == NULL_RTX)
    412  1.1  mrg 	    {
    413  1.1  mrg 	      /* Generate x = index_scale; x = x + base.  */
    414  1.1  mrg 	      lra_assert (index_scale != NULL_RTX && base != NULL_RTX);
    415  1.1  mrg 	      emit_move_insn (x, index_scale);
    416  1.1  mrg 	      rtx_insn *insn = emit_add2_insn (x, base);
    417  1.1  mrg 	      lra_assert (insn != NULL_RTX);
    418  1.1  mrg 	    }
    419  1.1  mrg 	  else if (scale == NULL_RTX)
    420  1.1  mrg 	    {
    421  1.1  mrg 	      /* Try x = base + disp.  */
    422  1.1  mrg 	      lra_assert (base != NULL_RTX);
    423  1.1  mrg 	      last = get_last_insn ();
    424  1.1  mrg 	      rtx_insn *move_insn =
    425  1.1  mrg 		emit_move_insn (x, gen_rtx_PLUS (GET_MODE (base), base, disp));
    426  1.1  mrg 	      if (recog_memoized (move_insn) < 0)
    427  1.1  mrg 		{
    428  1.1  mrg 		  delete_insns_since (last);
    429  1.1  mrg 		  /* Generate x = disp; x = x + base.  */
    430  1.1  mrg 		  emit_move_insn (x, disp);
    431  1.1  mrg 		  rtx_insn *add2_insn = emit_add2_insn (x, base);
    432  1.1  mrg 		  lra_assert (add2_insn != NULL_RTX);
    433  1.1  mrg 		}
    434  1.1  mrg 	      /* Generate x = x + index.  */
    435  1.1  mrg 	      if (index != NULL_RTX)
    436  1.1  mrg 		{
    437  1.1  mrg 		  rtx_insn *insn = emit_add2_insn (x, index);
    438  1.1  mrg 		  lra_assert (insn != NULL_RTX);
    439  1.1  mrg 		}
    440  1.1  mrg 	    }
    441  1.1  mrg 	  else
    442  1.1  mrg 	    {
    443  1.1  mrg 	      /* Try x = index_scale; x = x + disp; x = x + base.  */
    444  1.1  mrg 	      last = get_last_insn ();
    445  1.1  mrg 	      rtx_insn *move_insn = emit_move_insn (x, index_scale);
    446  1.1  mrg 	      ok_p = false;
    447  1.1  mrg 	      if (recog_memoized (move_insn) >= 0)
    448  1.1  mrg 		{
    449  1.1  mrg 		  rtx_insn *insn = emit_add2_insn (x, disp);
    450  1.1  mrg 		  if (insn != NULL_RTX)
    451  1.1  mrg 		    {
    452  1.1  mrg 		      if (base == NULL_RTX)
    453  1.1  mrg 			ok_p = true;
    454  1.1  mrg 		      else
    455  1.1  mrg 			{
    456  1.1  mrg 			  insn = emit_add2_insn (x, base);
    457  1.1  mrg 			  if (insn != NULL_RTX)
    458  1.1  mrg 			    ok_p = true;
    459  1.1  mrg 			}
    460  1.1  mrg 		    }
    461  1.1  mrg 		}
    462  1.1  mrg 	      if (! ok_p)
    463  1.1  mrg 		{
    464  1.1  mrg 		  rtx_insn *insn;
    465  1.1  mrg 
    466  1.1  mrg 		  delete_insns_since (last);
    467  1.1  mrg 		  /* Generate x = disp; x = x + base; x = x + index_scale.  */
    468  1.1  mrg 		  emit_move_insn (x, disp);
    469  1.1  mrg 		  if (base != NULL_RTX)
    470  1.1  mrg 		    {
    471  1.1  mrg 		      insn = emit_add2_insn (x, base);
    472  1.1  mrg 		      lra_assert (insn != NULL_RTX);
    473  1.1  mrg 		    }
    474  1.1  mrg 		  insn = emit_add2_insn (x, index_scale);
    475  1.1  mrg 		  lra_assert (insn != NULL_RTX);
    476  1.1  mrg 		}
    477  1.1  mrg 	    }
    478  1.1  mrg 	}
    479  1.1  mrg     }
    480  1.1  mrg   /* Functions emit_... can create pseudos -- so expand the pseudo
    481  1.1  mrg      data.  */
    482  1.1  mrg   if (old != max_reg_num ())
    483  1.1  mrg     expand_reg_data (old);
    484  1.1  mrg }
    485  1.1  mrg 
    486  1.1  mrg /* The number of emitted reload insns so far.  */
    487  1.1  mrg int lra_curr_reload_num;
    488  1.1  mrg 
    489  1.1  mrg static void remove_insn_scratches (rtx_insn *insn);
    490  1.1  mrg 
    491  1.1  mrg /* Emit x := y, processing special case when y = u + v or y = u + v *
    492  1.1  mrg    scale + w through emit_add (Y can be an address which is base +
    493  1.1  mrg    index reg * scale + displacement in general case).  X may be used
    494  1.1  mrg    as intermediate result therefore it should be not in Y.  */
    495  1.1  mrg void
    496  1.1  mrg lra_emit_move (rtx x, rtx y)
    497  1.1  mrg {
    498  1.1  mrg   int old;
    499  1.1  mrg   rtx_insn *insn;
    500  1.1  mrg 
    501  1.1  mrg   if (GET_CODE (y) != PLUS)
    502  1.1  mrg     {
    503  1.1  mrg       if (rtx_equal_p (x, y))
    504  1.1  mrg 	return;
    505  1.1  mrg       old = max_reg_num ();
    506  1.1  mrg 
    507  1.1  mrg       insn = (GET_CODE (x) != STRICT_LOW_PART
    508  1.1  mrg 	      ? emit_move_insn (x, y) : emit_insn (gen_rtx_SET (x, y)));
    509  1.1  mrg       /* The move pattern may require scratch registers, so convert them
    510  1.1  mrg 	 into real registers now.  */
    511  1.1  mrg       if (insn != NULL_RTX)
    512  1.1  mrg 	remove_insn_scratches (insn);
    513  1.1  mrg       if (REG_P (x))
    514  1.1  mrg 	lra_reg_info[ORIGINAL_REGNO (x)].last_reload = ++lra_curr_reload_num;
    515  1.1  mrg       /* Function emit_move can create pseudos -- so expand the pseudo
    516  1.1  mrg 	 data.	*/
    517  1.1  mrg       if (old != max_reg_num ())
    518  1.1  mrg 	expand_reg_data (old);
    519  1.1  mrg       return;
    520  1.1  mrg     }
    521  1.1  mrg   lra_emit_add (x, XEXP (y, 0), XEXP (y, 1));
    522  1.1  mrg }
    523  1.1  mrg 
    524  1.1  mrg /* Update insn operands which are duplication of operands whose
    525  1.1  mrg    numbers are in array of NOPS (with end marker -1).  The insn is
    526  1.1  mrg    represented by its LRA internal representation ID.  */
    527  1.1  mrg void
    528  1.1  mrg lra_update_dups (lra_insn_recog_data_t id, signed char *nops)
    529  1.1  mrg {
    530  1.1  mrg   int i, j, nop;
    531  1.1  mrg   struct lra_static_insn_data *static_id = id->insn_static_data;
    532  1.1  mrg 
    533  1.1  mrg   for (i = 0; i < static_id->n_dups; i++)
    534  1.1  mrg     for (j = 0; (nop = nops[j]) >= 0; j++)
    535  1.1  mrg       if (static_id->dup_num[i] == nop)
    536  1.1  mrg 	*id->dup_loc[i] = *id->operand_loc[nop];
    537  1.1  mrg }
    538  1.1  mrg 
    539  1.1  mrg 
    540  1.1  mrg 
    542  1.1  mrg /* This page contains code dealing with info about registers in the
    543  1.1  mrg    insns.  */
    544  1.1  mrg 
    545  1.1  mrg /* Pools for insn reg info.  */
    546  1.1  mrg object_allocator<lra_insn_reg> lra_insn_reg_pool ("insn regs");
    547  1.1  mrg 
    548  1.1  mrg /* Create LRA insn related info about a reference to REGNO in INSN
    549  1.1  mrg    with TYPE (in/out/inout), biggest reference mode MODE, flag that it
    550  1.1  mrg    is reference through subreg (SUBREG_P), and reference to the next
    551  1.1  mrg    insn reg info (NEXT).  If REGNO can be early clobbered,
    552  1.1  mrg    alternatives in which it can be early clobbered are given by
    553  1.1  mrg    EARLY_CLOBBER_ALTS.  */
    554  1.1  mrg static struct lra_insn_reg *
    555  1.1  mrg new_insn_reg (rtx_insn *insn, int regno, enum op_type type,
    556  1.1  mrg 	      machine_mode mode, bool subreg_p,
    557  1.1  mrg 	      alternative_mask early_clobber_alts,
    558  1.1  mrg 	      struct lra_insn_reg *next)
    559  1.1  mrg {
    560  1.1  mrg   lra_insn_reg *ir = lra_insn_reg_pool.allocate ();
    561  1.1  mrg   ir->type = type;
    562  1.1  mrg   ir->biggest_mode = mode;
    563  1.1  mrg   if (NONDEBUG_INSN_P (insn)
    564  1.1  mrg       && partial_subreg_p (lra_reg_info[regno].biggest_mode, mode))
    565  1.1  mrg     lra_reg_info[regno].biggest_mode = mode;
    566  1.1  mrg   ir->subreg_p = subreg_p;
    567  1.1  mrg   ir->early_clobber_alts = early_clobber_alts;
    568  1.1  mrg   ir->regno = regno;
    569  1.1  mrg   ir->next = next;
    570  1.1  mrg   return ir;
    571  1.1  mrg }
    572  1.1  mrg 
    573  1.1  mrg /* Free insn reg info list IR.	*/
    574  1.1  mrg static void
    575  1.1  mrg free_insn_regs (struct lra_insn_reg *ir)
    576  1.1  mrg {
    577  1.1  mrg   struct lra_insn_reg *next_ir;
    578  1.1  mrg 
    579  1.1  mrg   for (; ir != NULL; ir = next_ir)
    580  1.1  mrg     {
    581  1.1  mrg       next_ir = ir->next;
    582  1.1  mrg       lra_insn_reg_pool.remove (ir);
    583  1.1  mrg     }
    584  1.1  mrg }
    585  1.1  mrg 
    586  1.1  mrg /* Finish pool for insn reg info.  */
    587  1.1  mrg static void
    588  1.1  mrg finish_insn_regs (void)
    589  1.1  mrg {
    590  1.1  mrg   lra_insn_reg_pool.release ();
    591  1.1  mrg }
    592  1.1  mrg 
    593  1.1  mrg 
    594  1.1  mrg 
    596  1.1  mrg /* This page contains code dealing LRA insn info (or in other words
    597  1.1  mrg    LRA internal insn representation).  */
    598  1.1  mrg 
    599  1.1  mrg /* Map INSN_CODE -> the static insn data.  This info is valid during
    600  1.1  mrg    all translation unit.  */
    601  1.1  mrg struct lra_static_insn_data *insn_code_data[NUM_INSN_CODES];
    602  1.1  mrg 
    603  1.1  mrg /* Debug insns are represented as a special insn with one input
    604  1.1  mrg    operand which is RTL expression in var_location.  */
    605  1.1  mrg 
    606  1.1  mrg /* The following data are used as static insn operand data for all
    607  1.1  mrg    debug insns.	 If structure lra_operand_data is changed, the
    608  1.1  mrg    initializer should be changed too.  */
    609  1.1  mrg static struct lra_operand_data debug_operand_data =
    610  1.1  mrg   {
    611  1.1  mrg     NULL, /* alternative  */
    612  1.1  mrg     0, /* early_clobber_alts */
    613  1.1  mrg     E_VOIDmode, /* We are not interesting in the operand mode.  */
    614  1.1  mrg     OP_IN,
    615  1.1  mrg     0, 0, 0
    616  1.1  mrg   };
    617  1.1  mrg 
    618  1.1  mrg /* The following data are used as static insn data for all debug
    619  1.1  mrg    bind insns.  If structure lra_static_insn_data is changed, the
    620  1.1  mrg    initializer should be changed too.  */
    621  1.1  mrg static struct lra_static_insn_data debug_bind_static_data =
    622  1.1  mrg   {
    623  1.1  mrg     &debug_operand_data,
    624  1.1  mrg     0,	/* Duplication operands #.  */
    625  1.1  mrg     -1, /* Commutative operand #.  */
    626  1.1  mrg     1,	/* Operands #.	There is only one operand which is debug RTL
    627  1.1  mrg 	   expression.	*/
    628  1.1  mrg     0,	/* Duplications #.  */
    629  1.1  mrg     0,	/* Alternatives #.  We are not interesting in alternatives
    630  1.1  mrg 	   because we does not proceed debug_insns for reloads.	 */
    631  1.1  mrg     NULL, /* Hard registers referenced in machine description.	*/
    632  1.1  mrg     NULL  /* Descriptions of operands in alternatives.	*/
    633  1.1  mrg   };
    634  1.1  mrg 
    635  1.1  mrg /* The following data are used as static insn data for all debug
    636  1.1  mrg    marker insns.  If structure lra_static_insn_data is changed, the
    637  1.1  mrg    initializer should be changed too.  */
    638  1.1  mrg static struct lra_static_insn_data debug_marker_static_data =
    639  1.1  mrg   {
    640  1.1  mrg     &debug_operand_data,
    641  1.1  mrg     0,	/* Duplication operands #.  */
    642  1.1  mrg     -1, /* Commutative operand #.  */
    643  1.1  mrg     0,	/* Operands #.	There isn't any operand.  */
    644  1.1  mrg     0,	/* Duplications #.  */
    645  1.1  mrg     0,	/* Alternatives #.  We are not interesting in alternatives
    646  1.1  mrg 	   because we does not proceed debug_insns for reloads.	 */
    647  1.1  mrg     NULL, /* Hard registers referenced in machine description.	*/
    648  1.1  mrg     NULL  /* Descriptions of operands in alternatives.	*/
    649  1.1  mrg   };
    650  1.1  mrg 
    651  1.1  mrg /* Called once per compiler work to initialize some LRA data related
    652  1.1  mrg    to insns.  */
    653  1.1  mrg static void
    654  1.1  mrg init_insn_code_data_once (void)
    655  1.1  mrg {
    656  1.1  mrg   memset (insn_code_data, 0, sizeof (insn_code_data));
    657  1.1  mrg }
    658  1.1  mrg 
    659  1.1  mrg /* Called once per compiler work to finalize some LRA data related to
    660  1.1  mrg    insns.  */
    661  1.1  mrg static void
    662  1.1  mrg finish_insn_code_data_once (void)
    663  1.1  mrg {
    664  1.1  mrg   for (unsigned int i = 0; i < NUM_INSN_CODES; i++)
    665  1.1  mrg     {
    666  1.1  mrg       if (insn_code_data[i] != NULL)
    667  1.1  mrg 	{
    668  1.1  mrg 	  free (insn_code_data[i]);
    669  1.1  mrg 	  insn_code_data[i] = NULL;
    670  1.1  mrg 	}
    671  1.1  mrg     }
    672  1.1  mrg }
    673  1.1  mrg 
    674  1.1  mrg /* Return static insn data, allocate and setup if necessary.  Although
    675  1.1  mrg    dup_num is static data (it depends only on icode), to set it up we
    676  1.1  mrg    need to extract insn first.	So recog_data should be valid for
    677  1.1  mrg    normal insn (ICODE >= 0) before the call.  */
    678  1.1  mrg static struct lra_static_insn_data *
    679  1.1  mrg get_static_insn_data (int icode, int nop, int ndup, int nalt)
    680  1.1  mrg {
    681  1.1  mrg   struct lra_static_insn_data *data;
    682  1.1  mrg   size_t n_bytes;
    683  1.1  mrg 
    684  1.1  mrg   lra_assert (icode < (int) NUM_INSN_CODES);
    685  1.1  mrg   if (icode >= 0 && (data = insn_code_data[icode]) != NULL)
    686  1.1  mrg     return data;
    687  1.1  mrg   lra_assert (nop >= 0 && ndup >= 0 && nalt >= 0);
    688  1.1  mrg   n_bytes = sizeof (struct lra_static_insn_data)
    689  1.1  mrg 	    + sizeof (struct lra_operand_data) * nop
    690  1.1  mrg 	    + sizeof (int) * ndup;
    691  1.1  mrg   data = XNEWVAR (struct lra_static_insn_data, n_bytes);
    692  1.1  mrg   data->operand_alternative = NULL;
    693  1.1  mrg   data->n_operands = nop;
    694  1.1  mrg   data->n_dups = ndup;
    695  1.1  mrg   data->n_alternatives = nalt;
    696  1.1  mrg   data->operand = ((struct lra_operand_data *)
    697  1.1  mrg 		   ((char *) data + sizeof (struct lra_static_insn_data)));
    698  1.1  mrg   data->dup_num = ((int *) ((char *) data->operand
    699  1.1  mrg 			    + sizeof (struct lra_operand_data) * nop));
    700  1.1  mrg   if (icode >= 0)
    701  1.1  mrg     {
    702  1.1  mrg       int i;
    703  1.1  mrg 
    704  1.1  mrg       insn_code_data[icode] = data;
    705  1.1  mrg       for (i = 0; i < nop; i++)
    706  1.1  mrg 	{
    707  1.1  mrg 	  data->operand[i].constraint
    708  1.1  mrg 	    = insn_data[icode].operand[i].constraint;
    709  1.1  mrg 	  data->operand[i].mode = insn_data[icode].operand[i].mode;
    710  1.1  mrg 	  data->operand[i].strict_low = insn_data[icode].operand[i].strict_low;
    711  1.1  mrg 	  data->operand[i].is_operator
    712  1.1  mrg 	    = insn_data[icode].operand[i].is_operator;
    713  1.1  mrg 	  data->operand[i].type
    714  1.1  mrg 	    = (data->operand[i].constraint[0] == '=' ? OP_OUT
    715  1.1  mrg 	       : data->operand[i].constraint[0] == '+' ? OP_INOUT
    716  1.1  mrg 	       : OP_IN);
    717  1.1  mrg 	  data->operand[i].is_address = false;
    718  1.1  mrg 	}
    719  1.1  mrg       for (i = 0; i < ndup; i++)
    720  1.1  mrg 	data->dup_num[i] = recog_data.dup_num[i];
    721  1.1  mrg     }
    722  1.1  mrg   return data;
    723  1.1  mrg }
    724  1.1  mrg 
    725  1.1  mrg /* The current length of the following array.  */
    726  1.1  mrg int lra_insn_recog_data_len;
    727  1.1  mrg 
    728  1.1  mrg /* Map INSN_UID -> the insn recog data (NULL if unknown).  */
    729  1.1  mrg lra_insn_recog_data_t *lra_insn_recog_data;
    730  1.1  mrg 
    731  1.1  mrg /* Alloc pool we allocate entries for lra_insn_recog_data from.  */
    732  1.1  mrg static object_allocator<class lra_insn_recog_data>
    733  1.1  mrg   lra_insn_recog_data_pool ("insn recog data pool");
    734  1.1  mrg 
    735  1.1  mrg /* Initialize LRA data about insns.  */
    736  1.1  mrg static void
    737  1.1  mrg init_insn_recog_data (void)
    738  1.1  mrg {
    739  1.1  mrg   lra_insn_recog_data_len = 0;
    740  1.1  mrg   lra_insn_recog_data = NULL;
    741  1.1  mrg }
    742  1.1  mrg 
    743  1.1  mrg /* Expand, if necessary, LRA data about insns.	*/
    744  1.1  mrg static void
    745  1.1  mrg check_and_expand_insn_recog_data (int index)
    746  1.1  mrg {
    747  1.1  mrg   int i, old;
    748  1.1  mrg 
    749  1.1  mrg   if (lra_insn_recog_data_len > index)
    750  1.1  mrg     return;
    751  1.1  mrg   old = lra_insn_recog_data_len;
    752  1.1  mrg   lra_insn_recog_data_len = index * 3 / 2 + 1;
    753  1.1  mrg   lra_insn_recog_data = XRESIZEVEC (lra_insn_recog_data_t,
    754  1.1  mrg 				    lra_insn_recog_data,
    755  1.1  mrg 				    lra_insn_recog_data_len);
    756  1.1  mrg   for (i = old; i < lra_insn_recog_data_len; i++)
    757  1.1  mrg     lra_insn_recog_data[i] = NULL;
    758  1.1  mrg }
    759  1.1  mrg 
    760  1.1  mrg /* Finish LRA DATA about insn.	*/
    761  1.1  mrg static void
    762  1.1  mrg free_insn_recog_data (lra_insn_recog_data_t data)
    763  1.1  mrg {
    764  1.1  mrg   if (data->operand_loc != NULL)
    765  1.1  mrg     free (data->operand_loc);
    766  1.1  mrg   if (data->dup_loc != NULL)
    767  1.1  mrg     free (data->dup_loc);
    768  1.1  mrg   if (data->arg_hard_regs != NULL)
    769  1.1  mrg     free (data->arg_hard_regs);
    770  1.1  mrg   if (data->icode < 0 && NONDEBUG_INSN_P (data->insn))
    771  1.1  mrg     {
    772  1.1  mrg       if (data->insn_static_data->operand_alternative != NULL)
    773  1.1  mrg 	free (const_cast <operand_alternative *>
    774  1.1  mrg 	      (data->insn_static_data->operand_alternative));
    775  1.1  mrg       free_insn_regs (data->insn_static_data->hard_regs);
    776  1.1  mrg       free (data->insn_static_data);
    777  1.1  mrg     }
    778  1.1  mrg   free_insn_regs (data->regs);
    779  1.1  mrg   data->regs = NULL;
    780  1.1  mrg   lra_insn_recog_data_pool.remove (data);
    781  1.1  mrg }
    782  1.1  mrg 
    783  1.1  mrg /* Pools for copies.  */
    784  1.1  mrg static object_allocator<lra_copy> lra_copy_pool ("lra copies");
    785  1.1  mrg 
    786  1.1  mrg /* Finish LRA data about all insns.  */
    787  1.1  mrg static void
    788  1.1  mrg finish_insn_recog_data (void)
    789  1.1  mrg {
    790  1.1  mrg   int i;
    791  1.1  mrg   lra_insn_recog_data_t data;
    792  1.1  mrg 
    793  1.1  mrg   for (i = 0; i < lra_insn_recog_data_len; i++)
    794  1.1  mrg     if ((data = lra_insn_recog_data[i]) != NULL)
    795  1.1  mrg       free_insn_recog_data (data);
    796  1.1  mrg   finish_insn_regs ();
    797  1.1  mrg   lra_copy_pool.release ();
    798  1.1  mrg   lra_insn_reg_pool.release ();
    799  1.1  mrg   lra_insn_recog_data_pool.release ();
    800  1.1  mrg   free (lra_insn_recog_data);
    801  1.1  mrg }
    802  1.1  mrg 
    803  1.1  mrg /* Setup info about operands in alternatives of LRA DATA of insn.  */
    804  1.1  mrg static void
    805  1.1  mrg setup_operand_alternative (lra_insn_recog_data_t data,
    806  1.1  mrg 			   const operand_alternative *op_alt)
    807  1.1  mrg {
    808  1.1  mrg   int i, j, nop, nalt;
    809  1.1  mrg   int icode = data->icode;
    810  1.1  mrg   struct lra_static_insn_data *static_data = data->insn_static_data;
    811  1.1  mrg 
    812  1.1  mrg   static_data->commutative = -1;
    813  1.1  mrg   nop = static_data->n_operands;
    814  1.1  mrg   nalt = static_data->n_alternatives;
    815  1.1  mrg   static_data->operand_alternative = op_alt;
    816  1.1  mrg   for (i = 0; i < nop; i++)
    817  1.1  mrg     {
    818  1.1  mrg       static_data->operand[i].early_clobber_alts = 0;
    819  1.1  mrg       static_data->operand[i].is_address = false;
    820  1.1  mrg       if (static_data->operand[i].constraint[0] == '%')
    821  1.1  mrg 	{
    822  1.1  mrg 	  /* We currently only support one commutative pair of operands.  */
    823  1.1  mrg 	  if (static_data->commutative < 0)
    824  1.1  mrg 	    static_data->commutative = i;
    825  1.1  mrg 	  else
    826  1.1  mrg 	    lra_assert (icode < 0); /* Asm  */
    827  1.1  mrg 	  /* The last operand should not be marked commutative.  */
    828  1.1  mrg 	  lra_assert (i != nop - 1);
    829  1.1  mrg 	}
    830  1.1  mrg     }
    831  1.1  mrg   for (j = 0; j < nalt; j++)
    832  1.1  mrg     for (i = 0; i < nop; i++, op_alt++)
    833  1.1  mrg       {
    834  1.1  mrg 	if (op_alt->earlyclobber)
    835  1.1  mrg 	  static_data->operand[i].early_clobber_alts |= (alternative_mask) 1 << j;
    836  1.1  mrg 	static_data->operand[i].is_address |= op_alt->is_address;
    837  1.1  mrg       }
    838  1.1  mrg }
    839  1.1  mrg 
    840  1.1  mrg /* Recursively process X and collect info about registers, which are
    841  1.1  mrg    not the insn operands, in X with TYPE (in/out/inout) and flag that
    842  1.1  mrg    it is early clobbered in the insn (EARLY_CLOBBER) and add the info
    843  1.1  mrg    to LIST.  X is a part of insn given by DATA.	 Return the result
    844  1.1  mrg    list.  */
    845  1.1  mrg static struct lra_insn_reg *
    846  1.1  mrg collect_non_operand_hard_regs (rtx_insn *insn, rtx *x,
    847  1.1  mrg 			       lra_insn_recog_data_t data,
    848  1.1  mrg 			       struct lra_insn_reg *list,
    849  1.1  mrg 			       enum op_type type, bool early_clobber)
    850  1.1  mrg {
    851  1.1  mrg   int i, j, regno, last;
    852  1.1  mrg   bool subreg_p;
    853  1.1  mrg   machine_mode mode;
    854  1.1  mrg   struct lra_insn_reg *curr;
    855  1.1  mrg   rtx op = *x;
    856  1.1  mrg   enum rtx_code code = GET_CODE (op);
    857  1.1  mrg   const char *fmt = GET_RTX_FORMAT (code);
    858  1.1  mrg 
    859  1.1  mrg   for (i = 0; i < data->insn_static_data->n_operands; i++)
    860  1.1  mrg     if (! data->insn_static_data->operand[i].is_operator
    861  1.1  mrg 	&& x == data->operand_loc[i])
    862  1.1  mrg       /* It is an operand loc. Stop here.  */
    863  1.1  mrg       return list;
    864  1.1  mrg   for (i = 0; i < data->insn_static_data->n_dups; i++)
    865  1.1  mrg     if (x == data->dup_loc[i])
    866  1.1  mrg       /* It is a dup loc. Stop here.  */
    867  1.1  mrg       return list;
    868  1.1  mrg   mode = GET_MODE (op);
    869  1.1  mrg   subreg_p = false;
    870  1.1  mrg   if (code == SUBREG)
    871  1.1  mrg     {
    872  1.1  mrg       mode = wider_subreg_mode (op);
    873  1.1  mrg       if (read_modify_subreg_p (op))
    874  1.1  mrg 	subreg_p = true;
    875  1.1  mrg       op = SUBREG_REG (op);
    876  1.1  mrg       code = GET_CODE (op);
    877  1.1  mrg     }
    878  1.1  mrg   if (REG_P (op))
    879  1.1  mrg     {
    880  1.1  mrg       if ((regno = REGNO (op)) >= FIRST_PSEUDO_REGISTER)
    881  1.1  mrg 	return list;
    882  1.1  mrg       /* Process all regs even unallocatable ones as we need info
    883  1.1  mrg 	 about all regs for rematerialization pass.  */
    884  1.1  mrg       for (last = end_hard_regno (mode, regno); regno < last; regno++)
    885  1.1  mrg 	{
    886  1.1  mrg 	  for (curr = list; curr != NULL; curr = curr->next)
    887  1.1  mrg 	    if (curr->regno == regno && curr->subreg_p == subreg_p
    888  1.1  mrg 		&& curr->biggest_mode == mode)
    889  1.1  mrg 	      {
    890  1.1  mrg 		if (curr->type != type)
    891  1.1  mrg 		  curr->type = OP_INOUT;
    892  1.1  mrg 		if (early_clobber)
    893  1.1  mrg 		  curr->early_clobber_alts = ALL_ALTERNATIVES;
    894  1.1  mrg 		break;
    895  1.1  mrg 	      }
    896  1.1  mrg 	  if (curr == NULL)
    897  1.1  mrg 	    {
    898  1.1  mrg 	      /* This is a new hard regno or the info cannot be
    899  1.1  mrg 		 integrated into the found structure.	 */
    900  1.1  mrg #ifdef STACK_REGS
    901  1.1  mrg 	      early_clobber
    902  1.1  mrg 		= (early_clobber
    903  1.1  mrg 		   /* This clobber is to inform popping floating
    904  1.1  mrg 		      point stack only.  */
    905  1.1  mrg 		   && ! (FIRST_STACK_REG <= regno
    906  1.1  mrg 			 && regno <= LAST_STACK_REG));
    907  1.1  mrg #endif
    908  1.1  mrg 	      list = new_insn_reg (data->insn, regno, type, mode, subreg_p,
    909  1.1  mrg 				   early_clobber ? ALL_ALTERNATIVES : 0, list);
    910  1.1  mrg 	    }
    911  1.1  mrg 	}
    912  1.1  mrg       return list;
    913  1.1  mrg     }
    914  1.1  mrg   switch (code)
    915  1.1  mrg     {
    916  1.1  mrg     case SET:
    917  1.1  mrg       list = collect_non_operand_hard_regs (insn, &SET_DEST (op), data,
    918  1.1  mrg 					    list, OP_OUT, false);
    919  1.1  mrg       list = collect_non_operand_hard_regs (insn, &SET_SRC (op), data,
    920  1.1  mrg 					    list, OP_IN, false);
    921  1.1  mrg       break;
    922  1.1  mrg     case CLOBBER:
    923  1.1  mrg       /* We treat clobber of non-operand hard registers as early clobber.  */
    924  1.1  mrg       list = collect_non_operand_hard_regs (insn, &XEXP (op, 0), data,
    925  1.1  mrg 					    list, OP_OUT, true);
    926  1.1  mrg       break;
    927  1.1  mrg     case PRE_INC: case PRE_DEC: case POST_INC: case POST_DEC:
    928  1.1  mrg       list = collect_non_operand_hard_regs (insn, &XEXP (op, 0), data,
    929  1.1  mrg 					    list, OP_INOUT, false);
    930  1.1  mrg       break;
    931  1.1  mrg     case PRE_MODIFY: case POST_MODIFY:
    932  1.1  mrg       list = collect_non_operand_hard_regs (insn, &XEXP (op, 0), data,
    933  1.1  mrg 					    list, OP_INOUT, false);
    934  1.1  mrg       list = collect_non_operand_hard_regs (insn, &XEXP (op, 1), data,
    935  1.1  mrg 					    list, OP_IN, false);
    936  1.1  mrg       break;
    937  1.1  mrg     default:
    938  1.1  mrg       fmt = GET_RTX_FORMAT (code);
    939  1.1  mrg       for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
    940  1.1  mrg 	{
    941  1.1  mrg 	  if (fmt[i] == 'e')
    942  1.1  mrg 	    list = collect_non_operand_hard_regs (insn, &XEXP (op, i), data,
    943  1.1  mrg 						  list, OP_IN, false);
    944  1.1  mrg 	  else if (fmt[i] == 'E')
    945  1.1  mrg 	    for (j = XVECLEN (op, i) - 1; j >= 0; j--)
    946  1.1  mrg 	      list = collect_non_operand_hard_regs (insn, &XVECEXP (op, i, j),
    947  1.1  mrg 						    data, list, OP_IN, false);
    948  1.1  mrg 	}
    949  1.1  mrg     }
    950  1.1  mrg   return list;
    951  1.1  mrg }
    952  1.1  mrg 
    953  1.1  mrg /* Set up and return info about INSN.  Set up the info if it is not set up
    954  1.1  mrg    yet.	 */
    955  1.1  mrg lra_insn_recog_data_t
    956  1.1  mrg lra_set_insn_recog_data (rtx_insn *insn)
    957  1.1  mrg {
    958  1.1  mrg   lra_insn_recog_data_t data;
    959  1.1  mrg   int i, n, icode;
    960  1.1  mrg   rtx **locs;
    961  1.1  mrg   unsigned int uid = INSN_UID (insn);
    962  1.1  mrg   struct lra_static_insn_data *insn_static_data;
    963  1.1  mrg 
    964  1.1  mrg   check_and_expand_insn_recog_data (uid);
    965  1.1  mrg   if (DEBUG_INSN_P (insn))
    966  1.1  mrg     icode = -1;
    967  1.1  mrg   else
    968  1.1  mrg     {
    969  1.1  mrg       icode = INSN_CODE (insn);
    970  1.1  mrg       if (icode < 0)
    971  1.1  mrg 	/* It might be a new simple insn which is not recognized yet.  */
    972  1.1  mrg 	INSN_CODE (insn) = icode = recog_memoized (insn);
    973  1.1  mrg     }
    974  1.1  mrg   data = lra_insn_recog_data_pool.allocate ();
    975  1.1  mrg   lra_insn_recog_data[uid] = data;
    976  1.1  mrg   data->insn = insn;
    977  1.1  mrg   data->used_insn_alternative = LRA_UNKNOWN_ALT;
    978  1.1  mrg   data->icode = icode;
    979  1.1  mrg   data->regs = NULL;
    980  1.1  mrg   if (DEBUG_INSN_P (insn))
    981  1.1  mrg     {
    982  1.1  mrg       data->dup_loc = NULL;
    983  1.1  mrg       data->arg_hard_regs = NULL;
    984  1.1  mrg       data->preferred_alternatives = ALL_ALTERNATIVES;
    985  1.1  mrg       if (DEBUG_BIND_INSN_P (insn))
    986  1.1  mrg 	{
    987  1.1  mrg 	  data->insn_static_data = &debug_bind_static_data;
    988  1.1  mrg 	  data->operand_loc = XNEWVEC (rtx *, 1);
    989  1.1  mrg 	  data->operand_loc[0] = &INSN_VAR_LOCATION_LOC (insn);
    990  1.1  mrg 	}
    991  1.1  mrg       else if (DEBUG_MARKER_INSN_P (insn))
    992  1.1  mrg 	{
    993  1.1  mrg 	  data->insn_static_data = &debug_marker_static_data;
    994  1.1  mrg 	  data->operand_loc = NULL;
    995  1.1  mrg 	}
    996  1.1  mrg       return data;
    997  1.1  mrg     }
    998  1.1  mrg   if (icode < 0)
    999  1.1  mrg     {
   1000  1.1  mrg       int nop, nalt;
   1001  1.1  mrg       machine_mode operand_mode[MAX_RECOG_OPERANDS];
   1002  1.1  mrg       const char *constraints[MAX_RECOG_OPERANDS];
   1003  1.1  mrg 
   1004  1.1  mrg       nop = asm_noperands (PATTERN (insn));
   1005  1.1  mrg       data->operand_loc = data->dup_loc = NULL;
   1006  1.1  mrg       nalt = 1;
   1007  1.1  mrg       if (nop < 0)
   1008  1.1  mrg 	{
   1009  1.1  mrg 	  /* It is a special insn like USE or CLOBBER.  We should
   1010  1.1  mrg 	     recognize any regular insn otherwise LRA can do nothing
   1011  1.1  mrg 	     with this insn.  */
   1012  1.1  mrg 	  gcc_assert (GET_CODE (PATTERN (insn)) == USE
   1013  1.1  mrg 		      || GET_CODE (PATTERN (insn)) == CLOBBER
   1014  1.1  mrg 		      || GET_CODE (PATTERN (insn)) == ASM_INPUT);
   1015  1.1  mrg 	  data->insn_static_data = insn_static_data
   1016  1.1  mrg 	    = get_static_insn_data (-1, 0, 0, nalt);
   1017  1.1  mrg 	}
   1018  1.1  mrg       else
   1019  1.1  mrg 	{
   1020  1.1  mrg 	  /* expand_asm_operands makes sure there aren't too many
   1021  1.1  mrg 	     operands.	*/
   1022  1.1  mrg 	  lra_assert (nop <= MAX_RECOG_OPERANDS);
   1023  1.1  mrg 	  if (nop != 0)
   1024  1.1  mrg 	    data->operand_loc = XNEWVEC (rtx *, nop);
   1025  1.1  mrg 	  /* Now get the operand values and constraints out of the
   1026  1.1  mrg 	     insn.  */
   1027  1.1  mrg 	  decode_asm_operands (PATTERN (insn), NULL,
   1028  1.1  mrg 			       data->operand_loc,
   1029  1.1  mrg 			       constraints, operand_mode, NULL);
   1030  1.1  mrg 	  if (nop > 0)
   1031  1.1  mrg 	    for (const char *p =constraints[0]; *p; p++)
   1032  1.1  mrg 	      nalt += *p == ',';
   1033  1.1  mrg 	  data->insn_static_data = insn_static_data
   1034  1.1  mrg 	    = get_static_insn_data (-1, nop, 0, nalt);
   1035  1.1  mrg 	  for (i = 0; i < nop; i++)
   1036  1.1  mrg 	    {
   1037  1.1  mrg 	      insn_static_data->operand[i].mode = operand_mode[i];
   1038  1.1  mrg 	      insn_static_data->operand[i].constraint = constraints[i];
   1039  1.1  mrg 	      insn_static_data->operand[i].strict_low = false;
   1040  1.1  mrg 	      insn_static_data->operand[i].is_operator = false;
   1041  1.1  mrg 	      insn_static_data->operand[i].is_address = false;
   1042  1.1  mrg 	    }
   1043  1.1  mrg 	}
   1044  1.1  mrg       for (i = 0; i < insn_static_data->n_operands; i++)
   1045  1.1  mrg 	insn_static_data->operand[i].type
   1046  1.1  mrg 	  = (insn_static_data->operand[i].constraint[0] == '=' ? OP_OUT
   1047  1.1  mrg 	     : insn_static_data->operand[i].constraint[0] == '+' ? OP_INOUT
   1048  1.1  mrg 	     : OP_IN);
   1049  1.1  mrg       data->preferred_alternatives = ALL_ALTERNATIVES;
   1050  1.1  mrg       if (nop > 0)
   1051  1.1  mrg 	{
   1052  1.1  mrg 	  operand_alternative *op_alt = XCNEWVEC (operand_alternative,
   1053  1.1  mrg 						  nalt * nop);
   1054  1.1  mrg 	  preprocess_constraints (nop, nalt, constraints, op_alt,
   1055  1.1  mrg 				  data->operand_loc);
   1056  1.1  mrg 	  setup_operand_alternative (data, op_alt);
   1057  1.1  mrg 	}
   1058  1.1  mrg     }
   1059  1.1  mrg   else
   1060  1.1  mrg     {
   1061  1.1  mrg       insn_extract (insn);
   1062  1.1  mrg       data->insn_static_data = insn_static_data
   1063  1.1  mrg 	= get_static_insn_data (icode, insn_data[icode].n_operands,
   1064  1.1  mrg 				insn_data[icode].n_dups,
   1065  1.1  mrg 				insn_data[icode].n_alternatives);
   1066  1.1  mrg       n = insn_static_data->n_operands;
   1067  1.1  mrg       if (n == 0)
   1068  1.1  mrg 	locs = NULL;
   1069  1.1  mrg       else
   1070  1.1  mrg 	{
   1071  1.1  mrg 	  locs = XNEWVEC (rtx *, n);
   1072  1.1  mrg 	  memcpy (locs, recog_data.operand_loc, n * sizeof (rtx *));
   1073  1.1  mrg 	}
   1074  1.1  mrg       data->operand_loc = locs;
   1075  1.1  mrg       n = insn_static_data->n_dups;
   1076  1.1  mrg       if (n == 0)
   1077  1.1  mrg 	locs = NULL;
   1078  1.1  mrg       else
   1079  1.1  mrg 	{
   1080  1.1  mrg 	  locs = XNEWVEC (rtx *, n);
   1081  1.1  mrg 	  memcpy (locs, recog_data.dup_loc, n * sizeof (rtx *));
   1082  1.1  mrg 	}
   1083  1.1  mrg       data->dup_loc = locs;
   1084  1.1  mrg       data->preferred_alternatives = get_preferred_alternatives (insn);
   1085  1.1  mrg       const operand_alternative *op_alt = preprocess_insn_constraints (icode);
   1086  1.1  mrg       if (!insn_static_data->operand_alternative)
   1087  1.1  mrg 	setup_operand_alternative (data, op_alt);
   1088  1.1  mrg       else if (op_alt != insn_static_data->operand_alternative)
   1089  1.1  mrg 	insn_static_data->operand_alternative = op_alt;
   1090  1.1  mrg     }
   1091  1.1  mrg   if (GET_CODE (PATTERN (insn)) == CLOBBER || GET_CODE (PATTERN (insn)) == USE)
   1092  1.1  mrg     insn_static_data->hard_regs = NULL;
   1093  1.1  mrg   else
   1094  1.1  mrg     insn_static_data->hard_regs
   1095  1.1  mrg       = collect_non_operand_hard_regs (insn, &PATTERN (insn), data,
   1096  1.1  mrg 				       NULL, OP_IN, false);
   1097  1.1  mrg   data->arg_hard_regs = NULL;
   1098  1.1  mrg   if (CALL_P (insn))
   1099  1.1  mrg     {
   1100  1.1  mrg       bool use_p;
   1101  1.1  mrg       rtx link;
   1102  1.1  mrg       int n_hard_regs, regno, arg_hard_regs[FIRST_PSEUDO_REGISTER];
   1103  1.1  mrg 
   1104  1.1  mrg       n_hard_regs = 0;
   1105  1.1  mrg       /* Finding implicit hard register usage.	We believe it will be
   1106  1.1  mrg 	 not changed whatever transformations are used.	 Call insns
   1107  1.1  mrg 	 are such example.  */
   1108  1.1  mrg       for (link = CALL_INSN_FUNCTION_USAGE (insn);
   1109  1.1  mrg 	   link != NULL_RTX;
   1110  1.1  mrg 	   link = XEXP (link, 1))
   1111  1.1  mrg 	if (((use_p = GET_CODE (XEXP (link, 0)) == USE)
   1112  1.1  mrg 	     || GET_CODE (XEXP (link, 0)) == CLOBBER)
   1113  1.1  mrg 	    && REG_P (XEXP (XEXP (link, 0), 0)))
   1114  1.1  mrg 	  {
   1115  1.1  mrg 	    regno = REGNO (XEXP (XEXP (link, 0), 0));
   1116  1.1  mrg 	    lra_assert (regno < FIRST_PSEUDO_REGISTER);
   1117  1.1  mrg 	    /* It is an argument register.  */
   1118  1.1  mrg 	    for (i = REG_NREGS (XEXP (XEXP (link, 0), 0)) - 1; i >= 0; i--)
   1119  1.1  mrg 	      arg_hard_regs[n_hard_regs++]
   1120  1.1  mrg 		= regno + i + (use_p ? 0 : FIRST_PSEUDO_REGISTER);
   1121  1.1  mrg 	  }
   1122  1.1  mrg 
   1123  1.1  mrg       if (n_hard_regs != 0)
   1124  1.1  mrg 	{
   1125  1.1  mrg 	  arg_hard_regs[n_hard_regs++] = -1;
   1126  1.1  mrg 	  data->arg_hard_regs = XNEWVEC (int, n_hard_regs);
   1127  1.1  mrg 	  memcpy (data->arg_hard_regs, arg_hard_regs,
   1128  1.1  mrg 		  sizeof (int) * n_hard_regs);
   1129  1.1  mrg 	}
   1130  1.1  mrg     }
   1131  1.1  mrg   /* Some output operand can be recognized only from the context not
   1132  1.1  mrg      from the constraints which are empty in this case.	 Call insn may
   1133  1.1  mrg      contain a hard register in set destination with empty constraint
   1134  1.1  mrg      and extract_insn treats them as an input.	*/
   1135  1.1  mrg   for (i = 0; i < insn_static_data->n_operands; i++)
   1136  1.1  mrg     {
   1137  1.1  mrg       int j;
   1138  1.1  mrg       rtx pat, set;
   1139  1.1  mrg       struct lra_operand_data *operand = &insn_static_data->operand[i];
   1140  1.1  mrg 
   1141  1.1  mrg       /* ??? Should we treat 'X' the same way.	It looks to me that
   1142  1.1  mrg 	 'X' means anything and empty constraint means we do not
   1143  1.1  mrg 	 care.	*/
   1144  1.1  mrg       if (operand->type != OP_IN || *operand->constraint != '\0'
   1145  1.1  mrg 	  || operand->is_operator)
   1146  1.1  mrg 	continue;
   1147  1.1  mrg       pat = PATTERN (insn);
   1148  1.1  mrg       if (GET_CODE (pat) == SET)
   1149  1.1  mrg 	{
   1150  1.1  mrg 	  if (data->operand_loc[i] != &SET_DEST (pat))
   1151  1.1  mrg 	    continue;
   1152  1.1  mrg 	}
   1153  1.1  mrg       else if (GET_CODE (pat) == PARALLEL)
   1154  1.1  mrg 	{
   1155  1.1  mrg 	  for (j = XVECLEN (pat, 0) - 1; j >= 0; j--)
   1156  1.1  mrg 	    {
   1157  1.1  mrg 	      set = XVECEXP (PATTERN (insn), 0, j);
   1158  1.1  mrg 	      if (GET_CODE (set) == SET
   1159  1.1  mrg 		  && &SET_DEST (set) == data->operand_loc[i])
   1160  1.1  mrg 		break;
   1161  1.1  mrg 	    }
   1162  1.1  mrg 	  if (j < 0)
   1163  1.1  mrg 	    continue;
   1164  1.1  mrg 	}
   1165  1.1  mrg       else
   1166  1.1  mrg 	continue;
   1167  1.1  mrg       operand->type = OP_OUT;
   1168  1.1  mrg     }
   1169  1.1  mrg   return data;
   1170  1.1  mrg }
   1171  1.1  mrg 
   1172  1.1  mrg /* Return info about insn give by UID.	The info should be already set
   1173  1.1  mrg    up.	*/
   1174  1.1  mrg static lra_insn_recog_data_t
   1175  1.1  mrg get_insn_recog_data_by_uid (int uid)
   1176  1.1  mrg {
   1177  1.1  mrg   lra_insn_recog_data_t data;
   1178  1.1  mrg 
   1179  1.1  mrg   data = lra_insn_recog_data[uid];
   1180  1.1  mrg   lra_assert (data != NULL);
   1181  1.1  mrg   return data;
   1182  1.1  mrg }
   1183  1.1  mrg 
   1184  1.1  mrg /* Invalidate all info about insn given by its UID.  */
   1185  1.1  mrg static void
   1186  1.1  mrg invalidate_insn_recog_data (int uid)
   1187  1.1  mrg {
   1188  1.1  mrg   lra_insn_recog_data_t data;
   1189  1.1  mrg 
   1190  1.1  mrg   data = lra_insn_recog_data[uid];
   1191  1.1  mrg   lra_assert (data != NULL);
   1192  1.1  mrg   free_insn_recog_data (data);
   1193  1.1  mrg   lra_insn_recog_data[uid] = NULL;
   1194  1.1  mrg }
   1195  1.1  mrg 
   1196  1.1  mrg /* Update all the insn info about INSN.	 It is usually called when
   1197  1.1  mrg    something in the insn was changed.  Return the updated info.	 */
   1198  1.1  mrg lra_insn_recog_data_t
   1199  1.1  mrg lra_update_insn_recog_data (rtx_insn *insn)
   1200  1.1  mrg {
   1201  1.1  mrg   lra_insn_recog_data_t data;
   1202  1.1  mrg   int n;
   1203  1.1  mrg   unsigned int uid = INSN_UID (insn);
   1204  1.1  mrg   struct lra_static_insn_data *insn_static_data;
   1205  1.1  mrg   poly_int64 sp_offset = 0;
   1206  1.1  mrg 
   1207  1.1  mrg   check_and_expand_insn_recog_data (uid);
   1208  1.1  mrg   if ((data = lra_insn_recog_data[uid]) != NULL
   1209  1.1  mrg       && data->icode != INSN_CODE (insn))
   1210  1.1  mrg     {
   1211  1.1  mrg       sp_offset = data->sp_offset;
   1212  1.1  mrg       invalidate_insn_data_regno_info (data, insn, get_insn_freq (insn));
   1213  1.1  mrg       invalidate_insn_recog_data (uid);
   1214  1.1  mrg       data = NULL;
   1215  1.1  mrg     }
   1216  1.1  mrg   if (data == NULL)
   1217  1.1  mrg     {
   1218  1.1  mrg       data = lra_get_insn_recog_data (insn);
   1219  1.1  mrg       /* Initiate or restore SP offset.  */
   1220  1.1  mrg       data->sp_offset = sp_offset;
   1221  1.1  mrg       return data;
   1222  1.1  mrg     }
   1223  1.1  mrg   insn_static_data = data->insn_static_data;
   1224  1.1  mrg   data->used_insn_alternative = LRA_UNKNOWN_ALT;
   1225  1.1  mrg   if (DEBUG_INSN_P (insn))
   1226  1.1  mrg     return data;
   1227  1.1  mrg   if (data->icode < 0)
   1228  1.1  mrg     {
   1229  1.1  mrg       int nop;
   1230  1.1  mrg       machine_mode operand_mode[MAX_RECOG_OPERANDS];
   1231  1.1  mrg       const char *constraints[MAX_RECOG_OPERANDS];
   1232  1.1  mrg 
   1233  1.1  mrg       nop = asm_noperands (PATTERN (insn));
   1234  1.1  mrg       if (nop >= 0)
   1235  1.1  mrg 	{
   1236  1.1  mrg 	  lra_assert (nop == data->insn_static_data->n_operands);
   1237  1.1  mrg 	  /* Now get the operand values and constraints out of the
   1238  1.1  mrg 	     insn.  */
   1239  1.1  mrg 	  decode_asm_operands (PATTERN (insn), NULL,
   1240  1.1  mrg 			       data->operand_loc,
   1241  1.1  mrg 			       constraints, operand_mode, NULL);
   1242  1.1  mrg 
   1243  1.1  mrg 	  if (flag_checking)
   1244  1.1  mrg 	    for (int i = 0; i < nop; i++)
   1245  1.1  mrg 	      lra_assert
   1246  1.1  mrg 		(insn_static_data->operand[i].mode == operand_mode[i]
   1247  1.1  mrg 		 && insn_static_data->operand[i].constraint == constraints[i]
   1248  1.1  mrg 		 && ! insn_static_data->operand[i].is_operator);
   1249  1.1  mrg 	}
   1250  1.1  mrg 
   1251  1.1  mrg       if (flag_checking)
   1252  1.1  mrg 	for (int i = 0; i < insn_static_data->n_operands; i++)
   1253  1.1  mrg 	  lra_assert
   1254  1.1  mrg 	    (insn_static_data->operand[i].type
   1255  1.1  mrg 	     == (insn_static_data->operand[i].constraint[0] == '=' ? OP_OUT
   1256  1.1  mrg 		 : insn_static_data->operand[i].constraint[0] == '+' ? OP_INOUT
   1257  1.1  mrg 		 : OP_IN));
   1258  1.1  mrg     }
   1259  1.1  mrg   else
   1260  1.1  mrg     {
   1261  1.1  mrg       insn_extract (insn);
   1262  1.1  mrg       n = insn_static_data->n_operands;
   1263  1.1  mrg       if (n != 0)
   1264  1.1  mrg 	memcpy (data->operand_loc, recog_data.operand_loc, n * sizeof (rtx *));
   1265  1.1  mrg       n = insn_static_data->n_dups;
   1266  1.1  mrg       if (n != 0)
   1267  1.1  mrg 	memcpy (data->dup_loc, recog_data.dup_loc, n * sizeof (rtx *));
   1268  1.1  mrg       lra_assert (check_bool_attrs (insn));
   1269  1.1  mrg     }
   1270  1.1  mrg   return data;
   1271  1.1  mrg }
   1272  1.1  mrg 
   1273  1.1  mrg /* Set up that INSN is using alternative ALT now.  */
   1274  1.1  mrg void
   1275  1.1  mrg lra_set_used_insn_alternative (rtx_insn *insn, int alt)
   1276  1.1  mrg {
   1277  1.1  mrg   lra_insn_recog_data_t data;
   1278  1.1  mrg 
   1279  1.1  mrg   data = lra_get_insn_recog_data (insn);
   1280  1.1  mrg   data->used_insn_alternative = alt;
   1281  1.1  mrg }
   1282  1.1  mrg 
   1283  1.1  mrg /* Set up that insn with UID is using alternative ALT now.  The insn
   1284  1.1  mrg    info should be already set up.  */
   1285  1.1  mrg void
   1286  1.1  mrg lra_set_used_insn_alternative_by_uid (int uid, int alt)
   1287  1.1  mrg {
   1288  1.1  mrg   lra_insn_recog_data_t data;
   1289  1.1  mrg 
   1290  1.1  mrg   check_and_expand_insn_recog_data (uid);
   1291  1.1  mrg   data = lra_insn_recog_data[uid];
   1292  1.1  mrg   lra_assert (data != NULL);
   1293  1.1  mrg   data->used_insn_alternative = alt;
   1294  1.1  mrg }
   1295  1.1  mrg 
   1296  1.1  mrg 
   1297  1.1  mrg 
   1299  1.1  mrg /* This page contains code dealing with common register info and
   1300  1.1  mrg    pseudo copies.  */
   1301  1.1  mrg 
   1302  1.1  mrg /* The size of the following array.  */
   1303  1.1  mrg static int reg_info_size;
   1304  1.1  mrg /* Common info about each register.  */
   1305  1.1  mrg class lra_reg *lra_reg_info;
   1306  1.1  mrg 
   1307  1.1  mrg HARD_REG_SET hard_regs_spilled_into;
   1308  1.1  mrg 
   1309  1.1  mrg /* Last register value.	 */
   1310  1.1  mrg static int last_reg_value;
   1311  1.1  mrg 
   1312  1.1  mrg /* Return new register value.  */
   1313  1.1  mrg static int
   1314  1.1  mrg get_new_reg_value (void)
   1315  1.1  mrg {
   1316  1.1  mrg   return ++last_reg_value;
   1317  1.1  mrg }
   1318  1.1  mrg 
   1319  1.1  mrg /* Vec referring to pseudo copies.  */
   1320  1.1  mrg static vec<lra_copy_t> copy_vec;
   1321  1.1  mrg 
   1322  1.1  mrg /* Initialize I-th element of lra_reg_info.  */
   1323  1.1  mrg static inline void
   1324  1.1  mrg initialize_lra_reg_info_element (int i)
   1325  1.1  mrg {
   1326  1.1  mrg   bitmap_initialize (&lra_reg_info[i].insn_bitmap, &reg_obstack);
   1327  1.1  mrg #ifdef STACK_REGS
   1328  1.1  mrg   lra_reg_info[i].no_stack_p = false;
   1329  1.1  mrg #endif
   1330  1.1  mrg   CLEAR_HARD_REG_SET (lra_reg_info[i].conflict_hard_regs);
   1331  1.1  mrg   CLEAR_HARD_REG_SET (lra_reg_info[i].exclude_start_hard_regs);
   1332  1.1  mrg   lra_reg_info[i].preferred_hard_regno1 = -1;
   1333  1.1  mrg   lra_reg_info[i].preferred_hard_regno2 = -1;
   1334  1.1  mrg   lra_reg_info[i].preferred_hard_regno_profit1 = 0;
   1335  1.1  mrg   lra_reg_info[i].preferred_hard_regno_profit2 = 0;
   1336  1.1  mrg   lra_reg_info[i].biggest_mode = VOIDmode;
   1337  1.1  mrg   lra_reg_info[i].live_ranges = NULL;
   1338  1.1  mrg   lra_reg_info[i].nrefs = lra_reg_info[i].freq = 0;
   1339  1.1  mrg   lra_reg_info[i].last_reload = 0;
   1340  1.1  mrg   lra_reg_info[i].restore_rtx = NULL_RTX;
   1341  1.1  mrg   lra_reg_info[i].val = get_new_reg_value ();
   1342  1.1  mrg   lra_reg_info[i].offset = 0;
   1343  1.1  mrg   lra_reg_info[i].copies = NULL;
   1344  1.1  mrg }
   1345  1.1  mrg 
   1346  1.1  mrg /* Initialize common reg info and copies.  */
   1347  1.1  mrg static void
   1348  1.1  mrg init_reg_info (void)
   1349  1.1  mrg {
   1350  1.1  mrg   int i;
   1351  1.1  mrg 
   1352  1.1  mrg   last_reg_value = 0;
   1353  1.1  mrg   reg_info_size = max_reg_num () * 3 / 2 + 1;
   1354  1.1  mrg   lra_reg_info = XNEWVEC (class lra_reg, reg_info_size);
   1355  1.1  mrg   for (i = 0; i < reg_info_size; i++)
   1356  1.1  mrg     initialize_lra_reg_info_element (i);
   1357  1.1  mrg   copy_vec.truncate (0);
   1358  1.1  mrg   CLEAR_HARD_REG_SET (hard_regs_spilled_into);
   1359  1.1  mrg }
   1360  1.1  mrg 
   1361  1.1  mrg 
   1362  1.1  mrg /* Finish common reg info and copies.  */
   1363  1.1  mrg static void
   1364  1.1  mrg finish_reg_info (void)
   1365  1.1  mrg {
   1366  1.1  mrg   int i;
   1367  1.1  mrg 
   1368  1.1  mrg   for (i = 0; i < reg_info_size; i++)
   1369  1.1  mrg     bitmap_clear (&lra_reg_info[i].insn_bitmap);
   1370  1.1  mrg   free (lra_reg_info);
   1371  1.1  mrg   reg_info_size = 0;
   1372  1.1  mrg }
   1373  1.1  mrg 
   1374  1.1  mrg /* Expand common reg info if it is necessary.  */
   1375  1.1  mrg static void
   1376  1.1  mrg expand_reg_info (void)
   1377  1.1  mrg {
   1378  1.1  mrg   int i, old = reg_info_size;
   1379  1.1  mrg 
   1380  1.1  mrg   if (reg_info_size > max_reg_num ())
   1381  1.1  mrg     return;
   1382  1.1  mrg   reg_info_size = max_reg_num () * 3 / 2 + 1;
   1383  1.1  mrg   lra_reg_info = XRESIZEVEC (class lra_reg, lra_reg_info, reg_info_size);
   1384  1.1  mrg   for (i = old; i < reg_info_size; i++)
   1385  1.1  mrg     initialize_lra_reg_info_element (i);
   1386  1.1  mrg }
   1387  1.1  mrg 
   1388  1.1  mrg /* Free all copies.  */
   1389  1.1  mrg void
   1390  1.1  mrg lra_free_copies (void)
   1391  1.1  mrg {
   1392  1.1  mrg   lra_copy_t cp;
   1393  1.1  mrg 
   1394  1.1  mrg   while (copy_vec.length () != 0)
   1395  1.1  mrg     {
   1396  1.1  mrg       cp = copy_vec.pop ();
   1397  1.1  mrg       lra_reg_info[cp->regno1].copies = lra_reg_info[cp->regno2].copies = NULL;
   1398  1.1  mrg       lra_copy_pool.remove (cp);
   1399  1.1  mrg     }
   1400  1.1  mrg }
   1401  1.1  mrg 
   1402  1.1  mrg /* Create copy of two pseudos REGNO1 and REGNO2.  The copy execution
   1403  1.1  mrg    frequency is FREQ.  */
   1404  1.1  mrg void
   1405  1.1  mrg lra_create_copy (int regno1, int regno2, int freq)
   1406  1.1  mrg {
   1407  1.1  mrg   bool regno1_dest_p;
   1408  1.1  mrg   lra_copy_t cp;
   1409  1.1  mrg 
   1410  1.1  mrg   lra_assert (regno1 != regno2);
   1411  1.1  mrg   regno1_dest_p = true;
   1412  1.1  mrg   if (regno1 > regno2)
   1413  1.1  mrg     {
   1414  1.1  mrg       std::swap (regno1, regno2);
   1415  1.1  mrg       regno1_dest_p = false;
   1416  1.1  mrg     }
   1417  1.1  mrg   cp = lra_copy_pool.allocate ();
   1418  1.1  mrg   copy_vec.safe_push (cp);
   1419  1.1  mrg   cp->regno1_dest_p = regno1_dest_p;
   1420  1.1  mrg   cp->freq = freq;
   1421  1.1  mrg   cp->regno1 = regno1;
   1422  1.1  mrg   cp->regno2 = regno2;
   1423  1.1  mrg   cp->regno1_next = lra_reg_info[regno1].copies;
   1424  1.1  mrg   lra_reg_info[regno1].copies = cp;
   1425  1.1  mrg   cp->regno2_next = lra_reg_info[regno2].copies;
   1426  1.1  mrg   lra_reg_info[regno2].copies = cp;
   1427  1.1  mrg   if (lra_dump_file != NULL)
   1428  1.1  mrg     fprintf (lra_dump_file, "	   Creating copy r%d%sr%d@%d\n",
   1429  1.1  mrg 	     regno1, regno1_dest_p ? "<-" : "->", regno2, freq);
   1430  1.1  mrg }
   1431  1.1  mrg 
   1432  1.1  mrg /* Return N-th (0, 1, ...) copy.  If there is no copy, return
   1433  1.1  mrg    NULL.  */
   1434  1.1  mrg lra_copy_t
   1435  1.1  mrg lra_get_copy (int n)
   1436  1.1  mrg {
   1437  1.1  mrg   if (n >= (int) copy_vec.length ())
   1438  1.1  mrg     return NULL;
   1439  1.1  mrg   return copy_vec[n];
   1440  1.1  mrg }
   1441  1.1  mrg 
   1442  1.1  mrg 
   1443  1.1  mrg 
   1445  1.1  mrg /* This page contains code dealing with info about registers in
   1446  1.1  mrg    insns.  */
   1447  1.1  mrg 
   1448  1.1  mrg /* Process X of INSN recursively and add info (operand type is given
   1449  1.1  mrg    by TYPE) about registers in X to the insn DATA.  If X can be early
   1450  1.1  mrg    clobbered, alternatives in which it can be early clobbered are given
   1451  1.1  mrg    by EARLY_CLOBBER_ALTS.  */
   1452  1.1  mrg static void
   1453  1.1  mrg add_regs_to_insn_regno_info (lra_insn_recog_data_t data, rtx x,
   1454  1.1  mrg 			     rtx_insn *insn, enum op_type type,
   1455  1.1  mrg 			     alternative_mask early_clobber_alts)
   1456  1.1  mrg {
   1457  1.1  mrg   int i, j, regno;
   1458  1.1  mrg   bool subreg_p;
   1459  1.1  mrg   machine_mode mode;
   1460  1.1  mrg   const char *fmt;
   1461  1.1  mrg   enum rtx_code code;
   1462  1.1  mrg   struct lra_insn_reg *curr;
   1463  1.1  mrg 
   1464  1.1  mrg   code = GET_CODE (x);
   1465  1.1  mrg   mode = GET_MODE (x);
   1466  1.1  mrg   subreg_p = false;
   1467  1.1  mrg   if (GET_CODE (x) == SUBREG)
   1468  1.1  mrg     {
   1469  1.1  mrg       mode = wider_subreg_mode (x);
   1470  1.1  mrg       if (read_modify_subreg_p (x))
   1471  1.1  mrg 	subreg_p = true;
   1472  1.1  mrg       x = SUBREG_REG (x);
   1473  1.1  mrg       code = GET_CODE (x);
   1474  1.1  mrg     }
   1475  1.1  mrg   if (REG_P (x))
   1476  1.1  mrg     {
   1477  1.1  mrg       regno = REGNO (x);
   1478  1.1  mrg       /* Process all regs even unallocatable ones as we need info about
   1479  1.1  mrg 	 all regs for rematerialization pass.  */
   1480  1.1  mrg       expand_reg_info ();
   1481  1.1  mrg       if (bitmap_set_bit (&lra_reg_info[regno].insn_bitmap, INSN_UID (insn)))
   1482  1.1  mrg 	{
   1483  1.1  mrg 	  data->regs = new_insn_reg (data->insn, regno, type, mode, subreg_p,
   1484  1.1  mrg 				     early_clobber_alts, data->regs);
   1485  1.1  mrg 	  return;
   1486  1.1  mrg 	}
   1487  1.1  mrg       else
   1488  1.1  mrg 	{
   1489  1.1  mrg 	  for (curr = data->regs; curr != NULL; curr = curr->next)
   1490  1.1  mrg 	    if (curr->regno == regno)
   1491  1.1  mrg 	      {
   1492  1.1  mrg 		if (curr->subreg_p != subreg_p || curr->biggest_mode != mode)
   1493  1.1  mrg 		  /* The info cannot be integrated into the found
   1494  1.1  mrg 		     structure.  */
   1495  1.1  mrg 		  data->regs = new_insn_reg (data->insn, regno, type, mode,
   1496  1.1  mrg 					     subreg_p, early_clobber_alts,
   1497  1.1  mrg 					     data->regs);
   1498  1.1  mrg 		else
   1499  1.1  mrg 		  {
   1500  1.1  mrg 		    if (curr->type != type)
   1501  1.1  mrg 		      curr->type = OP_INOUT;
   1502  1.1  mrg 		    curr->early_clobber_alts |= early_clobber_alts;
   1503  1.1  mrg 		  }
   1504  1.1  mrg 		return;
   1505  1.1  mrg 	      }
   1506  1.1  mrg 	  gcc_unreachable ();
   1507  1.1  mrg 	}
   1508  1.1  mrg     }
   1509  1.1  mrg 
   1510  1.1  mrg   switch (code)
   1511  1.1  mrg     {
   1512  1.1  mrg     case SET:
   1513  1.1  mrg       add_regs_to_insn_regno_info (data, SET_DEST (x), insn, OP_OUT, 0);
   1514  1.1  mrg       add_regs_to_insn_regno_info (data, SET_SRC (x), insn, OP_IN, 0);
   1515  1.1  mrg       break;
   1516  1.1  mrg     case CLOBBER:
   1517  1.1  mrg       /* We treat clobber of non-operand hard registers as early
   1518  1.1  mrg 	 clobber.  */
   1519  1.1  mrg       add_regs_to_insn_regno_info (data, XEXP (x, 0), insn, OP_OUT,
   1520  1.1  mrg 				   ALL_ALTERNATIVES);
   1521  1.1  mrg       break;
   1522  1.1  mrg     case PRE_INC: case PRE_DEC: case POST_INC: case POST_DEC:
   1523  1.1  mrg       add_regs_to_insn_regno_info (data, XEXP (x, 0), insn, OP_INOUT, 0);
   1524  1.1  mrg       break;
   1525  1.1  mrg     case PRE_MODIFY: case POST_MODIFY:
   1526  1.1  mrg       add_regs_to_insn_regno_info (data, XEXP (x, 0), insn, OP_INOUT, 0);
   1527  1.1  mrg       add_regs_to_insn_regno_info (data, XEXP (x, 1), insn, OP_IN, 0);
   1528  1.1  mrg       break;
   1529  1.1  mrg     default:
   1530  1.1  mrg       if ((code != PARALLEL && code != EXPR_LIST) || type != OP_OUT)
   1531  1.1  mrg 	/* Some targets place small structures in registers for return
   1532  1.1  mrg 	   values of functions, and those registers are wrapped in
   1533  1.1  mrg 	   PARALLEL that we may see as the destination of a SET.  Here
   1534  1.1  mrg 	   is an example:
   1535  1.1  mrg 
   1536  1.1  mrg 	   (call_insn 13 12 14 2 (set (parallel:BLK [
   1537  1.1  mrg 		(expr_list:REG_DEP_TRUE (reg:DI 0 ax)
   1538  1.1  mrg 		    (const_int 0 [0]))
   1539  1.1  mrg 		(expr_list:REG_DEP_TRUE (reg:DI 1 dx)
   1540  1.1  mrg 		    (const_int 8 [0x8]))
   1541  1.1  mrg 	       ])
   1542  1.1  mrg 	     (call (mem:QI (symbol_ref:DI (...	*/
   1543  1.1  mrg 	type = OP_IN;
   1544  1.1  mrg       fmt = GET_RTX_FORMAT (code);
   1545  1.1  mrg       for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
   1546  1.1  mrg 	{
   1547  1.1  mrg 	  if (fmt[i] == 'e')
   1548  1.1  mrg 	    add_regs_to_insn_regno_info (data, XEXP (x, i), insn, type, 0);
   1549  1.1  mrg 	  else if (fmt[i] == 'E')
   1550  1.1  mrg 	    {
   1551  1.1  mrg 	      for (j = XVECLEN (x, i) - 1; j >= 0; j--)
   1552  1.1  mrg 		add_regs_to_insn_regno_info (data, XVECEXP (x, i, j), insn,
   1553  1.1  mrg 					     type, 0);
   1554  1.1  mrg 	    }
   1555  1.1  mrg 	}
   1556  1.1  mrg     }
   1557  1.1  mrg }
   1558  1.1  mrg 
   1559  1.1  mrg /* Return execution frequency of INSN.	*/
   1560  1.1  mrg static int
   1561  1.1  mrg get_insn_freq (rtx_insn *insn)
   1562  1.1  mrg {
   1563  1.1  mrg   basic_block bb = BLOCK_FOR_INSN (insn);
   1564  1.1  mrg 
   1565  1.1  mrg   gcc_checking_assert (bb != NULL);
   1566  1.1  mrg   return REG_FREQ_FROM_BB (bb);
   1567  1.1  mrg }
   1568  1.1  mrg 
   1569  1.1  mrg /* Invalidate all reg info of INSN with DATA and execution frequency
   1570  1.1  mrg    FREQ.  Update common info about the invalidated registers.  */
   1571  1.1  mrg static void
   1572  1.1  mrg invalidate_insn_data_regno_info (lra_insn_recog_data_t data, rtx_insn *insn,
   1573  1.1  mrg 				 int freq)
   1574  1.1  mrg {
   1575  1.1  mrg   int uid;
   1576  1.1  mrg   bool debug_p;
   1577  1.1  mrg   unsigned int i;
   1578  1.1  mrg   struct lra_insn_reg *ir, *next_ir;
   1579  1.1  mrg 
   1580  1.1  mrg   uid = INSN_UID (insn);
   1581  1.1  mrg   debug_p = DEBUG_INSN_P (insn);
   1582  1.1  mrg   for (ir = data->regs; ir != NULL; ir = next_ir)
   1583  1.1  mrg     {
   1584  1.1  mrg       i = ir->regno;
   1585  1.1  mrg       next_ir = ir->next;
   1586  1.1  mrg       lra_insn_reg_pool.remove (ir);
   1587  1.1  mrg       bitmap_clear_bit (&lra_reg_info[i].insn_bitmap, uid);
   1588  1.1  mrg       if (i >= FIRST_PSEUDO_REGISTER && ! debug_p)
   1589  1.1  mrg 	{
   1590  1.1  mrg 	  lra_reg_info[i].nrefs--;
   1591  1.1  mrg 	  lra_reg_info[i].freq -= freq;
   1592  1.1  mrg 	  lra_assert (lra_reg_info[i].nrefs >= 0 && lra_reg_info[i].freq >= 0);
   1593  1.1  mrg 	}
   1594  1.1  mrg     }
   1595  1.1  mrg   data->regs = NULL;
   1596  1.1  mrg }
   1597  1.1  mrg 
   1598  1.1  mrg /* Invalidate all reg info of INSN.  Update common info about the
   1599  1.1  mrg    invalidated registers.  */
   1600  1.1  mrg void
   1601  1.1  mrg lra_invalidate_insn_regno_info (rtx_insn *insn)
   1602  1.1  mrg {
   1603  1.1  mrg   invalidate_insn_data_regno_info (lra_get_insn_recog_data (insn), insn,
   1604  1.1  mrg 				   get_insn_freq (insn));
   1605  1.1  mrg }
   1606  1.1  mrg 
   1607  1.1  mrg /* Update common reg info from reg info of insn given by its DATA and
   1608  1.1  mrg    execution frequency FREQ.  */
   1609  1.1  mrg static void
   1610  1.1  mrg setup_insn_reg_info (lra_insn_recog_data_t data, int freq)
   1611  1.1  mrg {
   1612  1.1  mrg   unsigned int i;
   1613  1.1  mrg   struct lra_insn_reg *ir;
   1614  1.1  mrg 
   1615  1.1  mrg   for (ir = data->regs; ir != NULL; ir = ir->next)
   1616  1.1  mrg     if ((i = ir->regno) >= FIRST_PSEUDO_REGISTER)
   1617  1.1  mrg       {
   1618  1.1  mrg 	lra_reg_info[i].nrefs++;
   1619  1.1  mrg 	lra_reg_info[i].freq += freq;
   1620  1.1  mrg       }
   1621  1.1  mrg }
   1622  1.1  mrg 
   1623  1.1  mrg /* Set up insn reg info of INSN.  Update common reg info from reg info
   1624  1.1  mrg    of INSN.  */
   1625  1.1  mrg void
   1626  1.1  mrg lra_update_insn_regno_info (rtx_insn *insn)
   1627  1.1  mrg {
   1628  1.1  mrg   int i, freq;
   1629  1.1  mrg   lra_insn_recog_data_t data;
   1630  1.1  mrg   struct lra_static_insn_data *static_data;
   1631  1.1  mrg   enum rtx_code code;
   1632  1.1  mrg   rtx link;
   1633  1.1  mrg 
   1634  1.1  mrg   if (! INSN_P (insn))
   1635  1.1  mrg     return;
   1636  1.1  mrg   data = lra_get_insn_recog_data (insn);
   1637  1.1  mrg   static_data = data->insn_static_data;
   1638  1.1  mrg   freq = NONDEBUG_INSN_P (insn) ? get_insn_freq (insn) : 0;
   1639  1.1  mrg   invalidate_insn_data_regno_info (data, insn, freq);
   1640  1.1  mrg   for (i = static_data->n_operands - 1; i >= 0; i--)
   1641  1.1  mrg     add_regs_to_insn_regno_info (data, *data->operand_loc[i], insn,
   1642  1.1  mrg 				 static_data->operand[i].type,
   1643  1.1  mrg 				 static_data->operand[i].early_clobber_alts);
   1644  1.1  mrg   if ((code = GET_CODE (PATTERN (insn))) == CLOBBER || code == USE)
   1645  1.1  mrg     add_regs_to_insn_regno_info (data, XEXP (PATTERN (insn), 0), insn,
   1646  1.1  mrg 				 code == USE ? OP_IN : OP_OUT, 0);
   1647  1.1  mrg   if (CALL_P (insn))
   1648  1.1  mrg     /* On some targets call insns can refer to pseudos in memory in
   1649  1.1  mrg        CALL_INSN_FUNCTION_USAGE list.  Process them in order to
   1650  1.1  mrg        consider their occurrences in calls for different
   1651  1.1  mrg        transformations (e.g. inheritance) with given pseudos.  */
   1652  1.1  mrg     for (link = CALL_INSN_FUNCTION_USAGE (insn);
   1653  1.1  mrg 	 link != NULL_RTX;
   1654  1.1  mrg 	 link = XEXP (link, 1))
   1655  1.1  mrg       {
   1656  1.1  mrg 	code = GET_CODE (XEXP (link, 0));
   1657  1.1  mrg 	if ((code == USE || code == CLOBBER)
   1658  1.1  mrg 	    && MEM_P (XEXP (XEXP (link, 0), 0)))
   1659  1.1  mrg 	  add_regs_to_insn_regno_info (data, XEXP (XEXP (link, 0), 0), insn,
   1660  1.1  mrg 				       code == USE ? OP_IN : OP_OUT, 0);
   1661  1.1  mrg       }
   1662  1.1  mrg   if (NONDEBUG_INSN_P (insn))
   1663  1.1  mrg     setup_insn_reg_info (data, freq);
   1664  1.1  mrg }
   1665  1.1  mrg 
   1666  1.1  mrg /* Return reg info of insn given by it UID.  */
   1667  1.1  mrg struct lra_insn_reg *
   1668  1.1  mrg lra_get_insn_regs (int uid)
   1669  1.1  mrg {
   1670  1.1  mrg   lra_insn_recog_data_t data;
   1671  1.1  mrg 
   1672  1.1  mrg   data = get_insn_recog_data_by_uid (uid);
   1673  1.1  mrg   return data->regs;
   1674  1.1  mrg }
   1675  1.1  mrg 
   1676  1.1  mrg 
   1677  1.1  mrg 
   1679  1.1  mrg /* Recursive hash function for RTL X.  */
   1680  1.1  mrg hashval_t
   1681  1.1  mrg lra_rtx_hash (rtx x)
   1682  1.1  mrg {
   1683  1.1  mrg   int i, j;
   1684  1.1  mrg   enum rtx_code code;
   1685  1.1  mrg   const char *fmt;
   1686  1.1  mrg   hashval_t val = 0;
   1687  1.1  mrg 
   1688  1.1  mrg   if (x == 0)
   1689  1.1  mrg     return val;
   1690  1.1  mrg 
   1691  1.1  mrg   code = GET_CODE (x);
   1692  1.1  mrg   val += (int) code + 4095;
   1693  1.1  mrg 
   1694  1.1  mrg   /* Some RTL can be compared nonrecursively.  */
   1695  1.1  mrg   switch (code)
   1696  1.1  mrg     {
   1697  1.1  mrg     case REG:
   1698  1.1  mrg       return val + REGNO (x);
   1699  1.1  mrg 
   1700  1.1  mrg     case LABEL_REF:
   1701  1.1  mrg       return iterative_hash_object (XEXP (x, 0), val);
   1702  1.1  mrg 
   1703  1.1  mrg     case SYMBOL_REF:
   1704  1.1  mrg       return iterative_hash_object (XSTR (x, 0), val);
   1705  1.1  mrg 
   1706  1.1  mrg     case SCRATCH:
   1707  1.1  mrg     case CONST_DOUBLE:
   1708  1.1  mrg     case CONST_VECTOR:
   1709  1.1  mrg       return val;
   1710  1.1  mrg 
   1711  1.1  mrg     case CONST_INT:
   1712  1.1  mrg       return val + UINTVAL (x);
   1713  1.1  mrg 
   1714  1.1  mrg     default:
   1715  1.1  mrg       break;
   1716  1.1  mrg     }
   1717  1.1  mrg 
   1718  1.1  mrg   /* Hash the elements.  */
   1719  1.1  mrg   fmt = GET_RTX_FORMAT (code);
   1720  1.1  mrg   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
   1721  1.1  mrg     {
   1722  1.1  mrg       switch (fmt[i])
   1723  1.1  mrg 	{
   1724  1.1  mrg 	case 'w':
   1725  1.1  mrg 	  val += XWINT (x, i);
   1726  1.1  mrg 	  break;
   1727  1.1  mrg 
   1728  1.1  mrg 	case 'n':
   1729  1.1  mrg 	case 'i':
   1730  1.1  mrg 	  val += XINT (x, i);
   1731  1.1  mrg 	  break;
   1732  1.1  mrg 
   1733  1.1  mrg 	case 'V':
   1734  1.1  mrg 	case 'E':
   1735  1.1  mrg 	  val += XVECLEN (x, i);
   1736  1.1  mrg 
   1737  1.1  mrg 	  for (j = 0; j < XVECLEN (x, i); j++)
   1738  1.1  mrg 	    val += lra_rtx_hash (XVECEXP (x, i, j));
   1739  1.1  mrg 	  break;
   1740  1.1  mrg 
   1741  1.1  mrg 	case 'e':
   1742  1.1  mrg 	  val += lra_rtx_hash (XEXP (x, i));
   1743  1.1  mrg 	  break;
   1744  1.1  mrg 
   1745  1.1  mrg 	case 'S':
   1746  1.1  mrg 	case 's':
   1747  1.1  mrg 	  val += htab_hash_string (XSTR (x, i));
   1748  1.1  mrg 	  break;
   1749  1.1  mrg 
   1750  1.1  mrg 	case 'u':
   1751  1.1  mrg 	case '0':
   1752  1.1  mrg 	case 't':
   1753  1.1  mrg 	  break;
   1754  1.1  mrg 
   1755  1.1  mrg 	  /* It is believed that rtx's at this level will never
   1756  1.1  mrg 	     contain anything but integers and other rtx's, except for
   1757  1.1  mrg 	     within LABEL_REFs and SYMBOL_REFs.  */
   1758  1.1  mrg 	default:
   1759  1.1  mrg 	  abort ();
   1760  1.1  mrg 	}
   1761  1.1  mrg     }
   1762  1.1  mrg   return val;
   1763  1.1  mrg }
   1764  1.1  mrg 
   1765  1.1  mrg 
   1766  1.1  mrg 
   1768  1.1  mrg /* This page contains code dealing with stack of the insns which
   1769  1.1  mrg    should be processed by the next constraint pass.  */
   1770  1.1  mrg 
   1771  1.1  mrg /* Bitmap used to put an insn on the stack only in one exemplar.  */
   1772  1.1  mrg static sbitmap lra_constraint_insn_stack_bitmap;
   1773  1.1  mrg 
   1774  1.1  mrg /* The stack itself.  */
   1775  1.1  mrg vec<rtx_insn *> lra_constraint_insn_stack;
   1776  1.1  mrg 
   1777  1.1  mrg /* Put INSN on the stack.  If ALWAYS_UPDATE is true, always update the reg
   1778  1.1  mrg    info for INSN, otherwise only update it if INSN is not already on the
   1779  1.1  mrg    stack.  */
   1780  1.1  mrg static inline void
   1781  1.1  mrg lra_push_insn_1 (rtx_insn *insn, bool always_update)
   1782  1.1  mrg {
   1783  1.1  mrg   unsigned int uid = INSN_UID (insn);
   1784  1.1  mrg   if (always_update)
   1785  1.1  mrg     lra_update_insn_regno_info (insn);
   1786  1.1  mrg   if (uid >= SBITMAP_SIZE (lra_constraint_insn_stack_bitmap))
   1787  1.1  mrg     lra_constraint_insn_stack_bitmap =
   1788  1.1  mrg       sbitmap_resize (lra_constraint_insn_stack_bitmap, 3 * uid / 2, 0);
   1789  1.1  mrg   if (bitmap_bit_p (lra_constraint_insn_stack_bitmap, uid))
   1790  1.1  mrg     return;
   1791  1.1  mrg   bitmap_set_bit (lra_constraint_insn_stack_bitmap, uid);
   1792  1.1  mrg   if (! always_update)
   1793  1.1  mrg     lra_update_insn_regno_info (insn);
   1794  1.1  mrg   lra_constraint_insn_stack.safe_push (insn);
   1795  1.1  mrg }
   1796  1.1  mrg 
   1797  1.1  mrg /* Put INSN on the stack.  */
   1798  1.1  mrg void
   1799  1.1  mrg lra_push_insn (rtx_insn *insn)
   1800  1.1  mrg {
   1801  1.1  mrg   lra_push_insn_1 (insn, false);
   1802  1.1  mrg }
   1803  1.1  mrg 
   1804  1.1  mrg /* Put INSN on the stack and update its reg info.  */
   1805  1.1  mrg void
   1806  1.1  mrg lra_push_insn_and_update_insn_regno_info (rtx_insn *insn)
   1807  1.1  mrg {
   1808  1.1  mrg   lra_push_insn_1 (insn, true);
   1809  1.1  mrg }
   1810  1.1  mrg 
   1811  1.1  mrg /* Put insn with UID on the stack.  */
   1812  1.1  mrg void
   1813  1.1  mrg lra_push_insn_by_uid (unsigned int uid)
   1814  1.1  mrg {
   1815  1.1  mrg   lra_push_insn (lra_insn_recog_data[uid]->insn);
   1816  1.1  mrg }
   1817  1.1  mrg 
   1818  1.1  mrg /* Take the last-inserted insns off the stack and return it.  */
   1819  1.1  mrg rtx_insn *
   1820  1.1  mrg lra_pop_insn (void)
   1821  1.1  mrg {
   1822  1.1  mrg   rtx_insn *insn = lra_constraint_insn_stack.pop ();
   1823  1.1  mrg   bitmap_clear_bit (lra_constraint_insn_stack_bitmap, INSN_UID (insn));
   1824  1.1  mrg   return insn;
   1825  1.1  mrg }
   1826  1.1  mrg 
   1827  1.1  mrg /* Return the current size of the insn stack.  */
   1828  1.1  mrg unsigned int
   1829  1.1  mrg lra_insn_stack_length (void)
   1830  1.1  mrg {
   1831  1.1  mrg   return lra_constraint_insn_stack.length ();
   1832  1.1  mrg }
   1833  1.1  mrg 
   1834  1.1  mrg /* Push insns FROM to TO (excluding it) going in reverse order.	 */
   1835  1.1  mrg static void
   1836  1.1  mrg push_insns (rtx_insn *from, rtx_insn *to)
   1837  1.1  mrg {
   1838  1.1  mrg   rtx_insn *insn;
   1839  1.1  mrg 
   1840  1.1  mrg   if (from == NULL_RTX)
   1841  1.1  mrg     return;
   1842  1.1  mrg   for (insn = from; insn != to; insn = PREV_INSN (insn))
   1843  1.1  mrg     if (INSN_P (insn))
   1844  1.1  mrg       lra_push_insn (insn);
   1845  1.1  mrg }
   1846  1.1  mrg 
   1847  1.1  mrg /* Set up sp offset for insn in range [FROM, LAST].  The offset is
   1848  1.1  mrg    taken from the next BB insn after LAST or zero if there in such
   1849  1.1  mrg    insn.  */
   1850  1.1  mrg static void
   1851  1.1  mrg setup_sp_offset (rtx_insn *from, rtx_insn *last)
   1852  1.1  mrg {
   1853  1.1  mrg   rtx_insn *before = next_nonnote_nondebug_insn_bb (last);
   1854  1.1  mrg   poly_int64 offset = (before == NULL_RTX || ! INSN_P (before)
   1855  1.1  mrg 		       ? 0 : lra_get_insn_recog_data (before)->sp_offset);
   1856  1.1  mrg 
   1857  1.1  mrg   for (rtx_insn *insn = from; insn != NEXT_INSN (last); insn = NEXT_INSN (insn))
   1858  1.1  mrg     lra_get_insn_recog_data (insn)->sp_offset = offset;
   1859  1.1  mrg }
   1860  1.1  mrg 
   1861  1.1  mrg /* Emit insns BEFORE before INSN and insns AFTER after INSN.  Put the
   1862  1.1  mrg    insns onto the stack.  Print about emitting the insns with
   1863  1.1  mrg    TITLE.  */
   1864  1.1  mrg void
   1865  1.1  mrg lra_process_new_insns (rtx_insn *insn, rtx_insn *before, rtx_insn *after,
   1866  1.1  mrg 		       const char *title)
   1867  1.1  mrg {
   1868  1.1  mrg   if (before == NULL_RTX && after == NULL_RTX)
   1869  1.1  mrg     return;
   1870  1.1  mrg   if (lra_dump_file != NULL)
   1871  1.1  mrg     {
   1872  1.1  mrg       dump_insn_slim (lra_dump_file, insn);
   1873  1.1  mrg       if (before != NULL_RTX)
   1874  1.1  mrg 	{
   1875  1.1  mrg 	  fprintf (lra_dump_file,"    %s before:\n", title);
   1876  1.1  mrg 	  dump_rtl_slim (lra_dump_file, before, NULL, -1, 0);
   1877  1.1  mrg 	}
   1878  1.1  mrg     }
   1879  1.1  mrg   if (before != NULL_RTX)
   1880  1.1  mrg     {
   1881  1.1  mrg       if (cfun->can_throw_non_call_exceptions)
   1882  1.1  mrg 	copy_reg_eh_region_note_forward (insn, before, NULL);
   1883  1.1  mrg       emit_insn_before (before, insn);
   1884  1.1  mrg       push_insns (PREV_INSN (insn), PREV_INSN (before));
   1885  1.1  mrg       setup_sp_offset (before, PREV_INSN (insn));
   1886  1.1  mrg     }
   1887  1.1  mrg   if (after != NULL_RTX)
   1888  1.1  mrg     {
   1889  1.1  mrg       if (cfun->can_throw_non_call_exceptions)
   1890  1.1  mrg 	copy_reg_eh_region_note_forward (insn, after, NULL);
   1891  1.1  mrg       if (! JUMP_P (insn))
   1892  1.1  mrg 	{
   1893  1.1  mrg 	  rtx_insn *last;
   1894  1.1  mrg 
   1895  1.1  mrg 	  if (lra_dump_file != NULL)
   1896  1.1  mrg 	    {
   1897  1.1  mrg 	      fprintf (lra_dump_file, "    %s after:\n", title);
   1898  1.1  mrg 	      dump_rtl_slim (lra_dump_file, after, NULL, -1, 0);
   1899  1.1  mrg 	    }
   1900  1.1  mrg 	  for (last = after;
   1901  1.1  mrg 	       NEXT_INSN (last) != NULL_RTX;
   1902  1.1  mrg 	       last = NEXT_INSN (last))
   1903  1.1  mrg 	    ;
   1904  1.1  mrg 	  emit_insn_after (after, insn);
   1905  1.1  mrg 	  push_insns (last, insn);
   1906  1.1  mrg 	  setup_sp_offset (after, last);
   1907  1.1  mrg 	}
   1908  1.1  mrg       else
   1909  1.1  mrg 	{
   1910  1.1  mrg 	  /* Put output reload insns on successor BBs: */
   1911  1.1  mrg 	  edge_iterator ei;
   1912  1.1  mrg 	  edge e;
   1913  1.1  mrg 
   1914  1.1  mrg 	  FOR_EACH_EDGE (e, ei, BLOCK_FOR_INSN (insn)->succs)
   1915  1.1  mrg 	    if (e->dest != EXIT_BLOCK_PTR_FOR_FN (cfun))
   1916  1.1  mrg 	      {
   1917  1.1  mrg 		/* We already made the edge no-critical in ira.cc::ira */
   1918  1.1  mrg 		lra_assert (!EDGE_CRITICAL_P (e));
   1919  1.1  mrg 		rtx_insn *curr, *tmp = BB_HEAD (e->dest);
   1920  1.1  mrg 		if (LABEL_P (tmp))
   1921  1.1  mrg 		  tmp = NEXT_INSN (tmp);
   1922  1.1  mrg 		if (NOTE_INSN_BASIC_BLOCK_P (tmp))
   1923  1.1  mrg 		  tmp = NEXT_INSN (tmp);
   1924  1.1  mrg 		/* Do not put reload insns if it is the last BB
   1925  1.1  mrg 		   without actual insns.  */
   1926  1.1  mrg 		if (tmp == NULL)
   1927  1.1  mrg 		  continue;
   1928  1.1  mrg 		start_sequence ();
   1929  1.1  mrg 		for (curr = after; curr != NULL_RTX; curr = NEXT_INSN (curr))
   1930  1.1  mrg 		  emit_insn (copy_insn (PATTERN (curr)));
   1931  1.1  mrg 		rtx_insn *copy = get_insns (), *last = get_last_insn ();
   1932  1.1  mrg 		end_sequence ();
   1933  1.1  mrg 		if (lra_dump_file != NULL)
   1934  1.1  mrg 		  {
   1935  1.1  mrg 		    fprintf (lra_dump_file, "    %s after in bb%d:\n", title,
   1936  1.1  mrg 			     e->dest->index);
   1937  1.1  mrg 		    dump_rtl_slim (lra_dump_file, copy, NULL, -1, 0);
   1938  1.1  mrg 		  }
   1939  1.1  mrg 		/* Use the right emit func for setting up BB_END/BB_HEAD: */
   1940  1.1  mrg 		if (BB_END (e->dest) == PREV_INSN (tmp))
   1941  1.1  mrg 		  emit_insn_after_noloc (copy, PREV_INSN (tmp), e->dest);
   1942  1.1  mrg 		else
   1943  1.1  mrg 		  emit_insn_before_noloc (copy, tmp, e->dest);
   1944  1.1  mrg 		push_insns (last, PREV_INSN (copy));
   1945  1.1  mrg 		setup_sp_offset (copy, last);
   1946  1.1  mrg 		/* We can ignore BB live info here as it and reg notes
   1947  1.1  mrg 		   will be updated before the next assignment
   1948  1.1  mrg 		   sub-pass. */
   1949  1.1  mrg 	      }
   1950  1.1  mrg 	}
   1951  1.1  mrg     }
   1952  1.1  mrg   if (lra_dump_file != NULL)
   1953  1.1  mrg     fprintf (lra_dump_file, "\n");
   1954  1.1  mrg   if (cfun->can_throw_non_call_exceptions)
   1955  1.1  mrg     {
   1956  1.1  mrg       rtx note = find_reg_note (insn, REG_EH_REGION, NULL_RTX);
   1957  1.1  mrg       if (note && !insn_could_throw_p (insn))
   1958  1.1  mrg 	remove_note (insn, note);
   1959  1.1  mrg     }
   1960  1.1  mrg }
   1961  1.1  mrg 
   1962  1.1  mrg 
   1964  1.1  mrg /* Replace all references to register OLD_REGNO in *LOC with pseudo
   1965  1.1  mrg    register NEW_REG.  Try to simplify subreg of constant if SUBREG_P.
   1966  1.1  mrg    DEBUG_P is if LOC is within a DEBUG_INSN.  Return true if any
   1967  1.1  mrg    change was made.  */
   1968  1.1  mrg bool
   1969  1.1  mrg lra_substitute_pseudo (rtx *loc, int old_regno, rtx new_reg, bool subreg_p,
   1970  1.1  mrg 		       bool debug_p)
   1971  1.1  mrg {
   1972  1.1  mrg   rtx x = *loc;
   1973  1.1  mrg   bool result = false;
   1974  1.1  mrg   enum rtx_code code;
   1975  1.1  mrg   const char *fmt;
   1976  1.1  mrg   int i, j;
   1977  1.1  mrg 
   1978  1.1  mrg   if (x == NULL_RTX)
   1979  1.1  mrg     return false;
   1980  1.1  mrg 
   1981  1.1  mrg   code = GET_CODE (x);
   1982  1.1  mrg   if (code == SUBREG && subreg_p)
   1983  1.1  mrg     {
   1984  1.1  mrg       rtx subst, inner = SUBREG_REG (x);
   1985  1.1  mrg       /* Transform subreg of constant while we still have inner mode
   1986  1.1  mrg 	 of the subreg.  The subreg internal should not be an insn
   1987  1.1  mrg 	 operand.  */
   1988  1.1  mrg       if (REG_P (inner) && (int) REGNO (inner) == old_regno
   1989  1.1  mrg 	  && CONSTANT_P (new_reg)
   1990  1.1  mrg 	  && (subst = simplify_subreg (GET_MODE (x), new_reg, GET_MODE (inner),
   1991  1.1  mrg 				       SUBREG_BYTE (x))) != NULL_RTX)
   1992  1.1  mrg 	{
   1993  1.1  mrg 	  *loc = subst;
   1994  1.1  mrg 	  return true;
   1995  1.1  mrg 	}
   1996  1.1  mrg 
   1997  1.1  mrg     }
   1998  1.1  mrg   else if (code == REG && (int) REGNO (x) == old_regno)
   1999  1.1  mrg     {
   2000  1.1  mrg       machine_mode mode = GET_MODE (x);
   2001  1.1  mrg       machine_mode inner_mode = GET_MODE (new_reg);
   2002  1.1  mrg 
   2003  1.1  mrg       if (mode != inner_mode
   2004  1.1  mrg 	  && ! (CONST_SCALAR_INT_P (new_reg) && SCALAR_INT_MODE_P (mode)))
   2005  1.1  mrg 	{
   2006  1.1  mrg 	  poly_uint64 offset = 0;
   2007  1.1  mrg 	  if (partial_subreg_p (mode, inner_mode)
   2008  1.1  mrg 	      && SCALAR_INT_MODE_P (inner_mode))
   2009  1.1  mrg 	    offset = subreg_lowpart_offset (mode, inner_mode);
   2010  1.1  mrg 	  if (debug_p)
   2011  1.1  mrg 	    new_reg = gen_rtx_raw_SUBREG (mode, new_reg, offset);
   2012  1.1  mrg 	  else
   2013  1.1  mrg 	    new_reg = gen_rtx_SUBREG (mode, new_reg, offset);
   2014  1.1  mrg 	}
   2015  1.1  mrg       *loc = new_reg;
   2016  1.1  mrg       return true;
   2017  1.1  mrg     }
   2018  1.1  mrg 
   2019  1.1  mrg   /* Scan all the operand sub-expressions.  */
   2020  1.1  mrg   fmt = GET_RTX_FORMAT (code);
   2021  1.1  mrg   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
   2022  1.1  mrg     {
   2023  1.1  mrg       if (fmt[i] == 'e')
   2024  1.1  mrg 	{
   2025  1.1  mrg 	  if (debug_p
   2026  1.1  mrg 	      && i == 0
   2027  1.1  mrg 	      && (code == SUBREG
   2028  1.1  mrg 		  || code == ZERO_EXTEND
   2029  1.1  mrg 		  || code == SIGN_EXTEND
   2030  1.1  mrg 		  || code == FLOAT
   2031  1.1  mrg 		  || code == UNSIGNED_FLOAT))
   2032  1.1  mrg 	    {
   2033  1.1  mrg 	      rtx y = XEXP (x, 0);
   2034  1.1  mrg 	      if (lra_substitute_pseudo (&y, old_regno,
   2035  1.1  mrg 					 new_reg, subreg_p, debug_p))
   2036  1.1  mrg 		{
   2037  1.1  mrg 		  result = true;
   2038  1.1  mrg 		  if (CONST_SCALAR_INT_P (y))
   2039  1.1  mrg 		    {
   2040  1.1  mrg 		      if (code == SUBREG)
   2041  1.1  mrg 			y = simplify_subreg (GET_MODE (x), y,
   2042  1.1  mrg 					     GET_MODE (SUBREG_REG (x)),
   2043  1.1  mrg 					     SUBREG_BYTE (x));
   2044  1.1  mrg 		      else
   2045  1.1  mrg 			y = simplify_unary_operation (code, GET_MODE (x), y,
   2046  1.1  mrg 						      GET_MODE (XEXP (x, 0)));
   2047  1.1  mrg 		      if (y)
   2048  1.1  mrg 			*loc = y;
   2049  1.1  mrg 		      else
   2050  1.1  mrg 			*loc = gen_rtx_CLOBBER (GET_MODE (x), const0_rtx);
   2051  1.1  mrg 		    }
   2052  1.1  mrg 		  else
   2053  1.1  mrg 		    XEXP (x, 0) = y;
   2054  1.1  mrg 		}
   2055  1.1  mrg 	    }
   2056  1.1  mrg 	  else if (lra_substitute_pseudo (&XEXP (x, i), old_regno,
   2057  1.1  mrg 					  new_reg, subreg_p, debug_p))
   2058  1.1  mrg 	    result = true;
   2059  1.1  mrg 	}
   2060  1.1  mrg       else if (fmt[i] == 'E')
   2061  1.1  mrg 	{
   2062  1.1  mrg 	  for (j = XVECLEN (x, i) - 1; j >= 0; j--)
   2063  1.1  mrg 	    if (lra_substitute_pseudo (&XVECEXP (x, i, j), old_regno,
   2064  1.1  mrg 				       new_reg, subreg_p, debug_p))
   2065  1.1  mrg 	      result = true;
   2066  1.1  mrg 	}
   2067  1.1  mrg     }
   2068  1.1  mrg   return result;
   2069  1.1  mrg }
   2070  1.1  mrg 
   2071  1.1  mrg /* Call lra_substitute_pseudo within an insn.  Try to simplify subreg
   2072  1.1  mrg    of constant if SUBREG_P.  This won't update the insn ptr, just the
   2073  1.1  mrg    contents of the insn.  */
   2074  1.1  mrg bool
   2075  1.1  mrg lra_substitute_pseudo_within_insn (rtx_insn *insn, int old_regno,
   2076  1.1  mrg 				   rtx new_reg, bool subreg_p)
   2077  1.1  mrg {
   2078  1.1  mrg   rtx loc = insn;
   2079  1.1  mrg   return lra_substitute_pseudo (&loc, old_regno, new_reg, subreg_p,
   2080  1.1  mrg 				DEBUG_INSN_P (insn));
   2081  1.1  mrg }
   2082  1.1  mrg 
   2083  1.1  mrg 
   2084  1.1  mrg 
   2086  1.1  mrg /* Return new register of the same mode as ORIGINAL of class ALL_REGS.
   2087  1.1  mrg    Used in ira_remove_scratches.  */
   2088  1.1  mrg static rtx
   2089  1.1  mrg get_scratch_reg (rtx original)
   2090  1.1  mrg {
   2091  1.1  mrg   return lra_create_new_reg (GET_MODE (original), original, ALL_REGS,
   2092  1.1  mrg 			     NULL, NULL);
   2093  1.1  mrg }
   2094  1.1  mrg 
   2095  1.1  mrg /* Remove all insn scratches in INSN.  */
   2096  1.1  mrg static void
   2097  1.1  mrg remove_insn_scratches (rtx_insn *insn)
   2098  1.1  mrg {
   2099  1.1  mrg   if (ira_remove_insn_scratches (insn, true, lra_dump_file, get_scratch_reg))
   2100  1.1  mrg     df_insn_rescan (insn);
   2101  1.1  mrg }
   2102  1.1  mrg 
   2103  1.1  mrg /* Remove all insn scratches in the current function.  */
   2104  1.1  mrg static void
   2105  1.1  mrg remove_scratches (void)
   2106  1.1  mrg {
   2107  1.1  mrg   basic_block bb;
   2108  1.1  mrg   rtx_insn *insn;
   2109  1.1  mrg 
   2110  1.1  mrg   FOR_EACH_BB_FN (bb, cfun)
   2111  1.1  mrg     FOR_BB_INSNS (bb, insn)
   2112  1.1  mrg       if (INSN_P (insn))
   2113  1.1  mrg         remove_insn_scratches (insn);
   2114  1.1  mrg }
   2115  1.1  mrg 
   2116  1.1  mrg /* Function checks RTL for correctness.	 If FINAL_P is true, it is
   2117  1.1  mrg    done at the end of LRA and the check is more rigorous.  */
   2118  1.1  mrg static void
   2119  1.1  mrg check_rtl (bool final_p)
   2120  1.1  mrg {
   2121  1.1  mrg   basic_block bb;
   2122  1.1  mrg   rtx_insn *insn;
   2123  1.1  mrg 
   2124  1.1  mrg   lra_assert (! final_p || reload_completed);
   2125  1.1  mrg   FOR_EACH_BB_FN (bb, cfun)
   2126  1.1  mrg     FOR_BB_INSNS (bb, insn)
   2127  1.1  mrg     if (NONDEBUG_INSN_P (insn)
   2128  1.1  mrg 	&& GET_CODE (PATTERN (insn)) != USE
   2129  1.1  mrg 	&& GET_CODE (PATTERN (insn)) != CLOBBER
   2130  1.1  mrg 	&& GET_CODE (PATTERN (insn)) != ASM_INPUT)
   2131  1.1  mrg       {
   2132  1.1  mrg 	if (final_p)
   2133  1.1  mrg 	  {
   2134  1.1  mrg 	    extract_constrain_insn (insn);
   2135  1.1  mrg 	    continue;
   2136  1.1  mrg 	  }
   2137  1.1  mrg 	/* LRA code is based on assumption that all addresses can be
   2138  1.1  mrg 	   correctly decomposed.  LRA can generate reloads for
   2139  1.1  mrg 	   decomposable addresses.  The decomposition code checks the
   2140  1.1  mrg 	   correctness of the addresses.  So we don't need to check
   2141  1.1  mrg 	   the addresses here.  Don't call insn_invalid_p here, it can
   2142  1.1  mrg 	   change the code at this stage.  */
   2143  1.1  mrg 	if (recog_memoized (insn) < 0 && asm_noperands (PATTERN (insn)) < 0)
   2144  1.1  mrg 	  fatal_insn_not_found (insn);
   2145  1.1  mrg       }
   2146  1.1  mrg }
   2147  1.1  mrg 
   2148  1.1  mrg /* Determine if the current function has an exception receiver block
   2149  1.1  mrg    that reaches the exit block via non-exceptional edges  */
   2150  1.1  mrg static bool
   2151  1.1  mrg has_nonexceptional_receiver (void)
   2152  1.1  mrg {
   2153  1.1  mrg   edge e;
   2154  1.1  mrg   edge_iterator ei;
   2155  1.1  mrg   basic_block *tos, *worklist, bb;
   2156  1.1  mrg 
   2157  1.1  mrg   /* If we're not optimizing, then just err on the safe side.  */
   2158  1.1  mrg   if (!optimize)
   2159  1.1  mrg     return true;
   2160  1.1  mrg 
   2161  1.1  mrg   /* First determine which blocks can reach exit via normal paths.  */
   2162  1.1  mrg   tos = worklist = XNEWVEC (basic_block, n_basic_blocks_for_fn (cfun) + 1);
   2163  1.1  mrg 
   2164  1.1  mrg   FOR_EACH_BB_FN (bb, cfun)
   2165  1.1  mrg     bb->flags &= ~BB_REACHABLE;
   2166  1.1  mrg 
   2167  1.1  mrg   /* Place the exit block on our worklist.  */
   2168  1.1  mrg   EXIT_BLOCK_PTR_FOR_FN (cfun)->flags |= BB_REACHABLE;
   2169  1.1  mrg   *tos++ = EXIT_BLOCK_PTR_FOR_FN (cfun);
   2170  1.1  mrg 
   2171  1.1  mrg   /* Iterate: find everything reachable from what we've already seen.  */
   2172  1.1  mrg   while (tos != worklist)
   2173  1.1  mrg     {
   2174  1.1  mrg       bb = *--tos;
   2175  1.1  mrg 
   2176  1.1  mrg       FOR_EACH_EDGE (e, ei, bb->preds)
   2177  1.1  mrg 	if (e->flags & EDGE_ABNORMAL)
   2178  1.1  mrg 	  {
   2179  1.1  mrg 	    free (worklist);
   2180  1.1  mrg 	    return true;
   2181  1.1  mrg 	  }
   2182  1.1  mrg 	else
   2183  1.1  mrg 	  {
   2184  1.1  mrg 	    basic_block src = e->src;
   2185  1.1  mrg 
   2186  1.1  mrg 	    if (!(src->flags & BB_REACHABLE))
   2187  1.1  mrg 	      {
   2188  1.1  mrg 		src->flags |= BB_REACHABLE;
   2189  1.1  mrg 		*tos++ = src;
   2190  1.1  mrg 	      }
   2191  1.1  mrg 	  }
   2192  1.1  mrg     }
   2193  1.1  mrg   free (worklist);
   2194  1.1  mrg   /* No exceptional block reached exit unexceptionally.	 */
   2195  1.1  mrg   return false;
   2196  1.1  mrg }
   2197  1.1  mrg 
   2198  1.1  mrg /* Remove all REG_DEAD and REG_UNUSED notes and regenerate REG_INC.
   2199  1.1  mrg    We change pseudos by hard registers without notification of DF and
   2200  1.1  mrg    that can make the notes obsolete.  DF-infrastructure does not deal
   2201  1.1  mrg    with REG_INC notes -- so we should regenerate them here.  */
   2202  1.1  mrg static void
   2203  1.1  mrg update_inc_notes (void)
   2204  1.1  mrg {
   2205  1.1  mrg   rtx *pnote;
   2206  1.1  mrg   basic_block bb;
   2207  1.1  mrg   rtx_insn *insn;
   2208  1.1  mrg 
   2209  1.1  mrg   FOR_EACH_BB_FN (bb, cfun)
   2210  1.1  mrg     FOR_BB_INSNS (bb, insn)
   2211  1.1  mrg     if (NONDEBUG_INSN_P (insn))
   2212  1.1  mrg       {
   2213  1.1  mrg 	pnote = &REG_NOTES (insn);
   2214  1.1  mrg 	while (*pnote != 0)
   2215  1.1  mrg 	  {
   2216  1.1  mrg 	    if (REG_NOTE_KIND (*pnote) == REG_DEAD
   2217  1.1  mrg                 || REG_NOTE_KIND (*pnote) == REG_UNUSED
   2218  1.1  mrg                 || REG_NOTE_KIND (*pnote) == REG_INC)
   2219  1.1  mrg 	      *pnote = XEXP (*pnote, 1);
   2220  1.1  mrg 	    else
   2221  1.1  mrg 	      pnote = &XEXP (*pnote, 1);
   2222  1.1  mrg 	  }
   2223  1.1  mrg 
   2224  1.1  mrg 	if (AUTO_INC_DEC)
   2225  1.1  mrg 	  add_auto_inc_notes (insn, PATTERN (insn));
   2226  1.1  mrg       }
   2227  1.1  mrg }
   2228  1.1  mrg 
   2229  1.1  mrg /* Set to 1 while in lra.  */
   2230  1.1  mrg int lra_in_progress;
   2231  1.1  mrg 
   2232  1.1  mrg /* Start of pseudo regnos before the LRA.  */
   2233  1.1  mrg int lra_new_regno_start;
   2234  1.1  mrg 
   2235  1.1  mrg /* Start of reload pseudo regnos before the new spill pass.  */
   2236  1.1  mrg int lra_constraint_new_regno_start;
   2237  1.1  mrg 
   2238  1.1  mrg /* Avoid spilling pseudos with regno more than the following value if
   2239  1.1  mrg    it is possible.  */
   2240  1.1  mrg int lra_bad_spill_regno_start;
   2241  1.1  mrg 
   2242  1.1  mrg /* A pseudo of Pmode.  */
   2243  1.1  mrg rtx lra_pmode_pseudo;
   2244  1.1  mrg 
   2245  1.1  mrg /* Inheritance pseudo regnos before the new spill pass.	 */
   2246  1.1  mrg bitmap_head lra_inheritance_pseudos;
   2247  1.1  mrg 
   2248  1.1  mrg /* Split regnos before the new spill pass.  */
   2249  1.1  mrg bitmap_head lra_split_regs;
   2250  1.1  mrg 
   2251  1.1  mrg /* Reload pseudo regnos before the new assignment pass which still can
   2252  1.1  mrg    be spilled after the assignment pass as memory is also accepted in
   2253  1.1  mrg    insns for the reload pseudos.  */
   2254  1.1  mrg bitmap_head lra_optional_reload_pseudos;
   2255  1.1  mrg 
   2256  1.1  mrg /* Pseudo regnos used for subreg reloads before the new assignment
   2257  1.1  mrg    pass.  Such pseudos still can be spilled after the assignment
   2258  1.1  mrg    pass.  */
   2259  1.1  mrg bitmap_head lra_subreg_reload_pseudos;
   2260  1.1  mrg 
   2261  1.1  mrg /* File used for output of LRA debug information.  */
   2262  1.1  mrg FILE *lra_dump_file;
   2263  1.1  mrg 
   2264  1.1  mrg /* True if we split hard reg after the last constraint sub-pass.  */
   2265  1.1  mrg bool lra_hard_reg_split_p;
   2266  1.1  mrg 
   2267  1.1  mrg /* True if we found an asm error.  */
   2268  1.1  mrg bool lra_asm_error_p;
   2269  1.1  mrg 
   2270  1.1  mrg /* True if we should try spill into registers of different classes
   2271  1.1  mrg    instead of memory.  */
   2272  1.1  mrg bool lra_reg_spill_p;
   2273  1.1  mrg 
   2274  1.1  mrg /* Set up value LRA_REG_SPILL_P.  */
   2275  1.1  mrg static void
   2276  1.1  mrg setup_reg_spill_flag (void)
   2277  1.1  mrg {
   2278  1.1  mrg   int cl, mode;
   2279  1.1  mrg 
   2280  1.1  mrg   if (targetm.spill_class != NULL)
   2281  1.1  mrg     for (cl = 0; cl < (int) LIM_REG_CLASSES; cl++)
   2282  1.1  mrg       for (mode = 0; mode < MAX_MACHINE_MODE; mode++)
   2283  1.1  mrg 	if (targetm.spill_class ((enum reg_class) cl,
   2284  1.1  mrg 				 (machine_mode) mode) != NO_REGS)
   2285  1.1  mrg 	  {
   2286  1.1  mrg 	    lra_reg_spill_p = true;
   2287  1.1  mrg 	    return;
   2288  1.1  mrg 	  }
   2289  1.1  mrg   lra_reg_spill_p = false;
   2290  1.1  mrg }
   2291  1.1  mrg 
   2292  1.1  mrg /* True if the current function is too big to use regular algorithms
   2293  1.1  mrg    in LRA. In other words, we should use simpler and faster algorithms
   2294  1.1  mrg    in LRA.  It also means we should not worry about generation code
   2295  1.1  mrg    for caller saves.  The value is set up in IRA.  */
   2296  1.1  mrg bool lra_simple_p;
   2297  1.1  mrg 
   2298  1.1  mrg /* Major LRA entry function.  F is a file should be used to dump LRA
   2299  1.1  mrg    debug info.  */
   2300  1.1  mrg void
   2301  1.1  mrg lra (FILE *f)
   2302  1.1  mrg {
   2303  1.1  mrg   int i;
   2304  1.1  mrg   bool live_p, inserted_p;
   2305  1.1  mrg 
   2306  1.1  mrg   lra_dump_file = f;
   2307  1.1  mrg   lra_asm_error_p = false;
   2308  1.1  mrg   lra_pmode_pseudo = gen_reg_rtx (Pmode);
   2309  1.1  mrg 
   2310  1.1  mrg   timevar_push (TV_LRA);
   2311  1.1  mrg 
   2312  1.1  mrg   /* Make sure that the last insn is a note.  Some subsequent passes
   2313  1.1  mrg      need it.  */
   2314  1.1  mrg   emit_note (NOTE_INSN_DELETED);
   2315  1.1  mrg 
   2316  1.1  mrg   lra_no_alloc_regs = ira_no_alloc_regs;
   2317  1.1  mrg 
   2318  1.1  mrg   init_reg_info ();
   2319  1.1  mrg   expand_reg_info ();
   2320  1.1  mrg 
   2321  1.1  mrg   init_insn_recog_data ();
   2322  1.1  mrg 
   2323  1.1  mrg   /* Some quick check on RTL generated by previous passes.  */
   2324  1.1  mrg   if (flag_checking)
   2325  1.1  mrg     check_rtl (false);
   2326  1.1  mrg 
   2327  1.1  mrg   lra_in_progress = 1;
   2328  1.1  mrg 
   2329  1.1  mrg   lra_live_range_iter = lra_coalesce_iter = lra_constraint_iter = 0;
   2330  1.1  mrg   lra_assignment_iter = lra_assignment_iter_after_spill = 0;
   2331  1.1  mrg   lra_inheritance_iter = lra_undo_inheritance_iter = 0;
   2332  1.1  mrg   lra_rematerialization_iter = 0;
   2333  1.1  mrg 
   2334  1.1  mrg   setup_reg_spill_flag ();
   2335  1.1  mrg 
   2336  1.1  mrg   /* Function remove_scratches can creates new pseudos for clobbers --
   2337  1.1  mrg      so set up lra_constraint_new_regno_start before its call to
   2338  1.1  mrg      permit changing reg classes for pseudos created by this
   2339  1.1  mrg      simplification.  */
   2340  1.1  mrg   lra_constraint_new_regno_start = lra_new_regno_start = max_reg_num ();
   2341  1.1  mrg   lra_bad_spill_regno_start = INT_MAX;
   2342  1.1  mrg   remove_scratches ();
   2343  1.1  mrg 
   2344  1.1  mrg   /* A function that has a non-local label that can reach the exit
   2345  1.1  mrg      block via non-exceptional paths must save all call-saved
   2346  1.1  mrg      registers.	 */
   2347  1.1  mrg   if (cfun->has_nonlocal_label && has_nonexceptional_receiver ())
   2348  1.1  mrg     crtl->saves_all_registers = 1;
   2349  1.1  mrg 
   2350  1.1  mrg   if (crtl->saves_all_registers)
   2351  1.1  mrg     for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
   2352  1.1  mrg       if (!crtl->abi->clobbers_full_reg_p (i)
   2353  1.1  mrg 	  && !fixed_regs[i]
   2354  1.1  mrg 	  && !LOCAL_REGNO (i))
   2355  1.1  mrg 	df_set_regs_ever_live (i, true);
   2356  1.1  mrg 
   2357  1.1  mrg   /* We don't DF from now and avoid its using because it is to
   2358  1.1  mrg      expensive when a lot of RTL changes are made.  */
   2359  1.1  mrg   df_set_flags (DF_NO_INSN_RESCAN);
   2360  1.1  mrg   lra_constraint_insn_stack.create (get_max_uid ());
   2361  1.1  mrg   lra_constraint_insn_stack_bitmap = sbitmap_alloc (get_max_uid ());
   2362  1.1  mrg   bitmap_clear (lra_constraint_insn_stack_bitmap);
   2363  1.1  mrg   lra_live_ranges_init ();
   2364  1.1  mrg   lra_constraints_init ();
   2365  1.1  mrg   lra_curr_reload_num = 0;
   2366  1.1  mrg   push_insns (get_last_insn (), NULL);
   2367  1.1  mrg   /* It is needed for the 1st coalescing.  */
   2368  1.1  mrg   bitmap_initialize (&lra_inheritance_pseudos, &reg_obstack);
   2369  1.1  mrg   bitmap_initialize (&lra_split_regs, &reg_obstack);
   2370  1.1  mrg   bitmap_initialize (&lra_optional_reload_pseudos, &reg_obstack);
   2371  1.1  mrg   bitmap_initialize (&lra_subreg_reload_pseudos, &reg_obstack);
   2372  1.1  mrg   live_p = false;
   2373  1.1  mrg   if (maybe_ne (get_frame_size (), 0) && crtl->stack_alignment_needed)
   2374  1.1  mrg     /* If we have a stack frame, we must align it now.  The stack size
   2375  1.1  mrg        may be a part of the offset computation for register
   2376  1.1  mrg        elimination.  */
   2377  1.1  mrg     assign_stack_local (BLKmode, 0, crtl->stack_alignment_needed);
   2378  1.1  mrg   lra_init_equiv ();
   2379  1.1  mrg   for (;;)
   2380  1.1  mrg     {
   2381  1.1  mrg       for (;;)
   2382  1.1  mrg 	{
   2383  1.1  mrg 	  bool reloads_p = lra_constraints (lra_constraint_iter == 0);
   2384  1.1  mrg 	  /* Constraint transformations may result in that eliminable
   2385  1.1  mrg 	     hard regs become uneliminable and pseudos which use them
   2386  1.1  mrg 	     should be spilled.	 It is better to do it before pseudo
   2387  1.1  mrg 	     assignments.
   2388  1.1  mrg 
   2389  1.1  mrg 	     For example, rs6000 can make
   2390  1.1  mrg 	     RS6000_PIC_OFFSET_TABLE_REGNUM uneliminable if we started
   2391  1.1  mrg 	     to use a constant pool.  */
   2392  1.1  mrg 	  lra_eliminate (false, false);
   2393  1.1  mrg 	  /* We should try to assign hard registers to scratches even
   2394  1.1  mrg 	     if there were no RTL transformations in lra_constraints.
   2395  1.1  mrg 	     Also we should check IRA assignments on the first
   2396  1.1  mrg 	     iteration as they can be wrong because of early clobbers
   2397  1.1  mrg 	     operands which are ignored in IRA.  */
   2398  1.1  mrg 	  if (! reloads_p && lra_constraint_iter > 1)
   2399  1.1  mrg 	    {
   2400  1.1  mrg 	      /* Stack is not empty here only when there are changes
   2401  1.1  mrg 		 during the elimination sub-pass.  */
   2402  1.1  mrg 	      if (bitmap_empty_p (lra_constraint_insn_stack_bitmap))
   2403  1.1  mrg 		break;
   2404  1.1  mrg 	      else
   2405  1.1  mrg 		/* If there are no reloads but changing due
   2406  1.1  mrg 		   elimination, restart the constraint sub-pass
   2407  1.1  mrg 		   first.  */
   2408  1.1  mrg 		continue;
   2409  1.1  mrg 	    }
   2410  1.1  mrg 	  /* Do inheritance only for regular algorithms.  */
   2411  1.1  mrg 	  if (! lra_simple_p)
   2412  1.1  mrg 	    lra_inheritance ();
   2413  1.1  mrg 	  if (live_p)
   2414  1.1  mrg 	    lra_clear_live_ranges ();
   2415  1.1  mrg 	  bool fails_p;
   2416  1.1  mrg 	  lra_hard_reg_split_p = false;
   2417  1.1  mrg 	  do
   2418  1.1  mrg 	    {
   2419  1.1  mrg 	      /* We need live ranges for lra_assign -- so build them.
   2420  1.1  mrg 		 But don't remove dead insns or change global live
   2421  1.1  mrg 		 info as we can undo inheritance transformations after
   2422  1.1  mrg 		 inheritance pseudo assigning.  */
   2423  1.1  mrg 	      lra_create_live_ranges (true, !lra_simple_p);
   2424  1.1  mrg 	      live_p = true;
   2425  1.1  mrg 	      /* If we don't spill non-reload and non-inheritance
   2426  1.1  mrg 		 pseudos, there is no sense to run memory-memory move
   2427  1.1  mrg 		 coalescing.  If inheritance pseudos were spilled, the
   2428  1.1  mrg 		 memory-memory moves involving them will be removed by
   2429  1.1  mrg 		 pass undoing inheritance.  */
   2430  1.1  mrg 	      if (lra_simple_p)
   2431  1.1  mrg 		lra_assign (fails_p);
   2432  1.1  mrg 	      else
   2433  1.1  mrg 		{
   2434  1.1  mrg 		  bool spill_p = !lra_assign (fails_p);
   2435  1.1  mrg 
   2436  1.1  mrg 		  if (lra_undo_inheritance ())
   2437  1.1  mrg 		    live_p = false;
   2438  1.1  mrg 		  if (spill_p && ! fails_p)
   2439  1.1  mrg 		    {
   2440  1.1  mrg 		      if (! live_p)
   2441  1.1  mrg 			{
   2442  1.1  mrg 			  lra_create_live_ranges (true, true);
   2443  1.1  mrg 			  live_p = true;
   2444  1.1  mrg 			}
   2445  1.1  mrg 		      if (lra_coalesce ())
   2446  1.1  mrg 			live_p = false;
   2447  1.1  mrg 		    }
   2448  1.1  mrg 		  if (! live_p)
   2449  1.1  mrg 		    lra_clear_live_ranges ();
   2450  1.1  mrg 		}
   2451  1.1  mrg 	      if (fails_p)
   2452  1.1  mrg 		{
   2453  1.1  mrg 		  /* It is a very rare case.  It is the last hope to
   2454  1.1  mrg 		     split a hard regno live range for a reload
   2455  1.1  mrg 		     pseudo.  */
   2456  1.1  mrg 		  if (live_p)
   2457  1.1  mrg 		    lra_clear_live_ranges ();
   2458  1.1  mrg 		  live_p = false;
   2459  1.1  mrg 		  if (! lra_split_hard_reg_for ())
   2460  1.1  mrg 		    break;
   2461  1.1  mrg 		  lra_hard_reg_split_p = true;
   2462  1.1  mrg 		}
   2463  1.1  mrg 	    }
   2464  1.1  mrg 	  while (fails_p);
   2465  1.1  mrg 	  if (! live_p) {
   2466  1.1  mrg 	    /* We need the correct reg notes for work of constraint sub-pass.  */
   2467  1.1  mrg 	    lra_create_live_ranges (true, true);
   2468  1.1  mrg 	    live_p = true;
   2469  1.1  mrg 	  }
   2470  1.1  mrg 	}
   2471  1.1  mrg       /* Don't clear optional reloads bitmap until all constraints are
   2472  1.1  mrg 	 satisfied as we need to differ them from regular reloads.  */
   2473  1.1  mrg       bitmap_clear (&lra_optional_reload_pseudos);
   2474  1.1  mrg       bitmap_clear (&lra_subreg_reload_pseudos);
   2475  1.1  mrg       bitmap_clear (&lra_inheritance_pseudos);
   2476  1.1  mrg       bitmap_clear (&lra_split_regs);
   2477  1.1  mrg       if (! live_p)
   2478  1.1  mrg 	{
   2479  1.1  mrg 	  /* We need full live info for spilling pseudos into
   2480  1.1  mrg 	     registers instead of memory.  */
   2481  1.1  mrg 	  lra_create_live_ranges (lra_reg_spill_p, true);
   2482  1.1  mrg 	  live_p = true;
   2483  1.1  mrg 	}
   2484  1.1  mrg       /* We should check necessity for spilling here as the above live
   2485  1.1  mrg 	 range pass can remove spilled pseudos.  */
   2486  1.1  mrg       if (! lra_need_for_spills_p ())
   2487  1.1  mrg 	break;
   2488  1.1  mrg       /* Now we know what pseudos should be spilled.  Try to
   2489  1.1  mrg 	 rematerialize them first.  */
   2490  1.1  mrg       if (lra_remat ())
   2491  1.1  mrg 	{
   2492  1.1  mrg 	  /* We need full live info -- see the comment above.  */
   2493  1.1  mrg 	  lra_create_live_ranges (lra_reg_spill_p, true);
   2494  1.1  mrg 	  live_p = true;
   2495  1.1  mrg 	  if (! lra_need_for_spills_p ())
   2496  1.1  mrg 	    {
   2497  1.1  mrg 	      if (lra_need_for_scratch_reg_p ())
   2498  1.1  mrg 		continue;
   2499  1.1  mrg 	      break;
   2500  1.1  mrg 	    }
   2501  1.1  mrg 	}
   2502  1.1  mrg       lra_spill ();
   2503  1.1  mrg       /* Assignment of stack slots changes elimination offsets for
   2504  1.1  mrg 	 some eliminations.  So update the offsets here.  */
   2505  1.1  mrg       lra_eliminate (false, false);
   2506  1.1  mrg       lra_constraint_new_regno_start = max_reg_num ();
   2507  1.1  mrg       if (lra_bad_spill_regno_start == INT_MAX
   2508  1.1  mrg 	  && lra_inheritance_iter > LRA_MAX_INHERITANCE_PASSES
   2509  1.1  mrg 	  && lra_rematerialization_iter > LRA_MAX_REMATERIALIZATION_PASSES)
   2510  1.1  mrg 	/* After switching off inheritance and rematerialization
   2511  1.1  mrg 	   passes, avoid spilling reload pseudos will be created to
   2512  1.1  mrg 	   prevent LRA cycling in some complicated cases.  */
   2513  1.1  mrg 	lra_bad_spill_regno_start = lra_constraint_new_regno_start;
   2514  1.1  mrg       lra_assignment_iter_after_spill = 0;
   2515  1.1  mrg     }
   2516  1.1  mrg   ira_restore_scratches (lra_dump_file);
   2517  1.1  mrg   lra_eliminate (true, false);
   2518  1.1  mrg   lra_final_code_change ();
   2519  1.1  mrg   lra_in_progress = 0;
   2520  1.1  mrg   if (live_p)
   2521  1.1  mrg     lra_clear_live_ranges ();
   2522  1.1  mrg   lra_live_ranges_finish ();
   2523  1.1  mrg   lra_constraints_finish ();
   2524  1.1  mrg   finish_reg_info ();
   2525  1.1  mrg   sbitmap_free (lra_constraint_insn_stack_bitmap);
   2526  1.1  mrg   lra_constraint_insn_stack.release ();
   2527  1.1  mrg   finish_insn_recog_data ();
   2528  1.1  mrg   regstat_free_n_sets_and_refs ();
   2529  1.1  mrg   regstat_free_ri ();
   2530  1.1  mrg   reload_completed = 1;
   2531  1.1  mrg   update_inc_notes ();
   2532  1.1  mrg 
   2533  1.1  mrg   inserted_p = fixup_abnormal_edges ();
   2534  1.1  mrg 
   2535  1.1  mrg   /* We've possibly turned single trapping insn into multiple ones.  */
   2536  1.1  mrg   if (cfun->can_throw_non_call_exceptions)
   2537  1.1  mrg     {
   2538  1.1  mrg       auto_sbitmap blocks (last_basic_block_for_fn (cfun));
   2539  1.1  mrg       bitmap_ones (blocks);
   2540  1.1  mrg       find_many_sub_basic_blocks (blocks);
   2541  1.1  mrg     }
   2542  1.1  mrg 
   2543  1.1  mrg   if (inserted_p)
   2544  1.1  mrg     commit_edge_insertions ();
   2545  1.1  mrg 
   2546  1.1  mrg   /* Subsequent passes expect that rtl is unshared, so unshare everything
   2547  1.1  mrg      here.  */
   2548  1.1  mrg   unshare_all_rtl_again (get_insns ());
   2549  1.1  mrg 
   2550  1.1  mrg   if (flag_checking)
   2551  1.1  mrg     check_rtl (true);
   2552  1.1  mrg 
   2553  1.1  mrg   timevar_pop (TV_LRA);
   2554  1.1  mrg }
   2555  1.1  mrg 
   2556  1.1  mrg /* Called once per compiler to initialize LRA data once.  */
   2557  1.1  mrg void
   2558  1.1  mrg lra_init_once (void)
   2559  1.1  mrg {
   2560  1.1  mrg   init_insn_code_data_once ();
   2561  1.1  mrg }
   2562           
   2563           /* Called once per compiler to finish LRA data which are initialize
   2564              once.  */
   2565           void
   2566           lra_finish_once (void)
   2567           {
   2568             finish_insn_code_data_once ();
   2569           }
   2570