LCOV - code coverage report
Current view: top level - gcc - loop-invariant.cc (source / functions) Coverage Total Hit
Test: gcc.info Lines: 96.9 % 988 957
Test Date: 2024-12-21 13:15:12 Functions: 96.3 % 54 52
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: - 0 0

             Branch data     Line data    Source code
       1                 :             : /* RTL-level loop invariant motion.
       2                 :             :    Copyright (C) 2004-2024 Free Software Foundation, Inc.
       3                 :             : 
       4                 :             : This file is part of GCC.
       5                 :             : 
       6                 :             : GCC is free software; you can redistribute it and/or modify it
       7                 :             : under the terms of the GNU General Public License as published by the
       8                 :             : Free Software Foundation; either version 3, or (at your option) any
       9                 :             : later version.
      10                 :             : 
      11                 :             : GCC is distributed in the hope that it will be useful, but WITHOUT
      12                 :             : ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
      13                 :             : FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
      14                 :             : for more details.
      15                 :             : 
      16                 :             : You should have received a copy of the GNU General Public License
      17                 :             : along with GCC; see the file COPYING3.  If not see
      18                 :             : <http://www.gnu.org/licenses/>.  */
      19                 :             : 
      20                 :             : /* This implements the loop invariant motion pass.  It is very simple
      21                 :             :    (no calls, no loads/stores, etc.).  This should be sufficient to cleanup
      22                 :             :    things like address arithmetics -- other more complicated invariants should
      23                 :             :    be eliminated on GIMPLE either in tree-ssa-loop-im.cc or in tree-ssa-pre.cc.
      24                 :             : 
      25                 :             :    We proceed loop by loop -- it is simpler than trying to handle things
      26                 :             :    globally and should not lose much.  First we inspect all sets inside loop
      27                 :             :    and create a dependency graph on insns (saying "to move this insn, you must
      28                 :             :    also move the following insns").
      29                 :             : 
      30                 :             :    We then need to determine what to move.  We estimate the number of registers
      31                 :             :    used and move as many invariants as possible while we still have enough free
      32                 :             :    registers.  We prefer the expensive invariants.
      33                 :             : 
      34                 :             :    Then we move the selected invariants out of the loop, creating a new
      35                 :             :    temporaries for them if necessary.  */
      36                 :             : 
      37                 :             : #include "config.h"
      38                 :             : #include "system.h"
      39                 :             : #include "coretypes.h"
      40                 :             : #include "backend.h"
      41                 :             : #include "target.h"
      42                 :             : #include "rtl.h"
      43                 :             : #include "tree.h"
      44                 :             : #include "cfghooks.h"
      45                 :             : #include "df.h"
      46                 :             : #include "memmodel.h"
      47                 :             : #include "tm_p.h"
      48                 :             : #include "insn-config.h"
      49                 :             : #include "regs.h"
      50                 :             : #include "ira.h"
      51                 :             : #include "recog.h"
      52                 :             : #include "cfgrtl.h"
      53                 :             : #include "cfgloop.h"
      54                 :             : #include "expr.h"
      55                 :             : #include "rtl-iter.h"
      56                 :             : #include "dumpfile.h"
      57                 :             : 
      58                 :             : /* The data stored for the loop.  */
      59                 :             : 
      60                 :             : class loop_data
      61                 :             : {
      62                 :             : public:
      63                 :             :   class loop *outermost_exit;   /* The outermost exit of the loop.  */
      64                 :             :   bool has_call;                /* True if the loop contains a call.  */
      65                 :             :   /* Maximal register pressure inside loop for given register class
      66                 :             :      (defined only for the pressure classes).  */
      67                 :             :   int max_reg_pressure[N_REG_CLASSES];
      68                 :             :   /* Loop regs referenced and live pseudo-registers.  */
      69                 :             :   bitmap_head regs_ref;
      70                 :             :   bitmap_head regs_live;
      71                 :             : };
      72                 :             : 
      73                 :             : #define LOOP_DATA(LOOP) ((class loop_data *) (LOOP)->aux)
      74                 :             : 
      75                 :             : /* The description of an use.  */
      76                 :             : 
      77                 :             : struct use
      78                 :             : {
      79                 :             :   rtx *pos;                     /* Position of the use.  */
      80                 :             :   rtx_insn *insn;               /* The insn in that the use occurs.  */
      81                 :             :   unsigned addr_use_p;          /* Whether the use occurs in an address.  */
      82                 :             :   struct use *next;             /* Next use in the list.  */
      83                 :             : };
      84                 :             : 
      85                 :             : /* The description of a def.  */
      86                 :             : 
      87                 :             : struct def
      88                 :             : {
      89                 :             :   struct use *uses;             /* The list of uses that are uniquely reached
      90                 :             :                                    by it.  */
      91                 :             :   unsigned n_uses;              /* Number of such uses.  */
      92                 :             :   unsigned n_addr_uses;         /* Number of uses in addresses.  */
      93                 :             :   unsigned invno;               /* The corresponding invariant.  */
      94                 :             :   bool can_prop_to_addr_uses;   /* True if the corresponding inv can be
      95                 :             :                                    propagated into its address uses.  */
      96                 :             : };
      97                 :             : 
      98                 :             : /* The data stored for each invariant.  */
      99                 :             : 
     100                 :             : struct invariant
     101                 :             : {
     102                 :             :   /* The number of the invariant.  */
     103                 :             :   unsigned invno;
     104                 :             : 
     105                 :             :   /* The number of the invariant with the same value.  */
     106                 :             :   unsigned eqto;
     107                 :             : 
     108                 :             :   /* The number of invariants which eqto this.  */
     109                 :             :   unsigned eqno;
     110                 :             : 
     111                 :             :   /* If we moved the invariant out of the loop, the original regno
     112                 :             :      that contained its value.  */
     113                 :             :   int orig_regno;
     114                 :             : 
     115                 :             :   /* If we moved the invariant out of the loop, the register that contains its
     116                 :             :      value.  */
     117                 :             :   rtx reg;
     118                 :             : 
     119                 :             :   /* The definition of the invariant.  */
     120                 :             :   struct def *def;
     121                 :             : 
     122                 :             :   /* The insn in that it is defined.  */
     123                 :             :   rtx_insn *insn;
     124                 :             : 
     125                 :             :   /* Whether it is always executed.  */
     126                 :             :   bool always_executed;
     127                 :             : 
     128                 :             :   /* Whether to move the invariant.  */
     129                 :             :   bool move;
     130                 :             : 
     131                 :             :   /* Whether the invariant is cheap when used as an address.  */
     132                 :             :   bool cheap_address;
     133                 :             : 
     134                 :             :   /* Cost of the invariant.  */
     135                 :             :   unsigned cost;
     136                 :             : 
     137                 :             :   /* Used for detecting already visited invariants during determining
     138                 :             :      costs of movements.  */
     139                 :             :   unsigned stamp;
     140                 :             : 
     141                 :             :   /* The invariants it depends on.  */
     142                 :             :   bitmap depends_on;
     143                 :             : };
     144                 :             : 
     145                 :             : /* Currently processed loop.  */
     146                 :             : static class loop *curr_loop;
     147                 :             : 
     148                 :             : /* Table of invariants indexed by the df_ref uid field.  */
     149                 :             : 
     150                 :             : static unsigned int invariant_table_size = 0;
     151                 :             : static struct invariant ** invariant_table;
     152                 :             : 
     153                 :             : /* Entry for hash table of invariant expressions.  */
     154                 :             : 
     155                 :             : struct invariant_expr_entry
     156                 :             : {
     157                 :             :   /* The invariant.  */
     158                 :             :   struct invariant *inv;
     159                 :             : 
     160                 :             :   /* Its value.  */
     161                 :             :   rtx expr;
     162                 :             : 
     163                 :             :   /* Its mode.  */
     164                 :             :   machine_mode mode;
     165                 :             : 
     166                 :             :   /* Its hash.  */
     167                 :             :   hashval_t hash;
     168                 :             : };
     169                 :             : 
     170                 :             : /* The actual stamp for marking already visited invariants during determining
     171                 :             :    costs of movements.  */
     172                 :             : 
     173                 :             : static unsigned actual_stamp;
     174                 :             : 
     175                 :             : typedef struct invariant *invariant_p;
     176                 :             : 
     177                 :             : 
     178                 :             : /* The invariants.  */
     179                 :             : 
     180                 :             : static vec<invariant_p> invariants;
     181                 :             : 
     182                 :             : /* Check the size of the invariant table and realloc if necessary.  */
     183                 :             : 
     184                 :             : static void
     185                 :    22929777 : check_invariant_table_size (void)
     186                 :             : {
     187                 :    22929777 :   if (invariant_table_size < DF_DEFS_TABLE_SIZE ())
     188                 :             :     {
     189                 :      276241 :       unsigned int new_size = DF_DEFS_TABLE_SIZE () + (DF_DEFS_TABLE_SIZE () / 4);
     190                 :      276241 :       invariant_table = XRESIZEVEC (struct invariant *, invariant_table, new_size);
     191                 :      276241 :       memset (&invariant_table[invariant_table_size], 0,
     192                 :      276241 :               (new_size - invariant_table_size) * sizeof (struct invariant *));
     193                 :      276241 :       invariant_table_size = new_size;
     194                 :             :     }
     195                 :    22929777 : }
     196                 :             : 
     197                 :             : /* Test for possibility of invariantness of X.  */
     198                 :             : 
     199                 :             : static bool
     200                 :    18048126 : check_maybe_invariant (rtx x)
     201                 :             : {
     202                 :    18048126 :   enum rtx_code code = GET_CODE (x);
     203                 :    18048126 :   int i, j;
     204                 :    18048126 :   const char *fmt;
     205                 :             : 
     206                 :    18048126 :   switch (code)
     207                 :             :     {
     208                 :             :     CASE_CONST_ANY:
     209                 :             :     case SYMBOL_REF:
     210                 :             :     case CONST:
     211                 :             :     case LABEL_REF:
     212                 :             :       return true;
     213                 :             : 
     214                 :             :     case PC:
     215                 :             :     case UNSPEC_VOLATILE:
     216                 :             :     case CALL:
     217                 :             :       return false;
     218                 :             : 
     219                 :             :     case REG:
     220                 :             :       return true;
     221                 :             : 
     222                 :     1673381 :     case MEM:
     223                 :             :       /* Load/store motion is done elsewhere.  ??? Perhaps also add it here?
     224                 :             :          It should not be hard, and might be faster than "elsewhere".  */
     225                 :             : 
     226                 :             :       /* Just handle the most trivial case where we load from an unchanging
     227                 :             :          location (most importantly, pic tables).  */
     228                 :     1673381 :       if (MEM_READONLY_P (x) && !MEM_VOLATILE_P (x))
     229                 :             :         break;
     230                 :             : 
     231                 :             :       return false;
     232                 :             : 
     233                 :         500 :     case ASM_OPERANDS:
     234                 :             :       /* Don't mess with insns declared volatile.  */
     235                 :         500 :       if (MEM_VOLATILE_P (x))
     236                 :             :         return false;
     237                 :             :       break;
     238                 :             : 
     239                 :             :     default:
     240                 :             :       break;
     241                 :             :     }
     242                 :             : 
     243                 :     4763033 :   fmt = GET_RTX_FORMAT (code);
     244                 :    13363996 :   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
     245                 :             :     {
     246                 :     8747347 :       if (fmt[i] == 'e')
     247                 :             :         {
     248                 :     7837577 :           if (!check_maybe_invariant (XEXP (x, i)))
     249                 :             :             return false;
     250                 :             :         }
     251                 :      909770 :       else if (fmt[i] == 'E')
     252                 :             :         {
     253                 :     1587420 :           for (j = 0; j < XVECLEN (x, i); j++)
     254                 :     1237276 :             if (!check_maybe_invariant (XVECEXP (x, i, j)))
     255                 :             :               return false;
     256                 :             :         }
     257                 :             :     }
     258                 :             : 
     259                 :             :   return true;
     260                 :             : }
     261                 :             : 
     262                 :             : /* Returns the invariant definition for USE, or NULL if USE is not
     263                 :             :    invariant.  */
     264                 :             : 
     265                 :             : static struct invariant *
     266                 :    22736932 : invariant_for_use (df_ref use)
     267                 :             : {
     268                 :    22736932 :   struct df_link *defs;
     269                 :    22736932 :   df_ref def;
     270                 :    22736932 :   basic_block bb = DF_REF_BB (use), def_bb;
     271                 :             : 
     272                 :    22736932 :   if (DF_REF_FLAGS (use) & DF_REF_READ_WRITE)
     273                 :             :     return NULL;
     274                 :             : 
     275                 :    22687177 :   defs = DF_REF_CHAIN (use);
     276                 :    22687177 :   if (!defs || defs->next)
     277                 :             :     return NULL;
     278                 :    16209457 :   def = defs->ref;
     279                 :    16209457 :   check_invariant_table_size ();
     280                 :    16209457 :   if (!invariant_table[DF_REF_ID (def)])
     281                 :             :     return NULL;
     282                 :             : 
     283                 :     1459332 :   def_bb = DF_REF_BB (def);
     284                 :     1459332 :   if (!dominated_by_p (CDI_DOMINATORS, bb, def_bb))
     285                 :             :     return NULL;
     286                 :     1458966 :   return invariant_table[DF_REF_ID (def)];
     287                 :             : }
     288                 :             : 
     289                 :             : /* Computes hash value for invariant expression X in INSN.  */
     290                 :             : 
     291                 :             : static hashval_t
     292                 :     1784376 : hash_invariant_expr_1 (rtx_insn *insn, rtx x)
     293                 :             : {
     294                 :     1784376 :   enum rtx_code code = GET_CODE (x);
     295                 :     1784376 :   int i, j;
     296                 :     1784376 :   const char *fmt;
     297                 :     1784376 :   hashval_t val = code;
     298                 :     1784376 :   int do_not_record_p;
     299                 :     1784376 :   df_ref use;
     300                 :     1784376 :   struct invariant *inv;
     301                 :             : 
     302                 :     1784376 :   switch (code)
     303                 :             :     {
     304                 :      775028 :     CASE_CONST_ANY:
     305                 :      775028 :     case SYMBOL_REF:
     306                 :      775028 :     case CONST:
     307                 :      775028 :     case LABEL_REF:
     308                 :      775028 :       return hash_rtx (x, GET_MODE (x), &do_not_record_p, NULL, false);
     309                 :             : 
     310                 :      704396 :     case REG:
     311                 :      704396 :       use = df_find_use (insn, x);
     312                 :      704396 :       if (!use)
     313                 :           0 :         return hash_rtx (x, GET_MODE (x), &do_not_record_p, NULL, false);
     314                 :      704396 :       inv = invariant_for_use (use);
     315                 :      704396 :       if (!inv)
     316                 :      458656 :         return hash_rtx (x, GET_MODE (x), &do_not_record_p, NULL, false);
     317                 :             : 
     318                 :      245740 :       gcc_assert (inv->eqto != ~0u);
     319                 :             :       return inv->eqto;
     320                 :             : 
     321                 :      304952 :     default:
     322                 :      304952 :       break;
     323                 :             :     }
     324                 :             : 
     325                 :      304952 :   fmt = GET_RTX_FORMAT (code);
     326                 :      872965 :   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
     327                 :             :     {
     328                 :      568013 :       if (fmt[i] == 'e')
     329                 :      522338 :         val ^= hash_invariant_expr_1 (insn, XEXP (x, i));
     330                 :             :       else if (fmt[i] == 'E')
     331                 :             :         {
     332                 :        4748 :           for (j = 0; j < XVECLEN (x, i); j++)
     333                 :        3895 :             val ^= hash_invariant_expr_1 (insn, XVECEXP (x, i, j));
     334                 :             :         }
     335                 :             :       else if (fmt[i] == 'i' || fmt[i] == 'n')
     336                 :         208 :         val ^= XINT (x, i);
     337                 :             :       else if (fmt[i] == 'L')
     338                 :          56 :         val ^= XLOC (x, i);
     339                 :             :       else if (fmt[i] == 'p')
     340                 :        6435 :         val ^= constant_lower_bound (SUBREG_BYTE (x));
     341                 :             :     }
     342                 :             : 
     343                 :             :   return val;
     344                 :             : }
     345                 :             : 
     346                 :             : /* Returns true if the invariant expressions E1 and E2 used in insns INSN1
     347                 :             :    and INSN2 have always the same value.  */
     348                 :             : 
     349                 :             : static bool
     350                 :     2368545 : invariant_expr_equal_p (rtx_insn *insn1, rtx e1, rtx_insn *insn2, rtx e2)
     351                 :             : {
     352                 :     2368545 :   enum rtx_code code = GET_CODE (e1);
     353                 :     2368545 :   int i, j;
     354                 :     2368545 :   const char *fmt;
     355                 :     2368545 :   df_ref use1, use2;
     356                 :     2368545 :   struct invariant *inv1 = NULL, *inv2 = NULL;
     357                 :     2368545 :   rtx sub1, sub2;
     358                 :             : 
     359                 :             :   /* If mode of only one of the operands is VOIDmode, it is not equivalent to
     360                 :             :      the other one.  If both are VOIDmode, we rely on the caller of this
     361                 :             :      function to verify that their modes are the same.  */
     362                 :     2368545 :   if (code != GET_CODE (e2) || GET_MODE (e1) != GET_MODE (e2))
     363                 :             :     return false;
     364                 :             : 
     365                 :     1221897 :   switch (code)
     366                 :             :     {
     367                 :      496300 :     CASE_CONST_ANY:
     368                 :      496300 :     case SYMBOL_REF:
     369                 :      496300 :     case CONST:
     370                 :      496300 :     case LABEL_REF:
     371                 :      496300 :       return rtx_equal_p (e1, e2);
     372                 :             : 
     373                 :      543045 :     case REG:
     374                 :      543045 :       use1 = df_find_use (insn1, e1);
     375                 :      543045 :       use2 = df_find_use (insn2, e2);
     376                 :      543045 :       if (use1)
     377                 :      543045 :         inv1 = invariant_for_use (use1);
     378                 :      543045 :       if (use2)
     379                 :      543045 :         inv2 = invariant_for_use (use2);
     380                 :             : 
     381                 :      543045 :       if (!inv1 && !inv2)
     382                 :      205070 :         return rtx_equal_p (e1, e2);
     383                 :             : 
     384                 :      337975 :       if (!inv1 || !inv2)
     385                 :             :         return false;
     386                 :             : 
     387                 :      238832 :       gcc_assert (inv1->eqto != ~0u);
     388                 :      238832 :       gcc_assert (inv2->eqto != ~0u);
     389                 :      238832 :       return inv1->eqto == inv2->eqto;
     390                 :             : 
     391                 :      182552 :     default:
     392                 :      182552 :       break;
     393                 :             :     }
     394                 :             : 
     395                 :      182552 :   fmt = GET_RTX_FORMAT (code);
     396                 :      233896 :   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
     397                 :             :     {
     398                 :      211567 :       if (fmt[i] == 'e')
     399                 :             :         {
     400                 :      185937 :           sub1 = XEXP (e1, i);
     401                 :      185937 :           sub2 = XEXP (e2, i);
     402                 :             : 
     403                 :      185937 :           if (!invariant_expr_equal_p (insn1, sub1, insn2, sub2))
     404                 :             :             return false;
     405                 :             :         }
     406                 :             : 
     407                 :             :       else if (fmt[i] == 'E')
     408                 :             :         {
     409                 :         522 :           if (XVECLEN (e1, i) != XVECLEN (e2, i))
     410                 :             :             return false;
     411                 :             : 
     412                 :        1660 :           for (j = 0; j < XVECLEN (e1, i); j++)
     413                 :             :             {
     414                 :        1395 :               sub1 = XVECEXP (e1, i, j);
     415                 :        1395 :               sub2 = XVECEXP (e2, i, j);
     416                 :             : 
     417                 :        1395 :               if (!invariant_expr_equal_p (insn1, sub1, insn2, sub2))
     418                 :             :                 return false;
     419                 :             :             }
     420                 :             :         }
     421                 :             :       else if (fmt[i] == 'i' || fmt[i] == 'n')
     422                 :             :         {
     423                 :         110 :           if (XINT (e1, i) != XINT (e2, i))
     424                 :             :             return false;
     425                 :             :         }
     426                 :             :       else if (fmt[i] == 'p')
     427                 :             :         {
     428                 :        4332 :           if (maybe_ne (SUBREG_BYTE (e1), SUBREG_BYTE (e2)))
     429                 :             :             return false;
     430                 :             :         }
     431                 :             :       /* Unhandled type of subexpression, we fail conservatively.  */
     432                 :             :       else
     433                 :             :         return false;
     434                 :             :     }
     435                 :             : 
     436                 :             :   return true;
     437                 :             : }
     438                 :             : 
     439                 :             : struct invariant_expr_hasher : free_ptr_hash <invariant_expr_entry>
     440                 :             : {
     441                 :             :   static inline hashval_t hash (const invariant_expr_entry *);
     442                 :             :   static inline bool equal (const invariant_expr_entry *,
     443                 :             :                             const invariant_expr_entry *);
     444                 :             : };
     445                 :             : 
     446                 :             : /* Returns hash value for invariant expression entry ENTRY.  */
     447                 :             : 
     448                 :             : inline hashval_t
     449                 :     2888188 : invariant_expr_hasher::hash (const invariant_expr_entry *entry)
     450                 :             : {
     451                 :     2888188 :   return entry->hash;
     452                 :             : }
     453                 :             : 
     454                 :             : /* Compares invariant expression entries ENTRY1 and ENTRY2.  */
     455                 :             : 
     456                 :             : inline bool
     457                 :     3356409 : invariant_expr_hasher::equal (const invariant_expr_entry *entry1,
     458                 :             :                               const invariant_expr_entry *entry2)
     459                 :             : {
     460                 :     3356409 :   if (entry1->mode != entry2->mode)
     461                 :             :     return 0;
     462                 :             : 
     463                 :     2181213 :   return invariant_expr_equal_p (entry1->inv->insn, entry1->expr,
     464                 :     2181213 :                                  entry2->inv->insn, entry2->expr);
     465                 :             : }
     466                 :             : 
     467                 :             : typedef hash_table<invariant_expr_hasher> invariant_htab_type;
     468                 :             : 
     469                 :             : /* Checks whether invariant with value EXPR in machine mode MODE is
     470                 :             :    recorded in EQ.  If this is the case, return the invariant.  Otherwise
     471                 :             :    insert INV to the table for this expression and return INV.  */
     472                 :             : 
     473                 :             : static struct invariant *
     474                 :     1258143 : find_or_insert_inv (invariant_htab_type *eq, rtx expr, machine_mode mode,
     475                 :             :                     struct invariant *inv)
     476                 :             : {
     477                 :     1258143 :   hashval_t hash = hash_invariant_expr_1 (inv->insn, expr);
     478                 :     1258143 :   struct invariant_expr_entry *entry;
     479                 :     1258143 :   struct invariant_expr_entry pentry;
     480                 :     1258143 :   invariant_expr_entry **slot;
     481                 :             : 
     482                 :     1258143 :   pentry.expr = expr;
     483                 :     1258143 :   pentry.inv = inv;
     484                 :     1258143 :   pentry.mode = mode;
     485                 :     1258143 :   slot = eq->find_slot_with_hash (&pentry, hash, INSERT);
     486                 :     1258143 :   entry = *slot;
     487                 :             : 
     488                 :     1258143 :   if (entry)
     489                 :      352172 :     return entry->inv;
     490                 :             : 
     491                 :      905971 :   entry = XNEW (struct invariant_expr_entry);
     492                 :      905971 :   entry->inv = inv;
     493                 :      905971 :   entry->expr = expr;
     494                 :      905971 :   entry->mode = mode;
     495                 :      905971 :   entry->hash = hash;
     496                 :      905971 :   *slot = entry;
     497                 :             : 
     498                 :      905971 :   return inv;
     499                 :             : }
     500                 :             : 
     501                 :             : /* Finds invariants identical to INV and records the equivalence.  EQ is the
     502                 :             :    hash table of the invariants.  */
     503                 :             : 
     504                 :             : static void
     505                 :     1504273 : find_identical_invariants (invariant_htab_type *eq, struct invariant *inv)
     506                 :             : {
     507                 :     1504273 :   unsigned depno;
     508                 :     1504273 :   bitmap_iterator bi;
     509                 :     1504273 :   struct invariant *dep;
     510                 :     1504273 :   rtx expr, set;
     511                 :     1504273 :   machine_mode mode;
     512                 :     1504273 :   struct invariant *tmp;
     513                 :             : 
     514                 :     1504273 :   if (inv->eqto != ~0u)
     515                 :      246130 :     return;
     516                 :             : 
     517                 :     1504273 :   EXECUTE_IF_SET_IN_BITMAP (inv->depends_on, 0, depno, bi)
     518                 :             :     {
     519                 :      246130 :       dep = invariants[depno];
     520                 :      246130 :       find_identical_invariants (eq, dep);
     521                 :             :     }
     522                 :             : 
     523                 :     1258143 :   set = single_set (inv->insn);
     524                 :     1258143 :   expr = SET_SRC (set);
     525                 :     1258143 :   mode = GET_MODE (expr);
     526                 :     1258143 :   if (mode == VOIDmode)
     527                 :      367922 :     mode = GET_MODE (SET_DEST (set));
     528                 :             : 
     529                 :     1258143 :   tmp = find_or_insert_inv (eq, expr, mode, inv);
     530                 :     1258143 :   inv->eqto = tmp->invno;
     531                 :             : 
     532                 :     1258143 :   if (tmp->invno != inv->invno && inv->always_executed)
     533                 :       62465 :     tmp->eqno++;
     534                 :             : 
     535                 :     1258143 :   if (dump_file && inv->eqto != inv->invno)
     536                 :           0 :     fprintf (dump_file,
     537                 :             :              "Invariant %d is equivalent to invariant %d.\n",
     538                 :             :              inv->invno, inv->eqto);
     539                 :             : }
     540                 :             : 
     541                 :             : /* Find invariants with the same value and record the equivalences.  */
     542                 :             : 
     543                 :             : static void
     544                 :      601647 : merge_identical_invariants (void)
     545                 :             : {
     546                 :      601647 :   unsigned i;
     547                 :      601647 :   struct invariant *inv;
     548                 :      601647 :   invariant_htab_type eq (invariants.length ());
     549                 :             : 
     550                 :     2461437 :   FOR_EACH_VEC_ELT (invariants, i, inv)
     551                 :     1258143 :     find_identical_invariants (&eq, inv);
     552                 :      601647 : }
     553                 :             : 
     554                 :             : /* Determines the basic blocks inside LOOP that are always executed and
     555                 :             :    stores their bitmap to ALWAYS_REACHED.  MAY_EXIT is a bitmap of
     556                 :             :    basic blocks that may either exit the loop, or contain the call that
     557                 :             :    does not have to return.  BODY is body of the loop obtained by
     558                 :             :    get_loop_body_in_dom_order.  */
     559                 :             : 
     560                 :             : static void
     561                 :     1203294 : compute_always_reached (class loop *loop, basic_block *body,
     562                 :             :                         bitmap may_exit, bitmap always_reached)
     563                 :             : {
     564                 :     1203294 :   unsigned i;
     565                 :             : 
     566                 :     2253829 :   for (i = 0; i < loop->num_nodes; i++)
     567                 :             :     {
     568                 :     2240405 :       if (dominated_by_p (CDI_DOMINATORS, loop->latch, body[i]))
     569                 :     1438553 :         bitmap_set_bit (always_reached, i);
     570                 :             : 
     571                 :     2240405 :       if (bitmap_bit_p (may_exit, i))
     572                 :             :         return;
     573                 :             :     }
     574                 :             : }
     575                 :             : 
     576                 :             : /* Finds exits out of the LOOP with body BODY.  Marks blocks in that we may
     577                 :             :    exit the loop by cfg edge to HAS_EXIT and MAY_EXIT.  In MAY_EXIT
     578                 :             :    additionally mark blocks that may exit due to a call.  */
     579                 :             : 
     580                 :             : static void
     581                 :      601647 : find_exits (class loop *loop, basic_block *body,
     582                 :             :             bitmap may_exit, bitmap has_exit)
     583                 :             : {
     584                 :      601647 :   unsigned i;
     585                 :      601647 :   edge_iterator ei;
     586                 :      601647 :   edge e;
     587                 :      601647 :   class loop *outermost_exit = loop, *aexit;
     588                 :      601647 :   bool has_call = false;
     589                 :      601647 :   rtx_insn *insn;
     590                 :             : 
     591                 :     4319648 :   for (i = 0; i < loop->num_nodes; i++)
     592                 :             :     {
     593                 :     3718001 :       if (body[i]->loop_father == loop)
     594                 :             :         {
     595                 :    26323560 :           FOR_BB_INSNS (body[i], insn)
     596                 :             :             {
     597                 :    23959482 :               if (CALL_P (insn)
     598                 :    23959482 :                   && (RTL_LOOPING_CONST_OR_PURE_CALL_P (insn)
     599                 :      472089 :                       || !RTL_CONST_OR_PURE_CALL_P (insn)))
     600                 :             :                 {
     601                 :      428949 :                   has_call = true;
     602                 :      428949 :                   bitmap_set_bit (may_exit, i);
     603                 :      428949 :                   break;
     604                 :             :                 }
     605                 :             :             }
     606                 :             : 
     607                 :     7162519 :           FOR_EACH_EDGE (e, ei, body[i]->succs)
     608                 :             :             {
     609                 :     4369492 :               if (! flow_bb_inside_loop_p (loop, e->dest))
     610                 :             :                 {
     611                 :     1052780 :                   bitmap_set_bit (may_exit, i);
     612                 :     1052780 :                   bitmap_set_bit (has_exit, i);
     613                 :     1052780 :                   outermost_exit = find_common_loop (outermost_exit,
     614                 :     1052780 :                                                      e->dest->loop_father);
     615                 :             :                 }
     616                 :             :               /* If we enter a subloop that might never terminate treat
     617                 :             :                  it like a possible exit.  */
     618                 :     4369492 :               if (flow_loop_nested_p (loop, e->dest->loop_father))
     619                 :      138474 :                 bitmap_set_bit (may_exit, i);
     620                 :             :             }
     621                 :     2793027 :           continue;
     622                 :     2793027 :         }
     623                 :             : 
     624                 :             :       /* Use the data stored for the subloop to decide whether we may exit
     625                 :             :          through it.  It is sufficient to do this for header of the loop,
     626                 :             :          as other basic blocks inside it must be dominated by it.  */
     627                 :      924974 :       if (body[i]->loop_father->header != body[i])
     628                 :      713799 :         continue;
     629                 :             : 
     630                 :      211175 :       if (LOOP_DATA (body[i]->loop_father)->has_call)
     631                 :             :         {
     632                 :       59824 :           has_call = true;
     633                 :       59824 :           bitmap_set_bit (may_exit, i);
     634                 :             :         }
     635                 :      211175 :       aexit = LOOP_DATA (body[i]->loop_father)->outermost_exit;
     636                 :      211175 :       if (aexit != loop)
     637                 :             :         {
     638                 :      111278 :           bitmap_set_bit (may_exit, i);
     639                 :      111278 :           bitmap_set_bit (has_exit, i);
     640                 :             : 
     641                 :      111278 :           if (flow_loop_nested_p (aexit, outermost_exit))
     642                 :     3718001 :             outermost_exit = aexit;
     643                 :             :         }
     644                 :             :     }
     645                 :             : 
     646                 :      601647 :   if (loop->aux == NULL)
     647                 :             :     {
     648                 :      601646 :       loop->aux = xcalloc (1, sizeof (class loop_data));
     649                 :      601646 :       bitmap_initialize (&LOOP_DATA (loop)->regs_ref, &reg_obstack);
     650                 :      601646 :       bitmap_initialize (&LOOP_DATA (loop)->regs_live, &reg_obstack);
     651                 :             :     }
     652                 :      601647 :   LOOP_DATA (loop)->outermost_exit = outermost_exit;
     653                 :      601647 :   LOOP_DATA (loop)->has_call = has_call;
     654                 :      601647 : }
     655                 :             : 
     656                 :             : /* Check whether we may assign a value to X from a register.  */
     657                 :             : 
     658                 :             : static bool
     659                 :    12544563 : may_assign_reg_p (rtx x)
     660                 :             : {
     661                 :    12544563 :   return (GET_MODE (x) != VOIDmode
     662                 :    12543045 :           && GET_MODE (x) != BLKmode
     663                 :    12522467 :           && can_copy_p (GET_MODE (x))
     664                 :             :           /* Do not mess with the frame pointer adjustments that can
     665                 :             :              be generated e.g. by expand_builtin_setjmp_receiver.  */
     666                 :    10714997 :           && x != frame_pointer_rtx
     667                 :    23259560 :           && (!REG_P (x)
     668                 :     9125091 :               || !HARD_REGISTER_P (x)
     669                 :     1583684 :               || REGNO_REG_CLASS (REGNO (x)) != NO_REGS));
     670                 :             : }
     671                 :             : 
     672                 :             : /* Finds definitions that may correspond to invariants in LOOP with body
     673                 :             :    BODY.  */
     674                 :             : 
     675                 :             : static void
     676                 :      601647 : find_defs (class loop *loop)
     677                 :             : {
     678                 :      601647 :   if (dump_file)
     679                 :             :     {
     680                 :          21 :       fprintf (dump_file,
     681                 :             :                "*****starting processing of loop %d ******\n",
     682                 :             :                loop->num);
     683                 :             :     }
     684                 :             : 
     685                 :      601647 :   df_chain_add_problem (DF_UD_CHAIN);
     686                 :      601647 :   df_set_flags (DF_RD_PRUNE_DEAD_DEFS);
     687                 :      601647 :   df_analyze_loop (loop);
     688                 :      601647 :   check_invariant_table_size ();
     689                 :             : 
     690                 :      601647 :   if (dump_file)
     691                 :             :     {
     692                 :          21 :       df_dump_region (dump_file);
     693                 :          21 :       fprintf (dump_file,
     694                 :             :                "*****ending processing of loop %d ******\n",
     695                 :             :                loop->num);
     696                 :             :     }
     697                 :      601647 : }
     698                 :             : 
     699                 :             : /* Creates a new invariant for definition DEF in INSN, depending on invariants
     700                 :             :    in DEPENDS_ON.  ALWAYS_EXECUTED is true if the insn is always executed,
     701                 :             :    unless the program ends due to a function call.  The newly created invariant
     702                 :             :    is returned.  */
     703                 :             : 
     704                 :             : static struct invariant *
     705                 :     1258143 : create_new_invariant (struct def *def, rtx_insn *insn, bitmap depends_on,
     706                 :             :                       bool always_executed)
     707                 :             : {
     708                 :     1258143 :   struct invariant *inv = XNEW (struct invariant);
     709                 :     1258143 :   rtx set = single_set (insn);
     710                 :     1258143 :   bool speed = optimize_bb_for_speed_p (BLOCK_FOR_INSN (insn));
     711                 :             : 
     712                 :     1258143 :   inv->def = def;
     713                 :     1258143 :   inv->always_executed = always_executed;
     714                 :     1258143 :   inv->depends_on = depends_on;
     715                 :             : 
     716                 :             :   /* If the set is simple, usually by moving it we move the whole store out of
     717                 :             :      the loop.  Otherwise we save only cost of the computation.  */
     718                 :     1258143 :   if (def)
     719                 :             :     {
     720                 :      606179 :       inv->cost = set_rtx_cost (set, speed);
     721                 :             :       /* ??? Try to determine cheapness of address computation.  Unfortunately
     722                 :             :          the address cost is only a relative measure, we can't really compare
     723                 :             :          it with any absolute number, but only with other address costs.
     724                 :             :          But here we don't have any other addresses, so compare with a magic
     725                 :             :          number anyway.  It has to be large enough to not regress PR33928
     726                 :             :          (by avoiding to move reg+8,reg+16,reg+24 invariants), but small
     727                 :             :          enough to not regress 410.bwaves either (by still moving reg+reg
     728                 :             :          invariants).
     729                 :             :          See http://gcc.gnu.org/ml/gcc-patches/2009-10/msg01210.html .  */
     730                 :      606179 :       if (SCALAR_INT_MODE_P (GET_MODE (SET_DEST (set))))
     731                 :      459070 :         inv->cheap_address = address_cost (SET_SRC (set), word_mode,
     732                 :      459070 :                                            ADDR_SPACE_GENERIC, speed) < 3;
     733                 :             :       else
     734                 :      147109 :         inv->cheap_address = false;
     735                 :             :     }
     736                 :             :   else
     737                 :             :     {
     738                 :      651964 :       inv->cost = set_src_cost (SET_SRC (set), GET_MODE (SET_DEST (set)),
     739                 :             :                                 speed);
     740                 :      651964 :       inv->cheap_address = false;
     741                 :             :     }
     742                 :             : 
     743                 :     1258143 :   inv->move = false;
     744                 :     1258143 :   inv->reg = NULL_RTX;
     745                 :     1258143 :   inv->orig_regno = -1;
     746                 :     1258143 :   inv->stamp = 0;
     747                 :     1258143 :   inv->insn = insn;
     748                 :             : 
     749                 :     1258143 :   inv->invno = invariants.length ();
     750                 :     1258143 :   inv->eqto = ~0u;
     751                 :             : 
     752                 :             :   /* Itself.  */
     753                 :     1258143 :   inv->eqno = 1;
     754                 :             : 
     755                 :     1258143 :   if (def)
     756                 :      606179 :     def->invno = inv->invno;
     757                 :     1258143 :   invariants.safe_push (inv);
     758                 :             : 
     759                 :     1258143 :   if (dump_file)
     760                 :             :     {
     761                 :          12 :       fprintf (dump_file,
     762                 :             :                "Set in insn %d is invariant (%d), cost %d, depends on ",
     763                 :          12 :                INSN_UID (insn), inv->invno, inv->cost);
     764                 :          12 :       dump_bitmap (dump_file, inv->depends_on);
     765                 :             :     }
     766                 :             : 
     767                 :     1258143 :   return inv;
     768                 :             : }
     769                 :             : 
     770                 :             : /* Return a canonical version of X for the address, from the point of view,
     771                 :             :    that all multiplications are represented as MULT instead of the multiply
     772                 :             :    by a power of 2 being represented as ASHIFT.
     773                 :             : 
     774                 :             :    Callers should prepare a copy of X because this function may modify it
     775                 :             :    in place.  */
     776                 :             : 
     777                 :             : static void
     778                 :       27406 : canonicalize_address_mult (rtx x)
     779                 :             : {
     780                 :       27406 :   subrtx_var_iterator::array_type array;
     781                 :      195031 :   FOR_EACH_SUBRTX_VAR (iter, array, x, NONCONST)
     782                 :             :     {
     783                 :      167625 :       rtx sub = *iter;
     784                 :      167625 :       scalar_int_mode sub_mode;
     785                 :      289981 :       if (is_a <scalar_int_mode> (GET_MODE (sub), &sub_mode)
     786                 :      122356 :           && GET_CODE (sub) == ASHIFT
     787                 :         187 :           && CONST_INT_P (XEXP (sub, 1))
     788                 :         374 :           && INTVAL (XEXP (sub, 1)) < GET_MODE_BITSIZE (sub_mode)
     789                 :         187 :           && INTVAL (XEXP (sub, 1)) >= 0)
     790                 :             :         {
     791                 :         187 :           HOST_WIDE_INT shift = INTVAL (XEXP (sub, 1));
     792                 :         187 :           PUT_CODE (sub, MULT);
     793                 :         187 :           XEXP (sub, 1) = gen_int_mode (HOST_WIDE_INT_1 << shift, sub_mode);
     794                 :         187 :           iter.skip_subrtxes ();
     795                 :             :         }
     796                 :             :     }
     797                 :       27406 : }
     798                 :             : 
     799                 :             : /* Maximum number of sub expressions in address.  We set it to
     800                 :             :    a small integer since it's unlikely to have a complicated
     801                 :             :    address expression.  */
     802                 :             : 
     803                 :             : #define MAX_CANON_ADDR_PARTS (5)
     804                 :             : 
     805                 :             : /* Collect sub expressions in address X with PLUS as the seperator.
     806                 :             :    Sub expressions are stored in vector ADDR_PARTS.  */
     807                 :             : 
     808                 :             : static void
     809                 :       27406 : collect_address_parts (rtx x, vec<rtx> *addr_parts)
     810                 :             : {
     811                 :       27406 :   subrtx_var_iterator::array_type array;
     812                 :      158404 :   FOR_EACH_SUBRTX_VAR (iter, array, x, NONCONST)
     813                 :             :     {
     814                 :      130998 :       rtx sub = *iter;
     815                 :             : 
     816                 :      130998 :       if (GET_CODE (sub) != PLUS)
     817                 :             :         {
     818                 :       79202 :           addr_parts->safe_push (sub);
     819                 :       79202 :           iter.skip_subrtxes ();
     820                 :             :         }
     821                 :             :     }
     822                 :       27406 : }
     823                 :             : 
     824                 :             : /* Compare function for sorting sub expressions X and Y based on
     825                 :             :    precedence defined for communitive operations.  */
     826                 :             : 
     827                 :             : static int
     828                 :      281126 : compare_address_parts (const void *x, const void *y)
     829                 :             : {
     830                 :      281126 :   const rtx *rx = (const rtx *)x;
     831                 :      281126 :   const rtx *ry = (const rtx *)y;
     832                 :      281126 :   int px = commutative_operand_precedence (*rx);
     833                 :      281126 :   int py = commutative_operand_precedence (*ry);
     834                 :             : 
     835                 :      281126 :   return (py - px);
     836                 :             : }
     837                 :             : 
     838                 :             : /* Return a canonical version address for X by following steps:
     839                 :             :      1) Rewrite ASHIFT into MULT recursively.
     840                 :             :      2) Divide address into sub expressions with PLUS as the
     841                 :             :         separator.
     842                 :             :      3) Sort sub expressions according to precedence defined
     843                 :             :         for communative operations.
     844                 :             :      4) Simplify CONST_INT_P sub expressions.
     845                 :             :      5) Create new canonicalized address and return.
     846                 :             :    Callers should prepare a copy of X because this function may
     847                 :             :    modify it in place.  */
     848                 :             : 
     849                 :             : static rtx
     850                 :       27406 : canonicalize_address (rtx x)
     851                 :             : {
     852                 :       27406 :   rtx res;
     853                 :       27406 :   unsigned int i, j;
     854                 :       27406 :   machine_mode mode = GET_MODE (x);
     855                 :       27406 :   auto_vec<rtx, MAX_CANON_ADDR_PARTS> addr_parts;
     856                 :             : 
     857                 :             :   /* Rewrite ASHIFT into MULT.  */
     858                 :       27406 :   canonicalize_address_mult (x);
     859                 :             :   /* Divide address into sub expressions.  */
     860                 :       27406 :   collect_address_parts (x, &addr_parts);
     861                 :             :   /* Unlikely to have very complicated address.  */
     862                 :       27406 :   if (addr_parts.length () < 2
     863                 :       27406 :       || addr_parts.length () > MAX_CANON_ADDR_PARTS)
     864                 :             :     return x;
     865                 :             : 
     866                 :             :   /* Sort sub expressions according to canonicalization precedence.  */
     867                 :       27374 :   addr_parts.qsort (compare_address_parts);
     868                 :             : 
     869                 :             :   /* Simplify all constant int summary if possible.  */
     870                 :      106325 :   for (i = 0; i < addr_parts.length (); i++)
     871                 :       77094 :     if (CONST_INT_P (addr_parts[i]))
     872                 :             :       break;
     873                 :             : 
     874                 :       29450 :   for (j = i + 1; j < addr_parts.length (); j++)
     875                 :             :     {
     876                 :        2076 :       gcc_assert (CONST_INT_P (addr_parts[j]));
     877                 :        2076 :       addr_parts[i] = simplify_gen_binary (PLUS, mode,
     878                 :        2076 :                                            addr_parts[i],
     879                 :        2076 :                                            addr_parts[j]);
     880                 :             :     }
     881                 :             : 
     882                 :             :   /* Chain PLUS operators to the left for !CONST_INT_P sub expressions.  */
     883                 :       27374 :   res = addr_parts[0];
     884                 :       51591 :   for (j = 1; j < i; j++)
     885                 :       24217 :     res = simplify_gen_binary (PLUS, mode, res, addr_parts[j]);
     886                 :             : 
     887                 :             :   /* Pickup the last CONST_INT_P sub expression.  */
     888                 :       52923 :   if (i < addr_parts.length ())
     889                 :       25517 :     res = simplify_gen_binary (PLUS, mode, res, addr_parts[i]);
     890                 :             : 
     891                 :             :   return res;
     892                 :       27406 : }
     893                 :             : 
     894                 :             : /* Given invariant DEF and its address USE, check if the corresponding
     895                 :             :    invariant expr can be propagated into the use or not.  */
     896                 :             : 
     897                 :             : static bool
     898                 :       49376 : inv_can_prop_to_addr_use (struct def *def, df_ref use)
     899                 :             : {
     900                 :       49376 :   struct invariant *inv;
     901                 :       49376 :   rtx *pos = DF_REF_REAL_LOC (use), def_set, use_set;
     902                 :       49376 :   rtx_insn *use_insn = DF_REF_INSN (use);
     903                 :       49376 :   rtx_insn *def_insn;
     904                 :       49376 :   bool ok;
     905                 :             : 
     906                 :       49376 :   inv = invariants[def->invno];
     907                 :             :   /* No need to check if address expression is expensive.  */
     908                 :       49376 :   if (!inv->cheap_address)
     909                 :             :     return false;
     910                 :             : 
     911                 :       43642 :   def_insn = inv->insn;
     912                 :       43642 :   def_set = single_set (def_insn);
     913                 :       43642 :   if (!def_set)
     914                 :             :     return false;
     915                 :             : 
     916                 :       43642 :   validate_unshare_change (use_insn, pos, SET_SRC (def_set), true);
     917                 :       43642 :   ok = verify_changes (0);
     918                 :             :   /* Try harder with canonicalization in address expression.  */
     919                 :       43642 :   if (!ok && (use_set = single_set (use_insn)) != NULL_RTX)
     920                 :             :     {
     921                 :       31709 :       rtx src, dest, mem = NULL_RTX;
     922                 :             : 
     923                 :       31709 :       src = SET_SRC (use_set);
     924                 :       31709 :       dest = SET_DEST (use_set);
     925                 :       31709 :       if (MEM_P (src))
     926                 :             :         mem = src;
     927                 :        8505 :       else if (MEM_P (dest))
     928                 :             :         mem = dest;
     929                 :             : 
     930                 :             :       if (mem != NULL_RTX
     931                 :       59708 :           && !memory_address_addr_space_p (GET_MODE (mem),
     932                 :             :                                            XEXP (mem, 0),
     933                 :       27999 :                                            MEM_ADDR_SPACE (mem)))
     934                 :             :         {
     935                 :       27406 :           rtx addr = canonicalize_address (copy_rtx (XEXP (mem, 0)));
     936                 :       54812 :           if (memory_address_addr_space_p (GET_MODE (mem),
     937                 :       27406 :                                            addr, MEM_ADDR_SPACE (mem)))
     938                 :       43642 :             ok = true;
     939                 :             :         }
     940                 :             :     }
     941                 :       43642 :   cancel_changes (0);
     942                 :       43642 :   return ok;
     943                 :             : }
     944                 :             : 
     945                 :             : /* Record USE at DEF.  */
     946                 :             : 
     947                 :             : static void
     948                 :      636419 : record_use (struct def *def, df_ref use)
     949                 :             : {
     950                 :      636419 :   struct use *u = XNEW (struct use);
     951                 :             : 
     952                 :      636419 :   u->pos = DF_REF_REAL_LOC (use);
     953                 :      636419 :   u->insn = DF_REF_INSN (use);
     954                 :      636419 :   u->addr_use_p = (DF_REF_TYPE (use) == DF_REF_REG_MEM_LOAD
     955                 :      636419 :                    || DF_REF_TYPE (use) == DF_REF_REG_MEM_STORE);
     956                 :      636419 :   u->next = def->uses;
     957                 :      636419 :   def->uses = u;
     958                 :      636419 :   def->n_uses++;
     959                 :      636419 :   if (u->addr_use_p)
     960                 :             :     {
     961                 :             :       /* Initialize propagation information if this is the first addr
     962                 :             :          use of the inv def.  */
     963                 :       53107 :       if (def->n_addr_uses == 0)
     964                 :       44727 :         def->can_prop_to_addr_uses = true;
     965                 :             : 
     966                 :       53107 :       def->n_addr_uses++;
     967                 :       53107 :       if (def->can_prop_to_addr_uses && !inv_can_prop_to_addr_use (def, use))
     968                 :       12105 :         def->can_prop_to_addr_uses = false;
     969                 :             :     }
     970                 :      636419 : }
     971                 :             : 
     972                 :             : /* Finds the invariants USE depends on and store them to the DEPENDS_ON
     973                 :             :    bitmap.  Returns true if all dependencies of USE are known to be
     974                 :             :    loop invariants, false otherwise.  */
     975                 :             : 
     976                 :             : static bool
     977                 :     6638085 : check_dependency (basic_block bb, df_ref use, bitmap depends_on)
     978                 :             : {
     979                 :     6638085 :   df_ref def;
     980                 :     6638085 :   basic_block def_bb;
     981                 :     6638085 :   struct df_link *defs;
     982                 :     6638085 :   struct def *def_data;
     983                 :     6638085 :   struct invariant *inv;
     984                 :             : 
     985                 :     6638085 :   if (DF_REF_FLAGS (use) & DF_REF_READ_WRITE)
     986                 :             :     return false;
     987                 :             : 
     988                 :     6601049 :   defs = DF_REF_CHAIN (use);
     989                 :     6601049 :   if (!defs)
     990                 :             :     {
     991                 :     1194444 :       unsigned int regno = DF_REF_REGNO (use);
     992                 :             : 
     993                 :             :       /* If this is the use of an uninitialized argument register that is
     994                 :             :          likely to be spilled, do not move it lest this might extend its
     995                 :             :          lifetime and cause reload to die.  This can occur for a call to
     996                 :             :          a function taking complex number arguments and moving the insns
     997                 :             :          preparing the arguments without moving the call itself wouldn't
     998                 :             :          gain much in practice.  */
     999                 :     1194444 :       if ((DF_REF_FLAGS (use) & DF_HARD_REG_LIVE)
    1000                 :         321 :           && FUNCTION_ARG_REGNO_P (regno)
    1001                 :     1194449 :           && targetm.class_likely_spilled_p (REGNO_REG_CLASS (regno)))
    1002                 :             :         return false;
    1003                 :             : 
    1004                 :     1194443 :       return true;
    1005                 :             :     }
    1006                 :             : 
    1007                 :     5406605 :   if (defs->next)
    1008                 :             :     return false;
    1009                 :             : 
    1010                 :     4910847 :   def = defs->ref;
    1011                 :     4910847 :   check_invariant_table_size ();
    1012                 :     4910847 :   inv = invariant_table[DF_REF_ID (def)];
    1013                 :     4910847 :   if (!inv)
    1014                 :             :     return false;
    1015                 :             : 
    1016                 :      273335 :   def_data = inv->def;
    1017                 :      273335 :   gcc_assert (def_data != NULL);
    1018                 :             : 
    1019                 :      273335 :   def_bb = DF_REF_BB (def);
    1020                 :             :   /* Note that in case bb == def_bb, we know that the definition
    1021                 :             :      dominates insn, because def has invariant_table[DF_REF_ID(def)]
    1022                 :             :      defined and we process the insns in the basic block bb
    1023                 :             :      sequentially.  */
    1024                 :      273335 :   if (!dominated_by_p (CDI_DOMINATORS, bb, def_bb))
    1025                 :             :     return false;
    1026                 :             : 
    1027                 :      273235 :   bitmap_set_bit (depends_on, def_data->invno);
    1028                 :      273235 :   return true;
    1029                 :             : }
    1030                 :             : 
    1031                 :             : 
    1032                 :             : /* Finds the invariants INSN depends on and store them to the DEPENDS_ON
    1033                 :             :    bitmap.  Returns true if all dependencies of INSN are known to be
    1034                 :             :    loop invariants, false otherwise.  */
    1035                 :             : 
    1036                 :             : static bool
    1037                 :     6428550 : check_dependencies (rtx_insn *insn, bitmap depends_on)
    1038                 :             : {
    1039                 :     6428550 :   struct df_insn_info *insn_info = DF_INSN_INFO_GET (insn);
    1040                 :     6428550 :   df_ref use;
    1041                 :     6428550 :   basic_block bb = BLOCK_FOR_INSN (insn);
    1042                 :             : 
    1043                 :     7765234 :   FOR_EACH_INSN_INFO_USE (use, insn_info)
    1044                 :     6507091 :     if (!check_dependency (bb, use, depends_on))
    1045                 :             :       return false;
    1046                 :     1389137 :   FOR_EACH_INSN_INFO_EQ_USE (use, insn_info)
    1047                 :      130994 :     if (!check_dependency (bb, use, depends_on))
    1048                 :             :       return false;
    1049                 :             : 
    1050                 :             :   return true;
    1051                 :             : }
    1052                 :             : 
    1053                 :             : /* Pre-check candidate DEST to skip the one which cannot make a valid insn
    1054                 :             :    during move_invariant_reg.  SIMPLE is to skip HARD_REGISTER.  */
    1055                 :             : static bool
    1056                 :    10714997 : pre_check_invariant_p (bool simple, rtx dest)
    1057                 :             : {
    1058                 :    10714997 :   if (simple && REG_P (dest) && DF_REG_DEF_COUNT (REGNO (dest)) > 1)
    1059                 :             :     {
    1060                 :     2501418 :       df_ref use;
    1061                 :     2501418 :       unsigned int i = REGNO (dest);
    1062                 :     2501418 :       struct df_insn_info *insn_info;
    1063                 :     2501418 :       df_ref def_rec;
    1064                 :             : 
    1065                 :    11144375 :       for (use = DF_REG_USE_CHAIN (i); use; use = DF_REF_NEXT_REG (use))
    1066                 :             :         {
    1067                 :    10418801 :           rtx_insn *ref = DF_REF_INSN (use);
    1068                 :    10418801 :           insn_info = DF_INSN_INFO_GET (ref);
    1069                 :             : 
    1070                 :    18509119 :           FOR_EACH_INSN_INFO_DEF (def_rec, insn_info)
    1071                 :     9866162 :             if (DF_REF_REGNO (def_rec) == i)
    1072                 :             :               {
    1073                 :             :                 /* Multi definitions at this stage, most likely are due to
    1074                 :             :                    instruction constraints, which requires both read and write
    1075                 :             :                    on the same register.  Since move_invariant_reg is not
    1076                 :             :                    powerful enough to handle such cases, just ignore the INV
    1077                 :             :                    and leave the chance to others.  */
    1078                 :             :                 return false;
    1079                 :             :               }
    1080                 :             :         }
    1081                 :             :     }
    1082                 :             :   return true;
    1083                 :             : }
    1084                 :             : 
    1085                 :             : /* Finds invariant in INSN.  ALWAYS_REACHED is true if the insn is always
    1086                 :             :    executed.  ALWAYS_EXECUTED is true if the insn is always executed,
    1087                 :             :    unless the program ends due to a function call.  */
    1088                 :             : 
    1089                 :             : static void
    1090                 :    14589678 : find_invariant_insn (rtx_insn *insn, bool always_reached, bool always_executed)
    1091                 :             : {
    1092                 :    14589678 :   df_ref ref;
    1093                 :    14589678 :   struct def *def;
    1094                 :    14589678 :   bitmap depends_on;
    1095                 :    14589678 :   rtx set, dest;
    1096                 :    14589678 :   bool simple = true;
    1097                 :    14589678 :   struct invariant *inv;
    1098                 :             : 
    1099                 :             :   /* Jumps have control flow side-effects.  */
    1100                 :    14589678 :   if (JUMP_P (insn))
    1101                 :             :     return;
    1102                 :             : 
    1103                 :    12893060 :   set = single_set (insn);
    1104                 :    12893060 :   if (!set)
    1105                 :             :     return;
    1106                 :    12544563 :   dest = SET_DEST (set);
    1107                 :             : 
    1108                 :    12544563 :   if (!REG_P (dest)
    1109                 :    12544563 :       || HARD_REGISTER_P (dest))
    1110                 :             :     simple = false;
    1111                 :             : 
    1112                 :    12544563 :   if (!may_assign_reg_p (dest)
    1113                 :    10714997 :       || !pre_check_invariant_p (simple, dest)
    1114                 :    21483716 :       || !check_maybe_invariant (SET_SRC (set)))
    1115                 :             :     return;
    1116                 :             : 
    1117                 :             :   /* If the insn can throw exception, we cannot move it at all without changing
    1118                 :             :      cfg.  */
    1119                 :     7030329 :   if (can_throw_internal (insn))
    1120                 :             :     return;
    1121                 :             : 
    1122                 :             :   /* We cannot make trapping insn executed, unless it was executed before.  */
    1123                 :     7023144 :   if (may_trap_or_fault_p (PATTERN (insn)) && !always_reached)
    1124                 :             :     return;
    1125                 :             : 
    1126                 :     6428550 :   depends_on = BITMAP_ALLOC (NULL);
    1127                 :     6428550 :   if (!check_dependencies (insn, depends_on))
    1128                 :             :     {
    1129                 :     5170407 :       BITMAP_FREE (depends_on);
    1130                 :     5170407 :       return;
    1131                 :             :     }
    1132                 :             : 
    1133                 :     1258143 :   if (simple)
    1134                 :      606179 :     def = XCNEW (struct def);
    1135                 :             :   else
    1136                 :             :     def = NULL;
    1137                 :             : 
    1138                 :     1258143 :   inv = create_new_invariant (def, insn, depends_on, always_executed);
    1139                 :             : 
    1140                 :     1258143 :   if (simple)
    1141                 :             :     {
    1142                 :      606179 :       ref = df_find_def (insn, dest);
    1143                 :      606179 :       check_invariant_table_size ();
    1144                 :      606179 :       invariant_table[DF_REF_ID (ref)] = inv;
    1145                 :             :     }
    1146                 :             : }
    1147                 :             : 
    1148                 :             : /* Record registers used in INSN that have a unique invariant definition.  */
    1149                 :             : 
    1150                 :             : static void
    1151                 :    14589678 : record_uses (rtx_insn *insn)
    1152                 :             : {
    1153                 :    14589678 :   struct df_insn_info *insn_info = DF_INSN_INFO_GET (insn);
    1154                 :    14589678 :   df_ref use;
    1155                 :    14589678 :   struct invariant *inv;
    1156                 :             : 
    1157                 :    35106431 :   FOR_EACH_INSN_INFO_USE (use, insn_info)
    1158                 :             :     {
    1159                 :    20516753 :       inv = invariant_for_use (use);
    1160                 :    20516753 :       if (inv)
    1161                 :      635696 :         record_use (inv->def, use);
    1162                 :             :     }
    1163                 :    15019371 :   FOR_EACH_INSN_INFO_EQ_USE (use, insn_info)
    1164                 :             :     {
    1165                 :      429693 :       inv = invariant_for_use (use);
    1166                 :      429693 :       if (inv)
    1167                 :         723 :         record_use (inv->def, use);
    1168                 :             :     }
    1169                 :    14589678 : }
    1170                 :             : 
    1171                 :             : /* Finds invariants in INSN.  ALWAYS_REACHED is true if the insn is always
    1172                 :             :    executed.  ALWAYS_EXECUTED is true if the insn is always executed,
    1173                 :             :    unless the program ends due to a function call.  */
    1174                 :             : 
    1175                 :             : static void
    1176                 :    14589678 : find_invariants_insn (rtx_insn *insn, bool always_reached, bool always_executed)
    1177                 :             : {
    1178                 :           0 :   find_invariant_insn (insn, always_reached, always_executed);
    1179                 :    14589678 :   record_uses (insn);
    1180                 :           0 : }
    1181                 :             : 
    1182                 :             : /* Finds invariants in basic block BB.  ALWAYS_REACHED is true if the
    1183                 :             :    basic block is always executed.  ALWAYS_EXECUTED is true if the basic
    1184                 :             :    block is always executed, unless the program ends due to a function
    1185                 :             :    call.  */
    1186                 :             : 
    1187                 :             : static void
    1188                 :     3718001 : find_invariants_bb (class loop *loop, basic_block bb, bool always_reached,
    1189                 :             :                     bool always_executed)
    1190                 :             : {
    1191                 :     3718001 :   rtx_insn *insn;
    1192                 :     3718001 :   basic_block preheader = loop_preheader_edge (loop)->src;
    1193                 :             : 
    1194                 :             :   /* Don't move insn of cold BB out of loop to preheader to reduce calculations
    1195                 :             :      and register live range in hot loop with cold BB.  */
    1196                 :     3718001 :   if (!always_executed && preheader->count > bb->count)
    1197                 :             :     {
    1198                 :      586574 :       if (dump_file)
    1199                 :           2 :         fprintf (dump_file, "Don't move invariant from bb: %d out of loop %d\n",
    1200                 :             :                  bb->index, loop->num);
    1201                 :      586574 :       return;
    1202                 :             :     }
    1203                 :             : 
    1204                 :    34351064 :   FOR_BB_INSNS (bb, insn)
    1205                 :             :     {
    1206                 :    31219637 :       if (!NONDEBUG_INSN_P (insn))
    1207                 :    16629959 :         continue;
    1208                 :             : 
    1209                 :    14589678 :       find_invariants_insn (insn, always_reached, always_executed);
    1210                 :             : 
    1211                 :    14589678 :       if (always_reached
    1212                 :     3636920 :           && CALL_P (insn)
    1213                 :    14699841 :           && (RTL_LOOPING_CONST_OR_PURE_CALL_P (insn)
    1214                 :      109665 :               || ! RTL_CONST_OR_PURE_CALL_P (insn)))
    1215                 :             :         always_reached = false;
    1216                 :             :     }
    1217                 :             : }
    1218                 :             : 
    1219                 :             : /* Finds invariants in LOOP with body BODY.  ALWAYS_REACHED is the bitmap of
    1220                 :             :    basic blocks in BODY that are always executed.  ALWAYS_EXECUTED is the
    1221                 :             :    bitmap of basic blocks in BODY that are always executed unless the program
    1222                 :             :    ends due to a function call.  */
    1223                 :             : 
    1224                 :             : static void
    1225                 :      601647 : find_invariants_body (class loop *loop, basic_block *body,
    1226                 :             :                       bitmap always_reached, bitmap always_executed)
    1227                 :             : {
    1228                 :      601647 :   unsigned i;
    1229                 :             : 
    1230                 :     4319648 :   for (i = 0; i < loop->num_nodes; i++)
    1231                 :     3718001 :     find_invariants_bb (loop, body[i], bitmap_bit_p (always_reached, i),
    1232                 :     3718001 :                         bitmap_bit_p (always_executed, i));
    1233                 :      601647 : }
    1234                 :             : 
    1235                 :             : /* Finds invariants in LOOP.  */
    1236                 :             : 
    1237                 :             : static void
    1238                 :      601647 : find_invariants (class loop *loop)
    1239                 :             : {
    1240                 :      601647 :   auto_bitmap may_exit;
    1241                 :      601647 :   auto_bitmap always_reached;
    1242                 :      601647 :   auto_bitmap has_exit;
    1243                 :      601647 :   auto_bitmap always_executed;
    1244                 :      601647 :   basic_block *body = get_loop_body_in_dom_order (loop);
    1245                 :             : 
    1246                 :      601647 :   find_exits (loop, body, may_exit, has_exit);
    1247                 :      601647 :   compute_always_reached (loop, body, may_exit, always_reached);
    1248                 :      601647 :   compute_always_reached (loop, body, has_exit, always_executed);
    1249                 :             : 
    1250                 :      601647 :   find_defs (loop);
    1251                 :      601647 :   find_invariants_body (loop, body, always_reached, always_executed);
    1252                 :      601647 :   merge_identical_invariants ();
    1253                 :             : 
    1254                 :      601647 :   free (body);
    1255                 :      601647 : }
    1256                 :             : 
    1257                 :             : /* Frees a list of uses USE.  */
    1258                 :             : 
    1259                 :             : static void
    1260                 :      606179 : free_use_list (struct use *use)
    1261                 :             : {
    1262                 :      606179 :   struct use *next;
    1263                 :             : 
    1264                 :     1242598 :   for (; use; use = next)
    1265                 :             :     {
    1266                 :      636419 :       next = use->next;
    1267                 :      636419 :       free (use);
    1268                 :             :     }
    1269                 :           0 : }
    1270                 :             : 
    1271                 :             : /* Return pressure class and number of hard registers (through *NREGS)
    1272                 :             :    for destination of INSN. */
    1273                 :             : static enum reg_class
    1274                 :          15 : get_pressure_class_and_nregs (rtx_insn *insn, int *nregs)
    1275                 :             : {
    1276                 :          15 :   rtx reg;
    1277                 :          15 :   enum reg_class pressure_class;
    1278                 :          15 :   rtx set = single_set (insn);
    1279                 :             : 
    1280                 :             :   /* Considered invariant insns have only one set.  */
    1281                 :          15 :   gcc_assert (set != NULL_RTX);
    1282                 :          15 :   reg = SET_DEST (set);
    1283                 :          15 :   if (GET_CODE (reg) == SUBREG)
    1284                 :           0 :     reg = SUBREG_REG (reg);
    1285                 :          15 :   if (MEM_P (reg))
    1286                 :             :     {
    1287                 :           0 :       *nregs = 0;
    1288                 :           0 :       pressure_class = NO_REGS;
    1289                 :             :     }
    1290                 :             :   else
    1291                 :             :     {
    1292                 :          15 :       if (! REG_P (reg))
    1293                 :             :         reg = NULL_RTX;
    1294                 :          15 :       if (reg == NULL_RTX)
    1295                 :             :         pressure_class = GENERAL_REGS;
    1296                 :             :       else
    1297                 :             :         {
    1298                 :          15 :           pressure_class = reg_allocno_class (REGNO (reg));
    1299                 :          15 :           pressure_class = ira_pressure_class_translate[pressure_class];
    1300                 :             :         }
    1301                 :          15 :       *nregs
    1302                 :          15 :         = ira_reg_class_max_nregs[pressure_class][GET_MODE (SET_SRC (set))];
    1303                 :             :     }
    1304                 :          15 :   return pressure_class;
    1305                 :             : }
    1306                 :             : 
    1307                 :             : /* Calculates cost and number of registers needed for moving invariant INV
    1308                 :             :    out of the loop and stores them to *COST and *REGS_NEEDED.  *CL will be
    1309                 :             :    the REG_CLASS of INV.  Return
    1310                 :             :      -1: if INV is invalid.
    1311                 :             :       0: if INV and its depends_on have same reg_class
    1312                 :             :       1: if INV and its depends_on have different reg_classes.  */
    1313                 :             : 
    1314                 :             : static int
    1315                 :     2494176 : get_inv_cost (struct invariant *inv, int *comp_cost, unsigned *regs_needed,
    1316                 :             :               enum reg_class *cl)
    1317                 :             : {
    1318                 :     2494176 :   int i, acomp_cost;
    1319                 :     2494176 :   unsigned aregs_needed[N_REG_CLASSES];
    1320                 :     2494176 :   unsigned depno;
    1321                 :     2494176 :   struct invariant *dep;
    1322                 :     2494176 :   bitmap_iterator bi;
    1323                 :     2494176 :   int ret = 1;
    1324                 :             : 
    1325                 :             :   /* Find the representative of the class of the equivalent invariants.  */
    1326                 :     2494176 :   inv = invariants[inv->eqto];
    1327                 :             : 
    1328                 :     2494176 :   *comp_cost = 0;
    1329                 :     2494176 :   if (! flag_ira_loop_pressure)
    1330                 :     2494161 :     regs_needed[0] = 0;
    1331                 :             :   else
    1332                 :             :     {
    1333                 :          75 :       for (i = 0; i < ira_pressure_classes_num; i++)
    1334                 :          60 :         regs_needed[ira_pressure_classes[i]] = 0;
    1335                 :             :     }
    1336                 :             : 
    1337                 :     2494176 :   if (inv->move
    1338                 :     2491105 :       || inv->stamp == actual_stamp)
    1339                 :             :     return -1;
    1340                 :     2489332 :   inv->stamp = actual_stamp;
    1341                 :             : 
    1342                 :     2489332 :   if (! flag_ira_loop_pressure)
    1343                 :     2489317 :     regs_needed[0]++;
    1344                 :             :   else
    1345                 :             :     {
    1346                 :          15 :       int nregs;
    1347                 :          15 :       enum reg_class pressure_class;
    1348                 :             : 
    1349                 :          15 :       pressure_class = get_pressure_class_and_nregs (inv->insn, &nregs);
    1350                 :          15 :       regs_needed[pressure_class] += nregs;
    1351                 :          15 :       *cl = pressure_class;
    1352                 :          15 :       ret = 0;
    1353                 :             :     }
    1354                 :             : 
    1355                 :     2489332 :   if (!inv->cheap_address
    1356                 :      994243 :       || inv->def->n_uses == 0
    1357                 :      789585 :       || inv->def->n_addr_uses < inv->def->n_uses
    1358                 :             :       /* Count cost if the inv can't be propagated into address uses.  */
    1359                 :       71441 :       || !inv->def->can_prop_to_addr_uses)
    1360                 :     2425670 :     (*comp_cost) += inv->cost * inv->eqno;
    1361                 :             : 
    1362                 :             : #ifdef STACK_REGS
    1363                 :     2489332 :   {
    1364                 :             :     /* Hoisting constant pool constants into stack regs may cost more than
    1365                 :             :        just single register.  On x87, the balance is affected both by the
    1366                 :             :        small number of FP registers, and by its register stack organization,
    1367                 :             :        that forces us to add compensation code in and around the loop to
    1368                 :             :        shuffle the operands to the top of stack before use, and pop them
    1369                 :             :        from the stack after the loop finishes.
    1370                 :             : 
    1371                 :             :        To model this effect, we increase the number of registers needed for
    1372                 :             :        stack registers by two: one register push, and one register pop.
    1373                 :             :        This usually has the effect that FP constant loads from the constant
    1374                 :             :        pool are not moved out of the loop.
    1375                 :             : 
    1376                 :             :        Note that this also means that dependent invariants cannot be moved.
    1377                 :             :        However, the primary purpose of this pass is to move loop invariant
    1378                 :             :        address arithmetic out of loops, and address arithmetic that depends
    1379                 :             :        on floating point constants is unlikely to ever occur.  */
    1380                 :     2489332 :     rtx set = single_set (inv->insn);
    1381                 :     2489332 :     if (set
    1382                 :     2489332 :         && IS_STACK_MODE (GET_MODE (SET_SRC (set)))
    1383                 :     2500972 :         && constant_pool_constant_p (SET_SRC (set)))
    1384                 :             :       {
    1385                 :        7441 :         if (flag_ira_loop_pressure)
    1386                 :           0 :           regs_needed[ira_stack_reg_pressure_class] += 2;
    1387                 :             :         else
    1388                 :        7441 :           regs_needed[0] += 2;
    1389                 :             :       }
    1390                 :             :   }
    1391                 :             : #endif
    1392                 :             : 
    1393                 :     3068362 :   EXECUTE_IF_SET_IN_BITMAP (inv->depends_on, 0, depno, bi)
    1394                 :             :     {
    1395                 :      579030 :       bool check_p;
    1396                 :      579030 :       enum reg_class dep_cl = ALL_REGS;
    1397                 :      579030 :       int dep_ret;
    1398                 :             : 
    1399                 :      579030 :       dep = invariants[depno];
    1400                 :             : 
    1401                 :             :       /* If DEP is moved out of the loop, it is not a depends_on any more.  */
    1402                 :      579030 :       if (dep->move)
    1403                 :       89326 :         continue;
    1404                 :             : 
    1405                 :      489704 :       dep_ret = get_inv_cost (dep, &acomp_cost, aregs_needed, &dep_cl);
    1406                 :             : 
    1407                 :      489704 :       if (! flag_ira_loop_pressure)
    1408                 :      489704 :         check_p = aregs_needed[0] != 0;
    1409                 :             :       else
    1410                 :             :         {
    1411                 :           0 :           for (i = 0; i < ira_pressure_classes_num; i++)
    1412                 :           0 :             if (aregs_needed[ira_pressure_classes[i]] != 0)
    1413                 :             :               break;
    1414                 :           0 :           check_p = i < ira_pressure_classes_num;
    1415                 :             : 
    1416                 :           0 :           if ((dep_ret == 1) || ((dep_ret == 0) && (*cl != dep_cl)))
    1417                 :             :             {
    1418                 :           0 :               *cl = ALL_REGS;
    1419                 :           0 :               ret = 1;
    1420                 :             :             }
    1421                 :             :         }
    1422                 :      489704 :       if (check_p
    1423                 :             :           /* We need to check always_executed, since if the original value of
    1424                 :             :              the invariant may be preserved, we may need to keep it in a
    1425                 :             :              separate register.  TODO check whether the register has an
    1426                 :             :              use outside of the loop.  */
    1427                 :      484860 :           && dep->always_executed
    1428                 :      155456 :           && !dep->def->uses->next)
    1429                 :             :         {
    1430                 :             :           /* If this is a single use, after moving the dependency we will not
    1431                 :             :              need a new register.  */
    1432                 :       94936 :           if (! flag_ira_loop_pressure)
    1433                 :       94936 :             aregs_needed[0]--;
    1434                 :             :           else
    1435                 :             :             {
    1436                 :           0 :               int nregs;
    1437                 :           0 :               enum reg_class pressure_class;
    1438                 :             : 
    1439                 :           0 :               pressure_class = get_pressure_class_and_nregs (inv->insn, &nregs);
    1440                 :           0 :               aregs_needed[pressure_class] -= nregs;
    1441                 :             :             }
    1442                 :             :         }
    1443                 :             : 
    1444                 :      489704 :       if (! flag_ira_loop_pressure)
    1445                 :      489704 :         regs_needed[0] += aregs_needed[0];
    1446                 :             :       else
    1447                 :             :         {
    1448                 :           0 :           for (i = 0; i < ira_pressure_classes_num; i++)
    1449                 :           0 :             regs_needed[ira_pressure_classes[i]]
    1450                 :           0 :               += aregs_needed[ira_pressure_classes[i]];
    1451                 :             :         }
    1452                 :      489704 :       (*comp_cost) += acomp_cost;
    1453                 :             :     }
    1454                 :             :   return ret;
    1455                 :             : }
    1456                 :             : 
    1457                 :             : /* Calculates gain for eliminating invariant INV.  REGS_USED is the number
    1458                 :             :    of registers used in the loop, NEW_REGS is the number of new variables
    1459                 :             :    already added due to the invariant motion.  The number of registers needed
    1460                 :             :    for it is stored in *REGS_NEEDED.  SPEED and CALL_P are flags passed
    1461                 :             :    through to estimate_reg_pressure_cost. */
    1462                 :             : 
    1463                 :             : static int
    1464                 :     2004472 : gain_for_invariant (struct invariant *inv, unsigned *regs_needed,
    1465                 :             :                     unsigned *new_regs, unsigned regs_used,
    1466                 :             :                     bool speed, bool call_p)
    1467                 :             : {
    1468                 :     2004472 :   int comp_cost, size_cost;
    1469                 :             :   /* Workaround -Wmaybe-uninitialized false positive during
    1470                 :             :      profiledbootstrap by initializing it.  */
    1471                 :     2004472 :   enum reg_class cl = NO_REGS;
    1472                 :     2004472 :   int ret;
    1473                 :             : 
    1474                 :     2004472 :   actual_stamp++;
    1475                 :             : 
    1476                 :     2004472 :   ret = get_inv_cost (inv, &comp_cost, regs_needed, &cl);
    1477                 :             : 
    1478                 :     2004472 :   if (! flag_ira_loop_pressure)
    1479                 :             :     {
    1480                 :     2004457 :       size_cost = (estimate_reg_pressure_cost (new_regs[0] + regs_needed[0],
    1481                 :             :                                                regs_used, speed, call_p)
    1482                 :     2004457 :                    - estimate_reg_pressure_cost (new_regs[0],
    1483                 :             :                                                  regs_used, speed, call_p));
    1484                 :             :     }
    1485                 :          15 :   else if (ret < 0)
    1486                 :             :     return -1;
    1487                 :          15 :   else if ((ret == 0) && (cl == NO_REGS))
    1488                 :             :     /* Hoist it anyway since it does not impact register pressure.  */
    1489                 :             :     return 1;
    1490                 :             :   else
    1491                 :             :     {
    1492                 :             :       int i;
    1493                 :             :       enum reg_class pressure_class;
    1494                 :             : 
    1495                 :          19 :       for (i = 0; i < ira_pressure_classes_num; i++)
    1496                 :             :         {
    1497                 :          18 :           pressure_class = ira_pressure_classes[i];
    1498                 :             : 
    1499                 :          18 :           if (!reg_classes_intersect_p (pressure_class, cl))
    1500                 :           3 :             continue;
    1501                 :             : 
    1502                 :          15 :           if ((int) new_regs[pressure_class]
    1503                 :          15 :               + (int) regs_needed[pressure_class]
    1504                 :          15 :               + LOOP_DATA (curr_loop)->max_reg_pressure[pressure_class]
    1505                 :          15 :               + param_ira_loop_reserved_regs
    1506                 :          15 :               > ira_class_hard_regs_num[pressure_class])
    1507                 :             :             break;
    1508                 :             :         }
    1509                 :          15 :       if (i < ira_pressure_classes_num)
    1510                 :             :         /* There will be register pressure excess and we want not to
    1511                 :             :            make this loop invariant motion.  All loop invariants with
    1512                 :             :            non-positive gains will be rejected in function
    1513                 :             :            find_invariants_to_move.  Therefore we return the negative
    1514                 :             :            number here.
    1515                 :             : 
    1516                 :             :            One could think that this rejects also expensive loop
    1517                 :             :            invariant motions and this will hurt code performance.
    1518                 :             :            However numerous experiments with different heuristics
    1519                 :             :            taking invariant cost into account did not confirm this
    1520                 :             :            assumption.  There are possible explanations for this
    1521                 :             :            result:
    1522                 :             :            o probably all expensive invariants were already moved out
    1523                 :             :              of the loop by PRE and gimple invariant motion pass.
    1524                 :             :            o expensive invariant execution will be hidden by insn
    1525                 :             :              scheduling or OOO processor hardware because usually such
    1526                 :             :              invariants have a lot of freedom to be executed
    1527                 :             :              out-of-order.
    1528                 :             :            Another reason for ignoring invariant cost vs spilling cost
    1529                 :             :            heuristics is also in difficulties to evaluate accurately
    1530                 :             :            spill cost at this stage.  */
    1531                 :             :         return -1;
    1532                 :             :       else
    1533                 :             :         size_cost = 0;
    1534                 :             :     }
    1535                 :             : 
    1536                 :     2004458 :   return comp_cost - size_cost;
    1537                 :             : }
    1538                 :             : 
    1539                 :             : /* Finds invariant with best gain for moving.  Returns the gain, stores
    1540                 :             :    the invariant in *BEST and number of registers needed for it to
    1541                 :             :    *REGS_NEEDED.  REGS_USED is the number of registers used in the loop.
    1542                 :             :    NEW_REGS is the number of new variables already added due to invariant
    1543                 :             :    motion.  */
    1544                 :             : 
    1545                 :             : static int
    1546                 :      476683 : best_gain_for_invariant (struct invariant **best, unsigned *regs_needed,
    1547                 :             :                          unsigned *new_regs, unsigned regs_used,
    1548                 :             :                          bool speed, bool call_p)
    1549                 :             : {
    1550                 :      476683 :   struct invariant *inv;
    1551                 :      476683 :   int i, gain = 0, again;
    1552                 :      476683 :   unsigned aregs_needed[N_REG_CLASSES], invno;
    1553                 :             : 
    1554                 :     4177953 :   FOR_EACH_VEC_ELT (invariants, invno, inv)
    1555                 :             :     {
    1556                 :     3701270 :       if (inv->move)
    1557                 :      631533 :         continue;
    1558                 :             : 
    1559                 :             :       /* Only consider the "representatives" of equivalent invariants.  */
    1560                 :     3069737 :       if (inv->eqto != inv->invno)
    1561                 :     1065265 :         continue;
    1562                 :             : 
    1563                 :     2004472 :       again = gain_for_invariant (inv, aregs_needed, new_regs, regs_used,
    1564                 :             :                                   speed, call_p);
    1565                 :     2004472 :       if (again > gain)
    1566                 :             :         {
    1567                 :      339692 :           gain = again;
    1568                 :      339692 :           *best = inv;
    1569                 :      339692 :           if (! flag_ira_loop_pressure)
    1570                 :      339691 :             regs_needed[0] = aregs_needed[0];
    1571                 :             :           else
    1572                 :             :             {
    1573                 :           5 :               for (i = 0; i < ira_pressure_classes_num; i++)
    1574                 :           4 :                 regs_needed[ira_pressure_classes[i]]
    1575                 :           4 :                   = aregs_needed[ira_pressure_classes[i]];
    1576                 :             :             }
    1577                 :             :         }
    1578                 :             :     }
    1579                 :             : 
    1580                 :      476683 :   return gain;
    1581                 :             : }
    1582                 :             : 
    1583                 :             : /* Marks invariant INVNO and all its dependencies for moving.  */
    1584                 :             : 
    1585                 :             : static void
    1586                 :      325447 : set_move_mark (unsigned invno, int gain)
    1587                 :             : {
    1588                 :      325447 :   struct invariant *inv = invariants[invno];
    1589                 :      325447 :   bitmap_iterator bi;
    1590                 :             : 
    1591                 :             :   /* Find the representative of the class of the equivalent invariants.  */
    1592                 :      325447 :   inv = invariants[inv->eqto];
    1593                 :             : 
    1594                 :      325447 :   if (inv->move)
    1595                 :        3060 :     return;
    1596                 :      322387 :   inv->move = true;
    1597                 :             : 
    1598                 :      322387 :   if (dump_file)
    1599                 :             :     {
    1600                 :           3 :       if (gain >= 0)
    1601                 :           3 :         fprintf (dump_file, "Decided to move invariant %d -- gain %d\n",
    1602                 :             :                  invno, gain);
    1603                 :             :       else
    1604                 :           0 :         fprintf (dump_file, "Decided to move dependent invariant %d\n",
    1605                 :             :                  invno);
    1606                 :      322387 :     };
    1607                 :             : 
    1608                 :      400906 :   EXECUTE_IF_SET_IN_BITMAP (inv->depends_on, 0, invno, bi)
    1609                 :             :     {
    1610                 :       78519 :       set_move_mark (invno, -1);
    1611                 :             :     }
    1612                 :             : }
    1613                 :             : 
    1614                 :             : /* Determines which invariants to move.  */
    1615                 :             : 
    1616                 :             : static void
    1617                 :      601647 : find_invariants_to_move (bool speed, bool call_p)
    1618                 :             : {
    1619                 :      601647 :   int gain;
    1620                 :      601647 :   unsigned i, regs_used, regs_needed[N_REG_CLASSES], new_regs[N_REG_CLASSES];
    1621                 :      601647 :   struct invariant *inv = NULL;
    1622                 :             : 
    1623                 :      601647 :   if (!invariants.length ())
    1624                 :      371892 :     return;
    1625                 :             : 
    1626                 :      229755 :   if (flag_ira_loop_pressure)
    1627                 :             :     /* REGS_USED is actually never used when the flag is on.  */
    1628                 :             :     regs_used = 0;
    1629                 :             :   else
    1630                 :             :     /* We do not really do a good job in estimating number of
    1631                 :             :        registers used; we put some initial bound here to stand for
    1632                 :             :        induction variables etc.  that we do not detect.  */
    1633                 :             :     {
    1634                 :      229754 :       unsigned int n_regs = DF_REG_SIZE (df);
    1635                 :             : 
    1636                 :      229754 :       regs_used = 2;
    1637                 :             : 
    1638                 :   126755522 :       for (i = 0; i < n_regs; i++)
    1639                 :             :         {
    1640                 :   126525768 :           if (!DF_REGNO_FIRST_DEF (i) && DF_REGNO_LAST_USE (i))
    1641                 :             :             {
    1642                 :             :               /* This is a value that is used but not changed inside loop.  */
    1643                 :           0 :               regs_used++;
    1644                 :             :             }
    1645                 :             :         }
    1646                 :             :     }
    1647                 :             : 
    1648                 :      229755 :   if (! flag_ira_loop_pressure)
    1649                 :      229754 :     new_regs[0] = regs_needed[0] = 0;
    1650                 :             :   else
    1651                 :             :     {
    1652                 :           5 :       for (i = 0; (int) i < ira_pressure_classes_num; i++)
    1653                 :           4 :         new_regs[ira_pressure_classes[i]] = 0;
    1654                 :             :     }
    1655                 :      953366 :   while ((gain = best_gain_for_invariant (&inv, regs_needed,
    1656                 :             :                                           new_regs, regs_used,
    1657                 :      476683 :                                           speed, call_p)) > 0)
    1658                 :             :     {
    1659                 :      246928 :       set_move_mark (inv->invno, gain);
    1660                 :      246928 :       if (! flag_ira_loop_pressure)
    1661                 :      246927 :         new_regs[0] += regs_needed[0];
    1662                 :             :       else
    1663                 :             :         {
    1664                 :           5 :           for (i = 0; (int) i < ira_pressure_classes_num; i++)
    1665                 :           4 :             new_regs[ira_pressure_classes[i]]
    1666                 :           4 :               += regs_needed[ira_pressure_classes[i]];
    1667                 :             :         }
    1668                 :             :     }
    1669                 :             : }
    1670                 :             : 
    1671                 :             : /* Replace the uses, reached by the definition of invariant INV, by REG.
    1672                 :             : 
    1673                 :             :    IN_GROUP is nonzero if this is part of a group of changes that must be
    1674                 :             :    performed as a group.  In that case, the changes will be stored.  The
    1675                 :             :    function `apply_change_group' will validate and apply the changes.  */
    1676                 :             : 
    1677                 :             : static int
    1678                 :      235110 : replace_uses (struct invariant *inv, rtx reg, bool in_group)
    1679                 :             : {
    1680                 :             :   /* Replace the uses we know to be dominated.  It saves work for copy
    1681                 :             :      propagation, and also it is necessary so that dependent invariants
    1682                 :             :      are computed right.  */
    1683                 :      235110 :   if (inv->def)
    1684                 :             :     {
    1685                 :      229307 :       struct use *use;
    1686                 :      441607 :       for (use = inv->def->uses; use; use = use->next)
    1687                 :      212300 :         validate_change (use->insn, use->pos, reg, true);
    1688                 :             : 
    1689                 :             :       /* If we aren't part of a larger group, apply the changes now.  */
    1690                 :      229307 :       if (!in_group)
    1691                 :       42758 :         return apply_change_group ();
    1692                 :             :     }
    1693                 :             : 
    1694                 :             :   return 1;
    1695                 :             : }
    1696                 :             : 
    1697                 :             : /* Whether invariant INV setting REG can be moved out of LOOP, at the end of
    1698                 :             :    the block preceding its header.  */
    1699                 :             : 
    1700                 :             : static bool
    1701                 :      322387 : can_move_invariant_reg (class loop *loop, struct invariant *inv, rtx reg)
    1702                 :             : {
    1703                 :      322387 :   df_ref def, use;
    1704                 :      322387 :   unsigned int dest_regno, defs_in_loop_count = 0;
    1705                 :      322387 :   rtx_insn *insn = inv->insn;
    1706                 :      322387 :   basic_block bb = BLOCK_FOR_INSN (inv->insn);
    1707                 :      322387 :   auto_vec <rtx_insn *, 16> debug_insns_to_reset;
    1708                 :             : 
    1709                 :             :   /* We ignore hard register and memory access for cost and complexity reasons.
    1710                 :             :      Hard register are few at this stage and expensive to consider as they
    1711                 :             :      require building a separate data flow.  Memory access would require using
    1712                 :             :      df_simulate_* and can_move_insns_across functions and is more complex.  */
    1713                 :      322387 :   if (!REG_P (reg) || HARD_REGISTER_P (reg))
    1714                 :             :     return false;
    1715                 :             : 
    1716                 :             :   /* Check whether the set is always executed.  We could omit this condition if
    1717                 :             :      we know that the register is unused outside of the loop, but it does not
    1718                 :             :      seem worth finding out.  */
    1719                 :      321597 :   if (!inv->always_executed)
    1720                 :             :     return false;
    1721                 :             : 
    1722                 :             :   /* Check that all uses that would be dominated by def are already dominated
    1723                 :             :      by it.  */
    1724                 :      143676 :   dest_regno = REGNO (reg);
    1725                 :      359927 :   for (use = DF_REG_USE_CHAIN (dest_regno); use; use = DF_REF_NEXT_REG (use))
    1726                 :             :     {
    1727                 :      218164 :       rtx_insn *use_insn;
    1728                 :      218164 :       basic_block use_bb;
    1729                 :             : 
    1730                 :      218164 :       use_insn = DF_REF_INSN (use);
    1731                 :      218164 :       use_bb = BLOCK_FOR_INSN (use_insn);
    1732                 :             : 
    1733                 :             :       /* Ignore instruction considered for moving.  */
    1734                 :      218164 :       if (use_insn == insn)
    1735                 :       11551 :         continue;
    1736                 :             : 
    1737                 :             :       /* Don't consider uses outside loop.  */
    1738                 :      218164 :       if (!flow_bb_inside_loop_p (loop, use_bb))
    1739                 :       11551 :         continue;
    1740                 :             : 
    1741                 :             :       /* Don't move if a use is not dominated by def in insn.  */
    1742                 :      141222 :       if ((use_bb == bb && DF_INSN_LUID (insn) >= DF_INSN_LUID (use_insn))
    1743                 :      346340 :           || !dominated_by_p (CDI_DOMINATORS, use_bb, bb))
    1744                 :             :         {
    1745                 :        1921 :           if (!DEBUG_INSN_P (use_insn))
    1746                 :        1913 :             return false;
    1747                 :           8 :           debug_insns_to_reset.safe_push (use_insn);
    1748                 :             :         }
    1749                 :             :     }
    1750                 :             : 
    1751                 :             :   /* Check for other defs.  Any other def in the loop might reach a use
    1752                 :             :      currently reached by the def in insn.  */
    1753                 :      284366 :   for (def = DF_REG_DEF_CHAIN (dest_regno); def; def = DF_REF_NEXT_REG (def))
    1754                 :             :     {
    1755                 :      149318 :       basic_block def_bb = DF_REF_BB (def);
    1756                 :             : 
    1757                 :             :       /* Defs in exit block cannot reach a use they weren't already.  */
    1758                 :      149318 :       if (single_succ_p (def_bb))
    1759                 :             :         {
    1760                 :       45094 :           basic_block def_bb_succ;
    1761                 :             : 
    1762                 :       45094 :           def_bb_succ = single_succ (def_bb);
    1763                 :       45094 :           if (!flow_bb_inside_loop_p (loop, def_bb_succ))
    1764                 :         840 :             continue;
    1765                 :             :         }
    1766                 :             : 
    1767                 :      148478 :       if (++defs_in_loop_count > 1)
    1768                 :             :         return false;
    1769                 :             :     }
    1770                 :             : 
    1771                 :             :   /* Reset debug uses if a use is not dominated by def in insn.  */
    1772                 :      405146 :   for (auto use_insn : debug_insns_to_reset)
    1773                 :             :     {
    1774                 :           2 :       INSN_VAR_LOCATION_LOC (use_insn) = gen_rtx_UNKNOWN_VAR_LOC ();
    1775                 :           2 :       df_insn_rescan (use_insn);
    1776                 :             :     }
    1777                 :             : 
    1778                 :             :   return true;
    1779                 :      322387 : }
    1780                 :             : 
    1781                 :             : /* Move invariant INVNO out of the LOOP.  Returns true if this succeeds, false
    1782                 :             :    otherwise.  */
    1783                 :             : 
    1784                 :             : static bool
    1785                 :     1384433 : move_invariant_reg (class loop *loop, unsigned invno)
    1786                 :             : {
    1787                 :     1384433 :   struct invariant *inv = invariants[invno];
    1788                 :     1384433 :   struct invariant *repr = invariants[inv->eqto];
    1789                 :     1384433 :   unsigned i;
    1790                 :     1384433 :   basic_block preheader = loop_preheader_edge (loop)->src;
    1791                 :     1384433 :   rtx reg, set, dest, note;
    1792                 :     1384433 :   bitmap_iterator bi;
    1793                 :     1384433 :   int regno = -1;
    1794                 :             : 
    1795                 :     1384433 :   if (inv->reg)
    1796                 :             :     return true;
    1797                 :     1258143 :   if (!repr->move)
    1798                 :             :     return false;
    1799                 :             : 
    1800                 :             :   /* If this is a representative of the class of equivalent invariants,
    1801                 :             :      really move the invariant.  Otherwise just replace its use with
    1802                 :             :      the register used for the representative.  */
    1803                 :      370158 :   if (inv == repr)
    1804                 :             :     {
    1805                 :      322387 :       if (inv->depends_on)
    1806                 :             :         {
    1807                 :      400906 :           EXECUTE_IF_SET_IN_BITMAP (inv->depends_on, 0, i, bi)
    1808                 :             :             {
    1809                 :       78519 :               if (!move_invariant_reg (loop, i))
    1810                 :           0 :                 goto fail;
    1811                 :             :             }
    1812                 :             :         }
    1813                 :             : 
    1814                 :             :       /* If possible, just move the set out of the loop.  Otherwise, we
    1815                 :             :          need to create a temporary register.  */
    1816                 :      322387 :       set = single_set (inv->insn);
    1817                 :      322387 :       reg = dest = SET_DEST (set);
    1818                 :      322387 :       if (GET_CODE (reg) == SUBREG)
    1819                 :          32 :         reg = SUBREG_REG (reg);
    1820                 :      322387 :       if (REG_P (reg))
    1821                 :      322276 :         regno = REGNO (reg);
    1822                 :             : 
    1823                 :      322387 :       if (!can_move_invariant_reg (loop, inv, dest))
    1824                 :             :         {
    1825                 :      187339 :           reg = gen_reg_rtx_and_attrs (dest);
    1826                 :             : 
    1827                 :             :           /* Try replacing the destination by a new pseudoregister.  */
    1828                 :      187339 :           validate_change (inv->insn, &SET_DEST (set), reg, true);
    1829                 :             : 
    1830                 :             :           /* As well as all the dominated uses.  */
    1831                 :      187339 :           replace_uses (inv, reg, true);
    1832                 :             : 
    1833                 :             :           /* And validate all the changes.  */
    1834                 :      187339 :           if (!apply_change_group ())
    1835                 :          43 :             goto fail;
    1836                 :             : 
    1837                 :      187296 :           emit_insn_after (gen_move_insn (dest, reg), inv->insn);
    1838                 :             :         }
    1839                 :      135048 :       else if (dump_file)
    1840                 :           1 :         fprintf (dump_file, "Invariant %d moved without introducing a new "
    1841                 :             :                             "temporary register\n", invno);
    1842                 :      322344 :       if (JUMP_P (BB_END (preheader)))
    1843                 :           6 :         preheader = split_edge (loop_preheader_edge (loop));
    1844                 :      322344 :       reorder_insns (inv->insn, inv->insn, BB_END (preheader));
    1845                 :      322344 :       df_recompute_luids (preheader);
    1846                 :             : 
    1847                 :             :       /* If there is a REG_EQUAL note on the insn we just moved, and the
    1848                 :             :          insn is in a basic block that is not always executed or the note
    1849                 :             :          contains something for which we don't know the invariant status,
    1850                 :             :          the note may no longer be valid after we move the insn.  Note that
    1851                 :             :          uses in REG_EQUAL notes are taken into account in the computation
    1852                 :             :          of invariants, so it is safe to retain the note even if it contains
    1853                 :             :          register references for which we know the invariant status.  */
    1854                 :      322344 :       if ((note = find_reg_note (inv->insn, REG_EQUAL, NULL_RTX))
    1855                 :      322344 :           && (!inv->always_executed
    1856                 :       34120 :               || !check_maybe_invariant (XEXP (note, 0))))
    1857                 :       25491 :         remove_note (inv->insn, note);
    1858                 :             :     }
    1859                 :             :   else
    1860                 :             :     {
    1861                 :       47771 :       if (!move_invariant_reg (loop, repr->invno))
    1862                 :           0 :         goto fail;
    1863                 :       47771 :       reg = repr->reg;
    1864                 :       47771 :       regno = repr->orig_regno;
    1865                 :       47771 :       if (!replace_uses (inv, reg, false))
    1866                 :           0 :         goto fail;
    1867                 :       47771 :       set = single_set (inv->insn);
    1868                 :       47771 :       emit_insn_after (gen_move_insn (SET_DEST (set), reg), inv->insn);
    1869                 :       47771 :       delete_insn (inv->insn);
    1870                 :             :     }
    1871                 :             : 
    1872                 :      370115 :   inv->reg = reg;
    1873                 :      370115 :   inv->orig_regno = regno;
    1874                 :             : 
    1875                 :      370115 :   return true;
    1876                 :             : 
    1877                 :          43 : fail:
    1878                 :             :   /* If we failed, clear move flag, so that we do not try to move inv
    1879                 :             :      again.  */
    1880                 :          43 :   if (dump_file)
    1881                 :           0 :     fprintf (dump_file, "Failed to move invariant %d\n", invno);
    1882                 :          43 :   inv->move = false;
    1883                 :          43 :   inv->reg = NULL_RTX;
    1884                 :          43 :   inv->orig_regno = -1;
    1885                 :             : 
    1886                 :          43 :   return false;
    1887                 :             : }
    1888                 :             : 
    1889                 :             : /* Move selected invariant out of the LOOP.  Newly created regs are marked
    1890                 :             :    in TEMPORARY_REGS.  */
    1891                 :             : 
    1892                 :             : static void
    1893                 :      601647 : move_invariants (class loop *loop)
    1894                 :             : {
    1895                 :      601647 :   struct invariant *inv;
    1896                 :      601647 :   unsigned i;
    1897                 :             : 
    1898                 :     1859790 :   FOR_EACH_VEC_ELT (invariants, i, inv)
    1899                 :     1258143 :     move_invariant_reg (loop, i);
    1900                 :      601647 :   if (flag_ira_loop_pressure && resize_reg_info ())
    1901                 :             :     {
    1902                 :           9 :       FOR_EACH_VEC_ELT (invariants, i, inv)
    1903                 :           8 :         if (inv->reg != NULL_RTX)
    1904                 :             :           {
    1905                 :           1 :             if (inv->orig_regno >= 0)
    1906                 :           1 :               setup_reg_classes (REGNO (inv->reg),
    1907                 :             :                                  reg_preferred_class (inv->orig_regno),
    1908                 :             :                                  reg_alternate_class (inv->orig_regno),
    1909                 :             :                                  reg_allocno_class (inv->orig_regno));
    1910                 :             :             else
    1911                 :           0 :               setup_reg_classes (REGNO (inv->reg),
    1912                 :             :                                  GENERAL_REGS, NO_REGS, GENERAL_REGS);
    1913                 :             :           }
    1914                 :             :     }
    1915                 :             :   /* Remove the DF_UD_CHAIN problem added in find_defs before rescanning,
    1916                 :             :      to save a bit of compile time.  */
    1917                 :      601647 :   df_remove_problem (df_chain);
    1918                 :      601647 :   df_process_deferred_rescans ();
    1919                 :      601647 : }
    1920                 :             : 
    1921                 :             : /* Initializes invariant motion data.  */
    1922                 :             : 
    1923                 :             : static void
    1924                 :      601647 : init_inv_motion_data (void)
    1925                 :             : {
    1926                 :      601647 :   actual_stamp = 1;
    1927                 :             : 
    1928                 :      601647 :   invariants.create (100);
    1929                 :      601647 : }
    1930                 :             : 
    1931                 :             : /* Frees the data allocated by invariant motion.  */
    1932                 :             : 
    1933                 :             : static void
    1934                 :      601647 : free_inv_motion_data (void)
    1935                 :             : {
    1936                 :      601647 :   unsigned i;
    1937                 :      601647 :   struct def *def;
    1938                 :      601647 :   struct invariant *inv;
    1939                 :             : 
    1940                 :      601647 :   check_invariant_table_size ();
    1941                 :    78688613 :   for (i = 0; i < DF_DEFS_TABLE_SIZE (); i++)
    1942                 :             :     {
    1943                 :    77485319 :       inv = invariant_table[i];
    1944                 :    77485319 :       if (inv)
    1945                 :             :         {
    1946                 :      606179 :           def = inv->def;
    1947                 :      606179 :           gcc_assert (def != NULL);
    1948                 :             : 
    1949                 :      606179 :           free_use_list (def->uses);
    1950                 :      606179 :           free (def);
    1951                 :      606179 :           invariant_table[i] = NULL;
    1952                 :             :         }
    1953                 :             :     }
    1954                 :             : 
    1955                 :     1859790 :   FOR_EACH_VEC_ELT (invariants, i, inv)
    1956                 :             :     {
    1957                 :     1258143 :       BITMAP_FREE (inv->depends_on);
    1958                 :     1258143 :       free (inv);
    1959                 :             :     }
    1960                 :      601647 :   invariants.release ();
    1961                 :      601647 : }
    1962                 :             : 
    1963                 :             : /* Move the invariants out of the LOOP.  */
    1964                 :             : 
    1965                 :             : static void
    1966                 :      601647 : move_single_loop_invariants (class loop *loop)
    1967                 :             : {
    1968                 :      601647 :   init_inv_motion_data ();
    1969                 :             : 
    1970                 :      601647 :   find_invariants (loop);
    1971                 :      601647 :   find_invariants_to_move (optimize_loop_for_speed_p (loop),
    1972                 :      601647 :                            LOOP_DATA (loop)->has_call);
    1973                 :      601647 :   move_invariants (loop);
    1974                 :             : 
    1975                 :      601647 :   free_inv_motion_data ();
    1976                 :      601647 : }
    1977                 :             : 
    1978                 :             : /* Releases the auxiliary data for LOOP.  */
    1979                 :             : 
    1980                 :             : static void
    1981                 :      601647 : free_loop_data (class loop *loop)
    1982                 :             : {
    1983                 :      601647 :   class loop_data *data = LOOP_DATA (loop);
    1984                 :      601647 :   if (!data)
    1985                 :             :     return;
    1986                 :             : 
    1987                 :      601647 :   bitmap_clear (&LOOP_DATA (loop)->regs_ref);
    1988                 :      601647 :   bitmap_clear (&LOOP_DATA (loop)->regs_live);
    1989                 :      601647 :   free (data);
    1990                 :      601647 :   loop->aux = NULL;
    1991                 :             : }
    1992                 :             : 
    1993                 :             : 
    1994                 :             : 
    1995                 :             : /* Registers currently living.  */
    1996                 :             : static bitmap_head curr_regs_live;
    1997                 :             : 
    1998                 :             : /* Current reg pressure for each pressure class.  */
    1999                 :             : static int curr_reg_pressure[N_REG_CLASSES];
    2000                 :             : 
    2001                 :             : /* Record all regs that are set in any one insn.  Communication from
    2002                 :             :    mark_reg_{store,clobber} and global_conflicts.  Asm can refer to
    2003                 :             :    all hard-registers.  */
    2004                 :             : static rtx regs_set[(FIRST_PSEUDO_REGISTER > MAX_RECOG_OPERANDS
    2005                 :             :                      ? FIRST_PSEUDO_REGISTER : MAX_RECOG_OPERANDS) * 2];
    2006                 :             : /* Number of regs stored in the previous array.  */
    2007                 :             : static int n_regs_set;
    2008                 :             : 
    2009                 :             : /* Return pressure class and number of needed hard registers (through
    2010                 :             :    *NREGS) of register REGNO.  */
    2011                 :             : static enum reg_class
    2012                 :         137 : get_regno_pressure_class (int regno, int *nregs)
    2013                 :             : {
    2014                 :         137 :   if (regno >= FIRST_PSEUDO_REGISTER)
    2015                 :             :     {
    2016                 :          82 :       enum reg_class pressure_class;
    2017                 :             : 
    2018                 :          82 :       pressure_class = reg_allocno_class (regno);
    2019                 :          82 :       pressure_class = ira_pressure_class_translate[pressure_class];
    2020                 :          82 :       *nregs
    2021                 :          82 :         = ira_reg_class_max_nregs[pressure_class][PSEUDO_REGNO_MODE (regno)];
    2022                 :          82 :       return pressure_class;
    2023                 :             :     }
    2024                 :          55 :   else if (! TEST_HARD_REG_BIT (ira_no_alloc_regs, regno)
    2025                 :          55 :            && ! TEST_HARD_REG_BIT (eliminable_regset, regno))
    2026                 :             :     {
    2027                 :          12 :       *nregs = 1;
    2028                 :          12 :       return ira_pressure_class_translate[REGNO_REG_CLASS (regno)];
    2029                 :             :     }
    2030                 :             :   else
    2031                 :             :     {
    2032                 :          43 :       *nregs = 0;
    2033                 :          43 :       return NO_REGS;
    2034                 :             :     }
    2035                 :             : }
    2036                 :             : 
    2037                 :             : /* Increase (if INCR_P) or decrease current register pressure for
    2038                 :             :    register REGNO.  */
    2039                 :             : static void
    2040                 :         134 : change_pressure (int regno, bool incr_p)
    2041                 :             : {
    2042                 :         134 :   int nregs;
    2043                 :         134 :   enum reg_class pressure_class;
    2044                 :             : 
    2045                 :         134 :   pressure_class = get_regno_pressure_class (regno, &nregs);
    2046                 :         134 :   if (! incr_p)
    2047                 :          32 :     curr_reg_pressure[pressure_class] -= nregs;
    2048                 :             :   else
    2049                 :             :     {
    2050                 :         102 :       curr_reg_pressure[pressure_class] += nregs;
    2051                 :         102 :       if (LOOP_DATA (curr_loop)->max_reg_pressure[pressure_class]
    2052                 :             :           < curr_reg_pressure[pressure_class])
    2053                 :          20 :         LOOP_DATA (curr_loop)->max_reg_pressure[pressure_class]
    2054                 :          20 :           = curr_reg_pressure[pressure_class];
    2055                 :             :     }
    2056                 :         134 : }
    2057                 :             : 
    2058                 :             : /* Mark REGNO birth.  */
    2059                 :             : static void
    2060                 :          48 : mark_regno_live (int regno)
    2061                 :             : {
    2062                 :          48 :   class loop *loop;
    2063                 :             : 
    2064                 :          48 :   for (loop = curr_loop;
    2065                 :          96 :        loop != current_loops->tree_root;
    2066                 :          48 :        loop = loop_outer (loop))
    2067                 :          48 :     bitmap_set_bit (&LOOP_DATA (loop)->regs_live, regno);
    2068                 :          48 :   if (!bitmap_set_bit (&curr_regs_live, regno))
    2069                 :             :     return;
    2070                 :          37 :   change_pressure (regno, true);
    2071                 :             : }
    2072                 :             : 
    2073                 :             : /* Mark REGNO death.  */
    2074                 :             : static void
    2075                 :          42 : mark_regno_death (int regno)
    2076                 :             : {
    2077                 :          42 :   if (! bitmap_clear_bit (&curr_regs_live, regno))
    2078                 :             :     return;
    2079                 :          32 :   change_pressure (regno, false);
    2080                 :             : }
    2081                 :             : 
    2082                 :             : /* Mark setting register REG.  */
    2083                 :             : static void
    2084                 :          53 : mark_reg_store (rtx reg, const_rtx setter ATTRIBUTE_UNUSED,
    2085                 :             :                 void *data ATTRIBUTE_UNUSED)
    2086                 :             : {
    2087                 :          53 :   if (GET_CODE (reg) == SUBREG)
    2088                 :           0 :     reg = SUBREG_REG (reg);
    2089                 :             : 
    2090                 :          53 :   if (! REG_P (reg))
    2091                 :             :     return;
    2092                 :             : 
    2093                 :          48 :   regs_set[n_regs_set++] = reg;
    2094                 :             : 
    2095                 :          48 :   unsigned int end_regno = END_REGNO (reg);
    2096                 :          96 :   for (unsigned int regno = REGNO (reg); regno < end_regno; ++regno)
    2097                 :          48 :     mark_regno_live (regno);
    2098                 :             : }
    2099                 :             : 
    2100                 :             : /* Mark clobbering register REG.  */
    2101                 :             : static void
    2102                 :          43 : mark_reg_clobber (rtx reg, const_rtx setter, void *data)
    2103                 :             : {
    2104                 :          43 :   if (GET_CODE (setter) == CLOBBER)
    2105                 :          10 :     mark_reg_store (reg, setter, data);
    2106                 :          43 : }
    2107                 :             : 
    2108                 :             : /* Mark register REG death.  */
    2109                 :             : static void
    2110                 :          42 : mark_reg_death (rtx reg)
    2111                 :             : {
    2112                 :          42 :   unsigned int end_regno = END_REGNO (reg);
    2113                 :          84 :   for (unsigned int regno = REGNO (reg); regno < end_regno; ++regno)
    2114                 :          42 :     mark_regno_death (regno);
    2115                 :          42 : }
    2116                 :             : 
    2117                 :             : /* Mark occurrence of registers in X for the current loop.  */
    2118                 :             : static void
    2119                 :         197 : mark_ref_regs (rtx x)
    2120                 :             : {
    2121                 :         197 :   RTX_CODE code;
    2122                 :         197 :   int i;
    2123                 :         197 :   const char *fmt;
    2124                 :             : 
    2125                 :         197 :   if (!x)
    2126                 :             :     return;
    2127                 :             : 
    2128                 :         197 :   code = GET_CODE (x);
    2129                 :         197 :   if (code == REG)
    2130                 :             :     {
    2131                 :          82 :       class loop *loop;
    2132                 :             : 
    2133                 :          82 :       for (loop = curr_loop;
    2134                 :         164 :            loop != current_loops->tree_root;
    2135                 :          82 :            loop = loop_outer (loop))
    2136                 :          82 :         bitmap_set_bit (&LOOP_DATA (loop)->regs_ref, REGNO (x));
    2137                 :             :       return;
    2138                 :             :     }
    2139                 :             : 
    2140                 :         115 :   fmt = GET_RTX_FORMAT (code);
    2141                 :         305 :   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
    2142                 :         190 :     if (fmt[i] == 'e')
    2143                 :         143 :       mark_ref_regs (XEXP (x, i));
    2144                 :          47 :     else if (fmt[i] == 'E')
    2145                 :             :       {
    2146                 :             :         int j;
    2147                 :             : 
    2148                 :          30 :         for (j = 0; j < XVECLEN (x, i); j++)
    2149                 :          20 :           mark_ref_regs (XVECEXP (x, i, j));
    2150                 :             :       }
    2151                 :             : }
    2152                 :             : 
    2153                 :             : /* Calculate register pressure in the loops.  */
    2154                 :             : static void
    2155                 :           1 : calculate_loop_reg_pressure (void)
    2156                 :             : {
    2157                 :           1 :   int i;
    2158                 :           1 :   unsigned int j;
    2159                 :           1 :   bitmap_iterator bi;
    2160                 :           1 :   basic_block bb;
    2161                 :           1 :   rtx_insn *insn;
    2162                 :           1 :   rtx link;
    2163                 :           1 :   class loop *parent;
    2164                 :             : 
    2165                 :           4 :   for (auto loop : loops_list (cfun, 0))
    2166                 :           1 :     if (loop->aux == NULL)
    2167                 :             :       {
    2168                 :           1 :         loop->aux = xcalloc (1, sizeof (class loop_data));
    2169                 :           1 :         bitmap_initialize (&LOOP_DATA (loop)->regs_ref, &reg_obstack);
    2170                 :           1 :         bitmap_initialize (&LOOP_DATA (loop)->regs_live, &reg_obstack);
    2171                 :           1 :       }
    2172                 :           1 :   ira_setup_eliminable_regset ();
    2173                 :           1 :   bitmap_initialize (&curr_regs_live, &reg_obstack);
    2174                 :           9 :   FOR_EACH_BB_FN (bb, cfun)
    2175                 :             :     {
    2176                 :           8 :       curr_loop = bb->loop_father;
    2177                 :           8 :       if (curr_loop == current_loops->tree_root)
    2178                 :           4 :         continue;
    2179                 :             : 
    2180                 :           4 :       for (class loop *loop = curr_loop;
    2181                 :           8 :            loop != current_loops->tree_root;
    2182                 :           4 :            loop = loop_outer (loop))
    2183                 :           8 :         bitmap_ior_into (&LOOP_DATA (loop)->regs_live, DF_LR_IN (bb));
    2184                 :             : 
    2185                 :           4 :       bitmap_copy (&curr_regs_live, DF_LR_IN (bb));
    2186                 :          24 :       for (i = 0; i < ira_pressure_classes_num; i++)
    2187                 :          16 :         curr_reg_pressure[ira_pressure_classes[i]] = 0;
    2188                 :          69 :       EXECUTE_IF_SET_IN_BITMAP (&curr_regs_live, 0, j, bi)
    2189                 :          65 :         change_pressure (j, true);
    2190                 :             : 
    2191                 :          45 :       FOR_BB_INSNS (bb, insn)
    2192                 :             :         {
    2193                 :          41 :           if (! NONDEBUG_INSN_P (insn))
    2194                 :           7 :             continue;
    2195                 :             : 
    2196                 :          34 :           mark_ref_regs (PATTERN (insn));
    2197                 :          34 :           n_regs_set = 0;
    2198                 :          34 :           note_stores (insn, mark_reg_clobber, NULL);
    2199                 :             : 
    2200                 :             :           /* Mark any registers dead after INSN as dead now.  */
    2201                 :             : 
    2202                 :          78 :           for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
    2203                 :          44 :             if (REG_NOTE_KIND (link) == REG_DEAD)
    2204                 :          22 :               mark_reg_death (XEXP (link, 0));
    2205                 :             : 
    2206                 :             :           /* Mark any registers set in INSN as live,
    2207                 :             :              and mark them as conflicting with all other live regs.
    2208                 :             :              Clobbers are processed again, so they conflict with
    2209                 :             :              the registers that are set.  */
    2210                 :             : 
    2211                 :          34 :           note_stores (insn, mark_reg_store, NULL);
    2212                 :             : 
    2213                 :          34 :           if (AUTO_INC_DEC)
    2214                 :             :             for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
    2215                 :             :               if (REG_NOTE_KIND (link) == REG_INC)
    2216                 :             :                 mark_reg_store (XEXP (link, 0), NULL_RTX, NULL);
    2217                 :             : 
    2218                 :         116 :           while (n_regs_set-- > 0)
    2219                 :             :             {
    2220                 :          96 :               rtx note = find_regno_note (insn, REG_UNUSED,
    2221                 :          48 :                                           REGNO (regs_set[n_regs_set]));
    2222                 :          48 :               if (! note)
    2223                 :          28 :                 continue;
    2224                 :             : 
    2225                 :          20 :               mark_reg_death (XEXP (note, 0));
    2226                 :             :             }
    2227                 :             :         }
    2228                 :             :     }
    2229                 :           1 :   bitmap_release (&curr_regs_live);
    2230                 :           1 :   if (flag_ira_region == IRA_REGION_MIXED
    2231                 :           1 :       || flag_ira_region == IRA_REGION_ALL)
    2232                 :           4 :     for (auto loop : loops_list (cfun, 0))
    2233                 :             :       {
    2234                 :          41 :         EXECUTE_IF_SET_IN_BITMAP (&LOOP_DATA (loop)->regs_live, 0, j, bi)
    2235                 :          40 :           if (! bitmap_bit_p (&LOOP_DATA (loop)->regs_ref, j))
    2236                 :             :             {
    2237                 :           3 :               enum reg_class pressure_class;
    2238                 :           3 :               int nregs;
    2239                 :             : 
    2240                 :           3 :               pressure_class = get_regno_pressure_class (j, &nregs);
    2241                 :           3 :               LOOP_DATA (loop)->max_reg_pressure[pressure_class] -= nregs;
    2242                 :             :             }
    2243                 :           1 :       }
    2244                 :           1 :   if (dump_file == NULL)
    2245                 :           0 :     return;
    2246                 :           4 :   for (auto loop : loops_list (cfun, 0))
    2247                 :             :     {
    2248                 :           1 :       parent = loop_outer (loop);
    2249                 :           2 :       fprintf (dump_file, "\n  Loop %d (parent %d, header bb%d, depth %d)\n",
    2250                 :             :                loop->num, (parent == NULL ? -1 : parent->num),
    2251                 :           1 :                loop->header->index, loop_depth (loop));
    2252                 :           1 :       fprintf (dump_file, "\n    ref. regnos:");
    2253                 :          38 :       EXECUTE_IF_SET_IN_BITMAP (&LOOP_DATA (loop)->regs_ref, 0, j, bi)
    2254                 :          37 :         fprintf (dump_file, " %d", j);
    2255                 :           1 :       fprintf (dump_file, "\n    live regnos:");
    2256                 :          41 :       EXECUTE_IF_SET_IN_BITMAP (&LOOP_DATA (loop)->regs_live, 0, j, bi)
    2257                 :          40 :         fprintf (dump_file, " %d", j);
    2258                 :           1 :       fprintf (dump_file, "\n    Pressure:");
    2259                 :           5 :       for (i = 0; (int) i < ira_pressure_classes_num; i++)
    2260                 :             :         {
    2261                 :           4 :           enum reg_class pressure_class;
    2262                 :             : 
    2263                 :           4 :           pressure_class = ira_pressure_classes[i];
    2264                 :           4 :           if (LOOP_DATA (loop)->max_reg_pressure[pressure_class] == 0)
    2265                 :           2 :             continue;
    2266                 :           2 :           fprintf (dump_file, " %s=%d", reg_class_names[pressure_class],
    2267                 :             :                    LOOP_DATA (loop)->max_reg_pressure[pressure_class]);
    2268                 :             :         }
    2269                 :           1 :       fprintf (dump_file, "\n");
    2270                 :           1 :     }
    2271                 :             : }
    2272                 :             : 
    2273                 :             : 
    2274                 :             : 
    2275                 :             : /* Move the invariants out of the loops.  */
    2276                 :             : 
    2277                 :             : void
    2278                 :      229199 : move_loop_invariants (void)
    2279                 :             : {
    2280                 :      229199 :   if (optimize == 1)
    2281                 :       15080 :     df_live_add_problem ();
    2282                 :             :   /* ??? This is a hack.  We should only need to call df_live_set_all_dirty
    2283                 :             :      for optimize == 1, but can_move_invariant_reg relies on DF_INSN_LUID
    2284                 :             :      being up-to-date.  That isn't always true (even after df_analyze)
    2285                 :             :      because df_process_deferred_rescans doesn't necessarily cause
    2286                 :             :      blocks to be rescanned.  */
    2287                 :      229199 :   df_live_set_all_dirty ();
    2288                 :      229199 :   if (flag_ira_loop_pressure)
    2289                 :             :     {
    2290                 :           1 :       df_analyze ();
    2291                 :           1 :       regstat_init_n_sets_and_refs ();
    2292                 :           1 :       ira_set_pseudo_classes (true, dump_file);
    2293                 :           1 :       calculate_loop_reg_pressure ();
    2294                 :           1 :       regstat_free_n_sets_and_refs ();
    2295                 :             :     }
    2296                 :      229199 :   df_set_flags (DF_EQ_NOTES + DF_DEFER_INSN_RESCAN);
    2297                 :             :   /* Process the loops, innermost first.  */
    2298                 :     1289244 :   for (auto loop : loops_list (cfun, LI_FROM_INNERMOST))
    2299                 :             :     {
    2300                 :      601647 :       curr_loop = loop;
    2301                 :             :       /* move_single_loop_invariants for very large loops is time consuming
    2302                 :             :          and might need a lot of memory.  For -O1 only do loop invariant
    2303                 :             :          motion for very small loops.  */
    2304                 :      601647 :       unsigned max_bbs = param_loop_invariant_max_bbs_in_loop;
    2305                 :      601647 :       if (optimize < 2)
    2306                 :       40091 :         max_bbs /= 10;
    2307                 :      601647 :       if (loop->num_nodes <= max_bbs)
    2308                 :      601647 :         move_single_loop_invariants (loop);
    2309                 :      229199 :     }
    2310                 :             : 
    2311                 :     1289244 :   for (auto loop : loops_list (cfun, 0))
    2312                 :      601647 :       free_loop_data (loop);
    2313                 :             : 
    2314                 :      229199 :   if (flag_ira_loop_pressure)
    2315                 :             :     /* There is no sense to keep this info because it was most
    2316                 :             :        probably outdated by subsequent passes.  */
    2317                 :           1 :     free_reg_info ();
    2318                 :      229199 :   free (invariant_table);
    2319                 :      229199 :   invariant_table = NULL;
    2320                 :      229199 :   invariant_table_size = 0;
    2321                 :             : 
    2322                 :      229199 :   if (optimize == 1)
    2323                 :       15080 :     df_remove_problem (df_live);
    2324                 :             : 
    2325                 :      229199 :   checking_verify_flow_info ();
    2326                 :      229199 : }
        

Generated by: LCOV version 2.1-beta

LCOV profile is generated on x86_64 machine using following configure options: configure --disable-bootstrap --enable-coverage=opt --enable-languages=c,c++,fortran,go,jit,lto,rust,m2 --enable-host-shared. GCC test suite is run with the built compiler.