LCOV - code coverage report
Current view: top level - gcc - cse.c (source / functions) Hit Total Coverage
Test: gcc.info Lines: 2683 2997 89.5 %
Date: 2020-03-28 11:57:23 Functions: 77 88 87.5 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 0 0 -

           Branch data     Line data    Source code
       1                 :            : /* Common subexpression elimination for GNU compiler.
       2                 :            :    Copyright (C) 1987-2020 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 under
       7                 :            : the terms of the GNU General Public License as published by the Free
       8                 :            : Software Foundation; either version 3, or (at your option) any later
       9                 :            : version.
      10                 :            : 
      11                 :            : GCC is distributed in the hope that it will be useful, but WITHOUT ANY
      12                 :            : 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                 :            : #include "config.h"
      21                 :            : #include "system.h"
      22                 :            : #include "coretypes.h"
      23                 :            : #include "backend.h"
      24                 :            : #include "target.h"
      25                 :            : #include "rtl.h"
      26                 :            : #include "tree.h"
      27                 :            : #include "cfghooks.h"
      28                 :            : #include "df.h"
      29                 :            : #include "memmodel.h"
      30                 :            : #include "tm_p.h"
      31                 :            : #include "insn-config.h"
      32                 :            : #include "regs.h"
      33                 :            : #include "emit-rtl.h"
      34                 :            : #include "recog.h"
      35                 :            : #include "cfgrtl.h"
      36                 :            : #include "cfganal.h"
      37                 :            : #include "cfgcleanup.h"
      38                 :            : #include "alias.h"
      39                 :            : #include "toplev.h"
      40                 :            : #include "rtlhooks-def.h"
      41                 :            : #include "tree-pass.h"
      42                 :            : #include "dbgcnt.h"
      43                 :            : #include "rtl-iter.h"
      44                 :            : #include "regs.h"
      45                 :            : #include "function-abi.h"
      46                 :            : 
      47                 :            : /* The basic idea of common subexpression elimination is to go
      48                 :            :    through the code, keeping a record of expressions that would
      49                 :            :    have the same value at the current scan point, and replacing
      50                 :            :    expressions encountered with the cheapest equivalent expression.
      51                 :            : 
      52                 :            :    It is too complicated to keep track of the different possibilities
      53                 :            :    when control paths merge in this code; so, at each label, we forget all
      54                 :            :    that is known and start fresh.  This can be described as processing each
      55                 :            :    extended basic block separately.  We have a separate pass to perform
      56                 :            :    global CSE.
      57                 :            : 
      58                 :            :    Note CSE can turn a conditional or computed jump into a nop or
      59                 :            :    an unconditional jump.  When this occurs we arrange to run the jump
      60                 :            :    optimizer after CSE to delete the unreachable code.
      61                 :            : 
      62                 :            :    We use two data structures to record the equivalent expressions:
      63                 :            :    a hash table for most expressions, and a vector of "quantity
      64                 :            :    numbers" to record equivalent (pseudo) registers.
      65                 :            : 
      66                 :            :    The use of the special data structure for registers is desirable
      67                 :            :    because it is faster.  It is possible because registers references
      68                 :            :    contain a fairly small number, the register number, taken from
      69                 :            :    a contiguously allocated series, and two register references are
      70                 :            :    identical if they have the same number.  General expressions
      71                 :            :    do not have any such thing, so the only way to retrieve the
      72                 :            :    information recorded on an expression other than a register
      73                 :            :    is to keep it in a hash table.
      74                 :            : 
      75                 :            : Registers and "quantity numbers":
      76                 :            : 
      77                 :            :    At the start of each basic block, all of the (hardware and pseudo)
      78                 :            :    registers used in the function are given distinct quantity
      79                 :            :    numbers to indicate their contents.  During scan, when the code
      80                 :            :    copies one register into another, we copy the quantity number.
      81                 :            :    When a register is loaded in any other way, we allocate a new
      82                 :            :    quantity number to describe the value generated by this operation.
      83                 :            :    `REG_QTY (N)' records what quantity register N is currently thought
      84                 :            :    of as containing.
      85                 :            : 
      86                 :            :    All real quantity numbers are greater than or equal to zero.
      87                 :            :    If register N has not been assigned a quantity, `REG_QTY (N)' will
      88                 :            :    equal -N - 1, which is always negative.
      89                 :            : 
      90                 :            :    Quantity numbers below zero do not exist and none of the `qty_table'
      91                 :            :    entries should be referenced with a negative index.
      92                 :            : 
      93                 :            :    We also maintain a bidirectional chain of registers for each
      94                 :            :    quantity number.  The `qty_table` members `first_reg' and `last_reg',
      95                 :            :    and `reg_eqv_table' members `next' and `prev' hold these chains.
      96                 :            : 
      97                 :            :    The first register in a chain is the one whose lifespan is least local.
      98                 :            :    Among equals, it is the one that was seen first.
      99                 :            :    We replace any equivalent register with that one.
     100                 :            : 
     101                 :            :    If two registers have the same quantity number, it must be true that
     102                 :            :    REG expressions with qty_table `mode' must be in the hash table for both
     103                 :            :    registers and must be in the same class.
     104                 :            : 
     105                 :            :    The converse is not true.  Since hard registers may be referenced in
     106                 :            :    any mode, two REG expressions might be equivalent in the hash table
     107                 :            :    but not have the same quantity number if the quantity number of one
     108                 :            :    of the registers is not the same mode as those expressions.
     109                 :            : 
     110                 :            : Constants and quantity numbers
     111                 :            : 
     112                 :            :    When a quantity has a known constant value, that value is stored
     113                 :            :    in the appropriate qty_table `const_rtx'.  This is in addition to
     114                 :            :    putting the constant in the hash table as is usual for non-regs.
     115                 :            : 
     116                 :            :    Whether a reg or a constant is preferred is determined by the configuration
     117                 :            :    macro CONST_COSTS and will often depend on the constant value.  In any
     118                 :            :    event, expressions containing constants can be simplified, by fold_rtx.
     119                 :            : 
     120                 :            :    When a quantity has a known nearly constant value (such as an address
     121                 :            :    of a stack slot), that value is stored in the appropriate qty_table
     122                 :            :    `const_rtx'.
     123                 :            : 
     124                 :            :    Integer constants don't have a machine mode.  However, cse
     125                 :            :    determines the intended machine mode from the destination
     126                 :            :    of the instruction that moves the constant.  The machine mode
     127                 :            :    is recorded in the hash table along with the actual RTL
     128                 :            :    constant expression so that different modes are kept separate.
     129                 :            : 
     130                 :            : Other expressions:
     131                 :            : 
     132                 :            :    To record known equivalences among expressions in general
     133                 :            :    we use a hash table called `table'.  It has a fixed number of buckets
     134                 :            :    that contain chains of `struct table_elt' elements for expressions.
     135                 :            :    These chains connect the elements whose expressions have the same
     136                 :            :    hash codes.
     137                 :            : 
     138                 :            :    Other chains through the same elements connect the elements which
     139                 :            :    currently have equivalent values.
     140                 :            : 
     141                 :            :    Register references in an expression are canonicalized before hashing
     142                 :            :    the expression.  This is done using `reg_qty' and qty_table `first_reg'.
     143                 :            :    The hash code of a register reference is computed using the quantity
     144                 :            :    number, not the register number.
     145                 :            : 
     146                 :            :    When the value of an expression changes, it is necessary to remove from the
     147                 :            :    hash table not just that expression but all expressions whose values
     148                 :            :    could be different as a result.
     149                 :            : 
     150                 :            :      1. If the value changing is in memory, except in special cases
     151                 :            :      ANYTHING referring to memory could be changed.  That is because
     152                 :            :      nobody knows where a pointer does not point.
     153                 :            :      The function `invalidate_memory' removes what is necessary.
     154                 :            : 
     155                 :            :      The special cases are when the address is constant or is
     156                 :            :      a constant plus a fixed register such as the frame pointer
     157                 :            :      or a static chain pointer.  When such addresses are stored in,
     158                 :            :      we can tell exactly which other such addresses must be invalidated
     159                 :            :      due to overlap.  `invalidate' does this.
     160                 :            :      All expressions that refer to non-constant
     161                 :            :      memory addresses are also invalidated.  `invalidate_memory' does this.
     162                 :            : 
     163                 :            :      2. If the value changing is a register, all expressions
     164                 :            :      containing references to that register, and only those,
     165                 :            :      must be removed.
     166                 :            : 
     167                 :            :    Because searching the entire hash table for expressions that contain
     168                 :            :    a register is very slow, we try to figure out when it isn't necessary.
     169                 :            :    Precisely, this is necessary only when expressions have been
     170                 :            :    entered in the hash table using this register, and then the value has
     171                 :            :    changed, and then another expression wants to be added to refer to
     172                 :            :    the register's new value.  This sequence of circumstances is rare
     173                 :            :    within any one basic block.
     174                 :            : 
     175                 :            :    `REG_TICK' and `REG_IN_TABLE', accessors for members of
     176                 :            :    cse_reg_info, are used to detect this case.  REG_TICK (i) is
     177                 :            :    incremented whenever a value is stored in register i.
     178                 :            :    REG_IN_TABLE (i) holds -1 if no references to register i have been
     179                 :            :    entered in the table; otherwise, it contains the value REG_TICK (i)
     180                 :            :    had when the references were entered.  If we want to enter a
     181                 :            :    reference and REG_IN_TABLE (i) != REG_TICK (i), we must scan and
     182                 :            :    remove old references.  Until we want to enter a new entry, the
     183                 :            :    mere fact that the two vectors don't match makes the entries be
     184                 :            :    ignored if anyone tries to match them.
     185                 :            : 
     186                 :            :    Registers themselves are entered in the hash table as well as in
     187                 :            :    the equivalent-register chains.  However, `REG_TICK' and
     188                 :            :    `REG_IN_TABLE' do not apply to expressions which are simple
     189                 :            :    register references.  These expressions are removed from the table
     190                 :            :    immediately when they become invalid, and this can be done even if
     191                 :            :    we do not immediately search for all the expressions that refer to
     192                 :            :    the register.
     193                 :            : 
     194                 :            :    A CLOBBER rtx in an instruction invalidates its operand for further
     195                 :            :    reuse.  A CLOBBER or SET rtx whose operand is a MEM:BLK
     196                 :            :    invalidates everything that resides in memory.
     197                 :            : 
     198                 :            : Related expressions:
     199                 :            : 
     200                 :            :    Constant expressions that differ only by an additive integer
     201                 :            :    are called related.  When a constant expression is put in
     202                 :            :    the table, the related expression with no constant term
     203                 :            :    is also entered.  These are made to point at each other
     204                 :            :    so that it is possible to find out if there exists any
     205                 :            :    register equivalent to an expression related to a given expression.  */
     206                 :            : 
     207                 :            : /* Length of qty_table vector.  We know in advance we will not need
     208                 :            :    a quantity number this big.  */
     209                 :            : 
     210                 :            : static int max_qty;
     211                 :            : 
     212                 :            : /* Next quantity number to be allocated.
     213                 :            :    This is 1 + the largest number needed so far.  */
     214                 :            : 
     215                 :            : static int next_qty;
     216                 :            : 
     217                 :            : /* Per-qty information tracking.
     218                 :            : 
     219                 :            :    `first_reg' and `last_reg' track the head and tail of the
     220                 :            :    chain of registers which currently contain this quantity.
     221                 :            : 
     222                 :            :    `mode' contains the machine mode of this quantity.
     223                 :            : 
     224                 :            :    `const_rtx' holds the rtx of the constant value of this
     225                 :            :    quantity, if known.  A summations of the frame/arg pointer
     226                 :            :    and a constant can also be entered here.  When this holds
     227                 :            :    a known value, `const_insn' is the insn which stored the
     228                 :            :    constant value.
     229                 :            : 
     230                 :            :    `comparison_{code,const,qty}' are used to track when a
     231                 :            :    comparison between a quantity and some constant or register has
     232                 :            :    been passed.  In such a case, we know the results of the comparison
     233                 :            :    in case we see it again.  These members record a comparison that
     234                 :            :    is known to be true.  `comparison_code' holds the rtx code of such
     235                 :            :    a comparison, else it is set to UNKNOWN and the other two
     236                 :            :    comparison members are undefined.  `comparison_const' holds
     237                 :            :    the constant being compared against, or zero if the comparison
     238                 :            :    is not against a constant.  `comparison_qty' holds the quantity
     239                 :            :    being compared against when the result is known.  If the comparison
     240                 :            :    is not with a register, `comparison_qty' is -1.  */
     241                 :            : 
     242                 :            : struct qty_table_elem
     243                 :            : {
     244                 :            :   rtx const_rtx;
     245                 :            :   rtx_insn *const_insn;
     246                 :            :   rtx comparison_const;
     247                 :            :   int comparison_qty;
     248                 :            :   unsigned int first_reg, last_reg;
     249                 :            :   /* The sizes of these fields should match the sizes of the
     250                 :            :      code and mode fields of struct rtx_def (see rtl.h).  */
     251                 :            :   ENUM_BITFIELD(rtx_code) comparison_code : 16;
     252                 :            :   ENUM_BITFIELD(machine_mode) mode : 8;
     253                 :            : };
     254                 :            : 
     255                 :            : /* The table of all qtys, indexed by qty number.  */
     256                 :            : static struct qty_table_elem *qty_table;
     257                 :            : 
     258                 :            : /* For machines that have a CC0, we do not record its value in the hash
     259                 :            :    table since its use is guaranteed to be the insn immediately following
     260                 :            :    its definition and any other insn is presumed to invalidate it.
     261                 :            : 
     262                 :            :    Instead, we store below the current and last value assigned to CC0.
     263                 :            :    If it should happen to be a constant, it is stored in preference
     264                 :            :    to the actual assigned value.  In case it is a constant, we store
     265                 :            :    the mode in which the constant should be interpreted.  */
     266                 :            : 
     267                 :            : static rtx this_insn_cc0, prev_insn_cc0;
     268                 :            : static machine_mode this_insn_cc0_mode, prev_insn_cc0_mode;
     269                 :            : 
     270                 :            : /* Insn being scanned.  */
     271                 :            : 
     272                 :            : static rtx_insn *this_insn;
     273                 :            : static bool optimize_this_for_speed_p;
     274                 :            : 
     275                 :            : /* Index by register number, gives the number of the next (or
     276                 :            :    previous) register in the chain of registers sharing the same
     277                 :            :    value.
     278                 :            : 
     279                 :            :    Or -1 if this register is at the end of the chain.
     280                 :            : 
     281                 :            :    If REG_QTY (N) == -N - 1, reg_eqv_table[N].next is undefined.  */
     282                 :            : 
     283                 :            : /* Per-register equivalence chain.  */
     284                 :            : struct reg_eqv_elem
     285                 :            : {
     286                 :            :   int next, prev;
     287                 :            : };
     288                 :            : 
     289                 :            : /* The table of all register equivalence chains.  */
     290                 :            : static struct reg_eqv_elem *reg_eqv_table;
     291                 :            : 
     292                 :            : struct cse_reg_info
     293                 :            : {
     294                 :            :   /* The timestamp at which this register is initialized.  */
     295                 :            :   unsigned int timestamp;
     296                 :            : 
     297                 :            :   /* The quantity number of the register's current contents.  */
     298                 :            :   int reg_qty;
     299                 :            : 
     300                 :            :   /* The number of times the register has been altered in the current
     301                 :            :      basic block.  */
     302                 :            :   int reg_tick;
     303                 :            : 
     304                 :            :   /* The REG_TICK value at which rtx's containing this register are
     305                 :            :      valid in the hash table.  If this does not equal the current
     306                 :            :      reg_tick value, such expressions existing in the hash table are
     307                 :            :      invalid.  */
     308                 :            :   int reg_in_table;
     309                 :            : 
     310                 :            :   /* The SUBREG that was set when REG_TICK was last incremented.  Set
     311                 :            :      to -1 if the last store was to the whole register, not a subreg.  */
     312                 :            :   unsigned int subreg_ticked;
     313                 :            : };
     314                 :            : 
     315                 :            : /* A table of cse_reg_info indexed by register numbers.  */
     316                 :            : static struct cse_reg_info *cse_reg_info_table;
     317                 :            : 
     318                 :            : /* The size of the above table.  */
     319                 :            : static unsigned int cse_reg_info_table_size;
     320                 :            : 
     321                 :            : /* The index of the first entry that has not been initialized.  */
     322                 :            : static unsigned int cse_reg_info_table_first_uninitialized;
     323                 :            : 
     324                 :            : /* The timestamp at the beginning of the current run of
     325                 :            :    cse_extended_basic_block.  We increment this variable at the beginning of
     326                 :            :    the current run of cse_extended_basic_block.  The timestamp field of a
     327                 :            :    cse_reg_info entry matches the value of this variable if and only
     328                 :            :    if the entry has been initialized during the current run of
     329                 :            :    cse_extended_basic_block.  */
     330                 :            : static unsigned int cse_reg_info_timestamp;
     331                 :            : 
     332                 :            : /* A HARD_REG_SET containing all the hard registers for which there is
     333                 :            :    currently a REG expression in the hash table.  Note the difference
     334                 :            :    from the above variables, which indicate if the REG is mentioned in some
     335                 :            :    expression in the table.  */
     336                 :            : 
     337                 :            : static HARD_REG_SET hard_regs_in_table;
     338                 :            : 
     339                 :            : /* True if CSE has altered the CFG.  */
     340                 :            : static bool cse_cfg_altered;
     341                 :            : 
     342                 :            : /* True if CSE has altered conditional jump insns in such a way
     343                 :            :    that jump optimization should be redone.  */
     344                 :            : static bool cse_jumps_altered;
     345                 :            : 
     346                 :            : /* True if we put a LABEL_REF into the hash table for an INSN
     347                 :            :    without a REG_LABEL_OPERAND, we have to rerun jump after CSE
     348                 :            :    to put in the note.  */
     349                 :            : static bool recorded_label_ref;
     350                 :            : 
     351                 :            : /* canon_hash stores 1 in do_not_record
     352                 :            :    if it notices a reference to CC0, PC, or some other volatile
     353                 :            :    subexpression.  */
     354                 :            : 
     355                 :            : static int do_not_record;
     356                 :            : 
     357                 :            : /* canon_hash stores 1 in hash_arg_in_memory
     358                 :            :    if it notices a reference to memory within the expression being hashed.  */
     359                 :            : 
     360                 :            : static int hash_arg_in_memory;
     361                 :            : 
     362                 :            : /* The hash table contains buckets which are chains of `struct table_elt's,
     363                 :            :    each recording one expression's information.
     364                 :            :    That expression is in the `exp' field.
     365                 :            : 
     366                 :            :    The canon_exp field contains a canonical (from the point of view of
     367                 :            :    alias analysis) version of the `exp' field.
     368                 :            : 
     369                 :            :    Those elements with the same hash code are chained in both directions
     370                 :            :    through the `next_same_hash' and `prev_same_hash' fields.
     371                 :            : 
     372                 :            :    Each set of expressions with equivalent values
     373                 :            :    are on a two-way chain through the `next_same_value'
     374                 :            :    and `prev_same_value' fields, and all point with
     375                 :            :    the `first_same_value' field at the first element in
     376                 :            :    that chain.  The chain is in order of increasing cost.
     377                 :            :    Each element's cost value is in its `cost' field.
     378                 :            : 
     379                 :            :    The `in_memory' field is nonzero for elements that
     380                 :            :    involve any reference to memory.  These elements are removed
     381                 :            :    whenever a write is done to an unidentified location in memory.
     382                 :            :    To be safe, we assume that a memory address is unidentified unless
     383                 :            :    the address is either a symbol constant or a constant plus
     384                 :            :    the frame pointer or argument pointer.
     385                 :            : 
     386                 :            :    The `related_value' field is used to connect related expressions
     387                 :            :    (that differ by adding an integer).
     388                 :            :    The related expressions are chained in a circular fashion.
     389                 :            :    `related_value' is zero for expressions for which this
     390                 :            :    chain is not useful.
     391                 :            : 
     392                 :            :    The `cost' field stores the cost of this element's expression.
     393                 :            :    The `regcost' field stores the value returned by approx_reg_cost for
     394                 :            :    this element's expression.
     395                 :            : 
     396                 :            :    The `is_const' flag is set if the element is a constant (including
     397                 :            :    a fixed address).
     398                 :            : 
     399                 :            :    The `flag' field is used as a temporary during some search routines.
     400                 :            : 
     401                 :            :    The `mode' field is usually the same as GET_MODE (`exp'), but
     402                 :            :    if `exp' is a CONST_INT and has no machine mode then the `mode'
     403                 :            :    field is the mode it was being used as.  Each constant is
     404                 :            :    recorded separately for each mode it is used with.  */
     405                 :            : 
     406                 :            : struct table_elt
     407                 :            : {
     408                 :            :   rtx exp;
     409                 :            :   rtx canon_exp;
     410                 :            :   struct table_elt *next_same_hash;
     411                 :            :   struct table_elt *prev_same_hash;
     412                 :            :   struct table_elt *next_same_value;
     413                 :            :   struct table_elt *prev_same_value;
     414                 :            :   struct table_elt *first_same_value;
     415                 :            :   struct table_elt *related_value;
     416                 :            :   int cost;
     417                 :            :   int regcost;
     418                 :            :   /* The size of this field should match the size
     419                 :            :      of the mode field of struct rtx_def (see rtl.h).  */
     420                 :            :   ENUM_BITFIELD(machine_mode) mode : 8;
     421                 :            :   char in_memory;
     422                 :            :   char is_const;
     423                 :            :   char flag;
     424                 :            : };
     425                 :            : 
     426                 :            : /* We don't want a lot of buckets, because we rarely have very many
     427                 :            :    things stored in the hash table, and a lot of buckets slows
     428                 :            :    down a lot of loops that happen frequently.  */
     429                 :            : #define HASH_SHIFT      5
     430                 :            : #define HASH_SIZE       (1 << HASH_SHIFT)
     431                 :            : #define HASH_MASK       (HASH_SIZE - 1)
     432                 :            : 
     433                 :            : /* Compute hash code of X in mode M.  Special-case case where X is a pseudo
     434                 :            :    register (hard registers may require `do_not_record' to be set).  */
     435                 :            : 
     436                 :            : #define HASH(X, M)      \
     437                 :            :  ((REG_P (X) && REGNO (X) >= FIRST_PSEUDO_REGISTER   \
     438                 :            :   ? (((unsigned) REG << 7) + (unsigned) REG_QTY (REGNO (X)))      \
     439                 :            :   : canon_hash (X, M)) & HASH_MASK)
     440                 :            : 
     441                 :            : /* Like HASH, but without side-effects.  */
     442                 :            : #define SAFE_HASH(X, M) \
     443                 :            :  ((REG_P (X) && REGNO (X) >= FIRST_PSEUDO_REGISTER   \
     444                 :            :   ? (((unsigned) REG << 7) + (unsigned) REG_QTY (REGNO (X)))      \
     445                 :            :   : safe_hash (X, M)) & HASH_MASK)
     446                 :            : 
     447                 :            : /* Determine whether register number N is considered a fixed register for the
     448                 :            :    purpose of approximating register costs.
     449                 :            :    It is desirable to replace other regs with fixed regs, to reduce need for
     450                 :            :    non-fixed hard regs.
     451                 :            :    A reg wins if it is either the frame pointer or designated as fixed.  */
     452                 :            : #define FIXED_REGNO_P(N)  \
     453                 :            :   ((N) == FRAME_POINTER_REGNUM || (N) == HARD_FRAME_POINTER_REGNUM \
     454                 :            :    || fixed_regs[N] || global_regs[N])
     455                 :            : 
     456                 :            : /* Compute cost of X, as stored in the `cost' field of a table_elt.  Fixed
     457                 :            :    hard registers and pointers into the frame are the cheapest with a cost
     458                 :            :    of 0.  Next come pseudos with a cost of one and other hard registers with
     459                 :            :    a cost of 2.  Aside from these special cases, call `rtx_cost'.  */
     460                 :            : 
     461                 :            : #define CHEAP_REGNO(N)                                                  \
     462                 :            :   (REGNO_PTR_FRAME_P (N)                                                \
     463                 :            :    || (HARD_REGISTER_NUM_P (N)                                          \
     464                 :            :        && FIXED_REGNO_P (N) && REGNO_REG_CLASS (N) != NO_REGS))
     465                 :            : 
     466                 :            : #define COST(X, MODE)                                                   \
     467                 :            :   (REG_P (X) ? 0 : notreg_cost (X, MODE, SET, 1))
     468                 :            : #define COST_IN(X, MODE, OUTER, OPNO)                                   \
     469                 :            :   (REG_P (X) ? 0 : notreg_cost (X, MODE, OUTER, OPNO))
     470                 :            : 
     471                 :            : /* Get the number of times this register has been updated in this
     472                 :            :    basic block.  */
     473                 :            : 
     474                 :            : #define REG_TICK(N) (get_cse_reg_info (N)->reg_tick)
     475                 :            : 
     476                 :            : /* Get the point at which REG was recorded in the table.  */
     477                 :            : 
     478                 :            : #define REG_IN_TABLE(N) (get_cse_reg_info (N)->reg_in_table)
     479                 :            : 
     480                 :            : /* Get the SUBREG set at the last increment to REG_TICK (-1 if not a
     481                 :            :    SUBREG).  */
     482                 :            : 
     483                 :            : #define SUBREG_TICKED(N) (get_cse_reg_info (N)->subreg_ticked)
     484                 :            : 
     485                 :            : /* Get the quantity number for REG.  */
     486                 :            : 
     487                 :            : #define REG_QTY(N) (get_cse_reg_info (N)->reg_qty)
     488                 :            : 
     489                 :            : /* Determine if the quantity number for register X represents a valid index
     490                 :            :    into the qty_table.  */
     491                 :            : 
     492                 :            : #define REGNO_QTY_VALID_P(N) (REG_QTY (N) >= 0)
     493                 :            : 
     494                 :            : /* Compare table_elt X and Y and return true iff X is cheaper than Y.  */
     495                 :            : 
     496                 :            : #define CHEAPER(X, Y) \
     497                 :            :  (preferable ((X)->cost, (X)->regcost, (Y)->cost, (Y)->regcost) < 0)
     498                 :            : 
     499                 :            : static struct table_elt *table[HASH_SIZE];
     500                 :            : 
     501                 :            : /* Chain of `struct table_elt's made so far for this function
     502                 :            :    but currently removed from the table.  */
     503                 :            : 
     504                 :            : static struct table_elt *free_element_chain;
     505                 :            : 
     506                 :            : /* Set to the cost of a constant pool reference if one was found for a
     507                 :            :    symbolic constant.  If this was found, it means we should try to
     508                 :            :    convert constants into constant pool entries if they don't fit in
     509                 :            :    the insn.  */
     510                 :            : 
     511                 :            : static int constant_pool_entries_cost;
     512                 :            : static int constant_pool_entries_regcost;
     513                 :            : 
     514                 :            : /* Trace a patch through the CFG.  */
     515                 :            : 
     516                 :            : struct branch_path
     517                 :            : {
     518                 :            :   /* The basic block for this path entry.  */
     519                 :            :   basic_block bb;
     520                 :            : };
     521                 :            : 
     522                 :            : /* This data describes a block that will be processed by
     523                 :            :    cse_extended_basic_block.  */
     524                 :            : 
     525                 :            : struct cse_basic_block_data
     526                 :            : {
     527                 :            :   /* Total number of SETs in block.  */
     528                 :            :   int nsets;
     529                 :            :   /* Size of current branch path, if any.  */
     530                 :            :   int path_size;
     531                 :            :   /* Current path, indicating which basic_blocks will be processed.  */
     532                 :            :   struct branch_path *path;
     533                 :            : };
     534                 :            : 
     535                 :            : 
     536                 :            : /* Pointers to the live in/live out bitmaps for the boundaries of the
     537                 :            :    current EBB.  */
     538                 :            : static bitmap cse_ebb_live_in, cse_ebb_live_out;
     539                 :            : 
     540                 :            : /* A simple bitmap to track which basic blocks have been visited
     541                 :            :    already as part of an already processed extended basic block.  */
     542                 :            : static sbitmap cse_visited_basic_blocks;
     543                 :            : 
     544                 :            : static bool fixed_base_plus_p (rtx x);
     545                 :            : static int notreg_cost (rtx, machine_mode, enum rtx_code, int);
     546                 :            : static int preferable (int, int, int, int);
     547                 :            : static void new_basic_block (void);
     548                 :            : static void make_new_qty (unsigned int, machine_mode);
     549                 :            : static void make_regs_eqv (unsigned int, unsigned int);
     550                 :            : static void delete_reg_equiv (unsigned int);
     551                 :            : static int mention_regs (rtx);
     552                 :            : static int insert_regs (rtx, struct table_elt *, int);
     553                 :            : static void remove_from_table (struct table_elt *, unsigned);
     554                 :            : static void remove_pseudo_from_table (rtx, unsigned);
     555                 :            : static struct table_elt *lookup (rtx, unsigned, machine_mode);
     556                 :            : static struct table_elt *lookup_for_remove (rtx, unsigned, machine_mode);
     557                 :            : static rtx lookup_as_function (rtx, enum rtx_code);
     558                 :            : static struct table_elt *insert_with_costs (rtx, struct table_elt *, unsigned,
     559                 :            :                                             machine_mode, int, int);
     560                 :            : static struct table_elt *insert (rtx, struct table_elt *, unsigned,
     561                 :            :                                  machine_mode);
     562                 :            : static void merge_equiv_classes (struct table_elt *, struct table_elt *);
     563                 :            : static void invalidate (rtx, machine_mode);
     564                 :            : static void remove_invalid_refs (unsigned int);
     565                 :            : static void remove_invalid_subreg_refs (unsigned int, poly_uint64,
     566                 :            :                                         machine_mode);
     567                 :            : static void rehash_using_reg (rtx);
     568                 :            : static void invalidate_memory (void);
     569                 :            : static rtx use_related_value (rtx, struct table_elt *);
     570                 :            : 
     571                 :            : static inline unsigned canon_hash (rtx, machine_mode);
     572                 :            : static inline unsigned safe_hash (rtx, machine_mode);
     573                 :            : static inline unsigned hash_rtx_string (const char *);
     574                 :            : 
     575                 :            : static rtx canon_reg (rtx, rtx_insn *);
     576                 :            : static enum rtx_code find_comparison_args (enum rtx_code, rtx *, rtx *,
     577                 :            :                                            machine_mode *,
     578                 :            :                                            machine_mode *);
     579                 :            : static rtx fold_rtx (rtx, rtx_insn *);
     580                 :            : static rtx equiv_constant (rtx);
     581                 :            : static void record_jump_equiv (rtx_insn *, bool);
     582                 :            : static void record_jump_cond (enum rtx_code, machine_mode, rtx, rtx,
     583                 :            :                               int);
     584                 :            : static void cse_insn (rtx_insn *);
     585                 :            : static void cse_prescan_path (struct cse_basic_block_data *);
     586                 :            : static void invalidate_from_clobbers (rtx_insn *);
     587                 :            : static void invalidate_from_sets_and_clobbers (rtx_insn *);
     588                 :            : static rtx cse_process_notes (rtx, rtx, bool *);
     589                 :            : static void cse_extended_basic_block (struct cse_basic_block_data *);
     590                 :            : extern void dump_class (struct table_elt*);
     591                 :            : static void get_cse_reg_info_1 (unsigned int regno);
     592                 :            : static struct cse_reg_info * get_cse_reg_info (unsigned int regno);
     593                 :            : 
     594                 :            : static void flush_hash_table (void);
     595                 :            : static bool insn_live_p (rtx_insn *, int *);
     596                 :            : static bool set_live_p (rtx, rtx_insn *, int *);
     597                 :            : static void cse_change_cc_mode_insn (rtx_insn *, rtx);
     598                 :            : static void cse_change_cc_mode_insns (rtx_insn *, rtx_insn *, rtx);
     599                 :            : static machine_mode cse_cc_succs (basic_block, basic_block, rtx, rtx,
     600                 :            :                                        bool);
     601                 :            : 
     602                 :            : 
     603                 :            : #undef RTL_HOOKS_GEN_LOWPART
     604                 :            : #define RTL_HOOKS_GEN_LOWPART           gen_lowpart_if_possible
     605                 :            : 
     606                 :            : static const struct rtl_hooks cse_rtl_hooks = RTL_HOOKS_INITIALIZER;
     607                 :            : 
     608                 :            : /* Nonzero if X has the form (PLUS frame-pointer integer).  */
     609                 :            : 
     610                 :            : static bool
     611                 :  149034000 : fixed_base_plus_p (rtx x)
     612                 :            : {
     613                 :  172035000 :   switch (GET_CODE (x))
     614                 :            :     {
     615                 :   88725500 :     case REG:
     616                 :   88725500 :       if (x == frame_pointer_rtx || x == hard_frame_pointer_rtx)
     617                 :            :         return true;
     618                 :   77411500 :       if (x == arg_pointer_rtx && fixed_regs[ARG_POINTER_REGNUM])
     619                 :      84755 :         return true;
     620                 :            :       return false;
     621                 :            : 
     622                 :   26479500 :     case PLUS:
     623                 :   26479500 :       if (!CONST_INT_P (XEXP (x, 1)))
     624                 :            :         return false;
     625                 :   23000700 :       return fixed_base_plus_p (XEXP (x, 0));
     626                 :            : 
     627                 :            :     default:
     628                 :            :       return false;
     629                 :            :     }
     630                 :            : }
     631                 :            : 
     632                 :            : /* Dump the expressions in the equivalence class indicated by CLASSP.
     633                 :            :    This function is used only for debugging.  */
     634                 :            : DEBUG_FUNCTION void
     635                 :          0 : dump_class (struct table_elt *classp)
     636                 :            : {
     637                 :          0 :   struct table_elt *elt;
     638                 :            : 
     639                 :          0 :   fprintf (stderr, "Equivalence chain for ");
     640                 :          0 :   print_rtl (stderr, classp->exp);
     641                 :          0 :   fprintf (stderr, ": \n");
     642                 :            : 
     643                 :          0 :   for (elt = classp->first_same_value; elt; elt = elt->next_same_value)
     644                 :            :     {
     645                 :          0 :       print_rtl (stderr, elt->exp);
     646                 :          0 :       fprintf (stderr, "\n");
     647                 :            :     }
     648                 :          0 : }
     649                 :            : 
     650                 :            : /* Return an estimate of the cost of the registers used in an rtx.
     651                 :            :    This is mostly the number of different REG expressions in the rtx;
     652                 :            :    however for some exceptions like fixed registers we use a cost of
     653                 :            :    0.  If any other hard register reference occurs, return MAX_COST.  */
     654                 :            : 
     655                 :            : static int
     656                 :  269312000 : approx_reg_cost (const_rtx x)
     657                 :            : {
     658                 :  269312000 :   int cost = 0;
     659                 :  269312000 :   subrtx_iterator::array_type array;
     660                 :  857659000 :   FOR_EACH_SUBRTX (iter, array, x, NONCONST)
     661                 :            :     {
     662                 :  623208000 :       const_rtx x = *iter;
     663                 :  623208000 :       if (REG_P (x))
     664                 :            :         {
     665                 :  254836000 :           unsigned int regno = REGNO (x);
     666                 :  254836000 :           if (!CHEAP_REGNO (regno))
     667                 :            :             {
     668                 :  209128000 :               if (regno < FIRST_PSEUDO_REGISTER)
     669                 :            :                 {
     670                 :   34861500 :                   if (targetm.small_register_classes_for_mode_p (GET_MODE (x)))
     671                 :   34861500 :                     return MAX_COST;
     672                 :          0 :                   cost += 2;
     673                 :            :                 }
     674                 :            :               else
     675                 :  174266000 :                 cost += 1;
     676                 :            :             }
     677                 :            :         }
     678                 :            :     }
     679                 :  234451000 :   return cost;
     680                 :            : }
     681                 :            : 
     682                 :            : /* Return a negative value if an rtx A, whose costs are given by COST_A
     683                 :            :    and REGCOST_A, is more desirable than an rtx B.
     684                 :            :    Return a positive value if A is less desirable, or 0 if the two are
     685                 :            :    equally good.  */
     686                 :            : static int
     687                 :  409147000 : preferable (int cost_a, int regcost_a, int cost_b, int regcost_b)
     688                 :            : {
     689                 :            :   /* First, get rid of cases involving expressions that are entirely
     690                 :            :      unwanted.  */
     691                 :  105478000 :   if (cost_a != cost_b)
     692                 :            :     {
     693                 :  381695000 :       if (cost_a == MAX_COST)
     694                 :            :         return 1;
     695                 :  379647000 :       if (cost_b == MAX_COST)
     696                 :            :         return -1;
     697                 :            :     }
     698                 :            : 
     699                 :            :   /* Avoid extending lifetimes of hardregs.  */
     700                 :  105787000 :   if (regcost_a != regcost_b)
     701                 :            :     {
     702                 :   58164200 :       if (regcost_a == MAX_COST)
     703                 :            :         return 1;
     704                 :   45023100 :       if (regcost_b == MAX_COST)
     705                 :            :         return -1;
     706                 :            :     }
     707                 :            : 
     708                 :            :   /* Normal operation costs take precedence.  */
     709                 :   91225300 :   if (cost_a != cost_b)
     710                 :   63822300 :     return cost_a - cost_b;
     711                 :            :   /* Only if these are identical consider effects on register pressure.  */
     712                 :   27402900 :   if (regcost_a != regcost_b)
     713                 :   10163100 :     return regcost_a - regcost_b;
     714                 :            :   return 0;
     715                 :            : }
     716                 :            : 
     717                 :            : /* Internal function, to compute cost when X is not a register; called
     718                 :            :    from COST macro to keep it simple.  */
     719                 :            : 
     720                 :            : static int
     721                 :  191334000 : notreg_cost (rtx x, machine_mode mode, enum rtx_code outer, int opno)
     722                 :            : {
     723                 :  191334000 :   scalar_int_mode int_mode, inner_mode;
     724                 :  191334000 :   return ((GET_CODE (x) == SUBREG
     725                 :    2596800 :            && REG_P (SUBREG_REG (x))
     726                 :  192120000 :            && is_int_mode (mode, &int_mode)
     727                 :    2321050 :            && is_int_mode (GET_MODE (SUBREG_REG (x)), &inner_mode)
     728                 :    4382990 :            && GET_MODE_SIZE (int_mode) < GET_MODE_SIZE (inner_mode)
     729                 :    2165290 :            && subreg_lowpart_p (x)
     730                 :    1535330 :            && TRULY_NOOP_TRUNCATION_MODES_P (int_mode, inner_mode))
     731                 :  381133000 :           ? 0
     732                 :  189799000 :           : rtx_cost (x, mode, outer, opno, optimize_this_for_speed_p) * 2);
     733                 :            : }
     734                 :            : 
     735                 :            : 
     736                 :            : /* Initialize CSE_REG_INFO_TABLE.  */
     737                 :            : 
     738                 :            : static void
     739                 :    1548700 : init_cse_reg_info (unsigned int nregs)
     740                 :            : {
     741                 :            :   /* Do we need to grow the table?  */
     742                 :    1548700 :   if (nregs > cse_reg_info_table_size)
     743                 :            :     {
     744                 :     123956 :       unsigned int new_size;
     745                 :            : 
     746                 :     123956 :       if (cse_reg_info_table_size < 2048)
     747                 :            :         {
     748                 :            :           /* Compute a new size that is a power of 2 and no smaller
     749                 :            :              than the large of NREGS and 64.  */
     750                 :     123754 :           new_size = (cse_reg_info_table_size
     751                 :     123754 :                       ? cse_reg_info_table_size : 64);
     752                 :            : 
     753                 :     270558 :           while (new_size < nregs)
     754                 :     146804 :             new_size *= 2;
     755                 :            :         }
     756                 :            :       else
     757                 :            :         {
     758                 :            :           /* If we need a big table, allocate just enough to hold
     759                 :            :              NREGS registers.  */
     760                 :            :           new_size = nregs;
     761                 :            :         }
     762                 :            : 
     763                 :            :       /* Reallocate the table with NEW_SIZE entries.  */
     764                 :     123956 :       free (cse_reg_info_table);
     765                 :     123956 :       cse_reg_info_table = XNEWVEC (struct cse_reg_info, new_size);
     766                 :     123956 :       cse_reg_info_table_size = new_size;
     767                 :     123956 :       cse_reg_info_table_first_uninitialized = 0;
     768                 :            :     }
     769                 :            : 
     770                 :            :   /* Do we have all of the first NREGS entries initialized?  */
     771                 :    1548700 :   if (cse_reg_info_table_first_uninitialized < nregs)
     772                 :            :     {
     773                 :     231222 :       unsigned int old_timestamp = cse_reg_info_timestamp - 1;
     774                 :     231222 :       unsigned int i;
     775                 :            : 
     776                 :            :       /* Put the old timestamp on newly allocated entries so that they
     777                 :            :          will all be considered out of date.  We do not touch those
     778                 :            :          entries beyond the first NREGS entries to be nice to the
     779                 :            :          virtual memory.  */
     780                 :   20860900 :       for (i = cse_reg_info_table_first_uninitialized; i < nregs; i++)
     781                 :   20629600 :         cse_reg_info_table[i].timestamp = old_timestamp;
     782                 :            : 
     783                 :     231222 :       cse_reg_info_table_first_uninitialized = nregs;
     784                 :            :     }
     785                 :    1548700 : }
     786                 :            : 
     787                 :            : /* Given REGNO, initialize the cse_reg_info entry for REGNO.  */
     788                 :            : 
     789                 :            : static void
     790                 :  478108000 : get_cse_reg_info_1 (unsigned int regno)
     791                 :            : {
     792                 :            :   /* Set TIMESTAMP field to CSE_REG_INFO_TIMESTAMP so that this
     793                 :            :      entry will be considered to have been initialized.  */
     794                 :  478108000 :   cse_reg_info_table[regno].timestamp = cse_reg_info_timestamp;
     795                 :            : 
     796                 :            :   /* Initialize the rest of the entry.  */
     797                 :  478108000 :   cse_reg_info_table[regno].reg_tick = 1;
     798                 :  478108000 :   cse_reg_info_table[regno].reg_in_table = -1;
     799                 :  478108000 :   cse_reg_info_table[regno].subreg_ticked = -1;
     800                 :  478108000 :   cse_reg_info_table[regno].reg_qty = -regno - 1;
     801                 :  478108000 : }
     802                 :            : 
     803                 :            : /* Find a cse_reg_info entry for REGNO.  */
     804                 :            : 
     805                 :            : static inline struct cse_reg_info *
     806                 : 6754230000 : get_cse_reg_info (unsigned int regno)
     807                 :            : {
     808                 : 6754230000 :   struct cse_reg_info *p = &cse_reg_info_table[regno];
     809                 :            : 
     810                 :            :   /* If this entry has not been initialized, go ahead and initialize
     811                 :            :      it.  */
     812                 : 1369540000 :   if (p->timestamp != cse_reg_info_timestamp)
     813                 :  478108000 :     get_cse_reg_info_1 (regno);
     814                 :            : 
     815                 : 6754230000 :   return p;
     816                 :            : }
     817                 :            : 
     818                 :            : /* Clear the hash table and initialize each register with its own quantity,
     819                 :            :    for a new basic block.  */
     820                 :            : 
     821                 :            : static void
     822                 :   13087400 : new_basic_block (void)
     823                 :            : {
     824                 :   13087400 :   int i;
     825                 :            : 
     826                 :   13087400 :   next_qty = 0;
     827                 :            : 
     828                 :            :   /* Invalidate cse_reg_info_table.  */
     829                 :   13087400 :   cse_reg_info_timestamp++;
     830                 :            : 
     831                 :            :   /* Clear out hash table state for this pass.  */
     832                 :   13087400 :   CLEAR_HARD_REG_SET (hard_regs_in_table);
     833                 :            : 
     834                 :            :   /* The per-quantity values used to be initialized here, but it is
     835                 :            :      much faster to initialize each as it is made in `make_new_qty'.  */
     836                 :            : 
     837                 :  431885000 :   for (i = 0; i < HASH_SIZE; i++)
     838                 :            :     {
     839                 :  418798000 :       struct table_elt *first;
     840                 :            : 
     841                 :  418798000 :       first = table[i];
     842                 :  418798000 :       if (first != NULL)
     843                 :            :         {
     844                 :   80804600 :           struct table_elt *last = first;
     845                 :            : 
     846                 :   80804600 :           table[i] = NULL;
     847                 :            : 
     848                 :  119451000 :           while (last->next_same_hash != NULL)
     849                 :            :             last = last->next_same_hash;
     850                 :            : 
     851                 :            :           /* Now relink this hash entire chain into
     852                 :            :              the free element list.  */
     853                 :            : 
     854                 :   80804600 :           last->next_same_hash = free_element_chain;
     855                 :   80804600 :           free_element_chain = first;
     856                 :            :         }
     857                 :            :     }
     858                 :            : 
     859                 :   13087400 :   prev_insn_cc0 = 0;
     860                 :   13087400 : }
     861                 :            : 
     862                 :            : /* Say that register REG contains a quantity in mode MODE not in any
     863                 :            :    register before and initialize that quantity.  */
     864                 :            : 
     865                 :            : static void
     866                 :   62346100 : make_new_qty (unsigned int reg, machine_mode mode)
     867                 :            : {
     868                 :   62346100 :   int q;
     869                 :   62346100 :   struct qty_table_elem *ent;
     870                 :   62346100 :   struct reg_eqv_elem *eqv;
     871                 :            : 
     872                 :   62346100 :   gcc_assert (next_qty < max_qty);
     873                 :            : 
     874                 :   62346100 :   q = REG_QTY (reg) = next_qty++;
     875                 :   62346100 :   ent = &qty_table[q];
     876                 :   62346100 :   ent->first_reg = reg;
     877                 :   62346100 :   ent->last_reg = reg;
     878                 :   62346100 :   ent->mode = mode;
     879                 :   62346100 :   ent->const_rtx = ent->const_insn = NULL;
     880                 :   62346100 :   ent->comparison_code = UNKNOWN;
     881                 :            : 
     882                 :   62346100 :   eqv = &reg_eqv_table[reg];
     883                 :   62346100 :   eqv->next = eqv->prev = -1;
     884                 :   62346100 : }
     885                 :            : 
     886                 :            : /* Make reg NEW equivalent to reg OLD.
     887                 :            :    OLD is not changing; NEW is.  */
     888                 :            : 
     889                 :            : static void
     890                 :    7818140 : make_regs_eqv (unsigned int new_reg, unsigned int old_reg)
     891                 :            : {
     892                 :    7818140 :   unsigned int lastr, firstr;
     893                 :    7818140 :   int q = REG_QTY (old_reg);
     894                 :    7818140 :   struct qty_table_elem *ent;
     895                 :            : 
     896                 :    7818140 :   ent = &qty_table[q];
     897                 :            : 
     898                 :            :   /* Nothing should become eqv until it has a "non-invalid" qty number.  */
     899                 :    7818140 :   gcc_assert (REGNO_QTY_VALID_P (old_reg));
     900                 :            : 
     901                 :    7818140 :   REG_QTY (new_reg) = q;
     902                 :    7818140 :   firstr = ent->first_reg;
     903                 :    7818140 :   lastr = ent->last_reg;
     904                 :            : 
     905                 :            :   /* Prefer fixed hard registers to anything.  Prefer pseudo regs to other
     906                 :            :      hard regs.  Among pseudos, if NEW will live longer than any other reg
     907                 :            :      of the same qty, and that is beyond the current basic block,
     908                 :            :      make it the new canonical replacement for this qty.  */
     909                 :      50985 :   if (! (firstr < FIRST_PSEUDO_REGISTER && FIXED_REGNO_P (firstr))
     910                 :            :       /* Certain fixed registers might be of the class NO_REGS.  This means
     911                 :            :          that not only can they not be allocated by the compiler, but
     912                 :            :          they cannot be used in substitutions or canonicalizations
     913                 :            :          either.  */
     914                 :    7767160 :       && (new_reg >= FIRST_PSEUDO_REGISTER || REGNO_REG_CLASS (new_reg) != NO_REGS)
     915                 :   15585300 :       && ((new_reg < FIRST_PSEUDO_REGISTER && FIXED_REGNO_P (new_reg))
     916                 :    7763180 :           || (new_reg >= FIRST_PSEUDO_REGISTER
     917                 :    7763180 :               && (firstr < FIRST_PSEUDO_REGISTER
     918                 :    7763180 :                   || (bitmap_bit_p (cse_ebb_live_out, new_reg)
     919                 :    2175440 :                       && !bitmap_bit_p (cse_ebb_live_out, firstr))
     920                 :    6436850 :                   || (bitmap_bit_p (cse_ebb_live_in, new_reg)
     921                 :     238432 :                       && !bitmap_bit_p (cse_ebb_live_in, firstr))))))
     922                 :            :     {
     923                 :    1380610 :       reg_eqv_table[firstr].prev = new_reg;
     924                 :    1380610 :       reg_eqv_table[new_reg].next = firstr;
     925                 :    1380610 :       reg_eqv_table[new_reg].prev = -1;
     926                 :    1380610 :       ent->first_reg = new_reg;
     927                 :            :     }
     928                 :            :   else
     929                 :            :     {
     930                 :            :       /* If NEW is a hard reg (known to be non-fixed), insert at end.
     931                 :            :          Otherwise, insert before any non-fixed hard regs that are at the
     932                 :            :          end.  Registers of class NO_REGS cannot be used as an
     933                 :            :          equivalent for anything.  */
     934                 :      35728 :       while (lastr < FIRST_PSEUDO_REGISTER && reg_eqv_table[lastr].prev >= 0
     935                 :          0 :              && (REGNO_REG_CLASS (lastr) == NO_REGS || ! FIXED_REGNO_P (lastr))
     936                 :    6437540 :              && new_reg >= FIRST_PSEUDO_REGISTER)
     937                 :          0 :         lastr = reg_eqv_table[lastr].prev;
     938                 :    6437540 :       reg_eqv_table[new_reg].next = reg_eqv_table[lastr].next;
     939                 :    6437540 :       if (reg_eqv_table[lastr].next >= 0)
     940                 :          0 :         reg_eqv_table[reg_eqv_table[lastr].next].prev = new_reg;
     941                 :            :       else
     942                 :    6437540 :         qty_table[q].last_reg = new_reg;
     943                 :    6437540 :       reg_eqv_table[lastr].next = new_reg;
     944                 :    6437540 :       reg_eqv_table[new_reg].prev = lastr;
     945                 :            :     }
     946                 :    7818140 : }
     947                 :            : 
     948                 :            : /* Remove REG from its equivalence class.  */
     949                 :            : 
     950                 :            : static void
     951                 :  802246000 : delete_reg_equiv (unsigned int reg)
     952                 :            : {
     953                 :  802246000 :   struct qty_table_elem *ent;
     954                 :  802246000 :   int q = REG_QTY (reg);
     955                 :  802246000 :   int p, n;
     956                 :            : 
     957                 :            :   /* If invalid, do nothing.  */
     958                 :  802246000 :   if (! REGNO_QTY_VALID_P (reg))
     959                 :            :     return;
     960                 :            : 
     961                 :   11385300 :   ent = &qty_table[q];
     962                 :            : 
     963                 :   11385300 :   p = reg_eqv_table[reg].prev;
     964                 :   11385300 :   n = reg_eqv_table[reg].next;
     965                 :            : 
     966                 :   11385300 :   if (n != -1)
     967                 :     355170 :     reg_eqv_table[n].prev = p;
     968                 :            :   else
     969                 :   11030100 :     ent->last_reg = p;
     970                 :   11385300 :   if (p != -1)
     971                 :     505611 :     reg_eqv_table[p].next = n;
     972                 :            :   else
     973                 :   10879700 :     ent->first_reg = n;
     974                 :            : 
     975                 :   11385300 :   REG_QTY (reg) = -reg - 1;
     976                 :            : }
     977                 :            : 
     978                 :            : /* Remove any invalid expressions from the hash table
     979                 :            :    that refer to any of the registers contained in expression X.
     980                 :            : 
     981                 :            :    Make sure that newly inserted references to those registers
     982                 :            :    as subexpressions will be considered valid.
     983                 :            : 
     984                 :            :    mention_regs is not called when a register itself
     985                 :            :    is being stored in the table.
     986                 :            : 
     987                 :            :    Return 1 if we have done something that may have changed the hash code
     988                 :            :    of X.  */
     989                 :            : 
     990                 :            : static int
     991                 :  299998000 : mention_regs (rtx x)
     992                 :            : {
     993                 :  299998000 :   enum rtx_code code;
     994                 :  299998000 :   int i, j;
     995                 :  299998000 :   const char *fmt;
     996                 :  299998000 :   int changed = 0;
     997                 :            : 
     998                 :  299998000 :   if (x == 0)
     999                 :            :     return 0;
    1000                 :            : 
    1001                 :  299998000 :   code = GET_CODE (x);
    1002                 :  299998000 :   if (code == REG)
    1003                 :            :     {
    1004                 :   90649500 :       unsigned int regno = REGNO (x);
    1005                 :   90649500 :       unsigned int endregno = END_REGNO (x);
    1006                 :   90649500 :       unsigned int i;
    1007                 :            : 
    1008                 :  181299000 :       for (i = regno; i < endregno; i++)
    1009                 :            :         {
    1010                 :  135631000 :           if (REG_IN_TABLE (i) >= 0 && REG_IN_TABLE (i) != REG_TICK (i))
    1011                 :       7737 :             remove_invalid_refs (i);
    1012                 :            : 
    1013                 :   90649500 :           REG_IN_TABLE (i) = REG_TICK (i);
    1014                 :   90649500 :           SUBREG_TICKED (i) = -1;
    1015                 :            :         }
    1016                 :            : 
    1017                 :            :       return 0;
    1018                 :            :     }
    1019                 :            : 
    1020                 :            :   /* If this is a SUBREG, we don't want to discard other SUBREGs of the same
    1021                 :            :      pseudo if they don't use overlapping words.  We handle only pseudos
    1022                 :            :      here for simplicity.  */
    1023                 :    3940920 :   if (code == SUBREG && REG_P (SUBREG_REG (x))
    1024                 :  213287000 :       && REGNO (SUBREG_REG (x)) >= FIRST_PSEUDO_REGISTER)
    1025                 :            :     {
    1026                 :    3938660 :       unsigned int i = REGNO (SUBREG_REG (x));
    1027                 :            : 
    1028                 :    5761610 :       if (REG_IN_TABLE (i) >= 0 && REG_IN_TABLE (i) != REG_TICK (i))
    1029                 :            :         {
    1030                 :            :           /* If REG_IN_TABLE (i) differs from REG_TICK (i) by one, and
    1031                 :            :              the last store to this register really stored into this
    1032                 :            :              subreg, then remove the memory of this subreg.
    1033                 :            :              Otherwise, remove any memory of the entire register and
    1034                 :            :              all its subregs from the table.  */
    1035                 :     352637 :           if (REG_TICK (i) - REG_IN_TABLE (i) > 1
    1036                 :     705037 :               || SUBREG_TICKED (i) != REGNO (SUBREG_REG (x)))
    1037                 :     352637 :             remove_invalid_refs (i);
    1038                 :            :           else
    1039                 :          0 :             remove_invalid_subreg_refs (i, SUBREG_BYTE (x), GET_MODE (x));
    1040                 :            :         }
    1041                 :            : 
    1042                 :    3938660 :       REG_IN_TABLE (i) = REG_TICK (i);
    1043                 :    3938660 :       SUBREG_TICKED (i) = REGNO (SUBREG_REG (x));
    1044                 :    3938660 :       return 0;
    1045                 :            :     }
    1046                 :            : 
    1047                 :            :   /* If X is a comparison or a COMPARE and either operand is a register
    1048                 :            :      that does not have a quantity, give it one.  This is so that a later
    1049                 :            :      call to record_jump_equiv won't cause X to be assigned a different
    1050                 :            :      hash code and not found in the table after that call.
    1051                 :            : 
    1052                 :            :      It is not necessary to do this here, since rehash_using_reg can
    1053                 :            :      fix up the table later, but doing this here eliminates the need to
    1054                 :            :      call that expensive function in the most common case where the only
    1055                 :            :      use of the register is in the comparison.  */
    1056                 :            : 
    1057                 :  205410000 :   if (code == COMPARE || COMPARISON_P (x))
    1058                 :            :     {
    1059                 :   14782600 :       if (REG_P (XEXP (x, 0))
    1060                 :   14782600 :           && ! REGNO_QTY_VALID_P (REGNO (XEXP (x, 0))))
    1061                 :    5021100 :         if (insert_regs (XEXP (x, 0), NULL, 0))
    1062                 :            :           {
    1063                 :    5021100 :             rehash_using_reg (XEXP (x, 0));
    1064                 :    5021100 :             changed = 1;
    1065                 :            :           }
    1066                 :            : 
    1067                 :   14782600 :       if (REG_P (XEXP (x, 1))
    1068                 :   14782600 :           && ! REGNO_QTY_VALID_P (REGNO (XEXP (x, 1))))
    1069                 :    1621590 :         if (insert_regs (XEXP (x, 1), NULL, 0))
    1070                 :            :           {
    1071                 :    1621590 :             rehash_using_reg (XEXP (x, 1));
    1072                 :    1621590 :             changed = 1;
    1073                 :            :           }
    1074                 :            :     }
    1075                 :            : 
    1076                 :  205410000 :   fmt = GET_RTX_FORMAT (code);
    1077                 :  536126000 :   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
    1078                 :  330716000 :     if (fmt[i] == 'e')
    1079                 :  197031000 :       changed |= mention_regs (XEXP (x, i));
    1080                 :  133685000 :     else if (fmt[i] == 'E')
    1081                 :    7428070 :       for (j = 0; j < XVECLEN (x, i); j++)
    1082                 :    5184130 :         changed |= mention_regs (XVECEXP (x, i, j));
    1083                 :            : 
    1084                 :            :   return changed;
    1085                 :            : }
    1086                 :            : 
    1087                 :            : /* Update the register quantities for inserting X into the hash table
    1088                 :            :    with a value equivalent to CLASSP.
    1089                 :            :    (If the class does not contain a REG, it is irrelevant.)
    1090                 :            :    If MODIFIED is nonzero, X is a destination; it is being modified.
    1091                 :            :    Note that delete_reg_equiv should be called on a register
    1092                 :            :    before insert_regs is done on that register with MODIFIED != 0.
    1093                 :            : 
    1094                 :            :    Nonzero value means that elements of reg_qty have changed
    1095                 :            :    so X's hash code may be different.  */
    1096                 :            : 
    1097                 :            : static int
    1098                 :  155004000 : insert_regs (rtx x, struct table_elt *classp, int modified)
    1099                 :            : {
    1100                 :  155004000 :   if (REG_P (x))
    1101                 :            :     {
    1102                 :   73933400 :       unsigned int regno = REGNO (x);
    1103                 :   73933400 :       int qty_valid;
    1104                 :            : 
    1105                 :            :       /* If REGNO is in the equivalence table already but is of the
    1106                 :            :          wrong mode for that equivalence, don't do anything here.  */
    1107                 :            : 
    1108                 :   73933400 :       qty_valid = REGNO_QTY_VALID_P (regno);
    1109                 :   73933400 :       if (qty_valid)
    1110                 :            :         {
    1111                 :    3769120 :           struct qty_table_elem *ent = &qty_table[REG_QTY (regno)];
    1112                 :            : 
    1113                 :    3769120 :           if (ent->mode != GET_MODE (x))
    1114                 :            :             return 0;
    1115                 :            :         }
    1116                 :            : 
    1117                 :   73933200 :       if (modified || ! qty_valid)
    1118                 :            :         {
    1119                 :   70164300 :           if (classp)
    1120                 :   56504100 :             for (classp = classp->first_same_value;
    1121                 :  110745000 :                  classp != 0;
    1122                 :   54240600 :                  classp = classp->next_same_value)
    1123                 :   62058700 :               if (REG_P (classp->exp)
    1124                 :    7818150 :                   && GET_MODE (classp->exp) == GET_MODE (x))
    1125                 :            :                 {
    1126                 :    7818150 :                   unsigned c_regno = REGNO (classp->exp);
    1127                 :            : 
    1128                 :    7818150 :                   gcc_assert (REGNO_QTY_VALID_P (c_regno));
    1129                 :            : 
    1130                 :            :                   /* Suppose that 5 is hard reg and 100 and 101 are
    1131                 :            :                      pseudos.  Consider
    1132                 :            : 
    1133                 :            :                      (set (reg:si 100) (reg:si 5))
    1134                 :            :                      (set (reg:si 5) (reg:si 100))
    1135                 :            :                      (set (reg:di 101) (reg:di 5))
    1136                 :            : 
    1137                 :            :                      We would now set REG_QTY (101) = REG_QTY (5), but the
    1138                 :            :                      entry for 5 is in SImode.  When we use this later in
    1139                 :            :                      copy propagation, we get the register in wrong mode.  */
    1140                 :    7818150 :                   if (qty_table[REG_QTY (c_regno)].mode != GET_MODE (x))
    1141                 :          2 :                     continue;
    1142                 :            : 
    1143                 :    7818140 :                   make_regs_eqv (regno, c_regno);
    1144                 :    7818140 :                   return 1;
    1145                 :            :                 }
    1146                 :            : 
    1147                 :            :           /* Mention_regs for a SUBREG checks if REG_TICK is exactly one larger
    1148                 :            :              than REG_IN_TABLE to find out if there was only a single preceding
    1149                 :            :              invalidation - for the SUBREG - or another one, which would be
    1150                 :            :              for the full register.  However, if we find here that REG_TICK
    1151                 :            :              indicates that the register is invalid, it means that it has
    1152                 :            :              been invalidated in a separate operation.  The SUBREG might be used
    1153                 :            :              now (then this is a recursive call), or we might use the full REG
    1154                 :            :              now and a SUBREG of it later.  So bump up REG_TICK so that
    1155                 :            :              mention_regs will do the right thing.  */
    1156                 :   62346100 :           if (! modified
    1157                 :   13789300 :               && REG_IN_TABLE (regno) >= 0
    1158                 :   63727100 :               && REG_TICK (regno) == REG_IN_TABLE (regno) + 1)
    1159                 :       8529 :             REG_TICK (regno)++;
    1160                 :   62346100 :           make_new_qty (regno, GET_MODE (x));
    1161                 :   62346100 :           return 1;
    1162                 :            :         }
    1163                 :            : 
    1164                 :            :       return 0;
    1165                 :            :     }
    1166                 :            : 
    1167                 :            :   /* If X is a SUBREG, we will likely be inserting the inner register in the
    1168                 :            :      table.  If that register doesn't have an assigned quantity number at
    1169                 :            :      this point but does later, the insertion that we will be doing now will
    1170                 :            :      not be accessible because its hash code will have changed.  So assign
    1171                 :            :      a quantity number now.  */
    1172                 :            : 
    1173                 :    1556750 :   else if (GET_CODE (x) == SUBREG && REG_P (SUBREG_REG (x))
    1174                 :   82625700 :            && ! REGNO_QTY_VALID_P (REGNO (SUBREG_REG (x))))
    1175                 :            :     {
    1176                 :    1112120 :       insert_regs (SUBREG_REG (x), NULL, 0);
    1177                 :    1112120 :       mention_regs (x);
    1178                 :    1112120 :       return 1;
    1179                 :            :     }
    1180                 :            :   else
    1181                 :   79958300 :     return mention_regs (x);
    1182                 :            : }
    1183                 :            : 
    1184                 :            : 
    1185                 :            : /* Compute upper and lower anchors for CST.  Also compute the offset of CST
    1186                 :            :    from these anchors/bases such that *_BASE + *_OFFS = CST.  Return false iff
    1187                 :            :    CST is equal to an anchor.  */
    1188                 :            : 
    1189                 :            : static bool
    1190                 :          0 : compute_const_anchors (rtx cst,
    1191                 :            :                        HOST_WIDE_INT *lower_base, HOST_WIDE_INT *lower_offs,
    1192                 :            :                        HOST_WIDE_INT *upper_base, HOST_WIDE_INT *upper_offs)
    1193                 :            : {
    1194                 :          0 :   HOST_WIDE_INT n = INTVAL (cst);
    1195                 :            : 
    1196                 :          0 :   *lower_base = n & ~(targetm.const_anchor - 1);
    1197                 :          0 :   if (*lower_base == n)
    1198                 :            :     return false;
    1199                 :            : 
    1200                 :          0 :   *upper_base =
    1201                 :          0 :     (n + (targetm.const_anchor - 1)) & ~(targetm.const_anchor - 1);
    1202                 :          0 :   *upper_offs = n - *upper_base;
    1203                 :          0 :   *lower_offs = n - *lower_base;
    1204                 :          0 :   return true;
    1205                 :            : }
    1206                 :            : 
    1207                 :            : /* Insert the equivalence between ANCHOR and (REG + OFF) in mode MODE.  */
    1208                 :            : 
    1209                 :            : static void
    1210                 :          0 : insert_const_anchor (HOST_WIDE_INT anchor, rtx reg, HOST_WIDE_INT offs,
    1211                 :            :                      machine_mode mode)
    1212                 :            : {
    1213                 :          0 :   struct table_elt *elt;
    1214                 :          0 :   unsigned hash;
    1215                 :          0 :   rtx anchor_exp;
    1216                 :          0 :   rtx exp;
    1217                 :            : 
    1218                 :          0 :   anchor_exp = GEN_INT (anchor);
    1219                 :          0 :   hash = HASH (anchor_exp, mode);
    1220                 :          0 :   elt = lookup (anchor_exp, hash, mode);
    1221                 :          0 :   if (!elt)
    1222                 :          0 :     elt = insert (anchor_exp, NULL, hash, mode);
    1223                 :            : 
    1224                 :          0 :   exp = plus_constant (mode, reg, offs);
    1225                 :            :   /* REG has just been inserted and the hash codes recomputed.  */
    1226                 :          0 :   mention_regs (exp);
    1227                 :          0 :   hash = HASH (exp, mode);
    1228                 :            : 
    1229                 :            :   /* Use the cost of the register rather than the whole expression.  When
    1230                 :            :      looking up constant anchors we will further offset the corresponding
    1231                 :            :      expression therefore it does not make sense to prefer REGs over
    1232                 :            :      reg-immediate additions.  Prefer instead the oldest expression.  Also
    1233                 :            :      don't prefer pseudos over hard regs so that we derive constants in
    1234                 :            :      argument registers from other argument registers rather than from the
    1235                 :            :      original pseudo that was used to synthesize the constant.  */
    1236                 :          0 :   insert_with_costs (exp, elt, hash, mode, COST (reg, mode), 1);
    1237                 :          0 : }
    1238                 :            : 
    1239                 :            : /* The constant CST is equivalent to the register REG.  Create
    1240                 :            :    equivalences between the two anchors of CST and the corresponding
    1241                 :            :    register-offset expressions using REG.  */
    1242                 :            : 
    1243                 :            : static void
    1244                 :          0 : insert_const_anchors (rtx reg, rtx cst, machine_mode mode)
    1245                 :            : {
    1246                 :          0 :   HOST_WIDE_INT lower_base, lower_offs, upper_base, upper_offs;
    1247                 :            : 
    1248                 :          0 :   if (!compute_const_anchors (cst, &lower_base, &lower_offs,
    1249                 :            :                               &upper_base, &upper_offs))
    1250                 :          0 :       return;
    1251                 :            : 
    1252                 :            :   /* Ignore anchors of value 0.  Constants accessible from zero are
    1253                 :            :      simple.  */
    1254                 :          0 :   if (lower_base != 0)
    1255                 :          0 :     insert_const_anchor (lower_base, reg, -lower_offs, mode);
    1256                 :            : 
    1257                 :          0 :   if (upper_base != 0)
    1258                 :          0 :     insert_const_anchor (upper_base, reg, -upper_offs, mode);
    1259                 :            : }
    1260                 :            : 
    1261                 :            : /* We need to express ANCHOR_ELT->exp + OFFS.  Walk the equivalence list of
    1262                 :            :    ANCHOR_ELT and see if offsetting any of the entries by OFFS would create a
    1263                 :            :    valid expression.  Return the cheapest and oldest of such expressions.  In
    1264                 :            :    *OLD, return how old the resulting expression is compared to the other
    1265                 :            :    equivalent expressions.  */
    1266                 :            : 
    1267                 :            : static rtx
    1268                 :          0 : find_reg_offset_for_const (struct table_elt *anchor_elt, HOST_WIDE_INT offs,
    1269                 :            :                            unsigned *old)
    1270                 :            : {
    1271                 :          0 :   struct table_elt *elt;
    1272                 :          0 :   unsigned idx;
    1273                 :          0 :   struct table_elt *match_elt;
    1274                 :          0 :   rtx match;
    1275                 :            : 
    1276                 :            :   /* Find the cheapest and *oldest* expression to maximize the chance of
    1277                 :            :      reusing the same pseudo.  */
    1278                 :            : 
    1279                 :          0 :   match_elt = NULL;
    1280                 :          0 :   match = NULL_RTX;
    1281                 :          0 :   for (elt = anchor_elt->first_same_value, idx = 0;
    1282                 :          0 :        elt;
    1283                 :          0 :        elt = elt->next_same_value, idx++)
    1284                 :            :     {
    1285                 :          0 :       if (match_elt && CHEAPER (match_elt, elt))
    1286                 :          0 :         return match;
    1287                 :            : 
    1288                 :          0 :       if (REG_P (elt->exp)
    1289                 :          0 :           || (GET_CODE (elt->exp) == PLUS
    1290                 :          0 :               && REG_P (XEXP (elt->exp, 0))
    1291                 :          0 :               && GET_CODE (XEXP (elt->exp, 1)) == CONST_INT))
    1292                 :            :         {
    1293                 :          0 :           rtx x;
    1294                 :            : 
    1295                 :            :           /* Ignore expressions that are no longer valid.  */
    1296                 :          0 :           if (!REG_P (elt->exp) && !exp_equiv_p (elt->exp, elt->exp, 1, false))
    1297                 :          0 :             continue;
    1298                 :            : 
    1299                 :          0 :           x = plus_constant (GET_MODE (elt->exp), elt->exp, offs);
    1300                 :          0 :           if (REG_P (x)
    1301                 :          0 :               || (GET_CODE (x) == PLUS
    1302                 :          0 :                   && IN_RANGE (INTVAL (XEXP (x, 1)),
    1303                 :            :                                -targetm.const_anchor,
    1304                 :            :                                targetm.const_anchor - 1)))
    1305                 :            :             {
    1306                 :          0 :               match = x;
    1307                 :          0 :               match_elt = elt;
    1308                 :          0 :               *old = idx;
    1309                 :            :             }
    1310                 :            :         }
    1311                 :            :     }
    1312                 :            : 
    1313                 :            :   return match;
    1314                 :            : }
    1315                 :            : 
    1316                 :            : /* Try to express the constant SRC_CONST using a register+offset expression
    1317                 :            :    derived from a constant anchor.  Return it if successful or NULL_RTX,
    1318                 :            :    otherwise.  */
    1319                 :            : 
    1320                 :            : static rtx
    1321                 :          0 : try_const_anchors (rtx src_const, machine_mode mode)
    1322                 :            : {
    1323                 :          0 :   struct table_elt *lower_elt, *upper_elt;
    1324                 :          0 :   HOST_WIDE_INT lower_base, lower_offs, upper_base, upper_offs;
    1325                 :          0 :   rtx lower_anchor_rtx, upper_anchor_rtx;
    1326                 :          0 :   rtx lower_exp = NULL_RTX, upper_exp = NULL_RTX;
    1327                 :          0 :   unsigned lower_old, upper_old;
    1328                 :            : 
    1329                 :            :   /* CONST_INT is used for CC modes, but we should leave those alone.  */
    1330                 :          0 :   if (GET_MODE_CLASS (mode) == MODE_CC)
    1331                 :            :     return NULL_RTX;
    1332                 :            : 
    1333                 :          0 :   gcc_assert (SCALAR_INT_MODE_P (mode));
    1334                 :          0 :   if (!compute_const_anchors (src_const, &lower_base, &lower_offs,
    1335                 :            :                               &upper_base, &upper_offs))
    1336                 :            :     return NULL_RTX;
    1337                 :            : 
    1338                 :          0 :   lower_anchor_rtx = GEN_INT (lower_base);
    1339                 :          0 :   upper_anchor_rtx = GEN_INT (upper_base);
    1340                 :          0 :   lower_elt = lookup (lower_anchor_rtx, HASH (lower_anchor_rtx, mode), mode);
    1341                 :          0 :   upper_elt = lookup (upper_anchor_rtx, HASH (upper_anchor_rtx, mode), mode);
    1342                 :            : 
    1343                 :          0 :   if (lower_elt)
    1344                 :          0 :     lower_exp = find_reg_offset_for_const (lower_elt, lower_offs, &lower_old);
    1345                 :          0 :   if (upper_elt)
    1346                 :          0 :     upper_exp = find_reg_offset_for_const (upper_elt, upper_offs, &upper_old);
    1347                 :            : 
    1348                 :          0 :   if (!lower_exp)
    1349                 :            :     return upper_exp;
    1350                 :          0 :   if (!upper_exp)
    1351                 :            :     return lower_exp;
    1352                 :            : 
    1353                 :            :   /* Return the older expression.  */
    1354                 :          0 :   return (upper_old > lower_old ? upper_exp : lower_exp);
    1355                 :            : }
    1356                 :            : 
    1357                 :            : /* Look in or update the hash table.  */
    1358                 :            : 
    1359                 :            : /* Remove table element ELT from use in the table.
    1360                 :            :    HASH is its hash code, made using the HASH macro.
    1361                 :            :    It's an argument because often that is known in advance
    1362                 :            :    and we save much time not recomputing it.  */
    1363                 :            : 
    1364                 :            : static void
    1365                 :   44397100 : remove_from_table (struct table_elt *elt, unsigned int hash)
    1366                 :            : {
    1367                 :   44397100 :   if (elt == 0)
    1368                 :            :     return;
    1369                 :            : 
    1370                 :            :   /* Mark this element as removed.  See cse_insn.  */
    1371                 :   44397100 :   elt->first_same_value = 0;
    1372                 :            : 
    1373                 :            :   /* Remove the table element from its equivalence class.  */
    1374                 :            : 
    1375                 :   44397100 :   {
    1376                 :   44397100 :     struct table_elt *prev = elt->prev_same_value;
    1377                 :   44397100 :     struct table_elt *next = elt->next_same_value;
    1378                 :            : 
    1379                 :   44397100 :     if (next)
    1380                 :    5605820 :       next->prev_same_value = prev;
    1381                 :            : 
    1382                 :   44397100 :     if (prev)
    1383                 :   28880300 :       prev->next_same_value = next;
    1384                 :            :     else
    1385                 :            :       {
    1386                 :   21252200 :         struct table_elt *newfirst = next;
    1387                 :   21252200 :         while (next)
    1388                 :            :           {
    1389                 :    5735290 :             next->first_same_value = newfirst;
    1390                 :    5735290 :             next = next->next_same_value;
    1391                 :            :           }
    1392                 :            :       }
    1393                 :            :   }
    1394                 :            : 
    1395                 :            :   /* Remove the table element from its hash bucket.  */
    1396                 :            : 
    1397                 :   44397100 :   {
    1398                 :   44397100 :     struct table_elt *prev = elt->prev_same_hash;
    1399                 :   44397100 :     struct table_elt *next = elt->next_same_hash;
    1400                 :            : 
    1401                 :   44397100 :     if (next)
    1402                 :   18811100 :       next->prev_same_hash = prev;
    1403                 :            : 
    1404                 :   44397100 :     if (prev)
    1405                 :    8188850 :       prev->next_same_hash = next;
    1406                 :   36208300 :     else if (table[hash] == elt)
    1407                 :   36208300 :       table[hash] = next;
    1408                 :            :     else
    1409                 :            :       {
    1410                 :            :         /* This entry is not in the proper hash bucket.  This can happen
    1411                 :            :            when two classes were merged by `merge_equiv_classes'.  Search
    1412                 :            :            for the hash bucket that it heads.  This happens only very
    1413                 :            :            rarely, so the cost is acceptable.  */
    1414                 :        363 :         for (hash = 0; hash < HASH_SIZE; hash++)
    1415                 :        352 :           if (table[hash] == elt)
    1416                 :         11 :             table[hash] = next;
    1417                 :            :       }
    1418                 :            :   }
    1419                 :            : 
    1420                 :            :   /* Remove the table element from its related-value circular chain.  */
    1421                 :            : 
    1422                 :   44397100 :   if (elt->related_value != 0 && elt->related_value != elt)
    1423                 :            :     {
    1424                 :            :       struct table_elt *p = elt->related_value;
    1425                 :            : 
    1426                 :     123913 :       while (p->related_value != elt)
    1427                 :            :         p = p->related_value;
    1428                 :      15130 :       p->related_value = elt->related_value;
    1429                 :      15130 :       if (p->related_value == p)
    1430                 :       8789 :         p->related_value = 0;
    1431                 :            :     }
    1432                 :            : 
    1433                 :            :   /* Now add it to the free element chain.  */
    1434                 :   44397100 :   elt->next_same_hash = free_element_chain;
    1435                 :   44397100 :   free_element_chain = elt;
    1436                 :            : }
    1437                 :            : 
    1438                 :            : /* Same as above, but X is a pseudo-register.  */
    1439                 :            : 
    1440                 :            : static void
    1441                 :   55016700 : remove_pseudo_from_table (rtx x, unsigned int hash)
    1442                 :            : {
    1443                 :   58005000 :   struct table_elt *elt;
    1444                 :            : 
    1445                 :            :   /* Because a pseudo-register can be referenced in more than one
    1446                 :            :      mode, we might have to remove more than one table entry.  */
    1447                 :   58005000 :   while ((elt = lookup_for_remove (x, hash, VOIDmode)))
    1448                 :    2988350 :     remove_from_table (elt, hash);
    1449                 :   55016700 : }
    1450                 :            : 
    1451                 :            : /* Look up X in the hash table and return its table element,
    1452                 :            :    or 0 if X is not in the table.
    1453                 :            : 
    1454                 :            :    MODE is the machine-mode of X, or if X is an integer constant
    1455                 :            :    with VOIDmode then MODE is the mode with which X will be used.
    1456                 :            : 
    1457                 :            :    Here we are satisfied to find an expression whose tree structure
    1458                 :            :    looks like X.  */
    1459                 :            : 
    1460                 :            : static struct table_elt *
    1461                 :  314308000 : lookup (rtx x, unsigned int hash, machine_mode mode)
    1462                 :            : {
    1463                 :  314308000 :   struct table_elt *p;
    1464                 :            : 
    1465                 :  688656000 :   for (p = table[hash]; p; p = p->next_same_hash)
    1466                 :  459152000 :     if (mode == p->mode && ((x == p->exp && REG_P (x))
    1467                 :  297593000 :                             || exp_equiv_p (x, p->exp, !REG_P (x), false)))
    1468                 :   84804800 :       return p;
    1469                 :            : 
    1470                 :            :   return 0;
    1471                 :            : }
    1472                 :            : 
    1473                 :            : /* Like `lookup' but don't care whether the table element uses invalid regs.
    1474                 :            :    Also ignore discrepancies in the machine mode of a register.  */
    1475                 :            : 
    1476                 :            : static struct table_elt *
    1477                 :   58005000 : lookup_for_remove (rtx x, unsigned int hash, machine_mode mode)
    1478                 :            : {
    1479                 :   58005000 :   struct table_elt *p;
    1480                 :            : 
    1481                 :   58005000 :   if (REG_P (x))
    1482                 :            :     {
    1483                 :   58005000 :       unsigned int regno = REGNO (x);
    1484                 :            : 
    1485                 :            :       /* Don't check the machine mode when comparing registers;
    1486                 :            :          invalidating (REG:SI 0) also invalidates (REG:DF 0).  */
    1487                 :  104064000 :       for (p = table[hash]; p; p = p->next_same_hash)
    1488                 :   49047400 :         if (REG_P (p->exp)
    1489                 :   49047400 :             && REGNO (p->exp) == regno)
    1490                 :    2988350 :           return p;
    1491                 :            :     }
    1492                 :            :   else
    1493                 :            :     {
    1494                 :          0 :       for (p = table[hash]; p; p = p->next_same_hash)
    1495                 :          0 :         if (mode == p->mode
    1496                 :          0 :             && (x == p->exp || exp_equiv_p (x, p->exp, 0, false)))
    1497                 :          0 :           return p;
    1498                 :            :     }
    1499                 :            : 
    1500                 :            :   return 0;
    1501                 :            : }
    1502                 :            : 
    1503                 :            : /* Look for an expression equivalent to X and with code CODE.
    1504                 :            :    If one is found, return that expression.  */
    1505                 :            : 
    1506                 :            : static rtx
    1507                 :   36222600 : lookup_as_function (rtx x, enum rtx_code code)
    1508                 :            : {
    1509                 :   36222600 :   struct table_elt *p
    1510                 :   60477700 :     = lookup (x, SAFE_HASH (x, VOIDmode), GET_MODE (x));
    1511                 :            : 
    1512                 :   36222600 :   if (p == 0)
    1513                 :            :     return 0;
    1514                 :            : 
    1515                 :   23673400 :   for (p = p->first_same_value; p; p = p->next_same_value)
    1516                 :   16577000 :     if (GET_CODE (p->exp) == code
    1517                 :            :         /* Make sure this is a valid entry in the table.  */
    1518                 :   16577000 :         && exp_equiv_p (p->exp, p->exp, 1, false))
    1519                 :     622527 :       return p->exp;
    1520                 :            : 
    1521                 :            :   return 0;
    1522                 :            : }
    1523                 :            : 
    1524                 :            : /* Insert X in the hash table, assuming HASH is its hash code and
    1525                 :            :    CLASSP is an element of the class it should go in (or 0 if a new
    1526                 :            :    class should be made).  COST is the code of X and reg_cost is the
    1527                 :            :    cost of registers in X.  It is inserted at the proper position to
    1528                 :            :    keep the class in the order cheapest first.
    1529                 :            : 
    1530                 :            :    MODE is the machine-mode of X, or if X is an integer constant
    1531                 :            :    with VOIDmode then MODE is the mode with which X will be used.
    1532                 :            : 
    1533                 :            :    For elements of equal cheapness, the most recent one
    1534                 :            :    goes in front, except that the first element in the list
    1535                 :            :    remains first unless a cheaper element is added.  The order of
    1536                 :            :    pseudo-registers does not matter, as canon_reg will be called to
    1537                 :            :    find the cheapest when a register is retrieved from the table.
    1538                 :            : 
    1539                 :            :    The in_memory field in the hash table element is set to 0.
    1540                 :            :    The caller must set it nonzero if appropriate.
    1541                 :            : 
    1542                 :            :    You should call insert_regs (X, CLASSP, MODIFY) before calling here,
    1543                 :            :    and if insert_regs returns a nonzero value
    1544                 :            :    you must then recompute its hash code before calling here.
    1545                 :            : 
    1546                 :            :    If necessary, update table showing constant values of quantities.  */
    1547                 :            : 
    1548                 :            : static struct table_elt *
    1549                 :  164186000 : insert_with_costs (rtx x, struct table_elt *classp, unsigned int hash,
    1550                 :            :                    machine_mode mode, int cost, int reg_cost)
    1551                 :            : {
    1552                 :  164186000 :   struct table_elt *elt;
    1553                 :            : 
    1554                 :            :   /* If X is a register and we haven't made a quantity for it,
    1555                 :            :      something is wrong.  */
    1556                 :  164186000 :   gcc_assert (!REG_P (x) || REGNO_QTY_VALID_P (REGNO (x)));
    1557                 :            : 
    1558                 :            :   /* If X is a hard register, show it is being put in the table.  */
    1559                 :  164186000 :   if (REG_P (x) && REGNO (x) < FIRST_PSEUDO_REGISTER)
    1560                 :   13156800 :     add_to_hard_reg_set (&hard_regs_in_table, GET_MODE (x), REGNO (x));
    1561                 :            : 
    1562                 :            :   /* Put an element for X into the right hash bucket.  */
    1563                 :            : 
    1564                 :  164186000 :   elt = free_element_chain;
    1565                 :  164186000 :   if (elt)
    1566                 :  160606000 :     free_element_chain = elt->next_same_hash;
    1567                 :            :   else
    1568                 :    3580590 :     elt = XNEW (struct table_elt);
    1569                 :            : 
    1570                 :  164186000 :   elt->exp = x;
    1571                 :  164186000 :   elt->canon_exp = NULL_RTX;
    1572                 :  164186000 :   elt->cost = cost;
    1573                 :  164186000 :   elt->regcost = reg_cost;
    1574                 :  164186000 :   elt->next_same_value = 0;
    1575                 :  164186000 :   elt->prev_same_value = 0;
    1576                 :  164186000 :   elt->next_same_hash = table[hash];
    1577                 :  164186000 :   elt->prev_same_hash = 0;
    1578                 :  164186000 :   elt->related_value = 0;
    1579                 :  164186000 :   elt->in_memory = 0;
    1580                 :  164186000 :   elt->mode = mode;
    1581                 :  164186000 :   elt->is_const = (CONSTANT_P (x) || fixed_base_plus_p (x));
    1582                 :            : 
    1583                 :  164186000 :   if (table[hash])
    1584                 :   60848300 :     table[hash]->prev_same_hash = elt;
    1585                 :  164186000 :   table[hash] = elt;
    1586                 :            : 
    1587                 :            :   /* Put it into the proper value-class.  */
    1588                 :  164186000 :   if (classp)
    1589                 :            :     {
    1590                 :   79757800 :       classp = classp->first_same_value;
    1591                 :  138005000 :       if (CHEAPER (elt, classp))
    1592                 :            :         /* Insert at the head of the class.  */
    1593                 :            :         {
    1594                 :   35482400 :           struct table_elt *p;
    1595                 :   35482400 :           elt->next_same_value = classp;
    1596                 :   35482400 :           classp->prev_same_value = elt;
    1597                 :   35482400 :           elt->first_same_value = elt;
    1598                 :            : 
    1599                 :   74506700 :           for (p = classp; p; p = p->next_same_value)
    1600                 :   39024300 :             p->first_same_value = elt;
    1601                 :            :         }
    1602                 :            :       else
    1603                 :            :         {
    1604                 :            :           /* Insert not at head of the class.  */
    1605                 :            :           /* Put it after the last element cheaper than X.  */
    1606                 :            :           struct table_elt *p, *next;
    1607                 :            : 
    1608                 :            :           for (p = classp;
    1609                 :   61837800 :                (next = p->next_same_value) && CHEAPER (next, elt);
    1610                 :            :                p = next)
    1611                 :            :             ;
    1612                 :            : 
    1613                 :            :           /* Put it after P and before NEXT.  */
    1614                 :   44275500 :           elt->next_same_value = next;
    1615                 :   44275500 :           if (next)
    1616                 :   12101300 :             next->prev_same_value = elt;
    1617                 :            : 
    1618                 :   44275500 :           elt->prev_same_value = p;
    1619                 :   44275500 :           p->next_same_value = elt;
    1620                 :   44275500 :           elt->first_same_value = classp;
    1621                 :            :         }
    1622                 :            :     }
    1623                 :            :   else
    1624                 :   84428600 :     elt->first_same_value = elt;
    1625                 :            : 
    1626                 :            :   /* If this is a constant being set equivalent to a register or a register
    1627                 :            :      being set equivalent to a constant, note the constant equivalence.
    1628                 :            : 
    1629                 :            :      If this is a constant, it cannot be equivalent to a different constant,
    1630                 :            :      and a constant is the only thing that can be cheaper than a register.  So
    1631                 :            :      we know the register is the head of the class (before the constant was
    1632                 :            :      inserted).
    1633                 :            : 
    1634                 :            :      If this is a register that is not already known equivalent to a
    1635                 :            :      constant, we must check the entire class.
    1636                 :            : 
    1637                 :            :      If this is a register that is already known equivalent to an insn,
    1638                 :            :      update the qtys `const_insn' to show that `this_insn' is the latest
    1639                 :            :      insn making that quantity equivalent to the constant.  */
    1640                 :            : 
    1641                 :  164186000 :   if (elt->is_const && classp && REG_P (classp->exp)
    1642                 :    2007900 :       && !REG_P (x))
    1643                 :            :     {
    1644                 :    2005480 :       int exp_q = REG_QTY (REGNO (classp->exp));
    1645                 :    2005480 :       struct qty_table_elem *exp_ent = &qty_table[exp_q];
    1646                 :            : 
    1647                 :    2005480 :       exp_ent->const_rtx = gen_lowpart (exp_ent->mode, x);
    1648                 :    2005480 :       exp_ent->const_insn = this_insn;
    1649                 :            :     }
    1650                 :            : 
    1651                 :  162181000 :   else if (REG_P (x)
    1652                 :   66178600 :            && classp
    1653                 :   56517200 :            && ! qty_table[REG_QTY (REGNO (x))].const_rtx
    1654                 :  215668000 :            && ! elt->is_const)
    1655                 :            :     {
    1656                 :            :       struct table_elt *p;
    1657                 :            : 
    1658                 :  123298000 :       for (p = classp; p != 0; p = p->next_same_value)
    1659                 :            :         {
    1660                 :   78033500 :           if (p->is_const && !REG_P (p->exp))
    1661                 :            :             {
    1662                 :    8220200 :               int x_q = REG_QTY (REGNO (x));
    1663                 :    8220200 :               struct qty_table_elem *x_ent = &qty_table[x_q];
    1664                 :            : 
    1665                 :    8220200 :               x_ent->const_rtx
    1666                 :    8220200 :                 = gen_lowpart (GET_MODE (x), p->exp);
    1667                 :    8220200 :               x_ent->const_insn = this_insn;
    1668                 :    8220200 :               break;
    1669                 :            :             }
    1670                 :            :         }
    1671                 :            :     }
    1672                 :            : 
    1673                 :  108696000 :   else if (REG_P (x)
    1674                 :   12693900 :            && qty_table[REG_QTY (REGNO (x))].const_rtx
    1675                 :  111726000 :            && GET_MODE (x) == qty_table[REG_QTY (REGNO (x))].mode)
    1676                 :    3030070 :     qty_table[REG_QTY (REGNO (x))].const_insn = this_insn;
    1677                 :            : 
    1678                 :            :   /* If this is a constant with symbolic value,
    1679                 :            :      and it has a term with an explicit integer value,
    1680                 :            :      link it up with related expressions.  */
    1681                 :  164186000 :   if (GET_CODE (x) == CONST)
    1682                 :            :     {
    1683                 :     493297 :       rtx subexp = get_related_value (x);
    1684                 :     493297 :       unsigned subhash;
    1685                 :     493297 :       struct table_elt *subelt, *subelt_prev;
    1686                 :            : 
    1687                 :     493297 :       if (subexp != 0)
    1688                 :            :         {
    1689                 :            :           /* Get the integer-free subexpression in the hash table.  */
    1690                 :     965062 :           subhash = SAFE_HASH (subexp, mode);
    1691                 :     482531 :           subelt = lookup (subexp, subhash, mode);
    1692                 :     482531 :           if (subelt == 0)
    1693                 :     222150 :             subelt = insert (subexp, NULL, subhash, mode);
    1694                 :            :           /* Initialize SUBELT's circular chain if it has none.  */
    1695                 :     482531 :           if (subelt->related_value == 0)
    1696                 :     289385 :             subelt->related_value = subelt;
    1697                 :            :           /* Find the element in the circular chain that precedes SUBELT.  */
    1698                 :     482531 :           subelt_prev = subelt;
    1699                 :    1726370 :           while (subelt_prev->related_value != subelt)
    1700                 :            :             subelt_prev = subelt_prev->related_value;
    1701                 :            :           /* Put new ELT into SUBELT's circular chain just before SUBELT.
    1702                 :            :              This way the element that follows SUBELT is the oldest one.  */
    1703                 :     482531 :           elt->related_value = subelt_prev->related_value;
    1704                 :     482531 :           subelt_prev->related_value = elt;
    1705                 :            :         }
    1706                 :            :     }
    1707                 :            : 
    1708                 :  164186000 :   return elt;
    1709                 :            : }
    1710                 :            : 
    1711                 :            : /* Wrap insert_with_costs by passing the default costs.  */
    1712                 :            : 
    1713                 :            : static struct table_elt *
    1714                 :  164186000 : insert (rtx x, struct table_elt *classp, unsigned int hash,
    1715                 :            :         machine_mode mode)
    1716                 :            : {
    1717                 :  328373000 :   return insert_with_costs (x, classp, hash, mode,
    1718                 :  164186000 :                             COST (x, mode), approx_reg_cost (x));
    1719                 :            : }
    1720                 :            : 
    1721                 :            : 
    1722                 :            : /* Given two equivalence classes, CLASS1 and CLASS2, put all the entries from
    1723                 :            :    CLASS2 into CLASS1.  This is done when we have reached an insn which makes
    1724                 :            :    the two classes equivalent.
    1725                 :            : 
    1726                 :            :    CLASS1 will be the surviving class; CLASS2 should not be used after this
    1727                 :            :    call.
    1728                 :            : 
    1729                 :            :    Any invalid entries in CLASS2 will not be copied.  */
    1730                 :            : 
    1731                 :            : static void
    1732                 :    3243560 : merge_equiv_classes (struct table_elt *class1, struct table_elt *class2)
    1733                 :            : {
    1734                 :    3243560 :   struct table_elt *elt, *next, *new_elt;
    1735                 :            : 
    1736                 :            :   /* Ensure we start with the head of the classes.  */
    1737                 :    3243560 :   class1 = class1->first_same_value;
    1738                 :    3243560 :   class2 = class2->first_same_value;
    1739                 :            : 
    1740                 :            :   /* If they were already equal, forget it.  */
    1741                 :    3243560 :   if (class1 == class2)
    1742                 :            :     return;
    1743                 :            : 
    1744                 :    7915480 :   for (elt = class2; elt; elt = next)
    1745                 :            :     {
    1746                 :    4671920 :       unsigned int hash;
    1747                 :    4671920 :       rtx exp = elt->exp;
    1748                 :    4671920 :       machine_mode mode = elt->mode;
    1749                 :            : 
    1750                 :    4671920 :       next = elt->next_same_value;
    1751                 :            : 
    1752                 :            :       /* Remove old entry, make a new one in CLASS1's class.
    1753                 :            :          Don't do this for invalid entries as we cannot find their
    1754                 :            :          hash code (it also isn't necessary).  */
    1755                 :    4671920 :       if (REG_P (exp) || exp_equiv_p (exp, exp, 1, false))
    1756                 :            :         {
    1757                 :    4671860 :           bool need_rehash = false;
    1758                 :            : 
    1759                 :    4671860 :           hash_arg_in_memory = 0;
    1760                 :    8016140 :           hash = HASH (exp, mode);
    1761                 :            : 
    1762                 :    4671860 :           if (REG_P (exp))
    1763                 :            :             {
    1764                 :    1328410 :               need_rehash = REGNO_QTY_VALID_P (REGNO (exp));
    1765                 :    1328410 :               delete_reg_equiv (REGNO (exp));
    1766                 :            :             }
    1767                 :            : 
    1768                 :    4671860 :           if (REG_P (exp) && REGNO (exp) >= FIRST_PSEUDO_REGISTER)
    1769                 :    1327590 :             remove_pseudo_from_table (exp, hash);
    1770                 :            :           else
    1771                 :    3344270 :             remove_from_table (elt, hash);
    1772                 :            : 
    1773                 :    4671860 :           if (insert_regs (exp, class1, 0) || need_rehash)
    1774                 :            :             {
    1775                 :    1328410 :               rehash_using_reg (exp);
    1776                 :    1329240 :               hash = HASH (exp, mode);
    1777                 :            :             }
    1778                 :    4671860 :           new_elt = insert (exp, class1, hash, mode);
    1779                 :    4671860 :           new_elt->in_memory = hash_arg_in_memory;
    1780                 :    4671860 :           if (GET_CODE (exp) == ASM_OPERANDS && elt->cost == MAX_COST)
    1781                 :          0 :             new_elt->cost = MAX_COST;
    1782                 :            :         }
    1783                 :            :     }
    1784                 :            : }
    1785                 :            : 
    1786                 :            : /* Flush the entire hash table.  */
    1787                 :            : 
    1788                 :            : static void
    1789                 :       3131 : flush_hash_table (void)
    1790                 :            : {
    1791                 :       3131 :   int i;
    1792                 :       3131 :   struct table_elt *p;
    1793                 :            : 
    1794                 :     103323 :   for (i = 0; i < HASH_SIZE; i++)
    1795                 :     905231 :     for (p = table[i]; p; p = table[i])
    1796                 :            :       {
    1797                 :            :         /* Note that invalidate can remove elements
    1798                 :            :            after P in the current hash chain.  */
    1799                 :     805039 :         if (REG_P (p->exp))
    1800                 :     229661 :           invalidate (p->exp, VOIDmode);
    1801                 :            :         else
    1802                 :     575378 :           remove_from_table (p, i);
    1803                 :            :       }
    1804                 :       3131 : }
    1805                 :            : 
    1806                 :            : /* Check whether an anti dependence exists between X and EXP.  MODE and
    1807                 :            :    ADDR are as for canon_anti_dependence.  */
    1808                 :            : 
    1809                 :            : static bool
    1810                 :  266619000 : check_dependence (const_rtx x, rtx exp, machine_mode mode, rtx addr)
    1811                 :            : {
    1812                 :  266619000 :   subrtx_iterator::array_type array;
    1813                 : 1296640000 :   FOR_EACH_SUBRTX (iter, array, x, NONCONST)
    1814                 :            :     {
    1815                 : 1035960000 :       const_rtx x = *iter;
    1816                 : 1035960000 :       if (MEM_P (x) && canon_anti_dependence (x, true, exp, mode, addr))
    1817                 :    5940180 :         return true;
    1818                 :            :     }
    1819                 :  260679000 :   return false;
    1820                 :            : }
    1821                 :            : 
    1822                 :            : /* Remove from the hash table, or mark as invalid, all expressions whose
    1823                 :            :    values could be altered by storing in register X.  */
    1824                 :            : 
    1825                 :            : static void
    1826                 :  136337000 : invalidate_reg (rtx x)
    1827                 :            : {
    1828                 :  136337000 :   gcc_assert (GET_CODE (x) == REG);
    1829                 :            : 
    1830                 :            :   /* If X is a register, dependencies on its contents are recorded
    1831                 :            :      through the qty number mechanism.  Just change the qty number of
    1832                 :            :      the register, mark it as invalid for expressions that refer to it,
    1833                 :            :      and remove it itself.  */
    1834                 :  136337000 :   unsigned int regno = REGNO (x);
    1835                 :  219026000 :   unsigned int hash = HASH (x, GET_MODE (x));
    1836                 :            : 
    1837                 :            :   /* Remove REGNO from any quantity list it might be on and indicate
    1838                 :            :      that its value might have changed.  If it is a pseudo, remove its
    1839                 :            :      entry from the hash table.
    1840                 :            : 
    1841                 :            :      For a hard register, we do the first two actions above for any
    1842                 :            :      additional hard registers corresponding to X.  Then, if any of these
    1843                 :            :      registers are in the table, we must remove any REG entries that
    1844                 :            :      overlap these registers.  */
    1845                 :            : 
    1846                 :  136337000 :   delete_reg_equiv (regno);
    1847                 :  136337000 :   REG_TICK (regno)++;
    1848                 :  136337000 :   SUBREG_TICKED (regno) = -1;
    1849                 :            : 
    1850                 :  136337000 :   if (regno >= FIRST_PSEUDO_REGISTER)
    1851                 :   53689100 :     remove_pseudo_from_table (x, hash);
    1852                 :            :   else
    1853                 :            :     {
    1854                 :   82647900 :       HOST_WIDE_INT in_table = TEST_HARD_REG_BIT (hard_regs_in_table, regno);
    1855                 :   82647900 :       unsigned int endregno = END_REGNO (x);
    1856                 :   82647900 :       unsigned int rn;
    1857                 :   82647900 :       struct table_elt *p, *next;
    1858                 :            : 
    1859                 :   82647900 :       CLEAR_HARD_REG_BIT (hard_regs_in_table, regno);
    1860                 :            : 
    1861                 :   83026300 :       for (rn = regno + 1; rn < endregno; rn++)
    1862                 :            :         {
    1863                 :     378420 :           in_table |= TEST_HARD_REG_BIT (hard_regs_in_table, rn);
    1864                 :     378420 :           CLEAR_HARD_REG_BIT (hard_regs_in_table, rn);
    1865                 :     378420 :           delete_reg_equiv (rn);
    1866                 :     378420 :           REG_TICK (rn)++;
    1867                 :     378420 :           SUBREG_TICKED (rn) = -1;
    1868                 :            :         }
    1869                 :            : 
    1870                 :   82647900 :       if (in_table)
    1871                 :  232965000 :         for (hash = 0; hash < HASH_SIZE; hash++)
    1872                 :  363541000 :           for (p = table[hash]; p; p = next)
    1873                 :            :             {
    1874                 :  137635000 :               next = p->next_same_hash;
    1875                 :            : 
    1876                 :  137635000 :               if (!REG_P (p->exp) || REGNO (p->exp) >= FIRST_PSEUDO_REGISTER)
    1877                 :  131255000 :                 continue;
    1878                 :            : 
    1879                 :    6380100 :               unsigned int tregno = REGNO (p->exp);
    1880                 :    6380100 :               unsigned int tendregno = END_REGNO (p->exp);
    1881                 :    6380100 :               if (tendregno > regno && tregno < endregno)
    1882                 :    6346200 :                 remove_from_table (p, hash);
    1883                 :            :             }
    1884                 :            :     }
    1885                 :  136337000 : }
    1886                 :            : 
    1887                 :            : /* Remove from the hash table, or mark as invalid, all expressions whose
    1888                 :            :    values could be altered by storing in X.  X is a register, a subreg, or
    1889                 :            :    a memory reference with nonvarying address (because, when a memory
    1890                 :            :    reference with a varying address is stored in, all memory references are
    1891                 :            :    removed by invalidate_memory so specific invalidation is superfluous).
    1892                 :            :    FULL_MODE, if not VOIDmode, indicates that this much should be
    1893                 :            :    invalidated instead of just the amount indicated by the mode of X.  This
    1894                 :            :    is only used for bitfield stores into memory.
    1895                 :            : 
    1896                 :            :    A nonvarying address may be just a register or just a symbol reference,
    1897                 :            :    or it may be either of those plus a numeric offset.  */
    1898                 :            : 
    1899                 :            : static void
    1900                 :  158903000 : invalidate (rtx x, machine_mode full_mode)
    1901                 :            : {
    1902                 :  159738000 :   int i;
    1903                 :  159738000 :   struct table_elt *p;
    1904                 :  159738000 :   rtx addr;
    1905                 :            : 
    1906                 :  159738000 :   switch (GET_CODE (x))
    1907                 :            :     {
    1908                 :  136337000 :     case REG:
    1909                 :  136337000 :       invalidate_reg (x);
    1910                 :  136337000 :       return;
    1911                 :            : 
    1912                 :     798404 :     case SUBREG:
    1913                 :     798404 :       invalidate (SUBREG_REG (x), VOIDmode);
    1914                 :     798404 :       return;
    1915                 :            : 
    1916                 :      20056 :     case PARALLEL:
    1917                 :      56384 :       for (i = XVECLEN (x, 0) - 1; i >= 0; --i)
    1918                 :      36328 :         invalidate (XVECEXP (x, 0, i), VOIDmode);
    1919                 :            :       return;
    1920                 :            : 
    1921                 :      36328 :     case EXPR_LIST:
    1922                 :            :       /* This is part of a disjoint return value; extract the location in
    1923                 :            :          question ignoring the offset.  */
    1924                 :      36328 :       invalidate (XEXP (x, 0), VOIDmode);
    1925                 :      36328 :       return;
    1926                 :            : 
    1927                 :   22546000 :     case MEM:
    1928                 :   22546000 :       addr = canon_rtx (get_addr (XEXP (x, 0)));
    1929                 :            :       /* Calculate the canonical version of X here so that
    1930                 :            :          true_dependence doesn't generate new RTL for X on each call.  */
    1931                 :   22546000 :       x = canon_rtx (x);
    1932                 :            : 
    1933                 :            :       /* Remove all hash table elements that refer to overlapping pieces of
    1934                 :            :          memory.  */
    1935                 :   22546000 :       if (full_mode == VOIDmode)
    1936                 :   22545600 :         full_mode = GET_MODE (x);
    1937                 :            : 
    1938                 :  744018000 :       for (i = 0; i < HASH_SIZE; i++)
    1939                 :            :         {
    1940                 :  721472000 :           struct table_elt *next;
    1941                 :            : 
    1942                 : 1703720000 :           for (p = table[i]; p; p = next)
    1943                 :            :             {
    1944                 :  982253000 :               next = p->next_same_hash;
    1945                 :  982253000 :               if (p->in_memory)
    1946                 :            :                 {
    1947                 :            :                   /* Just canonicalize the expression once;
    1948                 :            :                      otherwise each time we call invalidate
    1949                 :            :                      true_dependence will canonicalize the
    1950                 :            :                      expression again.  */
    1951                 :  266619000 :                   if (!p->canon_exp)
    1952                 :   19858900 :                     p->canon_exp = canon_rtx (p->exp);
    1953                 :  266619000 :                   if (check_dependence (p->canon_exp, x, full_mode, addr))
    1954                 :    5940180 :                     remove_from_table (p, i);
    1955                 :            :                 }
    1956                 :            :             }
    1957                 :            :         }
    1958                 :            :       return;
    1959                 :            : 
    1960                 :          0 :     default:
    1961                 :          0 :       gcc_unreachable ();
    1962                 :            :     }
    1963                 :            : }
    1964                 :            : 
    1965                 :            : /* Invalidate DEST.  Used when DEST is not going to be added
    1966                 :            :    into the hash table for some reason, e.g. do_not_record
    1967                 :            :    flagged on it.  */
    1968                 :            : 
    1969                 :            : static void
    1970                 :   35373200 : invalidate_dest (rtx dest)
    1971                 :            : {
    1972                 :   35373200 :   if (REG_P (dest)
    1973                 :   35373200 :       || GET_CODE (dest) == SUBREG
    1974                 :   18644400 :       || MEM_P (dest))
    1975                 :   23291900 :     invalidate (dest, VOIDmode);
    1976                 :   12081400 :   else if (GET_CODE (dest) == STRICT_LOW_PART
    1977                 :   12081400 :            || GET_CODE (dest) == ZERO_EXTRACT)
    1978                 :        410 :     invalidate (XEXP (dest, 0), GET_MODE (dest));
    1979                 :   35373200 : }
    1980                 :            : 
    1981                 :            : /* Remove all expressions that refer to register REGNO,
    1982                 :            :    since they are already invalid, and we are about to
    1983                 :            :    mark that register valid again and don't want the old
    1984                 :            :    expressions to reappear as valid.  */
    1985                 :            : 
    1986                 :            : static void
    1987                 :    8696200 : remove_invalid_refs (unsigned int regno)
    1988                 :            : {
    1989                 :    8696200 :   unsigned int i;
    1990                 :    8696200 :   struct table_elt *p, *next;
    1991                 :            : 
    1992                 :  286975000 :   for (i = 0; i < HASH_SIZE; i++)
    1993                 :  448370000 :     for (p = table[i]; p; p = next)
    1994                 :            :       {
    1995                 :  170091000 :         next = p->next_same_hash;
    1996                 :  170091000 :         if (!REG_P (p->exp) && refers_to_regno_p (regno, p->exp))
    1997                 :   10444700 :           remove_from_table (p, i);
    1998                 :            :       }
    1999                 :    8696200 : }
    2000                 :            : 
    2001                 :            : /* Likewise for a subreg with subreg_reg REGNO, subreg_byte OFFSET,
    2002                 :            :    and mode MODE.  */
    2003                 :            : static void
    2004                 :          0 : remove_invalid_subreg_refs (unsigned int regno, poly_uint64 offset,
    2005                 :            :                             machine_mode mode)
    2006                 :            : {
    2007                 :          0 :   unsigned int i;
    2008                 :          0 :   struct table_elt *p, *next;
    2009                 :            : 
    2010                 :          0 :   for (i = 0; i < HASH_SIZE; i++)
    2011                 :          0 :     for (p = table[i]; p; p = next)
    2012                 :            :       {
    2013                 :          0 :         rtx exp = p->exp;
    2014                 :          0 :         next = p->next_same_hash;
    2015                 :            : 
    2016                 :          0 :         if (!REG_P (exp)
    2017                 :          0 :             && (GET_CODE (exp) != SUBREG
    2018                 :          0 :                 || !REG_P (SUBREG_REG (exp))
    2019                 :          0 :                 || REGNO (SUBREG_REG (exp)) != regno
    2020                 :          0 :                 || ranges_maybe_overlap_p (SUBREG_BYTE (exp),
    2021                 :          0 :                                            GET_MODE_SIZE (GET_MODE (exp)),
    2022                 :          0 :                                            offset, GET_MODE_SIZE (mode)))
    2023                 :          0 :             && refers_to_regno_p (regno, p->exp))
    2024                 :          0 :           remove_from_table (p, i);
    2025                 :            :       }
    2026                 :          0 : }
    2027                 :            : 
    2028                 :            : /* Recompute the hash codes of any valid entries in the hash table that
    2029                 :            :    reference X, if X is a register, or SUBREG_REG (X) if X is a SUBREG.
    2030                 :            : 
    2031                 :            :    This is called when we make a jump equivalence.  */
    2032                 :            : 
    2033                 :            : static void
    2034                 :   75697000 : rehash_using_reg (rtx x)
    2035                 :            : {
    2036                 :   75697000 :   unsigned int i;
    2037                 :   75697000 :   struct table_elt *p, *next;
    2038                 :   75697000 :   unsigned hash;
    2039                 :            : 
    2040                 :   75697000 :   if (GET_CODE (x) == SUBREG)
    2041                 :    1112120 :     x = SUBREG_REG (x);
    2042                 :            : 
    2043                 :            :   /* If X is not a register or if the register is known not to be in any
    2044                 :            :      valid entries in the table, we have no work to do.  */
    2045                 :            : 
    2046                 :   75697000 :   if (!REG_P (x)
    2047                 :   70164300 :       || REG_IN_TABLE (REGNO (x)) < 0
    2048                 :   78513800 :       || REG_IN_TABLE (REGNO (x)) != REG_TICK (REGNO (x)))
    2049                 :   72888700 :     return;
    2050                 :            : 
    2051                 :            :   /* Scan all hash chains looking for valid entries that mention X.
    2052                 :            :      If we find one and it is in the wrong hash chain, move it.  */
    2053                 :            : 
    2054                 :   92673900 :   for (i = 0; i < HASH_SIZE; i++)
    2055                 :  155871000 :     for (p = table[i]; p; p = next)
    2056                 :            :       {
    2057                 :   66005100 :         next = p->next_same_hash;
    2058                 :   66005100 :         if (reg_mentioned_p (x, p->exp)
    2059                 :    3317980 :             && exp_equiv_p (p->exp, p->exp, 1, false)
    2060                 :   72640500 :             && i != (hash = SAFE_HASH (p->exp, p->mode)))
    2061                 :            :           {
    2062                 :    2085650 :             if (p->next_same_hash)
    2063                 :     684840 :               p->next_same_hash->prev_same_hash = p->prev_same_hash;
    2064                 :            : 
    2065                 :    2085650 :             if (p->prev_same_hash)
    2066                 :     413893 :               p->prev_same_hash->next_same_hash = p->next_same_hash;
    2067                 :            :             else
    2068                 :    1671750 :               table[i] = p->next_same_hash;
    2069                 :            : 
    2070                 :    2085650 :             p->next_same_hash = table[hash];
    2071                 :    2085650 :             p->prev_same_hash = 0;
    2072                 :    2085650 :             if (table[hash])
    2073                 :    1126340 :               table[hash]->prev_same_hash = p;
    2074                 :    2085650 :             table[hash] = p;
    2075                 :            :           }
    2076                 :            :       }
    2077                 :            : }
    2078                 :            : 
    2079                 :            : /* Remove from the hash table any expression that is a call-clobbered
    2080                 :            :    register in INSN.  Also update their TICK values.  */
    2081                 :            : 
    2082                 :            : static void
    2083                 :   10091300 : invalidate_for_call (rtx_insn *insn)
    2084                 :            : {
    2085                 :   10091300 :   unsigned int regno;
    2086                 :   10091300 :   unsigned hash;
    2087                 :   10091300 :   struct table_elt *p, *next;
    2088                 :   10091300 :   int in_table = 0;
    2089                 :   10091300 :   hard_reg_set_iterator hrsi;
    2090                 :            : 
    2091                 :            :   /* Go through all the hard registers.  For each that might be clobbered
    2092                 :            :      in call insn INSN, remove the register from quantity chains and update
    2093                 :            :      reg_tick if defined.  Also see if any of these registers is currently
    2094                 :            :      in the table.
    2095                 :            : 
    2096                 :            :      ??? We could be more precise for partially-clobbered registers,
    2097                 :            :      and only invalidate values that actually occupy the clobbered part
    2098                 :            :      of the registers.  It doesn't seem worth the effort though, since
    2099                 :            :      we shouldn't see this situation much before RA.  Whatever choice
    2100                 :            :      we make here has to be consistent with the table walk below,
    2101                 :            :      so any change to this test will require a change there too.  */
    2102                 :   10091300 :   HARD_REG_SET callee_clobbers
    2103                 :   10091300 :     = insn_callee_abi (insn).full_and_partial_reg_clobbers ();
    2104                 :  674294000 :   EXECUTE_IF_SET_IN_HARD_REG_SET (callee_clobbers, 0, regno, hrsi)
    2105                 :            :     {
    2106                 :  664203000 :       delete_reg_equiv (regno);
    2107                 :  664203000 :       if (REG_TICK (regno) >= 0)
    2108                 :            :         {
    2109                 :  664203000 :           REG_TICK (regno)++;
    2110                 :  664203000 :           SUBREG_TICKED (regno) = -1;
    2111                 :            :         }
    2112                 :  664203000 :       in_table |= (TEST_HARD_REG_BIT (hard_regs_in_table, regno) != 0);
    2113                 :            :     }
    2114                 :            : 
    2115                 :            :   /* In the case where we have no call-clobbered hard registers in the
    2116                 :            :      table, we are done.  Otherwise, scan the table and remove any
    2117                 :            :      entry that overlaps a call-clobbered register.  */
    2118                 :            : 
    2119                 :   10091300 :   if (in_table)
    2120                 :   63758400 :     for (hash = 0; hash < HASH_SIZE; hash++)
    2121                 :   95302600 :       for (p = table[hash]; p; p = next)
    2122                 :            :         {
    2123                 :   33476300 :           next = p->next_same_hash;
    2124                 :            : 
    2125                 :   65336800 :           if (!REG_P (p->exp)
    2126                 :   33476300 :               || REGNO (p->exp) >= FIRST_PSEUDO_REGISTER)
    2127                 :   31860500 :             continue;
    2128                 :            : 
    2129                 :            :           /* This must use the same test as above rather than the
    2130                 :            :              more accurate clobbers_reg_p.  */
    2131                 :    1624320 :           if (overlaps_hard_reg_set_p (callee_clobbers, GET_MODE (p->exp),
    2132                 :            :                                        REGNO (p->exp)))
    2133                 :    1607380 :             remove_from_table (p, hash);
    2134                 :            :         }
    2135                 :   10091300 : }
    2136                 :            : 
    2137                 :            : /* Given an expression X of type CONST,
    2138                 :            :    and ELT which is its table entry (or 0 if it
    2139                 :            :    is not in the hash table),
    2140                 :            :    return an alternate expression for X as a register plus integer.
    2141                 :            :    If none can be found, return 0.  */
    2142                 :            : 
    2143                 :            : static rtx
    2144                 :     484037 : use_related_value (rtx x, struct table_elt *elt)
    2145                 :            : {
    2146                 :     484037 :   struct table_elt *relt = 0;
    2147                 :     484037 :   struct table_elt *p, *q;
    2148                 :     484037 :   HOST_WIDE_INT offset;
    2149                 :            : 
    2150                 :            :   /* First, is there anything related known?
    2151                 :            :      If we have a table element, we can tell from that.
    2152                 :            :      Otherwise, must look it up.  */
    2153                 :            : 
    2154                 :     484037 :   if (elt != 0 && elt->related_value != 0)
    2155                 :            :     relt = elt;
    2156                 :     374174 :   else if (elt == 0 && GET_CODE (x) == CONST)
    2157                 :            :     {
    2158                 :     338813 :       rtx subexp = get_related_value (x);
    2159                 :     338813 :       if (subexp != 0)
    2160                 :     328047 :         relt = lookup (subexp,
    2161                 :     328047 :                        SAFE_HASH (subexp, GET_MODE (subexp)),
    2162                 :     328047 :                        GET_MODE (subexp));
    2163                 :            :     }
    2164                 :            : 
    2165                 :     437910 :   if (relt == 0)
    2166                 :     267766 :     return 0;
    2167                 :            : 
    2168                 :            :   /* Search all related table entries for one that has an
    2169                 :            :      equivalent register.  */
    2170                 :            : 
    2171                 :            :   p = relt;
    2172                 :     692332 :   while (1)
    2173                 :            :     {
    2174                 :            :       /* This loop is strange in that it is executed in two different cases.
    2175                 :            :          The first is when X is already in the table.  Then it is searching
    2176                 :            :          the RELATED_VALUE list of X's class (RELT).  The second case is when
    2177                 :            :          X is not in the table.  Then RELT points to a class for the related
    2178                 :            :          value.
    2179                 :            : 
    2180                 :            :          Ensure that, whatever case we are in, that we ignore classes that have
    2181                 :            :          the same value as X.  */
    2182                 :            : 
    2183                 :     692332 :       if (rtx_equal_p (x, p->exp))
    2184                 :            :         q = 0;
    2185                 :            :       else
    2186                 :    1399690 :         for (q = p->first_same_value; q; q = q->next_same_value)
    2187                 :     948335 :           if (REG_P (q->exp))
    2188                 :            :             break;
    2189                 :            : 
    2190                 :     582469 :       if (q)
    2191                 :            :         break;
    2192                 :            : 
    2193                 :     561218 :       p = p->related_value;
    2194                 :            : 
    2195                 :            :       /* We went all the way around, so there is nothing to be found.
    2196                 :            :          Alternatively, perhaps RELT was in the table for some other reason
    2197                 :            :          and it has no related values recorded.  */
    2198                 :     561218 :       if (p == relt || p == 0)
    2199                 :            :         break;
    2200                 :            :     }
    2201                 :            : 
    2202                 :     216271 :   if (q == 0)
    2203                 :            :     return 0;
    2204                 :            : 
    2205                 :     131114 :   offset = (get_integer_term (x) - get_integer_term (p->exp));
    2206                 :            :   /* Note: OFFSET may be 0 if P->xexp and X are related by commutativity.  */
    2207                 :     131114 :   return plus_constant (q->mode, q->exp, offset);
    2208                 :            : }
    2209                 :            : 
    2210                 :            : 
    2211                 :            : /* Hash a string.  Just add its bytes up.  */
    2212                 :            : static inline unsigned
    2213                 :     524493 : hash_rtx_string (const char *ps)
    2214                 :            : {
    2215                 :     524493 :   unsigned hash = 0;
    2216                 :     524493 :   const unsigned char *p = (const unsigned char *) ps;
    2217                 :            : 
    2218                 :     524493 :   if (p)
    2219                 :    2414470 :     while (*p)
    2220                 :    1889980 :       hash += *p++;
    2221                 :            : 
    2222                 :     524493 :   return hash;
    2223                 :            : }
    2224                 :            : 
    2225                 :            : /* Same as hash_rtx, but call CB on each rtx if it is not NULL.
    2226                 :            :    When the callback returns true, we continue with the new rtx.  */
    2227                 :            : 
    2228                 :            : unsigned
    2229                 :  838989000 : hash_rtx_cb (const_rtx x, machine_mode mode,
    2230                 :            :              int *do_not_record_p, int *hash_arg_in_memory_p,
    2231                 :            :              bool have_reg_qty, hash_rtx_callback_function cb)
    2232                 :            : {
    2233                 :  838989000 :   int i, j;
    2234                 :  838989000 :   unsigned hash = 0;
    2235                 : 1253460000 :   enum rtx_code code;
    2236                 : 1253460000 :   const char *fmt;
    2237                 : 1253460000 :   machine_mode newmode;
    2238                 : 1253460000 :   rtx newx;
    2239                 :            : 
    2240                 :            :   /* Used to turn recursion into iteration.  We can't rely on GCC's
    2241                 :            :      tail-recursion elimination since we need to keep accumulating values
    2242                 :            :      in HASH.  */
    2243                 : 1253460000 :  repeat:
    2244                 : 1253460000 :   if (x == 0)
    2245                 :          0 :     return hash;
    2246                 :            : 
    2247                 :            :   /* Invoke the callback first.  */
    2248                 : 1253460000 :   if (cb != NULL
    2249                 : 1253460000 :       && ((*cb) (x, mode, &newx, &newmode)))
    2250                 :            :     {
    2251                 :          0 :       hash += hash_rtx_cb (newx, newmode, do_not_record_p,
    2252                 :            :                            hash_arg_in_memory_p, have_reg_qty, cb);
    2253                 :          0 :       return hash;
    2254                 :            :     }
    2255                 :            : 
    2256                 : 1253460000 :   code = GET_CODE (x);
    2257                 : 1253460000 :   switch (code)
    2258                 :            :     {
    2259                 :  426007000 :     case REG:
    2260                 :  426007000 :       {
    2261                 :  426007000 :         unsigned int regno = REGNO (x);
    2262                 :            : 
    2263                 :  426007000 :         if (do_not_record_p && !reload_completed)
    2264                 :            :           {
    2265                 :            :             /* On some machines, we can't record any non-fixed hard register,
    2266                 :            :                because extending its life will cause reload problems.  We
    2267                 :            :                consider ap, fp, sp, gp to be fixed for this purpose.
    2268                 :            : 
    2269                 :            :                We also consider CCmode registers to be fixed for this purpose;
    2270                 :            :                failure to do so leads to failure to simplify 0<100 type of
    2271                 :            :                conditionals.
    2272                 :            : 
    2273                 :            :                On all machines, we can't record any global registers.
    2274                 :            :                Nor should we record any register that is in a small
    2275                 :            :                class, as defined by TARGET_CLASS_LIKELY_SPILLED_P.  */
    2276                 :  423375000 :             bool record;
    2277                 :            : 
    2278                 :  423375000 :             if (regno >= FIRST_PSEUDO_REGISTER)
    2279                 :            :               record = true;
    2280                 :  289883000 :             else if (x == frame_pointer_rtx
    2281                 :  189042000 :                      || x == hard_frame_pointer_rtx
    2282                 :  188938000 :                      || x == arg_pointer_rtx
    2283                 :  183158000 :                      || x == stack_pointer_rtx
    2284                 :  158543000 :                      || x == pic_offset_table_rtx)
    2285                 :            :               record = true;
    2286                 :  158543000 :             else if (global_regs[regno])
    2287                 :            :               record = false;
    2288                 :  158543000 :             else if (fixed_regs[regno])
    2289                 :            :               record = true;
    2290                 :   45914000 :             else if (GET_MODE_CLASS (GET_MODE (x)) == MODE_CC)
    2291                 :            :               record = true;
    2292                 :   45914000 :             else if (targetm.small_register_classes_for_mode_p (GET_MODE (x)))
    2293                 :            :               record = false;
    2294                 :          0 :             else if (targetm.class_likely_spilled_p (REGNO_REG_CLASS (regno)))
    2295                 :            :               record = false;
    2296                 :            :             else
    2297                 :            :               record = true;
    2298                 :            : 
    2299                 :            :             if (!record)
    2300                 :            :               {
    2301                 :   45914200 :                 *do_not_record_p = 1;
    2302                 :   45914200 :                 return 0;
    2303                 :            :               }
    2304                 :            :           }
    2305                 :            : 
    2306                 :  380093000 :         hash += ((unsigned int) REG << 7);
    2307                 :  672387000 :         hash += (have_reg_qty ? (unsigned) REG_QTY (regno) : regno);
    2308                 :  380093000 :         return hash;
    2309                 :            :       }
    2310                 :            : 
    2311                 :            :     /* We handle SUBREG of a REG specially because the underlying
    2312                 :            :        reg changes its hash value with every value change; we don't
    2313                 :            :        want to have to forget unrelated subregs when one subreg changes.  */
    2314                 :   19023000 :     case SUBREG:
    2315                 :   19023000 :       {
    2316                 :   19023000 :         if (REG_P (SUBREG_REG (x)))
    2317                 :            :           {
    2318                 :   38000000 :             hash += (((unsigned int) SUBREG << 7)
    2319                 :   19000000 :                      + REGNO (SUBREG_REG (x))
    2320                 :   19000000 :                      + (constant_lower_bound (SUBREG_BYTE (x))
    2321                 :   19000000 :                         / UNITS_PER_WORD));
    2322                 :   19000000 :             return hash;
    2323                 :            :           }
    2324                 :            :         break;
    2325                 :            :       }
    2326                 :            : 
    2327                 :  226861000 :     case CONST_INT:
    2328                 :  226861000 :       hash += (((unsigned int) CONST_INT << 7) + (unsigned int) mode
    2329                 :  226861000 :                + (unsigned int) INTVAL (x));
    2330                 :  226861000 :       return hash;
    2331                 :            : 
    2332                 :            :     case CONST_WIDE_INT:
    2333                 :     449139 :       for (i = 0; i < CONST_WIDE_INT_NUNITS (x); i++)
    2334                 :     299538 :         hash += CONST_WIDE_INT_ELT (x, i);
    2335                 :            :       return hash;
    2336                 :            : 
    2337                 :          0 :     case CONST_POLY_INT:
    2338                 :          0 :       {
    2339                 :          0 :         inchash::hash h;
    2340                 :          0 :         h.add_int (hash);
    2341                 :          0 :         for (unsigned int i = 0; i < NUM_POLY_INT_COEFFS; ++i)
    2342                 :          0 :           h.add_wide_int (CONST_POLY_INT_COEFFS (x)[i]);
    2343                 :          0 :         return h.end ();
    2344                 :            :       }
    2345                 :            : 
    2346                 :    2325560 :     case CONST_DOUBLE:
    2347                 :            :       /* This is like the general case, except that it only counts
    2348                 :            :          the integers representing the constant.  */
    2349                 :    2325560 :       hash += (unsigned int) code + (unsigned int) GET_MODE (x);
    2350                 :    2325560 :       if (TARGET_SUPPORTS_WIDE_INT == 0 && GET_MODE (x) == VOIDmode)
    2351                 :            :         hash += ((unsigned int) CONST_DOUBLE_LOW (x)
    2352                 :            :                  + (unsigned int) CONST_DOUBLE_HIGH (x));
    2353                 :            :       else
    2354                 :    2325560 :         hash += real_hash (CONST_DOUBLE_REAL_VALUE (x));
    2355                 :    2325560 :       return hash;
    2356                 :            : 
    2357                 :          0 :     case CONST_FIXED:
    2358                 :          0 :       hash += (unsigned int) code + (unsigned int) GET_MODE (x);
    2359                 :          0 :       hash += fixed_hash (CONST_FIXED_VALUE (x));
    2360                 :          0 :       return hash;
    2361                 :            : 
    2362                 :     728757 :     case CONST_VECTOR:
    2363                 :     728757 :       {
    2364                 :     728757 :         int units;
    2365                 :     728757 :         rtx elt;
    2366                 :            : 
    2367                 :     728757 :         units = const_vector_encoded_nelts (x);
    2368                 :            : 
    2369                 :    2559480 :         for (i = 0; i < units; ++i)
    2370                 :            :           {
    2371                 :    1830720 :             elt = CONST_VECTOR_ENCODED_ELT (x, i);
    2372                 :    1830720 :             hash += hash_rtx_cb (elt, GET_MODE (elt),
    2373                 :            :                                  do_not_record_p, hash_arg_in_memory_p,
    2374                 :            :                                  have_reg_qty, cb);
    2375                 :            :           }
    2376                 :            : 
    2377                 :            :         return hash;
    2378                 :            :       }
    2379                 :            : 
    2380                 :            :       /* Assume there is only one rtx object for any given label.  */
    2381                 :   12199500 :     case LABEL_REF:
    2382                 :            :       /* We don't hash on the address of the CODE_LABEL to avoid bootstrap
    2383                 :            :          differences and differences between each stage's debugging dumps.  */
    2384                 :   24399000 :          hash += (((unsigned int) LABEL_REF << 7)
    2385                 :   12199500 :                   + CODE_LABEL_NUMBER (label_ref_label (x)));
    2386                 :   12199500 :       return hash;
    2387                 :            : 
    2388                 :  106301000 :     case SYMBOL_REF:
    2389                 :  106301000 :       {
    2390                 :            :         /* Don't hash on the symbol's address to avoid bootstrap differences.
    2391                 :            :            Different hash values may cause expressions to be recorded in
    2392                 :            :            different orders and thus different registers to be used in the
    2393                 :            :            final assembler.  This also avoids differences in the dump files
    2394                 :            :            between various stages.  */
    2395                 :  106301000 :         unsigned int h = 0;
    2396                 :  106301000 :         const unsigned char *p = (const unsigned char *) XSTR (x, 0);
    2397                 :            : 
    2398                 : 2566280000 :         while (*p)
    2399                 : 2459980000 :           h += (h << 7) + *p++; /* ??? revisit */
    2400                 :            : 
    2401                 :  106301000 :         hash += ((unsigned int) SYMBOL_REF << 7) + h;
    2402                 :  106301000 :         return hash;
    2403                 :            :       }
    2404                 :            : 
    2405                 :  188737000 :     case MEM:
    2406                 :            :       /* We don't record if marked volatile or if BLKmode since we don't
    2407                 :            :          know the size of the move.  */
    2408                 :  188737000 :       if (do_not_record_p && (MEM_VOLATILE_P (x) || GET_MODE (x) == BLKmode))
    2409                 :            :         {
    2410                 :    4791730 :           *do_not_record_p = 1;
    2411                 :    4791730 :           return 0;
    2412                 :            :         }
    2413                 :  183945000 :       if (hash_arg_in_memory_p && !MEM_READONLY_P (x))
    2414                 :   42593500 :         *hash_arg_in_memory_p = 1;
    2415                 :            : 
    2416                 :            :       /* Now that we have already found this special case,
    2417                 :            :          might as well speed it up as much as possible.  */
    2418                 :  183945000 :       hash += (unsigned) MEM;
    2419                 :  183945000 :       x = XEXP (x, 0);
    2420                 :  183945000 :       goto repeat;
    2421                 :            : 
    2422                 :         73 :     case USE:
    2423                 :            :       /* A USE that mentions non-volatile memory needs special
    2424                 :            :          handling since the MEM may be BLKmode which normally
    2425                 :            :          prevents an entry from being made.  Pure calls are
    2426                 :            :          marked by a USE which mentions BLKmode memory.
    2427                 :            :          See calls.c:emit_call_1.  */
    2428                 :         73 :       if (MEM_P (XEXP (x, 0))
    2429                 :         73 :           && ! MEM_VOLATILE_P (XEXP (x, 0)))
    2430                 :            :         {
    2431                 :          0 :           hash += (unsigned) USE;
    2432                 :          0 :           x = XEXP (x, 0);
    2433                 :            : 
    2434                 :          0 :           if (hash_arg_in_memory_p && !MEM_READONLY_P (x))
    2435                 :          0 :             *hash_arg_in_memory_p = 1;
    2436                 :            : 
    2437                 :            :           /* Now that we have already found this special case,
    2438                 :            :              might as well speed it up as much as possible.  */
    2439                 :          0 :           hash += (unsigned) MEM;
    2440                 :          0 :           x = XEXP (x, 0);
    2441                 :          0 :           goto repeat;
    2442                 :            :         }
    2443                 :            :       break;
    2444                 :            : 
    2445                 :   35645500 :     case PRE_DEC:
    2446                 :   35645500 :     case PRE_INC:
    2447                 :   35645500 :     case POST_DEC:
    2448                 :   35645500 :     case POST_INC:
    2449                 :   35645500 :     case PRE_MODIFY:
    2450                 :   35645500 :     case POST_MODIFY:
    2451                 :   35645500 :     case PC:
    2452                 :   35645500 :     case CC0:
    2453                 :   35645500 :     case CALL:
    2454                 :   35645500 :     case UNSPEC_VOLATILE:
    2455                 :   35645500 :       if (do_not_record_p) {
    2456                 :   35644200 :         *do_not_record_p = 1;
    2457                 :   35644200 :         return 0;
    2458                 :            :       }
    2459                 :            :       else
    2460                 :            :         return hash;
    2461                 :     194561 :       break;
    2462                 :            : 
    2463                 :     194561 :     case ASM_OPERANDS:
    2464                 :     194561 :       if (do_not_record_p && MEM_VOLATILE_P (x))
    2465                 :            :         {
    2466                 :      32431 :           *do_not_record_p = 1;
    2467                 :      32431 :           return 0;
    2468                 :            :         }
    2469                 :            :       else
    2470                 :            :         {
    2471                 :            :           /* We don't want to take the filename and line into account.  */
    2472                 :     324260 :           hash += (unsigned) code + (unsigned) GET_MODE (x)
    2473                 :     162130 :             + hash_rtx_string (ASM_OPERANDS_TEMPLATE (x))
    2474                 :     162130 :             + hash_rtx_string (ASM_OPERANDS_OUTPUT_CONSTRAINT (x))
    2475                 :     162130 :             + (unsigned) ASM_OPERANDS_OUTPUT_IDX (x);
    2476                 :            : 
    2477                 :     162130 :           if (ASM_OPERANDS_INPUT_LENGTH (x))
    2478                 :            :             {
    2479                 :     200233 :               for (i = 1; i < ASM_OPERANDS_INPUT_LENGTH (x); i++)
    2480                 :            :                 {
    2481                 :      77298 :                   hash += (hash_rtx_cb (ASM_OPERANDS_INPUT (x, i),
    2482                 :      38649 :                                         GET_MODE (ASM_OPERANDS_INPUT (x, i)),
    2483                 :            :                                         do_not_record_p, hash_arg_in_memory_p,
    2484                 :            :                                         have_reg_qty, cb)
    2485                 :      38649 :                            + hash_rtx_string
    2486                 :      77298 :                            (ASM_OPERANDS_INPUT_CONSTRAINT (x, i)));
    2487                 :            :                 }
    2488                 :            : 
    2489                 :     161584 :               hash += hash_rtx_string (ASM_OPERANDS_INPUT_CONSTRAINT (x, 0));
    2490                 :     161584 :               x = ASM_OPERANDS_INPUT (x, 0);
    2491                 :     161584 :               mode = GET_MODE (x);
    2492                 :     161584 :               goto repeat;
    2493                 :            :             }
    2494                 :            : 
    2495                 :        546 :           return hash;
    2496                 :            :         }
    2497                 :            :       break;
    2498                 :            : 
    2499                 :            :     default:
    2500                 :            :       break;
    2501                 :            :     }
    2502                 :            : 
    2503                 :  235311000 :   i = GET_RTX_LENGTH (code) - 1;
    2504                 :  235311000 :   hash += (unsigned) code + (unsigned) GET_MODE (x);
    2505                 :  235311000 :   fmt = GET_RTX_FORMAT (code);
    2506                 :  476478000 :   for (; i >= 0; i--)
    2507                 :            :     {
    2508                 :  471532000 :       switch (fmt[i])
    2509                 :            :         {
    2510                 :  462177000 :         case 'e':
    2511                 :            :           /* If we are about to do the last recursive call
    2512                 :            :              needed at this level, change it into iteration.
    2513                 :            :              This function  is called enough to be worth it.  */
    2514                 :  462177000 :           if (i == 0)
    2515                 :            :             {
    2516                 :  230365000 :               x = XEXP (x, i);
    2517                 :  230365000 :               goto repeat;
    2518                 :            :             }
    2519                 :            : 
    2520                 :  231811000 :           hash += hash_rtx_cb (XEXP (x, i), VOIDmode, do_not_record_p,
    2521                 :            :                                hash_arg_in_memory_p,
    2522                 :            :                                have_reg_qty, cb);
    2523                 :  231811000 :           break;
    2524                 :            : 
    2525                 :            :         case 'E':
    2526                 :   11956600 :           for (j = 0; j < XVECLEN (x, i); j++)
    2527                 :    7011360 :             hash += hash_rtx_cb (XVECEXP (x, i, j), VOIDmode, do_not_record_p,
    2528                 :            :                                  hash_arg_in_memory_p,
    2529                 :            :                                  have_reg_qty, cb);
    2530                 :            :           break;
    2531                 :            : 
    2532                 :          0 :         case 's':
    2533                 :          0 :           hash += hash_rtx_string (XSTR (x, i));
    2534                 :          0 :           break;
    2535                 :            : 
    2536                 :    4387320 :         case 'i':
    2537                 :    4387320 :           hash += (unsigned int) XINT (x, i);
    2538                 :    4387320 :           break;
    2539                 :            : 
    2540                 :      23020 :         case 'p':
    2541                 :      23020 :           hash += constant_lower_bound (SUBREG_BYTE (x));
    2542                 :      23020 :           break;
    2543                 :            : 
    2544                 :            :         case '0': case 't':
    2545                 :            :           /* Unused.  */
    2546                 :            :           break;
    2547                 :            : 
    2548                 :          0 :         default:
    2549                 :          0 :           gcc_unreachable ();
    2550                 :            :         }
    2551                 :            :     }
    2552                 :            : 
    2553                 :            :   return hash;
    2554                 :            : }
    2555                 :            : 
    2556                 :            : /* Hash an rtx.  We are careful to make sure the value is never negative.
    2557                 :            :    Equivalent registers hash identically.
    2558                 :            :    MODE is used in hashing for CONST_INTs only;
    2559                 :            :    otherwise the mode of X is used.
    2560                 :            : 
    2561                 :            :    Store 1 in DO_NOT_RECORD_P if any subexpression is volatile.
    2562                 :            : 
    2563                 :            :    If HASH_ARG_IN_MEMORY_P is not NULL, store 1 in it if X contains
    2564                 :            :    a MEM rtx which does not have the MEM_READONLY_P flag set.
    2565                 :            : 
    2566                 :            :    Note that cse_insn knows that the hash code of a MEM expression
    2567                 :            :    is just (int) MEM plus the hash code of the address.  */
    2568                 :            : 
    2569                 :            : unsigned
    2570                 :  598290000 : hash_rtx (const_rtx x, machine_mode mode, int *do_not_record_p,
    2571                 :            :           int *hash_arg_in_memory_p, bool have_reg_qty)
    2572                 :            : {
    2573                 :  598290000 :   return hash_rtx_cb (x, mode, do_not_record_p,
    2574                 :  598290000 :                       hash_arg_in_memory_p, have_reg_qty, NULL);
    2575                 :            : }
    2576                 :            : 
    2577                 :            : /* Hash an rtx X for cse via hash_rtx.
    2578                 :            :    Stores 1 in do_not_record if any subexpression is volatile.
    2579                 :            :    Stores 1 in hash_arg_in_memory if X contains a mem rtx which
    2580                 :            :    does not have the MEM_READONLY_P flag set.  */
    2581                 :            : 
    2582                 :            : static inline unsigned
    2583                 :  326057000 : canon_hash (rtx x, machine_mode mode)
    2584                 :            : {
    2585                 :  301977000 :   return hash_rtx (x, mode, &do_not_record, &hash_arg_in_memory, true);
    2586                 :            : }
    2587                 :            : 
    2588                 :            : /* Like canon_hash but with no side effects, i.e. do_not_record
    2589                 :            :    and hash_arg_in_memory are not changed.  */
    2590                 :            : 
    2591                 :            : static inline unsigned
    2592                 :  109618000 : safe_hash (rtx x, machine_mode mode)
    2593                 :            : {
    2594                 :  109618000 :   int dummy_do_not_record;
    2595                 :   28405100 :   return hash_rtx (x, mode, &dummy_do_not_record, NULL, true);
    2596                 :            : }
    2597                 :            : 
    2598                 :            : /* Return 1 iff X and Y would canonicalize into the same thing,
    2599                 :            :    without actually constructing the canonicalization of either one.
    2600                 :            :    If VALIDATE is nonzero,
    2601                 :            :    we assume X is an expression being processed from the rtl
    2602                 :            :    and Y was found in the hash table.  We check register refs
    2603                 :            :    in Y for being marked as valid.
    2604                 :            : 
    2605                 :            :    If FOR_GCSE is true, we compare X and Y for equivalence for GCSE.  */
    2606                 :            : 
    2607                 :            : int
    2608                 : 1053440000 : exp_equiv_p (const_rtx x, const_rtx y, int validate, bool for_gcse)
    2609                 :            : {
    2610                 : 1053440000 :   int i, j;
    2611                 : 1053440000 :   enum rtx_code code;
    2612                 : 1053440000 :   const char *fmt;
    2613                 :            : 
    2614                 :            :   /* Note: it is incorrect to assume an expression is equivalent to itself
    2615                 :            :      if VALIDATE is nonzero.  */
    2616                 : 1053440000 :   if (x == y && !validate)
    2617                 :            :     return 1;
    2618                 :            : 
    2619                 : 1038170000 :   if (x == 0 || y == 0)
    2620                 :          0 :     return x == y;
    2621                 :            : 
    2622                 : 1038170000 :   code = GET_CODE (x);
    2623                 : 1038170000 :   if (code != GET_CODE (y))
    2624                 :            :     return 0;
    2625                 :            : 
    2626                 :            :   /* (MULT:SI x y) and (MULT:HI x y) are NOT equivalent.  */
    2627                 :  771413000 :   if (GET_MODE (x) != GET_MODE (y))
    2628                 :            :     return 0;
    2629                 :            : 
    2630                 :            :   /* MEMs referring to different address space are not equivalent.  */
    2631                 :  867263000 :   if (code == MEM && MEM_ADDR_SPACE (x) != MEM_ADDR_SPACE (y))
    2632                 :            :     return 0;
    2633                 :            : 
    2634                 :  728548000 :   switch (code)
    2635                 :            :     {
    2636                 :  179386000 :     case PC:
    2637                 :  179386000 :     case CC0:
    2638                 :  179386000 :     CASE_CONST_UNIQUE:
    2639                 :  179386000 :       return x == y;
    2640                 :            : 
    2641                 :      12683 :     case LABEL_REF:
    2642                 :      12683 :       return label_ref_label (x) == label_ref_label (y);
    2643                 :            : 
    2644                 :   12756700 :     case SYMBOL_REF:
    2645                 :   12756700 :       return XSTR (x, 0) == XSTR (y, 0);
    2646                 :            : 
    2647                 :  208652000 :     case REG:
    2648                 :  208652000 :       if (for_gcse)
    2649                 :     765577 :         return REGNO (x) == REGNO (y);
    2650                 :            :       else
    2651                 :            :         {
    2652                 :  207887000 :           unsigned int regno = REGNO (y);
    2653                 :  207887000 :           unsigned int i;
    2654                 :  207887000 :           unsigned int endregno = END_REGNO (y);
    2655                 :            : 
    2656                 :            :           /* If the quantities are not the same, the expressions are not
    2657                 :            :              equivalent.  If there are and we are not to validate, they
    2658                 :            :              are equivalent.  Otherwise, ensure all regs are up-to-date.  */
    2659                 :            : 
    2660                 :  207887000 :           if (REG_QTY (REGNO (x)) != REG_QTY (regno))
    2661                 :            :             return 0;
    2662                 :            : 
    2663                 :  198982000 :           if (! validate)
    2664                 :            :             return 1;
    2665                 :            : 
    2666                 :  380035000 :           for (i = regno; i < endregno; i++)
    2667                 :  190961000 :             if (REG_IN_TABLE (i) != REG_TICK (i))
    2668                 :            :               return 0;
    2669                 :            : 
    2670                 :            :           return 1;
    2671                 :            :         }
    2672                 :            : 
    2673                 :  138357000 :     case MEM:
    2674                 :  138357000 :       if (for_gcse)
    2675                 :            :         {
    2676                 :            :           /* A volatile mem should not be considered equivalent to any
    2677                 :            :              other.  */
    2678                 :   52778600 :           if (MEM_VOLATILE_P (x) || MEM_VOLATILE_P (y))
    2679                 :            :             return 0;
    2680                 :            : 
    2681                 :            :           /* Can't merge two expressions in different alias sets, since we
    2682                 :            :              can decide that the expression is transparent in a block when
    2683                 :            :              it isn't, due to it being set with the different alias set.
    2684                 :            : 
    2685                 :            :              Also, can't merge two expressions with different MEM_ATTRS.
    2686                 :            :              They could e.g. be two different entities allocated into the
    2687                 :            :              same space on the stack (see e.g. PR25130).  In that case, the
    2688                 :            :              MEM addresses can be the same, even though the two MEMs are
    2689                 :            :              absolutely not equivalent.
    2690                 :            : 
    2691                 :            :              But because really all MEM attributes should be the same for
    2692                 :            :              equivalent MEMs, we just use the invariant that MEMs that have
    2693                 :            :              the same attributes share the same mem_attrs data structure.  */
    2694                 :   52672900 :           if (!mem_attrs_eq_p (MEM_ATTRS (x), MEM_ATTRS (y)))
    2695                 :            :             return 0;
    2696                 :            : 
    2697                 :            :           /* If we are handling exceptions, we cannot consider two expressions
    2698                 :            :              with different trapping status as equivalent, because simple_mem
    2699                 :            :              might accept one and reject the other.  */
    2700                 :    5591800 :           if (cfun->can_throw_non_call_exceptions
    2701                 :    5591800 :               && (MEM_NOTRAP_P (x) != MEM_NOTRAP_P (y)))
    2702                 :            :             return 0;
    2703                 :            :         }
    2704                 :            :       break;
    2705                 :            : 
    2706                 :            :     /*  For commutative operations, check both orders.  */
    2707                 :  150022000 :     case PLUS:
    2708                 :  150022000 :     case MULT:
    2709                 :  150022000 :     case AND:
    2710                 :  150022000 :     case IOR:
    2711                 :  150022000 :     case XOR:
    2712                 :  150022000 :     case NE:
    2713                 :  150022000 :     case EQ:
    2714                 :  150022000 :       return ((exp_equiv_p (XEXP (x, 0), XEXP (y, 0),
    2715                 :            :                              validate, for_gcse)
    2716                 :  145305000 :                && exp_equiv_p (XEXP (x, 1), XEXP (y, 1),
    2717                 :            :                                 validate, for_gcse))
    2718                 :  245131000 :               || (exp_equiv_p (XEXP (x, 0), XEXP (y, 1),
    2719                 :            :                                 validate, for_gcse)
    2720                 :      12852 :                   && exp_equiv_p (XEXP (x, 1), XEXP (y, 0),
    2721                 :  150022000 :                                    validate, for_gcse)));
    2722                 :            : 
    2723                 :       8822 :     case ASM_OPERANDS:
    2724                 :            :       /* We don't use the generic code below because we want to
    2725                 :            :          disregard filename and line numbers.  */
    2726                 :            : 
    2727                 :            :       /* A volatile asm isn't equivalent to any other.  */
    2728                 :       8822 :       if (MEM_VOLATILE_P (x) || MEM_VOLATILE_P (y))
    2729                 :            :         return 0;
    2730                 :            : 
    2731                 :       8822 :       if (GET_MODE (x) != GET_MODE (y)
    2732                 :       8822 :           || strcmp (ASM_OPERANDS_TEMPLATE (x), ASM_OPERANDS_TEMPLATE (y))
    2733                 :       8822 :           || strcmp (ASM_OPERANDS_OUTPUT_CONSTRAINT (x),
    2734                 :       8822 :                      ASM_OPERANDS_OUTPUT_CONSTRAINT (y))
    2735                 :       8822 :           || ASM_OPERANDS_OUTPUT_IDX (x) != ASM_OPERANDS_OUTPUT_IDX (y)
    2736                 :       8822 :           || ASM_OPERANDS_INPUT_LENGTH (x) != ASM_OPERANDS_INPUT_LENGTH (y))
    2737                 :            :         return 0;
    2738                 :            : 
    2739                 :       8822 :       if (ASM_OPERANDS_INPUT_LENGTH (x))
    2740                 :            :         {
    2741                 :      16878 :           for (i = ASM_OPERANDS_INPUT_LENGTH (x) - 1; i >= 0; i--)
    2742                 :       8607 :             if (! exp_equiv_p (ASM_OPERANDS_INPUT (x, i),
    2743                 :       8607 :                                ASM_OPERANDS_INPUT (y, i),
    2744                 :            :                                validate, for_gcse)
    2745                 :       8607 :                 || strcmp (ASM_OPERANDS_INPUT_CONSTRAINT (x, i),
    2746                 :       8375 :                            ASM_OPERANDS_INPUT_CONSTRAINT (y, i)))
    2747                 :            :               return 0;
    2748                 :            :         }
    2749                 :            : 
    2750                 :            :       return 1;
    2751                 :            : 
    2752                 :            :     default:
    2753                 :            :       break;
    2754                 :            :     }
    2755                 :            : 
    2756                 :            :   /* Compare the elements.  If any pair of corresponding elements
    2757                 :            :      fail to match, return 0 for the whole thing.  */
    2758                 :            : 
    2759                 :  130519000 :   fmt = GET_RTX_FORMAT (code);
    2760                 :  331282000 :   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
    2761                 :            :     {
    2762                 :  254585000 :       switch (fmt[i])
    2763                 :            :         {
    2764                 :  153599000 :         case 'e':
    2765                 :  153599000 :           if (! exp_equiv_p (XEXP (x, i), XEXP (y, i),
    2766                 :            :                               validate, for_gcse))
    2767                 :            :             return 0;
    2768                 :            :           break;
    2769                 :            : 
    2770                 :    3832380 :         case 'E':
    2771                 :    3832380 :           if (XVECLEN (x, i) != XVECLEN (y, i))
    2772                 :            :             return 0;
    2773                 :    9651280 :           for (j = 0; j < XVECLEN (x, i); j++)
    2774                 :    6539220 :             if (! exp_equiv_p (XVECEXP (x, i, j), XVECEXP (y, i, j),
    2775                 :            :                                 validate, for_gcse))
    2776                 :            :               return 0;
    2777                 :            :           break;
    2778                 :            : 
    2779                 :          0 :         case 's':
    2780                 :          0 :           if (strcmp (XSTR (x, i), XSTR (y, i)))
    2781                 :            :             return 0;
    2782                 :            :           break;
    2783                 :            : 
    2784                 :    2480720 :         case 'i':
    2785                 :    2480720 :           if (XINT (x, i) != XINT (y, i))
    2786                 :            :             return 0;
    2787                 :            :           break;
    2788                 :            : 
    2789                 :          0 :         case 'w':
    2790                 :          0 :           if (XWINT (x, i) != XWINT (y, i))
    2791                 :            :             return 0;
    2792                 :            :           break;
    2793                 :            : 
    2794                 :    3507880 :         case 'p':
    2795                 :    3507880 :           if (maybe_ne (SUBREG_BYTE (x), SUBREG_BYTE (y)))
    2796                 :            :             return 0;
    2797                 :            :           break;
    2798                 :            : 
    2799                 :            :         case '0':
    2800                 :            :         case 't':
    2801                 :            :           break;
    2802                 :            : 
    2803                 :          0 :         default:
    2804                 :          0 :           gcc_unreachable ();
    2805                 :            :         }
    2806                 :            :     }
    2807                 :            : 
    2808                 :            :   return 1;
    2809                 :            : }
    2810                 :            : 
    2811                 :            : /* Subroutine of canon_reg.  Pass *XLOC through canon_reg, and validate
    2812                 :            :    the result if necessary.  INSN is as for canon_reg.  */
    2813                 :            : 
    2814                 :            : static void
    2815                 :  630348000 : validate_canon_reg (rtx *xloc, rtx_insn *insn)
    2816                 :            : {
    2817                 :  630348000 :   if (*xloc)
    2818                 :            :     {
    2819                 :  630348000 :       rtx new_rtx = canon_reg (*xloc, insn);
    2820                 :            : 
    2821                 :            :       /* If replacing pseudo with hard reg or vice versa, ensure the
    2822                 :            :          insn remains valid.  Likewise if the insn has MATCH_DUPs.  */
    2823                 :  630348000 :       gcc_assert (insn && new_rtx);
    2824                 :  630348000 :       validate_change (insn, xloc, new_rtx, 1);
    2825                 :            :     }
    2826                 :  630348000 : }
    2827                 :            : 
    2828                 :            : /* Canonicalize an expression:
    2829                 :            :    replace each register reference inside it
    2830                 :            :    with the "oldest" equivalent register.
    2831                 :            : 
    2832                 :            :    If INSN is nonzero validate_change is used to ensure that INSN remains valid
    2833                 :            :    after we make our substitution.  The calls are made with IN_GROUP nonzero
    2834                 :            :    so apply_change_group must be called upon the outermost return from this
    2835                 :            :    function (unless INSN is zero).  The result of apply_change_group can
    2836                 :            :    generally be discarded since the changes we are making are optional.  */
    2837                 :            : 
    2838                 :            : static rtx
    2839                 : 1033090000 : canon_reg (rtx x, rtx_insn *insn)
    2840                 :            : {
    2841                 : 1033090000 :   int i;
    2842                 : 1033090000 :   enum rtx_code code;
    2843                 : 1033090000 :   const char *fmt;
    2844                 :            : 
    2845                 : 1033090000 :   if (x == 0)
    2846                 :            :     return x;
    2847                 :            : 
    2848                 : 1033090000 :   code = GET_CODE (x);
    2849                 : 1033090000 :   switch (code)
    2850                 :            :     {
    2851                 :            :     case PC:
    2852                 :            :     case CC0:
    2853                 :            :     case CONST:
    2854                 :            :     CASE_CONST_ANY:
    2855                 :            :     case SYMBOL_REF:
    2856                 :            :     case LABEL_REF:
    2857                 :            :     case ADDR_VEC:
    2858                 :            :     case ADDR_DIFF_VEC:
    2859                 :            :       return x;
    2860                 :            : 
    2861                 :  290094000 :     case REG:
    2862                 :  290094000 :       {
    2863                 :  290094000 :         int first;
    2864                 :  290094000 :         int q;
    2865                 :  290094000 :         struct qty_table_elem *ent;
    2866                 :            : 
    2867                 :            :         /* Never replace a hard reg, because hard regs can appear
    2868                 :            :            in more than one machine mode, and we must preserve the mode
    2869                 :            :            of each occurrence.  Also, some hard regs appear in
    2870                 :            :            MEMs that are shared and mustn't be altered.  Don't try to
    2871                 :            :            replace any reg that maps to a reg of class NO_REGS.  */
    2872                 :  290094000 :         if (REGNO (x) < FIRST_PSEUDO_REGISTER
    2873                 :  310628000 :             || ! REGNO_QTY_VALID_P (REGNO (x)))
    2874                 :  188987000 :           return x;
    2875                 :            : 
    2876                 :  101107000 :         q = REG_QTY (REGNO (x));
    2877                 :  101107000 :         ent = &qty_table[q];
    2878                 :  101107000 :         first = ent->first_reg;
    2879                 :  101107000 :         return (first >= FIRST_PSEUDO_REGISTER ? regno_reg_rtx[first]
    2880                 :      59308 :                 : REGNO_REG_CLASS (first) == NO_REGS ? x
    2881                 :      59308 :                 : gen_rtx_REG (ent->mode, first));
    2882                 :            :       }
    2883                 :            : 
    2884                 :  452557000 :     default:
    2885                 :  452557000 :       break;
    2886                 :            :     }
    2887                 :            : 
    2888                 :  452557000 :   fmt = GET_RTX_FORMAT (code);
    2889                 : 1258200000 :   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
    2890                 :            :     {
    2891                 :  805647000 :       int j;
    2892                 :            : 
    2893                 :  805647000 :       if (fmt[i] == 'e')
    2894                 :  622079000 :         validate_canon_reg (&XEXP (x, i), insn);
    2895                 :  183568000 :       else if (fmt[i] == 'E')
    2896                 :   13030500 :         for (j = 0; j < XVECLEN (x, i); j++)
    2897                 :    8269200 :           validate_canon_reg (&XVECEXP (x, i, j), insn);
    2898                 :            :     }
    2899                 :            : 
    2900                 :            :   return x;
    2901                 :            : }
    2902                 :            : 
    2903                 :            : /* Given an operation (CODE, *PARG1, *PARG2), where code is a comparison
    2904                 :            :    operation (EQ, NE, GT, etc.), follow it back through the hash table and
    2905                 :            :    what values are being compared.
    2906                 :            : 
    2907                 :            :    *PARG1 and *PARG2 are updated to contain the rtx representing the values
    2908                 :            :    actually being compared.  For example, if *PARG1 was (cc0) and *PARG2
    2909                 :            :    was (const_int 0), *PARG1 and *PARG2 will be set to the objects that were
    2910                 :            :    compared to produce cc0.
    2911                 :            : 
    2912                 :            :    The return value is the comparison operator and is either the code of
    2913                 :            :    A or the code corresponding to the inverse of the comparison.  */
    2914                 :            : 
    2915                 :            : static enum rtx_code
    2916                 :   22389800 : find_comparison_args (enum rtx_code code, rtx *parg1, rtx *parg2,
    2917                 :            :                       machine_mode *pmode1, machine_mode *pmode2)
    2918                 :            : {
    2919                 :   22389800 :   rtx arg1, arg2;
    2920                 :   22389800 :   hash_set<rtx> *visited = NULL;
    2921                 :            :   /* Set nonzero when we find something of interest.  */
    2922                 :   22389800 :   rtx x = NULL;
    2923                 :            : 
    2924                 :   22389800 :   arg1 = *parg1, arg2 = *parg2;
    2925                 :            : 
    2926                 :            :   /* If ARG2 is const0_rtx, see what ARG1 is equivalent to.  */
    2927                 :            : 
    2928                 :   43647600 :   while (arg2 == CONST0_RTX (GET_MODE (arg1)))
    2929                 :            :     {
    2930                 :   32847100 :       int reverse_code = 0;
    2931                 :   32847100 :       struct table_elt *p = 0;
    2932                 :            : 
    2933                 :            :       /* Remember state from previous iteration.  */
    2934                 :   32847100 :       if (x)
    2935                 :            :         {
    2936                 :   10546200 :           if (!visited)
    2937                 :   10543500 :             visited = new hash_set<rtx>;
    2938                 :   10546200 :           visited->add (x);
    2939                 :   10546200 :           x = 0;
    2940                 :            :         }
    2941                 :            : 
    2942                 :            :       /* If arg1 is a COMPARE, extract the comparison arguments from it.
    2943                 :            :          On machines with CC0, this is the only case that can occur, since
    2944                 :            :          fold_rtx will return the COMPARE or item being compared with zero
    2945                 :            :          when given CC0.  */
    2946                 :            : 
    2947                 :   32847100 :       if (GET_CODE (arg1) == COMPARE && arg2 == const0_rtx)
    2948                 :          0 :         x = arg1;
    2949                 :            : 
    2950                 :            :       /* If ARG1 is a comparison operator and CODE is testing for
    2951                 :            :          STORE_FLAG_VALUE, get the inner arguments.  */
    2952                 :            : 
    2953                 :   32847100 :       else if (COMPARISON_P (arg1))
    2954                 :            :         {
    2955                 :            : #ifdef FLOAT_STORE_FLAG_VALUE
    2956                 :            :           REAL_VALUE_TYPE fsfv;
    2957                 :            : #endif
    2958                 :            : 
    2959                 :          0 :           if (code == NE
    2960                 :            :               || (GET_MODE_CLASS (GET_MODE (arg1)) == MODE_INT
    2961                 :            :                   && code == LT && STORE_FLAG_VALUE == -1)
    2962                 :            : #ifdef FLOAT_STORE_FLAG_VALUE
    2963                 :            :               || (SCALAR_FLOAT_MODE_P (GET_MODE (arg1))
    2964                 :            :                   && (fsfv = FLOAT_STORE_FLAG_VALUE (GET_MODE (arg1)),
    2965                 :            :                       REAL_VALUE_NEGATIVE (fsfv)))
    2966                 :            : #endif
    2967                 :            :               )
    2968                 :          0 :             x = arg1;
    2969                 :          0 :           else if (code == EQ
    2970                 :            :                    || (GET_MODE_CLASS (GET_MODE (arg1)) == MODE_INT
    2971                 :            :                        && code == GE && STORE_FLAG_VALUE == -1)
    2972                 :            : #ifdef FLOAT_STORE_FLAG_VALUE
    2973                 :            :                    || (SCALAR_FLOAT_MODE_P (GET_MODE (arg1))
    2974                 :            :                        && (fsfv = FLOAT_STORE_FLAG_VALUE (GET_MODE (arg1)),
    2975                 :            :                            REAL_VALUE_NEGATIVE (fsfv)))
    2976                 :            : #endif
    2977                 :            :                    )
    2978                 :          0 :             x = arg1, reverse_code = 1;
    2979                 :            :         }
    2980                 :            : 
    2981                 :            :       /* ??? We could also check for
    2982                 :            : 
    2983                 :            :          (ne (and (eq (...) (const_int 1))) (const_int 0))
    2984                 :            : 
    2985                 :            :          and related forms, but let's wait until we see them occurring.  */
    2986                 :            : 
    2987                 :   32847100 :       if (x == 0)
    2988                 :            :         /* Look up ARG1 in the hash table and see if it has an equivalence
    2989                 :            :            that lets us see what is being compared.  */
    2990                 :   32847100 :         p = lookup (arg1, SAFE_HASH (arg1, GET_MODE (arg1)), GET_MODE (arg1));
    2991                 :   32847100 :       if (p)
    2992                 :            :         {
    2993                 :   26797900 :           p = p->first_same_value;
    2994                 :            : 
    2995                 :            :           /* If what we compare is already known to be constant, that is as
    2996                 :            :              good as it gets.
    2997                 :            :              We need to break the loop in this case, because otherwise we
    2998                 :            :              can have an infinite loop when looking at a reg that is known
    2999                 :            :              to be a constant which is the same as a comparison of a reg
    3000                 :            :              against zero which appears later in the insn stream, which in
    3001                 :            :              turn is constant and the same as the comparison of the first reg
    3002                 :            :              against zero...  */
    3003                 :   26797900 :           if (p->is_const)
    3004                 :            :             break;
    3005                 :            :         }
    3006                 :            : 
    3007                 :   43722100 :       for (; p; p = p->next_same_value)
    3008                 :            :         {
    3009                 :   32173900 :           machine_mode inner_mode = GET_MODE (p->exp);
    3010                 :            : #ifdef FLOAT_STORE_FLAG_VALUE
    3011                 :            :           REAL_VALUE_TYPE fsfv;
    3012                 :            : #endif
    3013                 :            : 
    3014                 :            :           /* If the entry isn't valid, skip it.  */
    3015                 :   32173900 :           if (! exp_equiv_p (p->exp, p->exp, 1, false))
    3016                 :    1362000 :             continue;
    3017                 :            : 
    3018                 :            :           /* If it's a comparison we've used before, skip it.  */
    3019                 :   30811900 :           if (visited && visited->contains (p->exp))
    3020                 :          0 :             continue;
    3021                 :            : 
    3022                 :   30811900 :           if (GET_CODE (p->exp) == COMPARE
    3023                 :            :               /* Another possibility is that this machine has a compare insn
    3024                 :            :                  that includes the comparison code.  In that case, ARG1 would
    3025                 :            :                  be equivalent to a comparison operation that would set ARG1 to
    3026                 :            :                  either STORE_FLAG_VALUE or zero.  If this is an NE operation,
    3027                 :            :                  ORIG_CODE is the actual comparison being done; if it is an EQ,
    3028                 :            :                  we must reverse ORIG_CODE.  On machine with a negative value
    3029                 :            :                  for STORE_FLAG_VALUE, also look at LT and GE operations.  */
    3030                 :   30811900 :               || ((code == NE
    3031                 :    6627450 :                    || (code == LT
    3032                 :     182532 :                        && val_signbit_known_set_p (inner_mode,
    3033                 :            :                                                    STORE_FLAG_VALUE))
    3034                 :            : #ifdef FLOAT_STORE_FLAG_VALUE
    3035                 :            :                    || (code == LT
    3036                 :            :                        && SCALAR_FLOAT_MODE_P (inner_mode)
    3037                 :            :                        && (fsfv = FLOAT_STORE_FLAG_VALUE (GET_MODE (arg1)),
    3038                 :            :                            REAL_VALUE_NEGATIVE (fsfv)))
    3039                 :            : #endif
    3040                 :            :                    )
    3041                 :    3063770 :                   && COMPARISON_P (p->exp)))
    3042                 :            :             {
    3043                 :   21122900 :               x = p->exp;
    3044                 :   21122900 :               break;
    3045                 :            :             }
    3046                 :    9689070 :           else if ((code == EQ
    3047                 :    5549050 :                     || (code == GE
    3048                 :     351889 :                         && val_signbit_known_set_p (inner_mode,
    3049                 :            :                                                     STORE_FLAG_VALUE))
    3050                 :            : #ifdef FLOAT_STORE_FLAG_VALUE
    3051                 :            :                     || (code == GE
    3052                 :            :                         && SCALAR_FLOAT_MODE_P (inner_mode)
    3053                 :            :                         && (fsfv = FLOAT_STORE_FLAG_VALUE (GET_MODE (arg1)),
    3054                 :            :                             REAL_VALUE_NEGATIVE (fsfv)))
    3055                 :            : #endif
    3056                 :            :                     )
    3057                 :    9689070 :                    && COMPARISON_P (p->exp))
    3058                 :            :             {
    3059                 :     134943 :               reverse_code = 1;
    3060                 :     134943 :               x = p->exp;
    3061                 :     134943 :               break;
    3062                 :            :             }
    3063                 :            : 
    3064                 :            :           /* If this non-trapping address, e.g. fp + constant, the
    3065                 :            :              equivalent is a better operand since it may let us predict
    3066                 :            :              the value of the comparison.  */
    3067                 :    9554130 :           else if (!rtx_addr_can_trap_p (p->exp))
    3068                 :            :             {
    3069                 :          0 :               arg1 = p->exp;
    3070                 :          0 :               continue;
    3071                 :            :             }
    3072                 :            :         }
    3073                 :            : 
    3074                 :            :       /* If we didn't find a useful equivalence for ARG1, we are done.
    3075                 :            :          Otherwise, set up for the next iteration.  */
    3076                 :   32806000 :       if (x == 0)
    3077                 :            :         break;
    3078                 :            : 
    3079                 :            :       /* If we need to reverse the comparison, make sure that is
    3080                 :            :          possible -- we can't necessarily infer the value of GE from LT
    3081                 :            :          with floating-point operands.  */
    3082                 :   21257800 :       if (reverse_code)
    3083                 :            :         {
    3084                 :     134943 :           enum rtx_code reversed = reversed_comparison_code (x, NULL);
    3085                 :     134943 :           if (reversed == UNKNOWN)
    3086                 :            :             break;
    3087                 :            :           else
    3088                 :            :             code = reversed;
    3089                 :            :         }
    3090                 :   21122900 :       else if (COMPARISON_P (x))
    3091                 :       2153 :         code = GET_CODE (x);
    3092                 :   21257800 :       arg1 = XEXP (x, 0), arg2 = XEXP (x, 1);
    3093                 :            :     }
    3094                 :            : 
    3095                 :            :   /* Return our results.  Return the modes from before fold_rtx
    3096                 :            :      because fold_rtx might produce const_int, and then it's too late.  */
    3097                 :   22389800 :   *pmode1 = GET_MODE (arg1), *pmode2 = GET_MODE (arg2);
    3098                 :   22389800 :   *parg1 = fold_rtx (arg1, 0), *parg2 = fold_rtx (arg2, 0);
    3099                 :            : 
    3100                 :   22389800 :   if (visited)
    3101                 :   10543500 :     delete visited;
    3102                 :   22389800 :   return code;
    3103                 :            : }
    3104                 :            : 
    3105                 :            : /* If X is a nontrivial arithmetic operation on an argument for which
    3106                 :            :    a constant value can be determined, return the result of operating
    3107                 :            :    on that value, as a constant.  Otherwise, return X, possibly with
    3108                 :            :    one or more operands changed to a forward-propagated constant.
    3109                 :            : 
    3110                 :            :    If X is a register whose contents are known, we do NOT return
    3111                 :            :    those contents here; equiv_constant is called to perform that task.
    3112                 :            :    For SUBREGs and MEMs, we do that both here and in equiv_constant.
    3113                 :            : 
    3114                 :            :    INSN is the insn that we may be modifying.  If it is 0, make a copy
    3115                 :            :    of X before modifying it.  */
    3116                 :            : 
    3117                 :            : static rtx
    3118                 :  250813000 : fold_rtx (rtx x, rtx_insn *insn)
    3119                 :            : {
    3120                 :  250813000 :   enum rtx_code code;
    3121                 :  250813000 :   machine_mode mode;
    3122                 :  250813000 :   const char *fmt;
    3123                 :  250813000 :   int i;
    3124                 :  250813000 :   rtx new_rtx = 0;
    3125                 :  250813000 :   int changed = 0;
    3126                 :  250813000 :   poly_int64 xval;
    3127                 :            : 
    3128                 :            :   /* Operands of X.  */
    3129                 :            :   /* Workaround -Wmaybe-uninitialized false positive during
    3130                 :            :      profiledbootstrap by initializing them.  */
    3131                 :  250813000 :   rtx folded_arg0 = NULL_RTX;
    3132                 :  250813000 :   rtx folded_arg1 = NULL_RTX;
    3133                 :            : 
    3134                 :            :   /* Constant equivalents of first three operands of X;
    3135                 :            :      0 when no such equivalent is known.  */
    3136                 :  250813000 :   rtx const_arg0;
    3137                 :  250813000 :   rtx const_arg1;
    3138                 :  250813000 :   rtx const_arg2;
    3139                 :            : 
    3140                 :            :   /* The mode of the first operand of X.  We need this for sign and zero
    3141                 :            :      extends.  */
    3142                 :  250813000 :   machine_mode mode_arg0;
    3143                 :            : 
    3144                 :  250813000 :   if (x == 0)
    3145                 :            :     return x;
    3146                 :            : 
    3147                 :            :   /* Try to perform some initial simplifications on X.  */
    3148                 :  250813000 :   code = GET_CODE (x);
    3149                 :  250813000 :   switch (code)
    3150                 :            :     {
    3151                 :   44576500 :     case MEM:
    3152                 :   44576500 :     case SUBREG:
    3153                 :            :     /* The first operand of a SIGN/ZERO_EXTRACT has a different meaning
    3154                 :            :        than it would in other contexts.  Basically its mode does not
    3155                 :            :        signify the size of the object read.  That information is carried
    3156                 :            :        by size operand.    If we happen to have a MEM of the appropriate
    3157                 :            :        mode in our tables with a constant value we could simplify the
    3158                 :            :        extraction incorrectly if we allowed substitution of that value
    3159                 :            :        for the MEM.   */
    3160                 :   44576500 :     case ZERO_EXTRACT:
    3161                 :   44576500 :     case SIGN_EXTRACT:
    3162                 :   44576500 :       if ((new_rtx = equiv_constant (x)) != NULL_RTX)
    3163                 :    1367240 :         return new_rtx;
    3164                 :            :       return x;
    3165                 :            : 
    3166                 :            :     case CONST:
    3167                 :            :     CASE_CONST_ANY:
    3168                 :            :     case SYMBOL_REF:
    3169                 :            :     case LABEL_REF:
    3170                 :            :     case REG:
    3171                 :            :     case PC:
    3172                 :            :       /* No use simplifying an EXPR_LIST
    3173                 :            :          since they are used only for lists of args
    3174                 :            :          in a function call's REG_EQUAL note.  */
    3175                 :            :     case EXPR_LIST:
    3176                 :            :       return x;
    3177                 :            : 
    3178                 :          0 :     case CC0:
    3179                 :          0 :       return prev_insn_cc0;
    3180                 :            : 
    3181                 :     194489 :     case ASM_OPERANDS:
    3182                 :     194489 :       if (insn)
    3183                 :            :         {
    3184                 :          0 :           for (i = ASM_OPERANDS_INPUT_LENGTH (x) - 1; i >= 0; i--)
    3185                 :          0 :             validate_change (insn, &ASM_OPERANDS_INPUT (x, i),
    3186                 :          0 :                              fold_rtx (ASM_OPERANDS_INPUT (x, i), insn), 0);
    3187                 :            :         }
    3188                 :            :       return x;
    3189                 :            : 
    3190                 :   10091300 :     case CALL:
    3191                 :   10091300 :       if (NO_FUNCTION_CSE && CONSTANT_P (XEXP (XEXP (x, 0), 0)))
    3192                 :            :         return x;
    3193                 :            :       break;
    3194                 :            : 
    3195                 :            :     /* Anything else goes through the loop below.  */
    3196                 :            :     default:
    3197                 :            :       break;
    3198                 :            :     }
    3199                 :            : 
    3200                 :   70193200 :   mode = GET_MODE (x);
    3201                 :   70193200 :   const_arg0 = 0;
    3202                 :   70193200 :   const_arg1 = 0;
    3203                 :   70193200 :   const_arg2 = 0;
    3204                 :   70193200 :   mode_arg0 = VOIDmode;
    3205                 :            : 
    3206                 :            :   /* Try folding our operands.
    3207                 :            :      Then see which ones have constant values known.  */
    3208                 :            : 
    3209                 :   70193200 :   fmt = GET_RTX_FORMAT (code);
    3210                 :  219395000 :   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
    3211                 :  149202000 :     if (fmt[i] == 'e')
    3212                 :            :       {
    3213                 :  146036000 :         rtx folded_arg = XEXP (x, i), const_arg;
    3214                 :  146036000 :         machine_mode mode_arg = GET_MODE (folded_arg);
    3215                 :            : 
    3216                 :  146036000 :         switch (GET_CODE (folded_arg))
    3217                 :            :           {
    3218                 :   65215600 :           case MEM:
    3219                 :   65215600 :           case REG:
    3220                 :   65215600 :           case SUBREG:
    3221                 :   65215600 :             const_arg = equiv_constant (folded_arg);
    3222                 :   65215600 :             break;
    3223                 :            : 
    3224                 :            :           case CONST:
    3225                 :            :           CASE_CONST_ANY:
    3226                 :            :           case SYMBOL_REF:
    3227                 :            :           case LABEL_REF:
    3228                 :            :             const_arg = folded_arg;
    3229                 :            :             break;
    3230                 :            : 
    3231                 :          0 :           case CC0:
    3232                 :            :             /* The cc0-user and cc0-setter may be in different blocks if
    3233                 :            :                the cc0-setter potentially traps.  In that case PREV_INSN_CC0
    3234                 :            :                will have been cleared as we exited the block with the
    3235                 :            :                setter.
    3236                 :            : 
    3237                 :            :                While we could potentially track cc0 in this case, it just
    3238                 :            :                doesn't seem to be worth it given that cc0 targets are not
    3239                 :            :                terribly common or important these days and trapping math
    3240                 :            :                is rarely used.  The combination of those two conditions
    3241                 :            :                necessary to trip this situation is exceedingly rare in the
    3242                 :            :                real world.  */
    3243                 :          0 :             if (!prev_insn_cc0)
    3244                 :            :               {
    3245                 :            :                 const_arg = NULL_RTX;
    3246                 :            :               }
    3247                 :            :             else
    3248                 :            :               {
    3249                 :          0 :                 folded_arg = prev_insn_cc0;
    3250                 :          0 :                 mode_arg = prev_insn_cc0_mode;
    3251                 :          0 :                 const_arg = equiv_constant (folded_arg);
    3252                 :            :               }
    3253                 :            :             break;
    3254                 :            : 
    3255                 :   27128300 :           default:
    3256                 :   27128300 :             folded_arg = fold_rtx (folded_arg, insn);
    3257                 :   27128300 :             const_arg = equiv_constant (folded_arg);
    3258                 :   27128300 :             break;
    3259                 :            :           }
    3260                 :            : 
    3261                 :            :         /* For the first three operands, see if the operand
    3262                 :            :            is constant or equivalent to a constant.  */
    3263                 :  146036000 :         switch (i)
    3264                 :            :           {
    3265                 :   68384700 :           case 0:
    3266                 :   68384700 :             folded_arg0 = folded_arg;
    3267                 :   68384700 :             const_arg0 = const_arg;
    3268                 :   68384700 :             mode_arg0 = mode_arg;
    3269                 :   68384700 :             break;
    3270                 :   64880000 :           case 1:
    3271                 :   64880000 :             folded_arg1 = folded_arg;
    3272                 :   64880000 :             const_arg1 = const_arg;
    3273                 :   64880000 :             break;
    3274                 :   12771600 :           case 2:
    3275                 :   12771600 :             const_arg2 = const_arg;
    3276                 :   12771600 :             break;
    3277                 :            :           }
    3278                 :            : 
    3279                 :            :         /* Pick the least expensive of the argument and an equivalent constant
    3280                 :            :            argument.  */
    3281                 :  146036000 :         if (const_arg != 0
    3282                 :  146036000 :             && const_arg != folded_arg
    3283                 :    3915340 :             && (COST_IN (const_arg, mode_arg, code, i)
    3284                 :    1957670 :                 <= COST_IN (folded_arg, mode_arg, code, i))
    3285                 :            : 
    3286                 :            :             /* It's not safe to substitute the operand of a conversion
    3287                 :            :                operator with a constant, as the conversion's identity
    3288                 :            :                depends upon the mode of its operand.  This optimization
    3289                 :            :                is handled by the call to simplify_unary_operation.  */
    3290                 :  147119000 :             && (GET_RTX_CLASS (code) != RTX_UNARY
    3291                 :     100307 :                 || GET_MODE (const_arg) == mode_arg0
    3292                 :      67069 :                 || (code != ZERO_EXTEND
    3293                 :            :                     && code != SIGN_EXTEND
    3294                 :      67069 :                     && code != TRUNCATE
    3295                 :      67069 :                     && code != FLOAT_TRUNCATE
    3296                 :       4509 :                     && code != FLOAT_EXTEND
    3297                 :       4509 :                     && code != FLOAT
    3298                 :            :                     && code != FIX
    3299                 :       4329 :                     && code != UNSIGNED_FLOAT
    3300                 :       4329 :                     && code != UNSIGNED_FIX)))
    3301                 :            :           folded_arg = const_arg;
    3302                 :            : 
    3303                 :  146036000 :         if (folded_arg == XEXP (x, i))
    3304                 :  144518000 :           continue;
    3305                 :            : 
    3306                 :    1518080 :         if (insn == NULL_RTX && !changed)
    3307                 :    1453950 :           x = copy_rtx (x);
    3308                 :    1518080 :         changed = 1;
    3309                 :    1518080 :         validate_unshare_change (insn, &XEXP (x, i), folded_arg, 1);
    3310                 :            :       }
    3311                 :            : 
    3312                 :   70193200 :   if (changed)
    3313                 :            :     {
    3314                 :            :       /* Canonicalize X if necessary, and keep const_argN and folded_argN
    3315                 :            :          consistent with the order in X.  */
    3316                 :    1454200 :       if (canonicalize_change_group (insn, x))
    3317                 :            :         {
    3318                 :     236722 :           std::swap (const_arg0, const_arg1);
    3319                 :     236722 :           std::swap (folded_arg0, folded_arg1);
    3320                 :            :         }
    3321                 :            : 
    3322                 :    1454200 :       apply_change_group ();
    3323                 :            :     }
    3324                 :            : 
    3325                 :            :   /* If X is an arithmetic operation, see if we can simplify it.  */
    3326                 :            : 
    3327                 :   70193200 :   switch (GET_RTX_CLASS (code))
    3328                 :            :     {
    3329                 :    3504710 :     case RTX_UNARY:
    3330                 :    3504710 :       {
    3331                 :            :         /* We can't simplify extension ops unless we know the
    3332                 :            :            original mode.  */
    3333                 :    3504710 :         if ((code == ZERO_EXTEND || code == SIGN_EXTEND)
    3334                 :    2548270 :             && mode_arg0 == VOIDmode)
    3335                 :            :           break;
    3336                 :            : 
    3337                 :    3504710 :         new_rtx = simplify_unary_operation (code, mode,
    3338                 :            :                                             const_arg0 ? const_arg0 : folded_arg0,
    3339                 :            :                                             mode_arg0);
    3340                 :            :       }
    3341                 :    3504710 :       break;
    3342                 :            : 
    3343                 :   13588100 :     case RTX_COMPARE:
    3344                 :   13588100 :     case RTX_COMM_COMPARE:
    3345                 :            :       /* See what items are actually being compared and set FOLDED_ARG[01]
    3346                 :            :          to those values and CODE to the actual comparison code.  If any are
    3347                 :            :          constant, set CONST_ARG0 and CONST_ARG1 appropriately.  We needn't
    3348                 :            :          do anything if both operands are already known to be constant.  */
    3349                 :            : 
    3350                 :            :       /* ??? Vector mode comparisons are not supported yet.  */
    3351                 :   13588100 :       if (VECTOR_MODE_P (mode))
    3352                 :            :         break;
    3353                 :            : 
    3354                 :   13545900 :       if (const_arg0 == 0 || const_arg1 == 0)
    3355                 :            :         {
    3356                 :   13545600 :           struct table_elt *p0, *p1;
    3357                 :   13545600 :           rtx true_rtx, false_rtx;
    3358                 :   13545600 :           machine_mode mode_arg1;
    3359                 :            : 
    3360                 :   13545600 :           if (SCALAR_FLOAT_MODE_P (mode))
    3361                 :            :             {
    3362                 :            : #ifdef FLOAT_STORE_FLAG_VALUE
    3363                 :            :               true_rtx = (const_double_from_real_value
    3364                 :            :                           (FLOAT_STORE_FLAG_VALUE (mode), mode));
    3365                 :            : #else
    3366                 :       1443 :               true_rtx = NULL_RTX;
    3367                 :            : #endif
    3368                 :       1443 :               false_rtx = CONST0_RTX (mode);
    3369                 :            :             }
    3370                 :            :           else
    3371                 :            :             {
    3372                 :   13544200 :               true_rtx = const_true_rtx;
    3373                 :   13544200 :               false_rtx = const0_rtx;
    3374                 :            :             }
    3375                 :            : 
    3376                 :   13545600 :           code = find_comparison_args (code, &folded_arg0, &folded_arg1,
    3377                 :            :                                        &mode_arg0, &mode_arg1);
    3378                 :            : 
    3379                 :            :           /* If the mode is VOIDmode or a MODE_CC mode, we don't know
    3380                 :            :              what kinds of things are being compared, so we can't do
    3381                 :            :              anything with this comparison.  */
    3382                 :            : 
    3383                 :   13545600 :           if (mode_arg0 == VOIDmode || GET_MODE_CLASS (mode_arg0) == MODE_CC)
    3384                 :            :             break;
    3385                 :            : 
    3386                 :   12731900 :           const_arg0 = equiv_constant (folded_arg0);
    3387                 :   12731900 :           const_arg1 = equiv_constant (folded_arg1);
    3388                 :            : 
    3389                 :            :           /* If we do not now have two constants being compared, see
    3390                 :            :              if we can nevertheless deduce some things about the
    3391                 :            :              comparison.  */
    3392                 :   12731900 :           if (const_arg0 == 0 || const_arg1 == 0)
    3393                 :            :             {
    3394                 :   12689000 :               if (const_arg1 != NULL)
    3395                 :            :                 {
    3396                 :    9075910 :                   rtx cheapest_simplification;
    3397                 :    9075910 :                   int cheapest_cost;
    3398                 :    9075910 :                   rtx simp_result;
    3399                 :    9075910 :                   struct table_elt *p;
    3400                 :            : 
    3401                 :            :                   /* See if we can find an equivalent of folded_arg0
    3402                 :            :                      that gets us a cheaper expression, possibly a
    3403                 :            :                      constant through simplifications.  */
    3404                 :    9075910 :                   p = lookup (folded_arg0, SAFE_HASH (folded_arg0, mode_arg0),
    3405                 :            :                               mode_arg0);
    3406                 :            : 
    3407                 :    9075910 :                   if (p != NULL)
    3408                 :            :                     {
    3409                 :    4019450 :                       cheapest_simplification = x;
    3410                 :    4019450 :                       cheapest_cost = COST (x, mode);
    3411                 :            : 
    3412                 :   11852800 :                       for (p = p->first_same_value; p != NULL; p = p->next_same_value)
    3413                 :            :                         {
    3414                 :    7833330 :                           int cost;
    3415                 :            : 
    3416                 :            :                           /* If the entry isn't valid, skip it.  */
    3417                 :    7833330 :                           if (! exp_equiv_p (p->exp, p->exp, 1, false))
    3418                 :     508251 :                             continue;
    3419                 :            : 
    3420                 :            :                           /* Try to simplify using this equivalence.  */
    3421                 :    7325080 :                           simp_result
    3422                 :    7325080 :                             = simplify_relational_operation (code, mode,
    3423                 :            :                                                              mode_arg0,
    3424                 :            :                                                              p->exp,
    3425                 :            :                                                              const_arg1);
    3426                 :            : 
    3427                 :    7325080 :                           if (simp_result == NULL)
    3428                 :    7234120 :                             continue;
    3429                 :            : 
    3430                 :      90967 :                           cost = COST (simp_result, mode);
    3431                 :      90967 :                           if (cost < cheapest_cost)
    3432                 :            :                             {
    3433                 :       1306 :                               cheapest_cost = cost;
    3434                 :       1306 :                               cheapest_simplification = simp_result;
    3435                 :            :                             }
    3436                 :            :                         }
    3437                 :            : 
    3438                 :            :                       /* If we have a cheaper expression now, use that
    3439                 :            :                          and try folding it further, from the top.  */
    3440                 :    4019450 :                       if (cheapest_simplification != x)
    3441                 :       1306 :                         return fold_rtx (copy_rtx (cheapest_simplification),
    3442                 :       3554 :                                          insn);
    3443                 :            :                     }
    3444                 :            :                 }
    3445                 :            : 
    3446                 :            :               /* See if the two operands are the same.  */
    3447                 :            : 
    3448                 :   12687700 :               if ((REG_P (folded_arg0)
    3449                 :   10496900 :                    && REG_P (folded_arg1)
    3450                 :    3137480 :                    && (REG_QTY (REGNO (folded_arg0))
    3451                 :    3137480 :                        == REG_QTY (REGNO (folded_arg1))))
    3452                 :   25365200 :                   || ((p0 = lookup (folded_arg0,
    3453                 :   12677400 :                                     SAFE_HASH (folded_arg0, mode_arg0),
    3454                 :            :                                     mode_arg0))
    3455                 :    5715400 :                       && (p1 = lookup (folded_arg1,
    3456                 :    5715400 :                                        SAFE_HASH (folded_arg1, mode_arg0),
    3457                 :            :                                        mode_arg0))
    3458                 :    1866660 :                       && p0->first_same_value == p1->first_same_value))
    3459                 :      10600 :                 folded_arg1 = folded_arg0;
    3460                 :            : 
    3461                 :            :               /* If FOLDED_ARG0 is a register, see if the comparison we are
    3462                 :            :                  doing now is either the same as we did before or the reverse
    3463                 :            :                  (we only check the reverse if not floating-point).  */
    3464                 :   12677100 :               else if (REG_P (folded_arg0))
    3465                 :            :                 {
    3466                 :   10486300 :                   int qty = REG_QTY (REGNO (folded_arg0));
    3467                 :            : 
    3468                 :   10486300 :                   if (REGNO_QTY_VALID_P (REGNO (folded_arg0)))
    3469                 :            :                     {
    3470                 :   10480600 :                       struct qty_table_elem *ent = &qty_table[qty];
    3471                 :            : 
    3472                 :   10480600 :                       if ((comparison_dominates_p (ent->comparison_code, code)
    3473                 :   10277900 :                            || (! FLOAT_MODE_P (mode_arg0)
    3474                 :    9873290 :                                && comparison_dominates_p (ent->comparison_code,
    3475                 :            :                                                           reverse_condition (code))))
    3476                 :   10713900 :                           && (rtx_equal_p (ent->comparison_const, folded_arg1)
    3477                 :     434196 :                               || (const_arg1
    3478                 :     346484 :                                   && rtx_equal_p (ent->comparison_const,
    3479                 :            :                                                   const_arg1))
    3480                 :     434196 :                               || (REG_P (folded_arg1)
    3481                 :      85791 :                                   && (REG_QTY (REGNO (folded_arg1)) == ent->comparison_qty))))
    3482                 :            :                         {
    3483                 :       2248 :                           if (comparison_dominates_p (ent->comparison_code, code))
    3484                 :            :                             {
    3485                 :       1075 :                               if (true_rtx)
    3486                 :            :                                 return true_rtx;
    3487                 :            :                               else
    3488                 :            :                                 break;
    3489                 :            :                             }
    3490                 :            :                           else
    3491                 :            :                             return false_rtx;
    3492                 :            :                         }
    3493                 :            :                     }
    3494                 :            :                 }
    3495                 :            :             }
    3496                 :            :         }
    3497                 :            : 
    3498                 :            :       /* If we are comparing against zero, see if the first operand is
    3499                 :            :          equivalent to an IOR with a constant.  If so, we may be able to
    3500                 :            :          determine the result of this comparison.  */
    3501                 :   12728600 :       if (const_arg1 == const0_rtx && !const_arg0)
    3502                 :            :         {
    3503                 :    6177540 :           rtx y = lookup_as_function (folded_arg0, IOR);
    3504                 :    6177540 :           rtx inner_const;
    3505                 :            : 
    3506                 :    6177540 :           if (y != 0
    3507                 :     134211 :               && (inner_const = equiv_constant (XEXP (y, 1))) != 0
    3508                 :        133 :               && CONST_INT_P (inner_const)
    3509                 :    6177680 :               && INTVAL (inner_const) != 0)
    3510                 :        125 :             folded_arg0 = gen_rtx_IOR (mode_arg0, XEXP (y, 0), inner_const);
    3511                 :            :         }
    3512                 :            : 
    3513                 :   12728600 :       {
    3514                 :   12728600 :         rtx op0 = const_arg0 ? const_arg0 : copy_rtx (folded_arg0);
    3515                 :   12728600 :         rtx op1 = const_arg1 ? const_arg1 : copy_rtx (folded_arg1);
    3516                 :   12728600 :         new_rtx = simplify_relational_operation (code, mode, mode_arg0,
    3517                 :            :                                                  op0, op1);
    3518                 :            :       }
    3519                 :   12728600 :       break;
    3520                 :            : 
    3521                 :   38128400 :     case RTX_BIN_ARITH:
    3522                 :   38128400 :     case RTX_COMM_ARITH:
    3523                 :   38128400 :       switch (code)
    3524                 :            :         {
    3525                 :   17332100 :         case PLUS:
    3526                 :            :           /* If the second operand is a LABEL_REF, see if the first is a MINUS
    3527                 :            :              with that LABEL_REF as its second operand.  If so, the result is
    3528                 :            :              the first operand of that MINUS.  This handles switches with an
    3529                 :            :              ADDR_DIFF_VEC table.  */
    3530                 :   17332100 :           if (const_arg1 && GET_CODE (const_arg1) == LABEL_REF)
    3531                 :            :             {
    3532                 :       2733 :               rtx y
    3533                 :       2733 :                 = GET_CODE (folded_arg0) == MINUS ? folded_arg0
    3534                 :       2733 :                 : lookup_as_function (folded_arg0, MINUS);
    3535                 :            : 
    3536                 :          0 :               if (y != 0 && GET_CODE (XEXP (y, 1)) == LABEL_REF
    3537                 :       2733 :                   && label_ref_label (XEXP (y, 1)) == label_ref_label (const_arg1))
    3538                 :          0 :                 return XEXP (y, 0);
    3539                 :            : 
    3540                 :            :               /* Now try for a CONST of a MINUS like the above.  */
    3541                 :       2733 :               if ((y = (GET_CODE (folded_arg0) == CONST ? folded_arg0
    3542                 :       2733 :                         : lookup_as_function (folded_arg0, CONST))) != 0
    3543                 :          0 :                   && GET_CODE (XEXP (y, 0)) == MINUS
    3544                 :          0 :                   && GET_CODE (XEXP (XEXP (y, 0), 1)) == LABEL_REF
    3545                 :       2733 :                   && label_ref_label (XEXP (XEXP (y, 0), 1)) == label_ref_label (const_arg1))
    3546                 :          0 :                 return XEXP (XEXP (y, 0), 0);
    3547                 :            :             }
    3548                 :            : 
    3549                 :            :           /* Likewise if the operands are in the other order.  */
    3550                 :   17332100 :           if (const_arg0 && GET_CODE (const_arg0) == LABEL_REF)
    3551                 :            :             {
    3552                 :         22 :               rtx y
    3553                 :         22 :                 = GET_CODE (folded_arg1) == MINUS ? folded_arg1
    3554                 :         22 :                 : lookup_as_function (folded_arg1, MINUS);
    3555                 :            : 
    3556                 :          0 :               if (y != 0 && GET_CODE (XEXP (y, 1)) == LABEL_REF
    3557                 :         22 :                   && label_ref_label (XEXP (y, 1)) == label_ref_label (const_arg0))
    3558                 :          0 :                 return XEXP (y, 0);
    3559                 :            : 
    3560                 :            :               /* Now try for a CONST of a MINUS like the above.  */
    3561                 :         22 :               if ((y = (GET_CODE (folded_arg1) == CONST ? folded_arg1
    3562                 :         22 :                         : lookup_as_function (folded_arg1, CONST))) != 0
    3563                 :          0 :                   && GET_CODE (XEXP (y, 0)) == MINUS
    3564                 :          0 :                   && GET_CODE (XEXP (XEXP (y, 0), 1)) == LABEL_REF
    3565                 :         22 :                   && label_ref_label (XEXP (XEXP (y, 0), 1)) == label_ref_label (const_arg0))
    3566                 :          0 :                 return XEXP (XEXP (y, 0), 0);
    3567                 :            :             }
    3568                 :            : 
    3569                 :            :           /* If second operand is a register equivalent to a negative
    3570                 :            :              CONST_INT, see if we can find a register equivalent to the
    3571                 :            :              positive constant.  Make a MINUS if so.  Don't do this for
    3572                 :            :              a non-negative constant since we might then alternate between
    3573                 :            :              choosing positive and negative constants.  Having the positive
    3574                 :            :              constant previously-used is the more common case.  Be sure
    3575                 :            :              the resulting constant is non-negative; if const_arg1 were
    3576                 :            :              the smallest negative number this would overflow: depending
    3577                 :            :              on the mode, this would either just be the same value (and
    3578                 :            :              hence not save anything) or be incorrect.  */
    3579                 :   17332100 :           if (const_arg1 != 0 && CONST_INT_P (const_arg1)
    3580                 :   14386800 :               && INTVAL (const_arg1) < 0
    3581                 :            :               /* This used to test
    3582                 :            : 
    3583                 :            :                  -INTVAL (const_arg1) >= 0
    3584                 :            : 
    3585                 :            :                  But The Sun V5.0 compilers mis-compiled that test.  So
    3586                 :            :                  instead we test for the problematic value in a more direct
    3587                 :            :                  manner and hope the Sun compilers get it correct.  */
    3588                 :    8209740 :               && INTVAL (const_arg1) !=
    3589                 :            :                 (HOST_WIDE_INT_1 << (HOST_BITS_PER_WIDE_INT - 1))
    3590                 :    8191310 :               && REG_P (folded_arg1))
    3591                 :            :             {
    3592                 :      21731 :               rtx new_const = GEN_INT (-INTVAL (const_arg1));
    3593                 :      21731 :               struct table_elt *p
    3594                 :      43462 :                 = lookup (new_const, SAFE_HASH (new_const, mode), mode);
    3595                 :            : 
    3596                 :      21731 :               if (p)
    3597                 :       6302 :                 for (p = p->first_same_value; p; p = p->next_same_value)
    3598                 :       6302 :                   if (REG_P (p->exp))
    3599                 :       3225 :                     return simplify_gen_binary (MINUS, mode, folded_arg0,
    3600                 :       3225 :                                                 canon_reg (p->exp, NULL));
    3601                 :            :             }
    3602                 :   17328900 :           goto from_plus;
    3603                 :            : 
    3604                 :    1440240 :         case MINUS:
    3605                 :            :           /* If we have (MINUS Y C), see if Y is known to be (PLUS Z C2).
    3606                 :            :              If so, produce (PLUS Z C2-C).  */
    3607                 :    1440240 :           if (const_arg1 != 0 && poly_int_rtx_p (const_arg1, &xval))
    3608                 :            :             {
    3609                 :      42527 :               rtx y = lookup_as_function (XEXP (x, 0), PLUS);
    3610                 :      42527 :               if (y && poly_int_rtx_p (XEXP (y, 1)))
    3611                 :          0 :                 return fold_rtx (plus_constant (mode, copy_rtx (y), -xval),
    3612                 :          0 :                                  NULL);
    3613                 :            :             }
    3614                 :            : 
    3615                 :            :           /* Fall through.  */
    3616                 :            : 
    3617                 :   24188500 :         from_plus:
    3618                 :   24188500 :         case SMIN:    case SMAX:      case UMIN:    case UMAX:
    3619                 :   24188500 :         case IOR:     case AND:       case XOR:
    3620                 :   24188500 :         case MULT:
    3621                 :   24188500 :         case ASHIFT:  case LSHIFTRT:  case ASHIFTRT:
    3622                 :            :           /* If we have (<op> <reg> <const_int>) for an associative OP and REG
    3623                 :            :              is known to be of similar form, we may be able to replace the
    3624                 :            :              operation with a combined operation.  This may eliminate the
    3625                 :            :              intermediate operation if every use is simplified in this way.
    3626                 :            :              Note that the similar optimization done by combine.c only works
    3627                 :            :              if the intermediate operation's result has only one reference.  */
    3628                 :            : 
    3629                 :   24188500 :           if (REG_P (folded_arg0)
    3630                 :   22568500 :               && const_arg1 && CONST_INT_P (const_arg1))
    3631                 :            :             {
    3632                 :   36583100 :               int is_shift
    3633                 :   17276700 :                 = (code == ASHIFT || code == ASHIFTRT || code == LSHIFTRT);
    3634                 :            :               rtx y, inner_const, new_const;
    3635                 :   19306400 :               rtx canon_const_arg1 = const_arg1;
    3636                 :            :               enum rtx_code associate_code;
    3637                 :            : 
    3638                 :            :               if (is_shift
    3639                 :    4060210 :                   && (INTVAL (const_arg1) >= GET_MODE_UNIT_PRECISION (mode)
    3640                 :    2029800 :                       || INTVAL (const_arg1) < 0))
    3641                 :            :                 {
    3642                 :            :                   if (SHIFT_COUNT_TRUNCATED)
    3643                 :            :                     canon_const_arg1 = gen_int_shift_amount
    3644                 :            :                       (mode, (INTVAL (const_arg1)
    3645                 :            :                               & (GET_MODE_UNIT_BITSIZE (mode) - 1)));
    3646                 :            :                   else
    3647                 :            :                     break;
    3648                 :            :                 }
    3649                 :            : 
    3650                 :   17276200 :               y = lookup_as_function (folded_arg0, code);
    3651                 :   17276200 :               if (y == 0)
    3652                 :            :                 break;
    3653                 :            : 
    3654                 :            :               /* If we have compiled a statement like
    3655                 :            :                  "if (x == (x & mask1))", and now are looking at
    3656                 :            :                  "x & mask2", we will have a case where the first operand
    3657                 :            :                  of Y is the same as our first operand.  Unless we detect
    3658                 :            :                  this case, an infinite loop will result.  */
    3659                 :     483489 :               if (XEXP (y, 0) == folded_arg0)
    3660                 :            :                 break;
    3661                 :            : 
    3662                 :     483472 :               inner_const = equiv_constant (fold_rtx (XEXP (y, 1), 0));
    3663                 :     483472 :               if (!inner_const || !CONST_INT_P (inner_const))
    3664                 :            :                 break;
    3665                 :            : 
    3666                 :            :               /* Don't associate these operations if they are a PLUS with the
    3667                 :            :                  same constant and it is a power of two.  These might be doable
    3668                 :            :                  with a pre- or post-increment.  Similarly for two subtracts of
    3669                 :            :                  identical powers of two with post decrement.  */
    3670                 :            : 
    3671                 :     340460 :               if (code == PLUS && const_arg1 == inner_const
    3672                 :            :                   && ((HAVE_PRE_INCREMENT
    3673                 :            :                           && pow2p_hwi (INTVAL (const_arg1)))
    3674                 :            :                       || (HAVE_POST_INCREMENT
    3675                 :            :                           && pow2p_hwi (INTVAL (const_arg1)))
    3676                 :            :                       || (HAVE_PRE_DECREMENT
    3677                 :            :                           && pow2p_hwi (- INTVAL (const_arg1)))
    3678                 :            :                       || (HAVE_POST_DECREMENT
    3679                 :            :                           && pow2p_hwi (- INTVAL (const_arg1)))))
    3680                 :            :                 break;
    3681                 :            : 
    3682                 :            :               /* ??? Vector mode shifts by scalar
    3683                 :            :                  shift operand are not supported yet.  */
    3684                 :     340460 :               if (is_shift && VECTOR_MODE_P (mode))
    3685                 :            :                 break;
    3686                 :            : 
    3687                 :     340142 :               if (is_shift
    3688                 :     342400 :                   && (INTVAL (inner_const) >= GET_MODE_UNIT_PRECISION (mode)
    3689                 :       2258 :                       || INTVAL (inner_const) < 0))
    3690                 :            :                 {
    3691                 :            :                   if (SHIFT_COUNT_TRUNCATED)
    3692                 :            :                     inner_const = gen_int_shift_amount
    3693                 :            :                       (mode, (INTVAL (inner_const)
    3694                 :            :                               & (GET_MODE_UNIT_BITSIZE (mode) - 1)));
    3695                 :            :                   else
    3696                 :            :                     break;
    3697                 :            :                 }
    3698                 :            : 
    3699                 :            :               /* Compute the code used to compose the constants.  For example,
    3700                 :            :                  A-C1-C2 is A-(C1 + C2), so if CODE == MINUS, we want PLUS.  */
    3701                 :            : 
    3702                 :     340132 :               associate_code = (is_shift || code == MINUS ? PLUS : code);
    3703                 :            : 
    3704                 :     340132 :               new_const = simplify_binary_operation (associate_code, mode,
    3705                 :            :                                                      canon_const_arg1,
    3706                 :            :                                                      inner_const);
    3707                 :            : 
    3708                 :     340132 :               if (new_const == 0)
    3709                 :            :                 break;
    3710                 :            : 
    3711                 :            :               /* If we are associating shift operations, don't let this
    3712                 :            :                  produce a shift of the size of the object or larger.
    3713                 :            :                  This could occur when we follow a sign-extend by a right
    3714                 :            :                  shift on a machine that does a sign-extend as a pair
    3715                 :            :                  of shifts.  */
    3716                 :            : 
    3717                 :     340132 :               if (is_shift
    3718                 :       2248 :                   && CONST_INT_P (new_const)
    3719                 :     344628 :                   && INTVAL (new_const) >= GET_MODE_UNIT_PRECISION (mode))
    3720                 :            :                 {
    3721                 :            :                   /* As an exception, we can turn an ASHIFTRT of this
    3722                 :            :                      form into a shift of the number of bits - 1.  */
    3723                 :       1101 :                   if (code == ASHIFTRT)
    3724                 :       1101 :                     new_const = gen_int_shift_amount
    3725                 :       1101 :                       (mode, GET_MODE_UNIT_BITSIZE (mode) - 1);
    3726                 :          0 :                   else if (!side_effects_p (XEXP (y, 0)))
    3727                 :          0 :                     return CONST0_RTX (mode);
    3728                 :            :                   else
    3729                 :            :                     break;
    3730                 :            :                 }
    3731                 :            : 
    3732                 :     340132 :               y = copy_rtx (XEXP (y, 0));
    3733                 :            : 
    3734                 :            :               /* If Y contains our first operand (the most common way this
    3735                 :            :                  can happen is if Y is a MEM), we would do into an infinite
    3736                 :            :                  loop if we tried to fold it.  So don't in that case.  */
    3737                 :            : 
    3738                 :     340132 :               if (! reg_mentioned_p (folded_arg0, y))
    3739                 :     340132 :                 y = fold_rtx (y, insn);
    3740                 :            : 
    3741                 :     340132 :               return simplify_gen_binary (code, mode, y, new_const);
    3742                 :            :             }
    3743                 :            :           break;
    3744                 :            : 
    3745                 :            :         case DIV:       case UDIV:
    3746                 :            :           /* ??? The associative optimization performed immediately above is
    3747                 :            :              also possible for DIV and UDIV using associate_code of MULT.
    3748                 :            :              However, we would need extra code to verify that the
    3749                 :            :              multiplication does not overflow, that is, there is no overflow
    3750                 :            :              in the calculation of new_const.  */
    3751                 :            :           break;
    3752                 :            : 
    3753                 :            :         default:
    3754                 :            :           break;
    3755                 :            :         }
    3756                 :            : 
    3757                 :   37785000 :       new_rtx = simplify_binary_operation (code, mode,
    3758                 :            :                                        const_arg0 ? const_arg0 : folded_arg0,
    3759                 :            :                                        const_arg1 ? const_arg1 : folded_arg1);
    3760                 :   37785000 :       break;
    3761                 :            : 
    3762                 :          0 :     case RTX_OBJ:
    3763                 :            :       /* (lo_sum (high X) X) is simply X.  */
    3764                 :          0 :       if (code == LO_SUM && const_arg0 != 0
    3765                 :          0 :           && GET_CODE (const_arg0) == HIGH
    3766                 :          0 :           && rtx_equal_p (XEXP (const_arg0, 0), const_arg1))
    3767                 :          0 :         return const_arg1;
    3768                 :            :       break;
    3769                 :            : 
    3770                 :   12771600 :     case RTX_TERNARY:
    3771                 :   12771600 :     case RTX_BITFIELD_OPS:
    3772                 :   12771600 :       new_rtx = simplify_ternary_operation (code, mode, mode_arg0,
    3773                 :            :                                         const_arg0 ? const_arg0 : folded_arg0,
    3774                 :            :                                         const_arg1 ? const_arg1 : folded_arg1,
    3775                 :            :                                         const_arg2 ? const_arg2 : XEXP (x, 2));
    3776                 :   12771600 :       break;
    3777                 :            : 
    3778                 :            :     default:
    3779                 :            :       break;
    3780                 :            :     }
    3781                 :            : 
    3782                 :   67603700 :   return new_rtx ? new_rtx : x;
    3783                 :            : }
    3784                 :            : 
    3785                 :            : /* Return a constant value currently equivalent to X.
    3786                 :            :    Return 0 if we don't know one.  */
    3787                 :            : 
    3788                 :            : static rtx
    3789                 :  170198000 : equiv_constant (rtx x)
    3790                 :            : {
    3791                 :  170198000 :   if (REG_P (x)
    3792                 :  172858000 :       && REGNO_QTY_VALID_P (REGNO (x)))
    3793                 :            :     {
    3794                 :   51609700 :       int x_q = REG_QTY (REGNO (x));
    3795                 :   51609700 :       struct qty_table_elem *x_ent = &qty_table[x_q];
    3796                 :            : 
    3797                 :   51609700 :       if (x_ent->const_rtx)
    3798                 :    2675620 :         x = gen_lowpart (GET_MODE (x), x_ent->const_rtx);
    3799                 :            :     }
    3800                 :            : 
    3801                 :  170198000 :   if (x == 0 || CONSTANT_P (x))
    3802                 :            :     return x;
    3803                 :            : 
    3804                 :  154542000 :   if (GET_CODE (x) == SUBREG)
    3805                 :            :     {
    3806                 :    3181670 :       machine_mode mode = GET_MODE (x);
    3807                 :    3181670 :       machine_mode imode = GET_MODE (SUBREG_REG (x));
    3808                 :    3181670 :       rtx new_rtx;
    3809                 :            : 
    3810                 :            :       /* See if we previously assigned a constant value to this SUBREG.  */
    3811                 :    3181670 :       if ((new_rtx = lookup_as_function (x, CONST_INT)) != 0
    3812                 :    3179550 :           || (new_rtx = lookup_as_function (x, CONST_WIDE_INT)) != 0
    3813                 :    3179550 :           || (NUM_POLY_INT_COEFFS > 1
    3814                 :            :               && (new_rtx = lookup_as_function (x, CONST_POLY_INT)) != 0)
    3815                 :    3177630 :           || (new_rtx = lookup_as_function (x, CONST_DOUBLE)) != 0
    3816                 :    6359110 :           || (new_rtx = lookup_as_function (x, CONST_FIXED)) != 0)
    3817                 :       4227 :         return new_rtx;
    3818                 :            : 
    3819                 :            :       /* If we didn't and if doing so makes sense, see if we previously
    3820                 :            :          assigned a constant value to the enclosing word mode SUBREG.  */
    3821                 :    7086960 :       if (known_lt (GET_MODE_SIZE (mode), UNITS_PER_WORD)
    3822                 :    5068810 :           && known_lt (UNITS_PER_WORD, GET_MODE_SIZE (imode)))
    3823                 :            :         {
    3824                 :       4454 :           poly_int64 byte = (SUBREG_BYTE (x)
    3825                 :       4454 :                              - subreg_lowpart_offset (mode, word_mode));
    3826                 :      11202 :           if (known_ge (byte, 0) && multiple_p (byte, UNITS_PER_WORD))
    3827                 :            :             {
    3828                 :       4454 :               rtx y = gen_rtx_SUBREG (word_mode, SUBREG_REG (x), byte);
    3829                 :       4454 :               new_rtx = lookup_as_function (y, CONST_INT);
    3830                 :       4454 :               if (new_rtx)
    3831                 :          0 :                 return gen_lowpart (mode, new_rtx);
    3832                 :            :             }
    3833                 :            :         }
    3834                 :            : 
    3835                 :            :       /* Otherwise see if we already have a constant for the inner REG,
    3836                 :            :          and if that is enough to calculate an equivalent constant for
    3837                 :            :          the subreg.  Note that the upper bits of paradoxical subregs
    3838                 :            :          are undefined, so they cannot be said to equal anything.  */
    3839                 :    3177440 :       if (REG_P (SUBREG_REG (x))
    3840                 :    3172910 :           && !paradoxical_subreg_p (x)
    3841                 :    6305940 :           && (new_rtx = equiv_constant (SUBREG_REG (x))) != 0)
    3842                 :      12581 :         return simplify_subreg (mode, new_rtx, imode, SUBREG_BYTE (x));
    3843                 :            : 
    3844                 :    3164860 :       return 0;
    3845                 :            :     }
    3846                 :            : 
    3847                 :            :   /* If X is a MEM, see if it is a constant-pool reference, or look it up in
    3848                 :            :      the hash table in case its value was seen before.  */
    3849                 :            : 
    3850                 :  151360000 :   if (MEM_P (x))
    3851                 :            :     {
    3852                 :   49482600 :       struct table_elt *elt;
    3853                 :            : 
    3854                 :   49482600 :       x = avoid_constant_pool_reference (x);
    3855                 :   49482600 :       if (CONSTANT_P (x))
    3856                 :            :         return x;
    3857                 :            : 
    3858                 :   48245300 :       elt = lookup (x, SAFE_HASH (x, GET_MODE (x)), GET_MODE (x));
    3859                 :   48245300 :       if (elt == 0)
    3860                 :            :         return 0;
    3861                 :            : 
    3862                 :    5360370 :       for (elt = elt->first_same_value; elt; elt = elt->next_same_value)
    3863                 :    3967650 :         if (elt->is_const && CONSTANT_P (elt->exp))
    3864                 :     185754 :           return elt->exp;
    3865                 :            :     }
    3866                 :            : 
    3867                 :            :   return 0;
    3868                 :            : }
    3869                 :            : 
    3870                 :            : /* Given INSN, a jump insn, TAKEN indicates if we are following the
    3871                 :            :    "taken" branch.
    3872                 :            : 
    3873                 :            :    In certain cases, this can cause us to add an equivalence.  For example,
    3874                 :            :    if we are following the taken case of
    3875                 :            :         if (i == 2)
    3876                 :            :    we can add the fact that `i' and '2' are now equivalent.
    3877                 :            : 
    3878                 :            :    In any case, we can record that this comparison was passed.  If the same
    3879                 :            :    comparison is seen later, we will know its value.  */
    3880                 :            : 
    3881                 :            : static void
    3882                 :    8844250 : record_jump_equiv (rtx_insn *insn, bool taken)
    3883                 :            : {
    3884                 :    8844250 :   int cond_known_true;
    3885                 :    8844250 :   rtx op0, op1;
    3886                 :    8844250 :   rtx set;
    3887                 :    8844250 :   machine_mode mode, mode0, mode1;
    3888                 :    8844250 :   int reversed_nonequality = 0;
    3889                 :    8844250 :   enum rtx_code code;
    3890                 :            : 
    3891                 :            :   /* Ensure this is the right kind of insn.  */
    3892                 :    8844250 :   gcc_assert (any_condjump_p (insn));
    3893                 :            : 
    3894                 :    8844250 :   set = pc_set (insn);
    3895                 :            : 
    3896                 :            :   /* See if this jump condition is known true or false.  */
    3897                 :    8844250 :   if (taken)
    3898                 :    3266860 :     cond_known_true = (XEXP (SET_SRC (set), 2) == pc_rtx);
    3899                 :            :   else
    3900                 :    5577390 :     cond_known_true = (XEXP (SET_SRC (set), 1) == pc_rtx);
    3901                 :            : 
    3902                 :            :   /* Get the type of comparison being done and the operands being compared.
    3903                 :            :      If we had to reverse a non-equality condition, record that fact so we
    3904                 :            :      know that it isn't valid for floating-point.  */
    3905                 :    8844250 :   code = GET_CODE (XEXP (SET_SRC (set), 0));
    3906                 :    8844250 :   op0 = fold_rtx (XEXP (XEXP (SET_SRC (set), 0), 0), insn);
    3907                 :    8844250 :   op1 = fold_rtx (XEXP (XEXP (SET_SRC (set), 0), 1), insn);
    3908                 :            : 
    3909                 :            :   /* On a cc0 target the cc0-setter and cc0-user may end up in different
    3910                 :            :      blocks.  When that happens the tracking of the cc0-setter via
    3911                 :            :      PREV_INSN_CC0 is spoiled.  That means that fold_rtx may return
    3912                 :            :      NULL_RTX.  In those cases, there's nothing to record.  */
    3913                 :    8844250 :   if (op0 == NULL_RTX || op1 == NULL_RTX)
    3914                 :      57365 :     return;
    3915                 :            : 
    3916                 :    8844250 :   code = find_comparison_args (code, &op0, &op1, &mode0, &mode1);
    3917                 :    8844250 :   if (! cond_known_true)
    3918                 :            :     {
    3919                 :    5577390 :       code = reversed_comparison_code_parts (code, op0, op1, insn);
    3920                 :            : 
    3921                 :            :       /* Don't remember if we can't find the inverse.  */
    3922                 :    5577390 :       if (code == UNKNOWN)
    3923                 :            :         return;
    3924                 :            :     }
    3925                 :            : 
    3926                 :            :   /* The mode is the mode of the non-constant.  */
    3927                 :    8786880 :   mode = mode0;
    3928                 :    8786880 :   if (mode1 != VOIDmode)
    3929                 :    2567840 :     mode = mode1;
    3930                 :            : 
    3931                 :    8786880 :   record_jump_cond (code, mode, op0, op1, reversed_nonequality);
    3932                 :            : }
    3933                 :            : 
    3934                 :            : /* Yet another form of subreg creation.  In this case, we want something in
    3935                 :            :    MODE, and we should assume OP has MODE iff it is naturally modeless.  */
    3936                 :            : 
    3937                 :            : static rtx
    3938                 :      52622 : record_jump_cond_subreg (machine_mode mode, rtx op)
    3939                 :            : {
    3940                 :      52622 :   machine_mode op_mode = GET_MODE (op);
    3941                 :      52622 :   if (op_mode == mode || op_mode == VOIDmode)
    3942                 :            :     return op;
    3943                 :       4509 :   return lowpart_subreg (mode, op, op_mode);
    3944                 :            : }
    3945                 :            : 
    3946                 :            : /* We know that comparison CODE applied to OP0 and OP1 in MODE is true.
    3947                 :            :    REVERSED_NONEQUALITY is nonzero if CODE had to be swapped.
    3948                 :            :    Make any useful entries we can with that information.  Called from
    3949                 :            :    above function and called recursively.  */
    3950                 :            : 
    3951                 :            : static void
    3952                 :    8839500 : record_jump_cond (enum rtx_code code, machine_mode mode, rtx op0,
    3953                 :            :                   rtx op1, int reversed_nonequality)
    3954                 :            : {
    3955                 :    8839500 :   unsigned op0_hash, op1_hash;
    3956                 :    8839500 :   int op0_in_memory, op1_in_memory;
    3957                 :    8839500 :   struct table_elt *op0_elt, *op1_elt;
    3958                 :            : 
    3959                 :            :   /* If OP0 and OP1 are known equal, and either is a paradoxical SUBREG,
    3960                 :            :      we know that they are also equal in the smaller mode (this is also
    3961                 :            :      true for all smaller modes whether or not there is a SUBREG, but
    3962                 :            :      is not worth testing for with no SUBREG).  */
    3963                 :            : 
    3964                 :            :   /* Note that GET_MODE (op0) may not equal MODE.  */
    3965                 :    8867940 :   if (code == EQ && paradoxical_subreg_p (op0))
    3966                 :            :     {
    3967                 :          0 :       machine_mode inner_mode = GET_MODE (SUBREG_REG (op0));
    3968                 :          0 :       rtx tem = record_jump_cond_subreg (inner_mode, op1);
    3969                 :          0 :       if (tem)
    3970                 :          0 :         record_jump_cond (code, mode, SUBREG_REG (op0), tem,
    3971                 :            :                           reversed_nonequality);
    3972                 :            :     }
    3973                 :            : 
    3974                 :    8847690 :   if (code == EQ && paradoxical_subreg_p (op1))
    3975                 :            :     {
    3976                 :          0 :       machine_mode inner_mode = GET_MODE (SUBREG_REG (op1));
    3977                 :          0 :       rtx tem = record_jump_cond_subreg (inner_mode, op0);
    3978                 :          0 :       if (tem)
    3979                 :          0 :         record_jump_cond (code, mode, SUBREG_REG (op1), tem,
    3980                 :            :                           reversed_nonequality);
    3981                 :            :     }
    3982                 :            : 
    3983                 :            :   /* Similarly, if this is an NE comparison, and either is a SUBREG
    3984                 :            :      making a smaller mode, we know the whole thing is also NE.  */
    3985                 :            : 
    3986                 :            :   /* Note that GET_MODE (op0) may not equal MODE;
    3987                 :            :      if we test MODE instead, we can get an infinite recursion
    3988                 :            :      alternating between two modes each wider than MODE.  */
    3989                 :            : 
    3990                 :    8839500 :   if (code == NE
    3991                 :      49177 :       && partial_subreg_p (op0)
    3992                 :    8888590 :       && subreg_lowpart_p (op0))
    3993                 :            :     {
    3994                 :      48966 :       machine_mode inner_mode = GET_MODE (SUBREG_REG (op0));
    3995                 :      48966 :       rtx tem = record_jump_cond_subreg (inner_mode, op1);
    3996                 :      48966 :       if (tem)
    3997                 :      48966 :         record_jump_cond (code, mode, SUBREG_REG (op0), tem,
    3998                 :            :                           reversed_nonequality);
    3999                 :            :     }
    4000                 :            : 
    4001                 :    8839500 :   if (code == NE
    4002                 :       7028 :       && partial_subreg_p (op1)
    4003                 :    8843180 :       && subreg_lowpart_p (op1))
    4004                 :            :     {
    4005                 :       3656 :       machine_mode inner_mode = GET_MODE (SUBREG_REG (op1));
    4006                 :       3656 :       rtx tem = record_jump_cond_subreg (inner_mode, op0);
    4007                 :       3656 :       if (tem)
    4008                 :       3654 :         record_jump_cond (code, mode, SUBREG_REG (op1), tem,
    4009                 :            :                           reversed_nonequality);
    4010                 :            :     }
    4011                 :            : 
    4012                 :            :   /* Hash both operands.  */
    4013                 :            : 
    4014                 :    8839500 :   do_not_record = 0;
    4015                 :    8839500 :   hash_arg_in_memory = 0;
    4016                 :   10670600 :   op0_hash = HASH (op0, mode);
    4017                 :    8839500 :   op0_in_memory = hash_arg_in_memory;
    4018                 :            : 
    4019                 :    8839500 :   if (do_not_record)
    4020                 :            :     return;
    4021                 :            : 
    4022                 :    8839500 :   do_not_record = 0;
    4023                 :    8839500 :   hash_arg_in_memory = 0;
    4024                 :   15588400 :   op1_hash = HASH (op1, mode);
    4025                 :    8839500 :   op1_in_memory = hash_arg_in_memory;
    4026                 :            : 
    4027                 :    8839500 :   if (do_not_record)
    4028                 :            :     return;
    4029                 :            : 
    4030                 :            :   /* Look up both operands.  */
    4031                 :    8839500 :   op0_elt = lookup (op0, op0_hash, mode);
    4032                 :    8839500 :   op1_elt = lookup (op1, op1_hash, mode);
    4033                 :            : 
    4034                 :            :   /* If both operands are already equivalent or if they are not in the
    4035                 :            :      table but are identical, do nothing.  */
    4036                 :    8839500 :   if ((op0_elt != 0 && op1_elt != 0
    4037                 :    1360640 :        && op0_elt->first_same_value == op1_elt->first_same_value)
    4038                 :   10200000 :       || op0 == op1 || rtx_equal_p (op0, op1))
    4039                 :       1550 :     return;
    4040                 :            : 
    4041                 :            :   /* If we aren't setting two things equal all we can do is save this
    4042                 :            :      comparison.   Similarly if this is floating-point.  In the latter
    4043                 :            :      case, OP1 might be zero and both -0.0 and 0.0 are equal to it.
    4044                 :            :      If we record the equality, we might inadvertently delete code
    4045                 :            :      whose intent was to change -0 to +0.  */
    4046                 :            : 
    4047                 :    8837950 :   if (code != EQ || FLOAT_MODE_P (GET_MODE (op0)))
    4048                 :            :     {
    4049                 :    5603320 :       struct qty_table_elem *ent;
    4050                 :    5603320 :       int qty;
    4051                 :            : 
    4052                 :            :       /* If we reversed a floating-point comparison, if OP0 is not a
    4053                 :            :          register, or if OP1 is neither a register or constant, we can't
    4054                 :            :          do anything.  */
    4055                 :            : 
    4056                 :    5603320 :       if (!REG_P (op1))
    4057                 :    4067320 :         op1 = equiv_constant (op1);
    4058                 :            : 
    4059                 :    5603320 :       if ((reversed_nonequality && FLOAT_MODE_P (mode))
    4060                 :    5603320 :           || !REG_P (op0) || op1 == 0)
    4061                 :            :         return;
    4062                 :            : 
    4063                 :            :       /* Put OP0 in the hash table if it isn't already.  This gives it a
    4064                 :            :          new quantity number.  */
    4065                 :    4692860 :       if (op0_elt == 0)
    4066                 :            :         {
    4067                 :    1813590 :           if (insert_regs (op0, NULL, 0))
    4068                 :            :             {
    4069                 :      36101 :               rehash_using_reg (op0);
    4070                 :      64764 :               op0_hash = HASH (op0, mode);
    4071                 :            : 
    4072                 :            :               /* If OP0 is contained in OP1, this changes its hash code
    4073                 :            :                  as well.  Faster to rehash than to check, except
    4074                 :            :                  for the simple case of a constant.  */
    4075                 :      36101 :               if (! CONSTANT_P (op1))
    4076                 :        394 :                 op1_hash = HASH (op1,mode);
    4077                 :            :             }
    4078                 :            : 
    4079                 :    1813590 :           op0_elt = insert (op0, NULL, op0_hash, mode);
    4080                 :    1813590 :           op0_elt->in_memory = op0_in_memory;
    4081                 :            :         }
    4082                 :            : 
    4083                 :    4692860 :       qty = REG_QTY (REGNO (op0));
    4084                 :    4692860 :       ent = &qty_table[qty];
    4085                 :            : 
    4086                 :    4692860 :       ent->comparison_code = code;
    4087                 :    4692860 :       if (REG_P (op1))
    4088                 :            :         {
    4089                 :            :           /* Look it up again--in case op0 and op1 are the same.  */
    4090                 :    1471330 :           op1_elt = lookup (op1, op1_hash, mode);
    4091                 :            : 
    4092                 :            :           /* Put OP1 in the hash table so it gets a new quantity number.  */
    4093                 :    1471330 :           if (op1_elt == 0)
    4094                 :            :             {
    4095                 :     533380 :               if (insert_regs (op1, NULL, 0))
    4096                 :            :                 {
    4097                 :        364 :                   rehash_using_reg (op1);
    4098                 :        364 :                   op1_hash = HASH (op1, mode);
    4099                 :            :                 }
    4100                 :            : 
    4101                 :     533380 :               op1_elt = insert (op1, NULL, op1_hash, mode);
    4102                 :     533380 :               op1_elt->in_memory = op1_in_memory;
    4103                 :            :             }
    4104                 :            : 
    4105                 :    1471330 :           ent->comparison_const = NULL_RTX;
    4106                 :    1471330 :           ent->comparison_qty = REG_QTY (REGNO (op1));
    4107                 :            :         }
    4108                 :            :       else
    4109                 :            :         {
    4110                 :    3221530 :           ent->comparison_const = op1;
    4111                 :    3221530 :           ent->comparison_qty = -1;
    4112                 :            :         }
    4113                 :            : 
    4114                 :    4692860 :       return;
    4115                 :            :     }
    4116                 :            : 
    4117                 :            :   /* If either side is still missing an equivalence, make it now,
    4118                 :            :      then merge the equivalences.  */
    4119                 :            : 
    4120                 :    3234630 :   if (op0_elt == 0)
    4121                 :            :     {
    4122                 :    1986610 :       if (insert_regs (op0, NULL, 0))
    4123                 :            :         {
    4124                 :      12467 :           rehash_using_reg (op0);
    4125                 :      24934 :           op0_hash = HASH (op0, mode);
    4126                 :            :         }
    4127                 :            : 
    4128                 :    1986610 :       op0_elt = insert (op0, NULL, op0_hash, mode);
    4129                 :    1986610 :       op0_elt->in_memory = op0_in_memory;
    4130                 :            :     }
    4131                 :            : 
    4132                 :    3234630 :   if (op1_elt == 0)
    4133                 :            :     {
    4134                 :    2383330 :       if (insert_regs (op1, NULL, 0))
    4135                 :            :         {
    4136                 :       4576 :           rehash_using_reg (op1);
    4137                 :       9152 :           op1_hash = HASH (op1, mode);
    4138                 :            :         }
    4139                 :            : 
    4140                 :    2383330 :       op1_elt = insert (op1, NULL, op1_hash, mode);
    4141                 :    2383330 :       op1_elt->in_memory = op1_in_memory;
    4142                 :            :     }
    4143                 :            : 
    4144                 :    3234630 :   merge_equiv_classes (op0_elt, op1_elt);
    4145                 :            : }
    4146                 :            : 
    4147                 :            : /* CSE processing for one instruction.
    4148                 :            : 
    4149                 :            :    Most "true" common subexpressions are mostly optimized away in GIMPLE,
    4150                 :            :    but the few that "leak through" are cleaned up by cse_insn, and complex
    4151                 :            :    addressing modes are often formed here.
    4152                 :            : 
    4153                 :            :    The main function is cse_insn, and between here and that function
    4154                 :            :    a couple of helper functions is defined to keep the size of cse_insn
    4155                 :            :    within reasonable proportions.
    4156                 :            :    
    4157                 :            :    Data is shared between the main and helper functions via STRUCT SET,
    4158                 :            :    that contains all data related for every set in the instruction that
    4159                 :            :    is being processed.
    4160                 :            :    
    4161                 :            :    Note that cse_main processes all sets in the instruction.  Most
    4162                 :            :    passes in GCC only process simple SET insns or single_set insns, but
    4163                 :            :    CSE processes insns with multiple sets as well.  */
    4164                 :            : 
    4165                 :            : /* Data on one SET contained in the instruction.  */
    4166                 :            : 
    4167                 :            : struct set
    4168                 :            : {
    4169                 :            :   /* The SET rtx itself.  */
    4170                 :            :   rtx rtl;
    4171                 :            :   /* The SET_SRC of the rtx (the original value, if it is changing).  */
    4172                 :            :   rtx src;
    4173                 :            :   /* The hash-table element for the SET_SRC of the SET.  */
    4174                 :            :   struct table_elt *src_elt;
    4175                 :            :   /* Hash value for the SET_SRC.  */
    4176                 :            :   unsigned src_hash;
    4177                 :            :   /* Hash value for the SET_DEST.  */
    4178                 :            :   unsigned dest_hash;
    4179                 :            :   /* The SET_DEST, with SUBREG, etc., stripped.  */
    4180                 :            :   rtx inner_dest;
    4181                 :            :   /* Nonzero if the SET_SRC is in memory.  */
    4182                 :            :   char src_in_memory;
    4183                 :            :   /* Nonzero if the SET_SRC contains something
    4184                 :            :      whose value cannot be predicted and understood.  */
    4185                 :            :   char src_volatile;
    4186                 :            :   /* Original machine mode, in case it becomes a CONST_INT.
    4187                 :            :      The size of this field should match the size of the mode
    4188                 :            :      field of struct rtx_def (see rtl.h).  */
    4189                 :            :   ENUM_BITFIELD(machine_mode) mode : 8;
    4190                 :            :   /* Hash value of constant equivalent for SET_SRC.  */
    4191                 :            :   unsigned src_const_hash;
    4192                 :            :   /* A constant equivalent for SET_SRC, if any.  */
    4193                 :            :   rtx src_const;
    4194                 :            :   /* Table entry for constant equivalent for SET_SRC, if any.  */
    4195                 :            :   struct table_elt *src_const_elt;
    4196                 :            :   /* Table entry for the destination address.  */
    4197                 :            :   struct table_elt *dest_addr_elt;
    4198                 :            : };
    4199                 :            : 
    4200                 :            : /* Special handling for (set REG0 REG1) where REG0 is the
    4201                 :            :    "cheapest", cheaper than REG1.  After cse, REG1 will probably not
    4202                 :            :    be used in the sequel, so (if easily done) change this insn to
    4203                 :            :    (set REG1 REG0) and replace REG1 with REG0 in the previous insn
    4204                 :            :    that computed their value.  Then REG1 will become a dead store
    4205                 :            :    and won't cloud the situation for later optimizations.
    4206                 :            : 
    4207                 :            :    Do not make this change if REG1 is a hard register, because it will
    4208                 :            :    then be used in the sequel and we may be changing a two-operand insn
    4209                 :            :    into a three-operand insn.
    4210                 :            :    
    4211                 :            :    This is the last transformation that cse_insn will try to do.  */
    4212                 :            : 
    4213                 :            : static void
    4214                 :   86024300 : try_back_substitute_reg (rtx set, rtx_insn *insn)
    4215                 :            : {
    4216                 :   86024300 :   rtx dest = SET_DEST (set);
    4217                 :   86024300 :   rtx src = SET_SRC (set);
    4218                 :            : 
    4219                 :   86024300 :   if (REG_P (dest)
    4220                 :   69313700 :       && REG_P (src) && ! HARD_REGISTER_P (src)
    4221                 :   91189800 :       && REGNO_QTY_VALID_P (REGNO (src)))
    4222                 :            :     {
    4223                 :    5165540 :       int src_q = REG_QTY (REGNO (src));
    4224                 :    5165540 :       struct qty_table_elem *src_ent = &qty_table[src_q];
    4225                 :            : 
    4226                 :    5165540 :       if (src_ent->first_reg == REGNO (dest))
    4227                 :            :         {
    4228                 :            :           /* Scan for the previous nonnote insn, but stop at a basic
    4229                 :            :              block boundary.  */
    4230                 :    1212290 :           rtx_insn *prev = insn;
    4231                 :    1212290 :           rtx_insn *bb_head = BB_HEAD (BLOCK_FOR_INSN (insn));
    4232                 :    2791620 :           do
    4233                 :            :             {
    4234                 :    2791620 :               prev = PREV_INSN (prev);
    4235                 :            :             }
    4236                 :    2791620 :           while (prev != bb_head && (NOTE_P (prev) || DEBUG_INSN_P (prev)));
    4237                 :            : 
    4238                 :            :           /* Do not swap the registers around if the previous instruction
    4239                 :            :              attaches a REG_EQUIV note to REG1.
    4240                 :            : 
    4241                 :            :              ??? It's not entirely clear whether we can transfer a REG_EQUIV
    4242                 :            :              from the pseudo that originally shadowed an incoming argument
    4243                 :            :              to another register.  Some uses of REG_EQUIV might rely on it
    4244                 :            :              being attached to REG1 rather than REG2.
    4245                 :            : 
    4246                 :            :              This section previously turned the REG_EQUIV into a REG_EQUAL
    4247                 :            :              note.  We cannot do that because REG_EQUIV may provide an
    4248                 :            :              uninitialized stack slot when REG_PARM_STACK_SPACE is used.  */
    4249                 :    1212290 :           if (NONJUMP_INSN_P (prev)
    4250                 :     806935 :               && GET_CODE (PATTERN (prev)) == SET
    4251                 :     620549 :               && SET_DEST (PATTERN (prev)) == src
    4252                 :    1316710 :               && ! find_reg_note (prev, REG_EQUIV, NULL_RTX))
    4253                 :            :             {
    4254                 :     104348 :               rtx note;
    4255                 :            : 
    4256                 :     104348 :               validate_change (prev, &SET_DEST (PATTERN (prev)), dest, 1);
    4257                 :     104348 :               validate_change (insn, &SET_DEST (set), src, 1);
    4258                 :     104348 :               validate_change (insn, &SET_SRC (set), dest, 1);
    4259                 :     104348 :               apply_change_group ();
    4260                 :            : 
    4261                 :            :               /* If INSN has a REG_EQUAL note, and this note mentions
    4262                 :            :                  REG0, then we must delete it, because the value in
    4263                 :            :                  REG0 has changed.  If the note's value is REG1, we must
    4264                 :            :                  also delete it because that is now this insn's dest.  */
    4265                 :     104348 :               note = find_reg_note (insn, REG_EQUAL, NULL_RTX);
    4266                 :     104348 :               if (note != 0
    4267                 :     104348 :                   && (reg_mentioned_p (dest, XEXP (note, 0))
    4268                 :       2165 :                       || rtx_equal_p (src, XEXP (note, 0))))
    4269                 :          0 :                 remove_note (insn, note);
    4270                 :            : 
    4271                 :            :               /* If INSN has a REG_ARGS_SIZE note, move it to PREV.  */
    4272                 :     104348 :               note = find_reg_note (insn, REG_ARGS_SIZE, NULL_RTX);
    4273                 :     104348 :               if (note != 0)
    4274                 :            :                 {
    4275                 :          0 :                   remove_note (insn, note);
    4276                 :          0 :                   gcc_assert (!find_reg_note (prev, REG_ARGS_SIZE, NULL_RTX));
    4277                 :          0 :                   set_unique_reg_note (prev, REG_ARGS_SIZE, XEXP (note, 0));
    4278                 :            :                 }
    4279                 :            :             }
    4280                 :            :         }
    4281                 :            :     }
    4282                 :   86024300 : }
    4283                 :            : 
    4284                 :            : /* Record all the SETs in this instruction into SETS_PTR,
    4285                 :            :    and return the number of recorded sets.  */
    4286                 :            : static int
    4287                 :  232509000 : find_sets_in_insn (rtx_insn *insn, struct set **psets)
    4288                 :            : {
    4289                 :  232509000 :   struct set *sets = *psets;
    4290                 :  232509000 :   int n_sets = 0;
    4291                 :  232509000 :   rtx x = PATTERN (insn);
    4292                 :            : 
    4293                 :  232509000 :   if (GET_CODE (x) == SET)
    4294                 :            :     {
    4295                 :            :       /* Ignore SETs that are unconditional jumps.
    4296                 :            :          They never need cse processing, so this does not hurt.
    4297                 :            :          The reason is not efficiency but rather
    4298                 :            :          so that we can test at the end for instructions
    4299                 :            :          that have been simplified to unconditional jumps
    4300                 :            :          and not be misled by unchanged instructions
    4301                 :            :          that were unconditional jumps to begin with.  */
    4302                 :  106560000 :       if (SET_DEST (x) == pc_rtx
    4303                 :   12085700 :           && GET_CODE (SET_SRC (x)) == LABEL_REF)
    4304                 :            :         ;
    4305                 :            :       /* Don't count call-insns, (set (reg 0) (call ...)), as a set.
    4306                 :            :          The hard function value register is used only once, to copy to
    4307                 :            :          someplace else, so it isn't worth cse'ing.  */
    4308                 :  106559000 :       else if (GET_CODE (SET_SRC (x)) == CALL)
    4309                 :            :         ;
    4310                 :            :       else
    4311                 :  102468000 :         sets[n_sets++].rtl = x;
    4312                 :            :     }
    4313                 :  125948000 :   else if (GET_CODE (x) == PARALLEL)
    4314                 :            :     {
    4315                 :   19462400 :       int i, lim = XVECLEN (x, 0);
    4316                 :            : 
    4317                 :            :       /* Go over the expressions of the PARALLEL in forward order, to
    4318                 :            :          put them in the same order in the SETS array.  */
    4319                 :   59579400 :       for (i = 0; i < lim; i++)
    4320                 :            :         {
    4321                 :   40117000 :           rtx y = XVECEXP (x, 0, i);
    4322                 :   40117000 :           if (GET_CODE (y) == SET)
    4323                 :            :             {
    4324                 :            :               /* As above, we ignore unconditional jumps and call-insns and
    4325                 :            :                  ignore the result of apply_change_group.  */
    4326                 :   20209000 :               if (SET_DEST (y) == pc_rtx
    4327                 :       8734 :                   && GET_CODE (SET_SRC (y)) == LABEL_REF)
    4328                 :            :                 ;
    4329                 :   20209000 :               else if (GET_CODE (SET_SRC (y)) == CALL)
    4330                 :            :                 ;
    4331                 :            :               else
    4332                 :   20199600 :                 sets[n_sets++].rtl = y;
    4333                 :            :             }
    4334                 :            :         }
    4335                 :            :     }
    4336                 :            : 
    4337                 :  232509000 :   return n_sets;
    4338                 :            : }
    4339                 :            : 
    4340                 :            : /* Subroutine of canonicalize_insn.  X is an ASM_OPERANDS in INSN.  */
    4341                 :            : 
    4342                 :            : static void
    4343                 :      84681 : canon_asm_operands (rtx x, rtx_insn *insn)
    4344                 :            : {
    4345                 :     104380 :   for (int i = ASM_OPERANDS_INPUT_LENGTH (x) - 1; i >= 0; i--)
    4346                 :            :     {
    4347                 :      19699 :       rtx input = ASM_OPERANDS_INPUT (x, i);
    4348                 :      19699 :       if (!(REG_P (input) && HARD_REGISTER_P (input)))
    4349                 :            :         {
    4350                 :      19552 :           input = canon_reg (input, insn);
    4351                 :      19552 :           validate_change (insn, &ASM_OPERANDS_INPUT (x, i), input, 1);
    4352                 :            :         }
    4353                 :            :     }
    4354                 :      84681 : }
    4355                 :            : 
    4356                 :            : /* Where possible, substitute every register reference in the N_SETS
    4357                 :            :    number of SETS in INSN with the canonical register.
    4358                 :            : 
    4359                 :            :    Register canonicalization propagatest the earliest register (i.e.
    4360                 :            :    one that is set before INSN) with the same value.  This is a very
    4361                 :            :    useful, simple form of CSE, to clean up warts from expanding GIMPLE
    4362                 :            :    to RTL.  For instance, a CONST for an address is usually expanded
    4363                 :            :    multiple times to loads into different registers, thus creating many
    4364                 :            :    subexpressions of the form:
    4365                 :            : 
    4366                 :            :    (set (reg1) (some_const))
    4367                 :            :    (set (mem (... reg1 ...) (thing)))
    4368                 :            :    (set (reg2) (some_const))
    4369                 :            :    (set (mem (... reg2 ...) (thing)))
    4370                 :            : 
    4371                 :            :    After canonicalizing, the code takes the following form:
    4372                 :            : 
    4373                 :            :    (set (reg1) (some_const))
    4374                 :            :    (set (mem (... reg1 ...) (thing)))
    4375                 :            :    (set (reg2) (some_const))
    4376                 :            :    (set (mem (... reg1 ...) (thing)))
    4377                 :            : 
    4378                 :            :    The set to reg2 is now trivially dead, and the memory reference (or
    4379                 :            :    address, or whatever) may be a candidate for further CSEing.
    4380                 :            : 
    4381                 :            :    In this function, the result of apply_change_group can be ignored;
    4382                 :            :    see canon_reg.  */
    4383                 :            : 
    4384                 :            : static void
    4385                 :  232509000 : canonicalize_insn (rtx_insn *insn, struct set **psets, int n_sets)
    4386                 :            : {
    4387                 :  232509000 :   struct set *sets = *psets;
    4388                 :  232509000 :   rtx tem;
    4389                 :  232509000 :   rtx x = PATTERN (insn);
    4390                 :  232509000 :   int i;
    4391                 :            : 
    4392                 :  232509000 :   if (CALL_P (insn))
    4393                 :            :     {
    4394                 :   26251000 :       for (tem = CALL_INSN_FUNCTION_USAGE (insn); tem; tem = XEXP (tem, 1))
    4395                 :   16159700 :         if (GET_CODE (XEXP (tem, 0)) != SET)
    4396                 :   16097000 :           XEXP (tem, 0) = canon_reg (XEXP (tem, 0), insn);
    4397                 :            :     }
    4398                 :            : 
    4399                 :  232509000 :   if (GET_CODE (x) == SET && GET_CODE (SET_SRC (x)) == CALL)
    4400                 :            :     {
    4401                 :    4091540 :       canon_reg (SET_SRC (x), insn);
    4402                 :    4091540 :       apply_change_group ();
    4403                 :    4091540 :       fold_rtx (SET_SRC (x), insn);
    4404                 :            :     }
    4405                 :  228417000 :   else if (GET_CODE (x) == CLOBBER)
    4406                 :            :     {
    4407                 :            :       /* If we clobber memory, canon the address.
    4408                 :            :          This does nothing when a register is clobbered
    4409                 :            :          because we have already invalidated the reg.  */
    4410                 :      67257 :       if (MEM_P (XEXP (x, 0)))
    4411                 :      10412 :         canon_reg (XEXP (x, 0), insn);
    4412                 :            :     }
    4413                 :  228350000 :   else if (GET_CODE (x) == USE
    4414                 :  228350000 :            && ! (REG_P (XEXP (x, 0))
    4415                 :     824356 :                  && REGNO (XEXP (x, 0)) < FIRST_PSEUDO_REGISTER))
    4416                 :            :     /* Canonicalize a USE of a pseudo register or memory location.  */
    4417                 :          0 :     canon_reg (x, insn);
    4418                 :  228350000 :   else if (GET_CODE (x) == ASM_OPERANDS)
    4419                 :          0 :     canon_asm_operands (x, insn);
    4420                 :  228350000 :   else if (GET_CODE (x) == CALL)
    4421                 :            :     {
    4422                 :    5573140 :       canon_reg (x, insn);
    4423                 :    5573140 :       apply_change_group ();
    4424                 :    5573140 :       fold_rtx (x, insn);
    4425                 :            :     }
    4426                 :  222777000 :   else if (DEBUG_INSN_P (insn))
    4427                 :   99513200 :     canon_reg (PATTERN (insn), insn);
    4428                 :  123263000 :   else if (GET_CODE (x) == PARALLEL)
    4429                 :            :     {
    4430                 :   59579400 :       for (i = XVECLEN (x, 0) - 1; i >= 0; i--)
    4431                 :            :         {
    4432                 :   40117000 :           rtx y = XVECEXP (x, 0, i);
    4433                 :   40117000 :           if (GET_CODE (y) == SET && GET_CODE (SET_SRC (y)) == CALL)
    4434                 :            :             {
    4435                 :       9481 :               canon_reg (SET_SRC (y), insn);
    4436                 :       9481 :               apply_change_group ();
    4437                 :       9481 :               fold_rtx (SET_SRC (y), insn);
    4438                 :            :             }
    4439                 :   40107500 :           else if (GET_CODE (y) == CLOBBER)
    4440                 :            :             {
    4441                 :   19113200 :               if (MEM_P (XEXP (y, 0)))
    4442                 :      48927 :                 canon_reg (XEXP (y, 0), insn);
    4443                 :            :             }
    4444                 :   20994300 :           else if (GET_CODE (y) == USE
    4445                 :   20994300 :                    && ! (REG_P (XEXP (y, 0))
    4446                 :     250388 :                          && REGNO (XEXP (y, 0)) < FIRST_PSEUDO_REGISTER))
    4447                 :     262713 :             canon_reg (y, insn);
    4448                 :   20731600 :           else if (GET_CODE (y) == ASM_OPERANDS)
    4449                 :      84681 :             canon_asm_operands (y, insn);
    4450                 :   20646900 :           else if (GET_CODE (y) == CALL)
    4451                 :            :             {
    4452                 :     417172 :               canon_reg (y, insn);
    4453                 :     417172 :               apply_change_group ();
    4454                 :     417172 :               fold_rtx (y, insn);
    4455                 :            :             }
    4456                 :            :         }
    4457                 :            :     }
    4458                 :            : 
    4459                 :  121279000 :   if (n_sets == 1 && REG_NOTES (insn) != 0
    4460                 :  310133000 :       && (tem = find_reg_note (insn, REG_EQUAL, NULL_RTX)) != 0)
    4461                 :            :     {
    4462                 :            :       /* We potentially will process this insn many times.  Therefore,
    4463                 :            :          drop the REG_EQUAL note if it is equal to the SET_SRC of the
    4464                 :            :          unique set in INSN.
    4465                 :            : 
    4466                 :            :          Do not do so if the REG_EQUAL note is for a STRICT_LOW_PART,
    4467                 :            :          because cse_insn handles those specially.  */
    4468                 :    5191950 :       if (GET_CODE (SET_DEST (sets[0].rtl)) != STRICT_LOW_PART
    4469                 :    5191950 :           && rtx_equal_p (XEXP (tem, 0), SET_SRC (sets[0].rtl)))
    4470                 :      50635 :         remove_note (insn, tem);
    4471                 :            :       else
    4472                 :            :         {
    4473                 :    5141310 :           canon_reg (XEXP (tem, 0), insn);
    4474                 :    5141310 :           apply_change_group ();
    4475                 :    5141310 :           XEXP (tem, 0) = fold_rtx (XEXP (tem, 0), insn);
    4476                 :    5141310 :           df_notes_rescan (insn);
    4477                 :            :         }
    4478                 :            :     }
    4479                 :            : 
    4480                 :            :   /* Canonicalize sources and addresses of destinations.
    4481                 :            :      We do this in a separate pass to avoid problems when a MATCH_DUP is
    4482                 :            :      present in the insn pattern.  In that case, we want to ensure that
    4483                 :            :      we don't break the duplicate nature of the pattern.  So we will replace
    4484                 :            :      both operands at the same time.  Otherwise, we would fail to find an
    4485                 :            :      equivalent substitution in the loop calling validate_change below.
    4486                 :            : 
    4487                 :            :      We used to suppress canonicalization of DEST if it appears in SRC,
    4488                 :            :      but we don't do this any more.  */
    4489                 :            : 
    4490                 :  355176000 :   for (i = 0; i < n_sets; i++)
    4491                 :            :     {
    4492                 :  122667000 :       rtx dest = SET_DEST (sets[i].rtl);
    4493                 :  122667000 :       rtx src = SET_SRC (sets[i].rtl);
    4494                 :  122667000 :       rtx new_rtx = canon_reg (src, insn);
    4495                 :            : 
    4496                 :  122667000 :       validate_change (insn, &SET_SRC (sets[i].rtl), new_rtx, 1);
    4497                 :            : 
    4498                 :  122667000 :       if (GET_CODE (dest) == ZERO_EXTRACT)
    4499                 :            :         {
    4500                 :       2719 :           validate_change (insn, &XEXP (dest, 1),
    4501                 :            :                            canon_reg (XEXP (dest, 1), insn), 1);
    4502                 :       2719 :           validate_change (insn, &XEXP (dest, 2),
    4503                 :            :                            canon_reg (XEXP (dest, 2), insn), 1);
    4504                 :            :         }
    4505                 :            : 
    4506                 :  123482000 :       while (GET_CODE (dest) == SUBREG
    4507                 :  123482000 :              || GET_CODE (dest) == ZERO_EXTRACT
    4508                 :  123482000 :              || GET_CODE (dest) == STRICT_LOW_PART)
    4509                 :     814220 :         dest = XEXP (dest, 0);
    4510                 :            : 
    4511                 :  122667000 :       if (MEM_P (dest))
    4512                 :   22491900 :         canon_reg (dest, insn);
    4513                 :            :     }
    4514                 :            : 
    4515                 :            :   /* Now that we have done all the replacements, we can apply the change
    4516                 :            :      group and see if they all work.  Note that this will cause some
    4517                 :            :      canonicalizations that would have worked individually not to be applied
    4518                 :            :      because some other canonicalization didn't work, but this should not
    4519                 :            :      occur often.
    4520                 :            : 
    4521                 :            :      The result of apply_change_group can be ignored; see canon_reg.  */
    4522                 :            : 
    4523                 :  232509000 :   apply_change_group ();
    4524                 :  232509000 : }
    4525                 :            : 
    4526                 :            : /* Main function of CSE.
    4527                 :            :    First simplify sources and addresses of all assignments
    4528                 :            :    in the instruction, using previously-computed equivalents values.
    4529                 :            :    Then install the new sources and destinations in the table
    4530                 :            :    of available values.  */
    4531                 :            : 
    4532                 :            : static void
    4533                 :  232509000 : cse_insn (rtx_insn *insn)
    4534                 :            : {
    4535                 :  232509000 :   rtx x = PATTERN (insn);
    4536                 :  232509000 :   int i;
    4537                 :  232509000 :   rtx tem;
    4538                 :  232509000 :   int n_sets = 0;
    4539                 :            : 
    4540                 :  232509000 :   rtx src_eqv = 0;
    4541                 :  232509000 :   struct table_elt *src_eqv_elt = 0;
    4542                 :  232509000 :   int src_eqv_volatile = 0;
    4543                 :  232509000 :   int src_eqv_in_memory = 0;
    4544                 :  232509000 :   unsigned src_eqv_hash = 0;
    4545                 :            : 
    4546                 :  232509000 :   struct set *sets = (struct set *) 0;
    4547                 :            : 
    4548                 :  232509000 :   if (GET_CODE (x) == SET)
    4549                 :  106560000 :     sets = XALLOCA (struct set);
    4550                 :  125948000 :   else if (GET_CODE (x) == PARALLEL)
    4551                 :   19462400 :     sets = XALLOCAVEC (struct set, XVECLEN (x, 0));
    4552                 :            : 
    4553                 :  232509000 :   this_insn = insn;
    4554                 :            :   /* Records what this insn does to set CC0.  */
    4555                 :  232509000 :   this_insn_cc0 = 0;
    4556                 :  232509000 :   this_insn_cc0_mode = VOIDmode;
    4557                 :            : 
    4558                 :            :   /* Find all regs explicitly clobbered in this insn,
    4559                 :            :      to ensure they are not replaced with any other regs
    4560                 :            :      elsewhere in this insn.  */
    4561                 :  232509000 :   invalidate_from_sets_and_clobbers (insn);
    4562                 :            : 
    4563                 :            :   /* Record all the SETs in this instruction.  */
    4564                 :  232509000 :   n_sets = find_sets_in_insn (insn, &sets);
    4565                 :            : 
    4566                 :            :   /* Substitute the canonical register where possible.  */
    4567                 :  232509000 :   canonicalize_insn (insn, &sets, n_sets);
    4568                 :            : 
    4569                 :            :   /* If this insn has a REG_EQUAL note, store the equivalent value in SRC_EQV,
    4570                 :            :      if different, or if the DEST is a STRICT_LOW_PART/ZERO_EXTRACT.  The
    4571                 :            :      latter condition is necessary because SRC_EQV is handled specially for
    4572                 :            :      this case, and if it isn't set, then there will be no equivalence
    4573                 :            :      for the destination.  */
    4574                 :  121279000 :   if (n_sets == 1 && REG_NOTES (insn) != 0
    4575                 :  310109000 :       && (tem = find_reg_note (insn, REG_EQUAL, NULL_RTX)) != 0)
    4576                 :            :     {
    4577                 :            : 
    4578                 :    5141310 :       if (GET_CODE (SET_DEST (sets[0].rtl)) != ZERO_EXTRACT
    4579                 :    5141310 :           && (! rtx_equal_p (XEXP (tem, 0), SET_SRC (sets[0].rtl))
    4580                 :       8389 :               || GET_CODE (SET_DEST (sets[0].rtl)) == STRICT_LOW_PART))
    4581                 :    5132920 :         src_eqv = copy_rtx (XEXP (tem, 0));
    4582                 :            :       /* If DEST is of the form ZERO_EXTACT, as in:
    4583                 :            :          (set (zero_extract:SI (reg:SI 119)
    4584                 :            :                   (const_int 16 [0x10])
    4585                 :            :                   (const_int 16 [0x10]))
    4586                 :            :               (const_int 51154 [0xc7d2]))
    4587                 :            :          REG_EQUAL note will specify the value of register (reg:SI 119) at this
    4588                 :            :          point.  Note that this is different from SRC_EQV. We can however
    4589                 :            :          calculate SRC_EQV with the position and width of ZERO_EXTRACT.  */
    4590                 :       8389 :       else if (GET_CODE (SET_DEST (sets[0].rtl)) == ZERO_EXTRACT
    4591                 :          0 :                && CONST_INT_P (XEXP (tem, 0))
    4592                 :          0 :                && CONST_INT_P (XEXP (SET_DEST (sets[0].rtl), 1))
    4593                 :          0 :                && CONST_INT_P (XEXP (SET_DEST (sets[0].rtl), 2)))
    4594                 :            :         {
    4595                 :          0 :           rtx dest_reg = XEXP (SET_DEST (sets[0].rtl), 0);
    4596                 :            :           /* This is the mode of XEXP (tem, 0) as well.  */
    4597                 :          0 :           scalar_int_mode dest_mode
    4598                 :          0 :             = as_a <scalar_int_mode> (GET_MODE (dest_reg));
    4599                 :          0 :           rtx width = XEXP (SET_DEST (sets[0].rtl), 1);
    4600                 :          0 :           rtx pos = XEXP (SET_DEST (sets[0].rtl), 2);
    4601                 :          0 :           HOST_WIDE_INT val = INTVAL (XEXP (tem, 0));
    4602                 :          0 :           HOST_WIDE_INT mask;
    4603                 :          0 :           unsigned int shift;
    4604                 :          0 :           if (BITS_BIG_ENDIAN)
    4605                 :            :             shift = (GET_MODE_PRECISION (dest_mode)
    4606                 :            :                      - INTVAL (pos) - INTVAL (width));
    4607                 :            :           else
    4608                 :          0 :             shift = INTVAL (pos);
    4609                 :          0 :           if (INTVAL (width) == HOST_BITS_PER_WIDE_INT)
    4610                 :            :             mask = HOST_WIDE_INT_M1;
    4611                 :            :           else
    4612                 :          0 :             mask = (HOST_WIDE_INT_1 << INTVAL (width)) - 1;
    4613                 :          0 :           val = (val >> shift) & mask;
    4614                 :          0 :           src_eqv = GEN_INT (val);
    4615                 :            :         }
    4616                 :            :     }
    4617                 :            : 
    4618                 :            :   /* Set sets[i].src_elt to the class each source belongs to.
    4619                 :            :      Detect assignments from or to volatile things
    4620                 :            :      and set set[i] to zero so they will be ignored
    4621                 :            :      in the rest of this function.
    4622                 :            : 
    4623                 :            :      Nothing in this loop changes the hash table or the register chains.  */
    4624                 :            : 
    4625                 :  355176000 :   for (i = 0; i < n_sets; i++)
    4626                 :            :     {
    4627                 :  122667000 :       bool repeat = false;
    4628                 :  122667000 :       bool noop_insn = false;
    4629                 :  122667000 :       rtx src, dest;
    4630                 :  122667000 :       rtx src_folded;
    4631                 :  122667000 :       struct table_elt *elt = 0, *p;
    4632                 :  122667000 :       machine_mode mode;
    4633                 :  122667000 :       rtx src_eqv_here;
    4634                 :  122667000 :       rtx src_const = 0;
    4635                 :  122667000 :       rtx src_related = 0;
    4636                 :  122667000 :       bool src_related_is_const_anchor = false;
    4637                 :  122667000 :       struct table_elt *src_const_elt = 0;
    4638                 :  122667000 :       int src_cost = MAX_COST;
    4639                 :  122667000 :       int src_eqv_cost = MAX_COST;
    4640                 :  122667000 :       int src_folded_cost = MAX_COST;
    4641                 :  122667000 :       int src_related_cost = MAX_COST;
    4642                 :  122667000 :       int src_elt_cost = MAX_COST;
    4643                 :  122667000 :       int src_regcost = MAX_COST;
    4644                 :  122667000 :       int src_eqv_regcost = MAX_COST;
    4645                 :  122667000 :       int src_folded_regcost = MAX_COST;
    4646                 :  122667000 :       int src_related_regcost = MAX_COST;
    4647                 :  122667000 :       int src_elt_regcost = MAX_COST;
    4648                 :            :       /* Set nonzero if we need to call force_const_mem on with the
    4649                 :            :          contents of src_folded before using it.  */
    4650                 :  122667000 :       int src_folded_force_flag = 0;
    4651                 :  122667000 :       scalar_int_mode int_mode;
    4652                 :            : 
    4653                 :  122667000 :       dest = SET_DEST (sets[i].rtl);
    4654                 :  122667000 :       src = SET_SRC (sets[i].rtl);
    4655                 :            : 
    4656                 :            :       /* If SRC is a constant that has no machine mode,
    4657                 :            :          hash it with the destination's machine mode.
    4658                 :            :          This way we can keep different modes separate.  */
    4659                 :            : 
    4660                 :  122667000 :       mode = GET_MODE (src) == VOIDmode ? GET_MODE (dest) : GET_MODE (src);
    4661                 :  122667000 :       sets[i].mode = mode;
    4662                 :            : 
    4663                 :  122667000 :       if (src_eqv)
    4664                 :            :         {
    4665                 :    5132920 :           machine_mode eqvmode = mode;
    4666                 :    5132920 :           if (GET_CODE (dest) == STRICT_LOW_PART)
    4667                 :          0 :             eqvmode = GET_MODE (SUBREG_REG (XEXP (dest, 0)));
    4668                 :    5132920 :           do_not_record = 0;
    4669                 :    5132920 :           hash_arg_in_memory = 0;
    4670                 :   10265800 :           src_eqv_hash = HASH (src_eqv, eqvmode);
    4671                 :            : 
    4672                 :            :           /* Find the equivalence class for the equivalent expression.  */
    4673                 :            : 
    4674                 :    5132920 :           if (!do_not_record)
    4675                 :    5130420 :             src_eqv_elt = lookup (src_eqv, src_eqv_hash, eqvmode);
    4676                 :            : 
    4677                 :    5132920 :           src_eqv_volatile = do_not_record;
    4678                 :    5132920 :           src_eqv_in_memory = hash_arg_in_memory;
    4679                 :            :         }
    4680                 :            : 
    4681                 :            :       /* If this is a STRICT_LOW_PART assignment, src_eqv corresponds to the
    4682                 :            :          value of the INNER register, not the destination.  So it is not
    4683                 :            :          a valid substitution for the source.  But save it for later.  */
    4684                 :  122667000 :       if (GET_CODE (dest) == STRICT_LOW_PART)
    4685                 :            :         src_eqv_here = 0;
    4686                 :            :       else
    4687                 :  122654000 :         src_eqv_here = src_eqv;
    4688                 :            : 
    4689                 :            :       /* Simplify and foldable subexpressions in SRC.  Then get the fully-
    4690                 :            :          simplified result, which may not necessarily be valid.  */
    4691                 :  122667000 :       src_folded = fold_rtx (src, NULL);
    4692                 :            : 
    4693                 :            : #if 0
    4694                 :            :       /* ??? This caused bad code to be generated for the m68k port with -O2.
    4695                 :            :          Suppose src is (CONST_INT -1), and that after truncation src_folded
    4696                 :            :          is (CONST_INT 3).  Suppose src_folded is then used for src_const.
    4697                 :            :          At the end we will add src and src_const to the same equivalence
    4698                 :            :          class.  We now have 3 and -1 on the same equivalence class.  This
    4699                 :            :          causes later instructions to be mis-optimized.  */
    4700                 :            :       /* If storing a constant in a bitfield, pre-truncate the constant
    4701                 :            :          so we will be able to record it later.  */
    4702                 :            :       if (GET_CODE (SET_DEST (sets[i].rtl)) == ZERO_EXTRACT)
    4703                 :            :         {
    4704                 :            :           rtx width = XEXP (SET_DEST (sets[i].rtl), 1);
    4705                 :            : 
    4706                 :            :           if (CONST_INT_P (src)
    4707                 :            :               && CONST_INT_P (width)
    4708                 :            :               && INTVAL (width) < HOST_BITS_PER_WIDE_INT
    4709                 :            :               && (INTVAL (src) & ((HOST_WIDE_INT) (-1) << INTVAL (width))))
    4710                 :            :             src_folded
    4711                 :            :               = GEN_INT (INTVAL (src) & ((HOST_WIDE_INT_1
    4712                 :            :                                           << INTVAL (width)) - 1));
    4713                 :            :         }
    4714                 :            : #endif
    4715                 :            : 
    4716                 :            :       /* Compute SRC's hash code, and also notice if it
    4717                 :            :          should not be recorded at all.  In that case,
    4718                 :            :          prevent any further processing of this assignment.  */
    4719                 :  122667000 :       do_not_record = 0;
    4720                 :  122667000 :       hash_arg_in_memory = 0;
    4721                 :            : 
    4722                 :  122667000 :       sets[i].src = src;
    4723                 :  217683000 :       sets[i].src_hash = HASH (src, mode);
    4724                 :  122667000 :       sets[i].src_volatile = do_not_record;
    4725                 :  122667000 :       sets[i].src_in_memory = hash_arg_in_memory;
    4726                 :            : 
    4727                 :            :       /* If SRC is a MEM, there is a REG_EQUIV note for SRC, and DEST is
    4728                 :            :          a pseudo, do not record SRC.  Using SRC as a replacement for
    4729                 :            :          anything else will be incorrect in that situation.  Note that
    4730                 :            :          this usually occurs only for stack slots, in which case all the
    4731                 :            :          RTL would be referring to SRC, so we don't lose any optimization
    4732                 :            :          opportunities by not having SRC in the hash table.  */
    4733                 :            : 
    4734                 :  122667000 :       if (MEM_P (src)
    4735                 :   16861900 :           && find_reg_note (insn, REG_EQUIV, NULL_RTX) != 0
    4736                 :     634891 :           && REG_P (dest)
    4737                 :  123302000 :           && REGNO (dest) >= FIRST_PSEUDO_REGISTER)
    4738                 :     634891 :         sets[i].src_volatile = 1;
    4739                 :            : 
    4740                 :  122032000 :       else if (GET_CODE (src) == ASM_OPERANDS
    4741                 :     194489 :                && GET_CODE (x) == PARALLEL)
    4742                 :            :         {
    4743                 :            :           /* Do not record result of a non-volatile inline asm with
    4744                 :            :              more than one result.  */
    4745                 :     194465 :           if (n_sets > 1)
    4746                 :     169874 :             sets[i].src_volatile = 1;
    4747                 :            : 
    4748                 :     194465 :           int j, lim = XVECLEN (x, 0);
    4749                 :    1037460 :           for (j = 0; j < lim; j++)
    4750                 :            :             {
    4751                 :     844546 :               rtx y = XVECEXP (x, 0, j);
    4752                 :            :               /* And do not record result of a non-volatile inline asm
    4753                 :            :                  with "memory" clobber.  */
    4754                 :     844546 :               if (GET_CODE (y) == CLOBBER && MEM_P (XEXP (y, 0)))
    4755                 :            :                 {
    4756                 :       1547 :                   sets[i].src_volatile = 1;
    4757                 :       1547 :                   break;
    4758                 :            :                 }
    4759                 :            :             }
    4760                 :            :         }
    4761                 :            : 
    4762                 :            : #if 0
    4763                 :            :       /* It is no longer clear why we used to do this, but it doesn't
    4764                 :            :          appear to still be needed.  So let's try without it since this
    4765                 :            :          code hurts cse'ing widened ops.  */
    4766                 :            :       /* If source is a paradoxical subreg (such as QI treated as an SI),
    4767                 :            :          treat it as volatile.  It may do the work of an SI in one context
    4768                 :            :          where the extra bits are not being used, but cannot replace an SI
    4769                 :            :          in general.  */
    4770                 :            :       if (paradoxical_subreg_p (src))
    4771                 :            :         sets[i].src_volatile = 1;
    4772                 :            : #endif
    4773                 :            : 
    4774                 :            :       /* Locate all possible equivalent forms for SRC.  Try to replace
    4775                 :            :          SRC in the insn with each cheaper equivalent.
    4776                 :            : 
    4777                 :            :          We have the following types of equivalents: SRC itself, a folded
    4778                 :            :          version, a value given in a REG_EQUAL note, or a value related
    4779                 :            :          to a constant.
    4780                 :            : 
    4781                 :            :          Each of these equivalents may be part of an additional class
    4782                 :            :          of equivalents (if more than one is in the table, they must be in
    4783                 :            :          the same class; we check for this).
    4784                 :            : 
    4785                 :            :          If the source is volatile, we don't do any table lookups.
    4786                 :            : 
    4787                 :            :          We note any constant equivalent for possible later use in a
    4788                 :            :          REG_NOTE.  */
    4789                 :            : 
    4790                 :  122667000 :       if (!sets[i].src_volatile)
    4791                 :  101412000 :         elt = lookup (src, sets[i].src_hash, mode);
    4792                 :            : 
    4793                 :  122667000 :       sets[i].src_elt = elt;
    4794                 :            : 
    4795                 :  122667000 :       if (elt && src_eqv_here && src_eqv_elt)
    4796                 :            :         {
    4797                 :    1741600 :           if (elt->first_same_value != src_eqv_elt->first_same_value)
    4798                 :            :             {
    4799                 :            :               /* The REG_EQUAL is indicating that two formerly distinct
    4800                 :            :                  classes are now equivalent.  So merge them.  */
    4801                 :       6806 :               merge_equiv_classes (elt, src_eqv_elt);
    4802                 :       6806 :               src_eqv_hash = HASH (src_eqv, elt->mode);
    4803                 :       6806 :               src_eqv_elt = lookup (src_eqv, src_eqv_hash, elt->mode);
    4804                 :            :             }
    4805                 :            : 
    4806                 :            :           src_eqv_here = 0;
    4807                 :            :         }
    4808                 :            : 
    4809                 :  120926000 :       else if (src_eqv_elt)
    4810                 :     201288 :         elt = src_eqv_elt;
    4811                 :            : 
    4812                 :            :       /* Try to find a constant somewhere and record it in `src_const'.
    4813                 :            :          Record its table element, if any, in `src_const_elt'.  Look in
    4814                 :            :          any known equivalences first.  (If the constant is not in the
    4815                 :            :          table, also set `sets[i].src_const_hash').  */
    4816                 :  122667000 :       if (elt)
    4817                 :   64386700 :         for (p = elt->first_same_value; p; p = p->next_same_value)
    4818                 :   52010200 :           if (p->is_const)
    4819                 :            :             {
    4820                 :   11051400 :               src_const = p->exp;
    4821                 :   11051400 :               src_const_elt = elt;
    4822                 :   11051400 :               break;
    4823                 :            :             }
    4824                 :            : 
    4825                 :   23428000 :       if (src_const == 0
    4826                 :  111616000 :           && (CONSTANT_P (src_folded)
    4827                 :            :               /* Consider (minus (label_ref L1) (label_ref L2)) as
    4828                 :            :                  "constant" here so we will record it. This allows us
    4829                 :            :                  to fold switch statements when an ADDR_DIFF_VEC is used.  */
    4830                 :   95534400 :               || (GET_CODE (src_folded) == MINUS
    4831                 :    1126140 :                   && GET_CODE (XEXP (src_folded, 0)) == LABEL_REF
    4832                 :         95 :                   && GET_CODE (XEXP (src_folded, 1)) == LABEL_REF)))
    4833                 :            :         src_const = src_folded, src_const_elt = elt;
    4834                 :  106586000 :       else if (src_const == 0 && src_eqv_here && CONSTANT_P (src_eqv_here))
    4835                 :     359477 :         src_const = src_eqv_here, src_const_elt = src_eqv_elt;
    4836                 :            : 
    4837                 :            :       /* If we don't know if the constant is in the table, get its
    4838                 :            :          hash code and look it up.  */
    4839                 :  122667000 :       if (src_const && src_const_elt == 0)
    4840                 :            :         {
    4841                 :   32882000 :           sets[i].src_const_hash = HASH (src_const, mode);
    4842                 :   16441000 :           src_const_elt = lookup (src_const, sets[i].src_const_hash, mode);
    4843                 :            :         }
    4844                 :            : 
    4845                 :  122667000 :       sets[i].src_const = src_const;
    4846                 :  122667000 :       sets[i].src_const_elt = src_const_elt;
    4847                 :            : 
    4848                 :            :       /* If the constant and our source are both in the table, mark them as
    4849                 :            :          equivalent.  Otherwise, if a constant is in the table but the source
    4850                 :            :          isn't, set ELT to it.  */
    4851                 :  122667000 :       if (src_const_elt && elt
    4852                 :   11051500 :           && src_const_elt->first_same_value != elt->first_same_value)
    4853                 :          0 :         merge_equiv_classes (elt, src_const_elt);
    4854                 :  122667000 :       else if (src_const_elt && elt == 0)
    4855                 :      22467 :         elt = src_const_elt;
    4856                 :            : 
    4857                 :            :       /* See if there is a register linearly related to a constant
    4858                 :            :          equivalent of SRC.  */
    4859                 :  122667000 :       if (src_const
    4860                 :   27492500 :           && (GET_CODE (src_const) == CONST
    4861                 :   27087400 :               || (src_const_elt && src_const_elt->related_value != 0)))
    4862                 :            :         {
    4863                 :     484037 :           src_related = use_related_value (src_const, src_const_elt);
    4864                 :     484037 :           if (src_related)
    4865                 :            :             {
    4866                 :     131114 :               struct table_elt *src_related_elt
    4867                 :     262228 :                 = lookup (src_related, HASH (src_related, mode), mode);
    4868                 :     131114 :               if (src_related_elt && elt)
    4869                 :            :                 {
    4870                 :       2557 :                   if (elt->first_same_value
    4871                 :       2557 :                       != src_related_elt->first_same_value)
    4872                 :            :                     /* This can occur when we previously saw a CONST
    4873                 :            :                        involving a SYMBOL_REF and then see the SYMBOL_REF
    4874                 :            :                        twice.  Merge the involved classes.  */
    4875                 :       2108 :                     merge_equiv_classes (elt, src_related_elt);
    4876                 :            : 
    4877                 :            :                   src_related = 0;
    4878                 :  122667000 :                   src_related_elt = 0;
    4879                 :            :                 }
    4880                 :     128557 :               else if (src_related_elt && elt == 0)
    4881                 :       3592 :                 elt = src_related_elt;
    4882                 :            :             }
    4883                 :            :         }
    4884                 :            : 
    4885                 :            :       /* See if we have a CONST_INT that is already in a register in a
    4886                 :            :          wider mode.  */
    4887                 :            : 
    4888                 :   27364000 :       if (src_const && src_related == 0 && CONST_INT_P (src_const)
    4889                 :   13381100 :           && is_int_mode (mode, &int_mode)
    4890                 :  138441000 :           && GET_MODE_PRECISION (int_mode) < BITS_PER_WORD)
    4891                 :            :         {
    4892                 :    4592240 :           opt_scalar_int_mode wider_mode_iter;
    4893                 :   11799600 :           FOR_EACH_WIDER_MODE (wider_mode_iter, int_mode)
    4894                 :            :             {
    4895                 :   11799600 :               scalar_int_mode wider_mode = wider_mode_iter.require ();
    4896                 :   12397700 :               if (GET_MODE_PRECISION (wider_mode) > BITS_PER_WORD)
    4897                 :            :                 break;
    4898                 :            : 
    4899                 :    7371730 :               struct table_elt *const_elt
    4900                 :    7371730 :                 = lookup (src_const, HASH (src_const, wider_mode), wider_mode);
    4901                 :            : 
    4902                 :    7371730 :               if (const_elt == 0)
    4903                 :    6884140 :                 continue;
    4904                 :            : 
    4905                 :     487589 :               for (const_elt = const_elt->first_same_value;
    4906                 :    2872240 :                    const_elt; const_elt = const_elt->next_same_value)
    4907                 :    2549030 :                 if (REG_P (const_elt->exp))
    4908                 :            :                   {
    4909                 :     164374 :                     src_related = gen_lowpart (int_mode, const_elt->exp);
    4910                 :     164374 :                     break;
    4911                 :            :                   }
    4912                 :            : 
    4913                 :     487589 :               if (src_related != 0)
    4914                 :            :                 break;
    4915                 :            :             }
    4916                 :            :         }
    4917                 :            : 
    4918                 :            :       /* Another possibility is that we have an AND with a constant in
    4919                 :            :          a mode narrower than a word.  If so, it might have been generated
    4920                 :            :          as part of an "if" which would narrow the AND.  If we already
    4921                 :            :          have done the AND in a wider mode, we can use a SUBREG of that
    4922                 :            :          value.  */
    4923                 :            : 
    4924                 :  120195000 :       if (flag_expensive_optimizations && ! src_related
    4925                 :  209803000 :           && is_a <scalar_int_mode> (mode, &int_mode)
    4926                 :   87135600 :           && GET_CODE (src) == AND && CONST_INT_P (XEXP (src, 1))
    4927                 :  123452000 :           && GET_MODE_SIZE (int_mode) < UNITS_PER_WORD)
    4928                 :            :         {
    4929                 :     456601 :           opt_scalar_int_mode tmode_iter;
    4930                 :     456601 :           rtx new_and = gen_rtx_AND (VOIDmode, NULL_RTX, XEXP (src, 1));
    4931                 :            : 
    4932                 :    1223860 :           FOR_EACH_WIDER_MODE (tmode_iter, int_mode)
    4933                 :            :             {
    4934                 :    1223860 :               scalar_int_mode tmode = tmode_iter.require ();
    4935                 :    2534030 :               if (GET_MODE_SIZE (tmode) > UNITS_PER_WORD)
    4936                 :            :                 break;
    4937                 :            : 
    4938                 :     767323 :               rtx inner = gen_lowpart (tmode, XEXP (src, 0));
    4939                 :     767323 :               struct table_elt *larger_elt;
    4940                 :            : 
    4941                 :     767323 :               if (inner)
    4942                 :            :                 {
    4943                 :     767323 :                   PUT_MODE (new_and, tmode);
    4944                 :     767323 :                   XEXP (new_and, 0) = inner;
    4945                 :     767323 :                   larger_elt = lookup (new_and, HASH (new_and, tmode), tmode);
    4946                 :     767323 :                   if (larger_elt == 0)
    4947                 :     767257 :                     continue;
    4948                 :            : 
    4949                 :         66 :                   for (larger_elt = larger_elt->first_same_value;
    4950                 :         79 :                        larger_elt; larger_elt = larger_elt->next_same_value)
    4951                 :         79 :                     if (REG_P (larger_elt->exp))
    4952                 :            :                       {
    4953                 :         66 :                         src_related
    4954                 :         66 :                           = gen_lowpart (int_mode, larger_elt->exp);
    4955                 :         66 :                         break;
    4956                 :            :                       }
    4957                 :            : 
    4958                 :         66 :                   if (src_related)
    4959                 :            :                     break;
    4960                 :            :                 }
    4961                 :            :             }
    4962                 :            :         }
    4963                 :            : 
    4964                 :            :       /* See if a MEM has already been loaded with a widening operation;
    4965                 :            :          if it has, we can use a subreg of that.  Many CISC machines
    4966                 :            :          also have such operations, but this is only likely to be
    4967                 :            :          beneficial on these machines.  */
    4968                 :            : 
    4969                 :  122667000 :       rtx_code extend_op;
    4970                 :  122667000 :       if (flag_expensive_optimizations && src_related == 0
    4971                 :            :           && MEM_P (src) && ! do_not_record
    4972                 :  122667000 :           && is_a <scalar_int_mode> (mode, &int_mode)
    4973                 :  122667000 :           && (extend_op = load_extend_op (int_mode)) != UNKNOWN)
    4974                 :            :         {
    4975                 :            :           struct rtx_def memory_extend_buf;
    4976                 :            :           rtx memory_extend_rtx = &memory_extend_buf;
    4977                 :            : 
    4978                 :            :           /* Set what we are trying to extend and the operation it might
    4979                 :            :              have been extended with.  */
    4980                 :            :           memset (memory_extend_rtx, 0, sizeof (*memory_extend_rtx));
    4981                 :            :           PUT_CODE (memory_extend_rtx, extend_op);
    4982                 :            :           XEXP (memory_extend_rtx, 0) = src;
    4983                 :            : 
    4984                 :            :           opt_scalar_int_mode tmode_iter;
    4985                 :            :           FOR_EACH_WIDER_MODE (tmode_iter, int_mode)
    4986                 :            :             {
    4987                 :            :               struct table_elt *larger_elt;
    4988                 :            : 
    4989                 :            :               scalar_int_mode tmode = tmode_iter.require ();
    4990                 :            :               if (GET_MODE_SIZE (tmode) > UNITS_PER_WORD)
    4991                 :            :                 break;
    4992                 :            : 
    4993                 :            :               PUT_MODE (memory_extend_rtx, tmode);
    4994                 :            :               larger_elt = lookup (memory_extend_rtx,
    4995                 :            :                                    HASH (memory_extend_rtx, tmode), tmode);
    4996                 :            :               if (larger_elt == 0)
    4997                 :            :                 continue;
    4998                 :            : 
    4999                 :            :               for (larger_elt = larger_elt->first_same_value;
    5000                 :            :                    larger_elt; larger_elt = larger_elt->next_same_value)
    5001                 :            :                 if (REG_P (larger_elt->exp))
    5002                 :            :                   {
    5003                 :            :                     src_related = gen_lowpart (int_mode, larger_elt->exp);
    5004                 :            :                     break;
    5005                 :            :                   }
    5006                 :            : 
    5007                 :            :               if (src_related)
    5008                 :            :                 break;
    5009                 :            :             }
    5010                 :            :         }
    5011                 :            : 
    5012                 :            :       /* Try to express the constant using a register+offset expression
    5013                 :            :          derived from a constant anchor.  */
    5014                 :            : 
    5015                 :  122667000 :       if (targetm.const_anchor
    5016                 :          0 :           && !src_related
    5017                 :          0 :           && src_const
    5018                 :          0 :           && GET_CODE (src_const) == CONST_INT)
    5019                 :            :         {
    5020                 :          0 :           src_related = try_const_anchors (src_const, mode);
    5021                 :          0 :           src_related_is_const_anchor = src_related != NULL_RTX;
    5022                 :            :         }
    5023                 :            : 
    5024                 :            : 
    5025                 :  122667000 :       if (src == src_folded)
    5026                 :  120044000 :         src_folded = 0;
    5027                 :            : 
    5028                 :            :       /* At this point, ELT, if nonzero, points to a class of expressions
    5029                 :            :          equivalent to the source of this SET and SRC, SRC_EQV, SRC_FOLDED,
    5030                 :            :          and SRC_RELATED, if nonzero, each contain additional equivalent
    5031                 :            :          expressions.  Prune these latter expressions by deleting expressions
    5032                 :            :          already in the equivalence class.
    5033                 :            : 
    5034                 :            :          Check for an equivalent identical to the destination.  If found,
    5035                 :            :          this is the preferred equivalent since it will likely lead to
    5036                 :            :          elimination of the insn.  Indicate this by placing it in
    5037                 :            :          `src_related'.  */
    5038                 :            : 
    5039                 :  122667000 :       if (elt)
    5040                 :   23454000 :         elt = elt->first_same_value;
    5041                 :  199010000 :       for (p = elt; p; p = p->next_same_value)
    5042                 :            :         {
    5043                 :   76342400 :           enum rtx_code code = GET_CODE (p->exp);
    5044                 :            : 
    5045                 :            :           /* If the expression is not valid, ignore it.  Then we do not
    5046                 :            :              have to check for validity below.  In most cases, we can use
    5047                 :            :              `rtx_equal_p', since canonicalization has already been done.  */
    5048                 :   76342400 :           if (code != REG && ! exp_equiv_p (p->exp, p->exp, 1, false))
    5049                 :      15808 :             continue;
    5050                 :            : 
    5051                 :            :           /* Also skip paradoxical subregs, unless that's what we're
    5052                 :            :              looking for.  */
    5053                 :   76326600 :           if (paradoxical_subreg_p (p->exp)
    5054                 :     456854 :               && ! (src != 0
    5055                 :       1882 :                     && GET_CODE (src) == SUBREG
    5056                 :        414 :                     && GET_MODE (src) == GET_MODE (p->exp)
    5057                 :        414 :                     && partial_subreg_p (GET_MODE (SUBREG_REG (src)),
    5058                 :            :                                          GET_MODE (SUBREG_REG (p->exp)))))
    5059                 :       1929 :             continue;
    5060                 :            : 
    5061                 :   76324700 :           if (src && GET_CODE (src) == code && rtx_equal_p (src, p->exp))
    5062                 :            :             src = 0;
    5063                 :    1556370 :           else if (src_folded && GET_CODE (src_folded) == code
    5064                 :   53530500 :                    && rtx_equal_p (src_folded, p->exp))
    5065                 :            :             src_folded = 0;
    5066                 :     506467 :           else if (src_eqv_here && GET_CODE (src_eqv_here) == code
    5067                 :   52863200 :                    && rtx_equal_p (src_eqv_here, p->exp))
    5068                 :            :             src_eqv_here = 0;
    5069                 :     583604 :           else if (src_related && GET_CODE (src_related) == code
    5070                 :   52506100 :                    && rtx_equal_p (src_related, p->exp))
    5071                 :            :             src_related = 0;
    5072                 :            : 
    5073                 :            :           /* This is the same as the destination of the insns, we want
    5074                 :            :              to prefer it.  Copy it to src_related.  The code below will
    5075                 :            :              then give it a negative cost.  */
    5076                 :   76324700 :           if (GET_CODE (dest) == code && rtx_equal_p (p->exp, dest))
    5077                 :            :             src_related = dest;
    5078                 :            :         }
    5079                 :            : 
    5080                 :            :       /* Find the cheapest valid equivalent, trying all the available
    5081                 :            :          possibilities.  Prefer items not in the hash table to ones
    5082                 :            :          that are when they are equal cost.  Note that we can never
    5083                 :            :          worsen an insn as the current contents will also succeed.
    5084                 :            :          If we find an equivalent identical to the destination, use it as best,
    5085                 :            :          since this insn will probably be eliminated in that case.  */
    5086                 :  122667000 :       if (src)
    5087                 :            :         {
    5088                 :   99445200 :           if (rtx_equal_p (src, dest))
    5089                 :            :             src_cost = src_regcost = -1;
    5090                 :            :           else
    5091                 :            :             {
    5092                 :   99445100 :               src_cost = COST (src, mode);
    5093                 :   99445100 :               src_regcost = approx_reg_cost (src);
    5094                 :            :             }
    5095                 :            :         }
    5096                 :            : 
    5097                 :  122667000 :       if (src_eqv_here)
    5098                 :            :         {
    5099                 :    3202910 :           if (rtx_equal_p (src_eqv_here, dest))
    5100                 :            :             src_eqv_cost = src_eqv_regcost = -1;
    5101                 :            :           else
    5102                 :            :             {
    5103                 :    3202910 :               src_eqv_cost = COST (src_eqv_here, mode);
    5104                 :    3202910 :               src_eqv_regcost = approx_reg_cost (src_eqv_here);
    5105                 :            :             }
    5106                 :            :         }
    5107                 :            : 
    5108                 :  122667000 :       if (src_folded)
    5109                 :            :         {
    5110                 :    2195910 :           if (rtx_equal_p (src_folded, dest))
    5111                 :            :             src_folded_cost = src_folded_regcost = -1;
    5112                 :            :           else
    5113                 :            :             {
    5114                 :    2186580 :               src_folded_cost = COST (src_folded, mode);
    5115                 :    2186580 :               src_folded_regcost = approx_reg_cost (src_folded);
    5116                 :            :             }
    5117                 :            :         }
    5118                 :            : 
    5119                 :  122667000 :       if (src_related)
    5120                 :            :         {
    5121                 :     406193 :           if (rtx_equal_p (src_related, dest))
    5122                 :            :             src_related_cost = src_related_regcost = -1;
    5123                 :            :           else
    5124                 :            :             {
    5125                 :     291452 :               src_related_cost = COST (src_related, mode);
    5126                 :     291452 :               src_related_regcost = approx_reg_cost (src_related);
    5127                 :            : 
    5128                 :            :               /* If a const-anchor is used to synthesize a constant that
    5129                 :            :                  normally requires multiple instructions then slightly prefer
    5130                 :            :                  it over the original sequence.  These instructions are likely
    5131                 :            :                  to become redundant now.  We can't compare against the cost
    5132                 :            :                  of src_eqv_here because, on MIPS for example, multi-insn
    5133                 :            :                  constants have zero cost; they are assumed to be hoisted from
    5134                 :            :                  loops.  */
    5135                 :     291452 :               if (src_related_is_const_anchor
    5136                 :     291452 :                   && src_related_cost == src_cost
    5137                 :          0 :                   && src_eqv_here)
    5138                 :          0 :                 src_related_cost--;
    5139                 :            :             }
    5140                 :            :         }
    5141                 :            : 
    5142                 :            :       /* If this was an indirect jump insn, a known label will really be
    5143                 :            :          cheaper even though it looks more expensive.  */
    5144                 :  122667000 :       if (dest == pc_rtx && src_const && GET_CODE (src_const) == LABEL_REF)
    5145                 :       4397 :         src_folded = src_const, src_folded_cost = src_folded_regcost = -1;
    5146                 :            : 
    5147                 :            :       /* Terminate loop when replacement made.  This must terminate since
    5148                 :            :          the current contents will be tested and will always be valid.  */
    5149                 :  125260000 :       while (1)
    5150                 :            :         {
    5151                 :  125260000 :           rtx trial;
    5152                 :            : 
    5153                 :            :           /* Skip invalid entries.  */
    5154                 :   23712200 :           while (elt && !REG_P (elt->exp)
    5155                 :  131823000 :                  && ! exp_equiv_p (elt->exp, elt->exp, 1, false))
    5156                 :         20 :             elt = elt->next_same_value;
    5157                 :            : 
    5158                 :            :           /* A paradoxical subreg would be bad here: it'll be the right
    5159                 :            :              size, but later may be adjusted so that the upper bits aren't
    5160                 :            :              what we want.  So reject it.  */
    5161                 :  125262000 :           if (elt != 0
    5162                 :   23712100 :               && paradoxical_subreg_p (elt->exp)
    5163                 :            :               /* It is okay, though, if the rtx we're trying to match
    5164                 :            :                  will ignore any of the bits we can't predict.  */
    5165                 :  125262000 :               && ! (src != 0
    5166                 :        398 :                     && GET_CODE (src) == SUBREG
    5167                 :        398 :                     && GET_MODE (src) == GET_MODE (elt->exp)
    5168                 :        398 :                     && partial_subreg_p (GET_MODE (SUBREG_REG (src)),
    5169                 :            :                                          GET_MODE (SUBREG_REG (elt->exp)))))
    5170                 :            :             {
    5171                 :       1866 :               elt = elt->next_same_value;
    5172                 :       1866 :               continue;
    5173                 :            :             }
    5174                 :            : 
    5175                 :  125258000 :           if (elt)
    5176                 :            :             {
    5177                 :   23710300 :               src_elt_cost = elt->cost;
    5178                 :   23710300 :               src_elt_regcost = elt->regcost;
    5179                 :            :             }
    5180                 :            : 
    5181                 :            :           /* Find cheapest and skip it for the next time.   For items
    5182                 :            :              of equal cost, use this order:
    5183                 :            :              src_folded, src, src_eqv, src_related and hash table entry.  */
    5184                 :  125258000 :           if (src_folded
    5185                 :    2216650 :               && preferable (src_folded_cost, src_folded_regcost,
    5186                 :            :                              src_cost, src_regcost) <= 0
    5187                 :    1862490 :               && preferable (src_folded_cost, src_folded_regcost,
    5188                 :            :                              src_eqv_cost, src_eqv_regcost) <= 0
    5189                 :    1861310 :               && preferable (src_folded_cost, src_folded_regcost,
    5190                 :            :                              src_related_cost, src_related_regcost) <= 0
    5191                 :  125282000 :               && preferable (src_folded_cost, src_folded_regcost,
    5192                 :            :                              src_elt_cost, src_elt_regcost) <= 0)
    5193                 :            :             {
    5194                 :    1834410 :               trial = src_folded, src_folded_cost = MAX_COST;
    5195                 :    1834410 :               if (src_folded_force_flag)
    5196                 :            :                 {
    5197                 :          0 :                   rtx forced = force_const_mem (mode, trial);
    5198                 :          0 :                   if (forced)
    5199                 :          0 :                     trial = forced;
    5200                 :            :                 }
    5201                 :            :             }
    5202                 :  123424000 :           else if (src
    5203                 :   99935300 :                    && preferable (src_cost, src_regcost,
    5204                 :            :                                   src_eqv_cost, src_eqv_regcost) <= 0
    5205                 :   99096600 :                    && preferable (src_cost, src_regcost,
    5206                 :            :                                   src_related_cost, src_related_regcost) <= 0
    5207                 :  123638000 :                    && preferable (src_cost, src_regcost,
    5208                 :            :                                   src_elt_cost, src_elt_regcost) <= 0)
    5209                 :            :             trial = src, src_cost = MAX_COST;
    5210                 :   24379200 :           else if (src_eqv_here
    5211                 :    1048080 :                    && preferable (src_eqv_cost, src_eqv_regcost,
    5212                 :            :                                   src_related_cost, src_related_regcost) <= 0
    5213                 :   24564300 :                    && preferable (src_eqv_cost, src_eqv_regcost,
    5214                 :            :                                   src_elt_cost, src_elt_regcost) <= 0)
    5215                 :            :             trial = src_eqv_here, src_eqv_cost = MAX_COST;
    5216                 :   23518000 :           else if (src_related
    5217                 :   23718500 :                    && preferable (src_related_cost, src_related_regcost,
    5218                 :            :                                   src_elt_cost, src_elt_regcost) <= 0)
    5219                 :            :             trial = src_related, src_related_cost = MAX_COST;
    5220                 :            :           else
    5221                 :            :             {
    5222                 :   23386100 :               trial = elt->exp;
    5223                 :   23386100 :               elt = elt->next_same_value;
    5224                 :   23386100 :               src_elt_cost = MAX_COST;
    5225                 :            :             }
    5226                 :            : 
    5227                 :            :           /* Try to optimize
    5228                 :            :              (set (reg:M N) (const_int A))
    5229                 :            :              (set (reg:M2 O) (const_int B))
    5230                 :            :              (set (zero_extract:M2 (reg:M N) (const_int C) (const_int D))
    5231                 :            :                   (reg:M2 O)).  */
    5232                 :  125258000 :           if (GET_CODE (SET_DEST (sets[i].rtl)) == ZERO_EXTRACT
    5233                 :       2719 :               && CONST_INT_P (trial)
    5234                 :        379 :               && CONST_INT_P (XEXP (SET_DEST (sets[i].rtl), 1))
    5235                 :        379 :               && CONST_INT_P (XEXP (SET_DEST (sets[i].rtl), 2))
    5236                 :        265 :               && REG_P (XEXP (SET_DEST (sets[i].rtl), 0))
    5237                 :        128 :               && (known_ge
    5238                 :            :                   (GET_MODE_PRECISION (GET_MODE (SET_DEST (sets[i].rtl))),
    5239                 :            :                    INTVAL (XEXP (SET_DEST (sets[i].rtl), 1))))
    5240                 :  125258000 :               && ((unsigned) INTVAL (XEXP (SET_DEST (sets[i].rtl), 1))
    5241                 :        128 :                   + (unsigned) INTVAL (XEXP (SET_DEST (sets[i].rtl), 2))
    5242                 :            :                   <= HOST_BITS_PER_WIDE_INT))
    5243                 :            :             {
    5244                 :        128 :               rtx dest_reg = XEXP (SET_DEST (sets[i].rtl), 0);
    5245                 :        128 :               rtx width = XEXP (SET_DEST (sets[i].rtl), 1);
    5246                 :        128 :               rtx pos = XEXP (SET_DEST (sets[i].rtl), 2);
    5247                 :        129 :               unsigned int dest_hash = HASH (dest_reg, GET_MODE (dest_reg));
    5248                 :        128 :               struct table_elt *dest_elt
    5249                 :        128 :                 = lookup (dest_reg, dest_hash, GET_MODE (dest_reg));
    5250                 :        128 :               rtx dest_cst = NULL;
    5251                 :            : 
    5252                 :        128 :               if (dest_elt)
    5253                 :         13 :                 for (p = dest_elt->first_same_value; p; p = p->next_same_value)
    5254                 :         10 :                   if (p->is_const && CONST_INT_P (p->exp))
    5255                 :            :                     {
    5256                 :            :                       dest_cst = p->exp;
    5257                 :            :                       break;
    5258                 :            :                     }
    5259                 :          3 :               if (dest_cst)
    5260                 :            :                 {
    5261                 :          0 :                   HOST_WIDE_INT val = INTVAL (dest_cst);
    5262                 :          0 :                   HOST_WIDE_INT mask;
    5263                 :          0 :                   unsigned int shift;
    5264                 :            :                   /* This is the mode of DEST_CST as well.  */
    5265                 :          0 :                   scalar_int_mode dest_mode
    5266                 :          0 :                     = as_a <scalar_int_mode> (GET_MODE (dest_reg));
    5267                 :          0 :                   if (BITS_BIG_ENDIAN)
    5268                 :            :                     shift = GET_MODE_PRECISION (dest_mode)
    5269                 :            :                             - INTVAL (pos) - INTVAL (width);
    5270                 :            :                   else
    5271                 :          0 :                     shift = INTVAL (pos);
    5272                 :          0 :                   if (INTVAL (width) == HOST_BITS_PER_WIDE_INT)
    5273                 :            :                     mask = HOST_WIDE_INT_M1;
    5274                 :            :                   else
    5275                 :          0 :                     mask = (HOST_WIDE_INT_1 << INTVAL (width)) - 1;
    5276                 :          0 :                   val &= ~(mask << shift);
    5277                 :          0 :                   val |= (INTVAL (trial) & mask) << shift;
    5278                 :          0 :                   val = trunc_int_for_mode (val, dest_mode);
    5279                 :          0 :                   validate_unshare_change (insn, &SET_DEST (sets[i].rtl),
    5280                 :            :                                            dest_reg, 1);
    5281                 :          0 :                   validate_unshare_change (insn, &SET_SRC (sets[i].rtl),
    5282                 :            :                                            GEN_INT (val), 1);
    5283                 :          0 :                   if (apply_change_group ())
    5284                 :            :                     {
    5285                 :          0 :                       rtx note = find_reg_note (insn, REG_EQUAL, NULL_RTX);
    5286                 :          0 :                       if (note)
    5287                 :            :                         {
    5288                 :          0 :                           remove_note (insn, note);
    5289                 :          0 :                           df_notes_rescan (insn);
    5290                 :            :                         }
    5291                 :            :                       src_eqv = NULL_RTX;
    5292                 :            :                       src_eqv_elt = NULL;
    5293                 :            :                       src_eqv_volatile = 0;
    5294                 :            :                       src_eqv_in_memory = 0;
    5295                 :            :                       src_eqv_hash = 0;
    5296                 :            :                       repeat = true;
    5297                 :  122667000 :                       break;
    5298                 :            :                     }
    5299                 :            :                 }
    5300                 :            :             }
    5301                 :            : 
    5302                 :            :           /* We don't normally have an insn matching (set (pc) (pc)), so
    5303                 :            :              check for this separately here.  We will delete such an
    5304                 :            :              insn below.
    5305                 :            : 
    5306                 :            :              For other cases such as a table jump or conditional jump
    5307                 :            :              where we know the ultimate target, go ahead and replace the
    5308                 :            :              operand.  While that may not make a valid insn, we will
    5309                 :            :              reemit the jump below (and also insert any necessary
    5310                 :            :              barriers).  */
    5311                 :  123491000 :           if (n_sets == 1 && dest == pc_rtx
    5312                 :  137360000 :               && (trial == pc_rtx
    5313                 :   12092300 :                   || (GET_CODE (trial) == LABEL_REF
    5314                 :       4911 :                       && ! condjump_p (insn))))
    5315                 :            :             {
    5316                 :            :               /* Don't substitute non-local labels, this confuses CFG.  */
    5317                 :      11824 :               if (GET_CODE (trial) == LABEL_REF
    5318                 :      10500 :                   && LABEL_REF_NONLOCAL_P (trial))
    5319                 :       1324 :                 continue;
    5320                 :            : 
    5321                 :       9176 :               SET_SRC (sets[i].rtl) = trial;
    5322                 :       9176 :               cse_jumps_altered = true;
    5323                 :       9176 :               break;
    5324                 :            :             }
    5325                 :            : 
    5326                 :            :           /* Similarly, lots of targets don't allow no-op
    5327                 :            :              (set (mem x) (mem x)) moves.  Even (set (reg x) (reg x))
    5328                 :            :              might be impossible for certain registers (like CC registers).  */
    5329                 :  125248000 :           else if (n_sets == 1
    5330                 :  123480000 :                    && !CALL_P (insn)
    5331                 :  123063000 :                    && (MEM_P (trial) || REG_P (trial))
    5332                 :   51186200 :                    && rtx_equal_p (trial, dest)
    5333                 :     112851 :                    && !side_effects_p (dest)
    5334                 :  125248000 :                    && (cfun->can_delete_dead_exceptions
    5335                 :     112851 :                        || insn_nothrow_p (insn)))
    5336                 :            :             {
    5337                 :     109341 :               SET_SRC (sets[i].rtl) = trial;
    5338                 :     109341 :               noop_insn = true;
    5339                 :     109341 :               break;
    5340                 :            :             }
    5341                 :            : 
    5342                 :            :           /* Reject certain invalid forms of CONST that we create.  */
    5343                 :  125138000 :           else if (CONSTANT_P (trial)
    5344                 :   21309500 :                    && GET_CODE (trial) == CONST
    5345                 :            :                    /* Reject cases that will cause decode_rtx_const to
    5346                 :            :                       die.  On the alpha when simplifying a switch, we
    5347                 :            :                       get (const (truncate (minus (label_ref)
    5348                 :            :                       (label_ref)))).  */
    5349                 :     376625 :                    && (GET_CODE (XEXP (trial, 0)) == TRUNCATE
    5350                 :            :                        /* Likewise on IA-64, except without the
    5351                 :            :                           truncate.  */
    5352                 :     376625 :                        || (GET_CODE (XEXP (trial, 0)) == MINUS
    5353                 :          0 :                            && GET_CODE (XEXP (XEXP (trial, 0), 0)) == LABEL_REF
    5354                 :          0 :                            && GET_CODE (XEXP (XEXP (trial, 0), 1)) == LABEL_REF)))
    5355                 :            :             /* Do nothing for this case.  */
    5356                 :            :             ;
    5357                 :            : 
    5358                 :            :           /* Do not replace anything with a MEM, except the replacement
    5359                 :            :              is a no-op.  This allows this loop to terminate.  */
    5360                 :  125138000 :           else if (MEM_P (trial) && !rtx_equal_p (trial, SET_SRC(sets[i].rtl)))
    5361                 :            :             /* Do nothing for this case.  */
    5362                 :            :             ;
    5363                 :            : 
    5364                 :            :           /* Look for a substitution that makes a valid insn.  */
    5365                 :  125137000 :           else if (validate_unshare_change (insn, &SET_SRC (sets[i].rtl),
    5366                 :            :                                             trial, 0))
    5367                 :            :             {
    5368                 :  122549000 :               rtx new_rtx = canon_reg (SET_SRC (sets[i].rtl), insn);
    5369                 :            : 
    5370                 :            :               /* The result of apply_change_group can be ignored; see
    5371                 :            :                  canon_reg.  */
    5372                 :            : 
    5373                 :  122549000 :               validate_change (insn, &SET_SRC (sets[i].rtl), new_rtx, 1);
    5374                 :  122549000 :               apply_change_group ();
    5375                 :            : 
    5376                 :  122549000 :               break;
    5377                 :            :             }
    5378                 :            : 
    5379                 :            :           /* If we previously found constant pool entries for
    5380                 :            :              constants and this is a constant, try making a
    5381                 :            :              pool entry.  Put it in src_folded unless we already have done
    5382                 :            :              this since that is where it likely came from.  */
    5383                 :            : 
    5384                 :    2587730 :           else if (constant_pool_entries_cost
    5385                 :    2587730 :                    && CONSTANT_P (trial)
    5386                 :          0 :                    && (src_folded == 0
    5387                 :          0 :                        || (!MEM_P (src_folded)
    5388                 :          0 :                            && ! src_folded_force_flag))
    5389                 :          0 :                    && GET_MODE_CLASS (mode) != MODE_CC
    5390                 :          0 :                    && mode != VOIDmode)
    5391                 :            :             {
    5392                 :          0 :               src_folded_force_flag = 1;
    5393                 :          0 :               src_folded = trial;
    5394                 :          0 :               src_folded_cost = constant_pool_entries_cost;
    5395                 :          0 :               src_folded_regcost = constant_pool_entries_regcost;
    5396                 :            :             }
    5397                 :            :         }
    5398                 :            : 
    5399                 :            :       /* If we changed the insn too much, handle this set from scratch.  */
    5400                 :  122667000 :       if (repeat)
    5401                 :            :         {
    5402                 :          0 :           i--;
    5403                 :          0 :           continue;
    5404                 :            :         }
    5405                 :            : 
    5406                 :  122667000 :       src = SET_SRC (sets[i].rtl);
    5407                 :            : 
    5408                 :            :       /* In general, it is good to have a SET with SET_SRC == SET_DEST.
    5409                 :            :          However, there is an important exception:  If both are registers
    5410                 :            :          that are not the head of their equivalence class, replace SET_SRC
    5411                 :            :          with the head of the class.  If we do not do this, we will have
    5412                 :            :          both registers live over a portion of the basic block.  This way,
    5413                 :            :          their lifetimes will likely abut instead of overlapping.  */
    5414                 :  122667000 :       if (REG_P (dest)
    5415                 :  185704000 :           && REGNO_QTY_VALID_P (REGNO (dest)))
    5416                 :            :         {
    5417                 :    4986370 :           int dest_q = REG_QTY (REGNO (dest));
    5418                 :    4986370 :           struct qty_table_elem *dest_ent = &qty_table[dest_q];
    5419                 :            : 
    5420                 :    4986370 :           if (dest_ent->mode == GET_MODE (dest)
    5421                 :    3745000 :               && dest_ent->first_reg != REGNO (dest)
    5422                 :      91459 :               && REG_P (src) && REGNO (src) == REGNO (dest)
    5423                 :            :               /* Don't do this if the original insn had a hard reg as
    5424                 :            :                  SET_SRC or SET_DEST.  */
    5425                 :       2706 :               && (!REG_P (sets[i].src)
    5426                 :       2087 :                   || REGNO (sets[i].src) >= FIRST_PSEUDO_REGISTER)
    5427                 :    4989060 :               && (!REG_P (dest) || REGNO (dest) >= FIRST_PSEUDO_REGISTER))
    5428                 :            :             /* We can't call canon_reg here because it won't do anything if
    5429                 :            :                SRC is a hard register.  */
    5430                 :            :             {
    5431                 :       2684 :               int src_q = REG_QTY (REGNO (src));
    5432                 :       2684 :               struct qty_table_elem *src_ent = &qty_table[src_q];
    5433                 :       2684 :               int first = src_ent->first_reg;
    5434                 :       2684 :               rtx new_src
    5435                 :            :                 = (first >= FIRST_PSEUDO_REGISTER
    5436                 :       2684 :                    ? regno_reg_rtx[first] : gen_rtx_REG (GET_MODE (src), first));
    5437                 :            : 
    5438                 :            :               /* We must use validate-change even for this, because this
    5439                 :            :                  might be a special no-op instruction, suitable only to
    5440                 :            :                  tag notes onto.  */
    5441                 :       2684 :               if (validate_change (insn, &SET_SRC (sets[i].rtl), new_src, 0))
    5442                 :            :                 {
    5443                 :       2684 :                   src = new_src;
    5444                 :            :                   /* If we had a constant that is cheaper than what we are now
    5445                 :            :                      setting SRC to, use that constant.  We ignored it when we
    5446                 :            :                      thought we could make this into a no-op.  */
    5447                 :        882 :                   if (src_const && COST (src_const, mode) < COST (src, mode)
    5448                 :       2684 :                       && validate_change (insn, &SET_SRC (sets[i].rtl),
    5449                 :            :                                           src_const, 0))
    5450                 :            :                     src = src_const;
    5451                 :            :                 }
    5452                 :            :             }
    5453                 :            :         }
    5454                 :            : 
    5455                 :            :       /* If we made a change, recompute SRC values.  */
    5456                 :  122667000 :       if (src != sets[i].src)
    5457                 :            :         {
    5458                 :    2338900 :           do_not_record = 0;
    5459                 :    2338900 :           hash_arg_in_memory = 0;
    5460                 :    2338900 :           sets[i].src = src;
    5461                 :    3502670 :           sets[i].src_hash = HASH (src, mode);
    5462                 :    2338900 :           sets[i].src_volatile = do_not_record;
    5463                 :    2338900 :           sets[i].src_in_memory = hash_arg_in_memory;
    5464                 :    2338900 :           sets[i].src_elt = lookup (src, sets[i].src_hash, mode);
    5465                 :            :         }
    5466                 :            : 
    5467                 :            :       /* If this is a single SET, we are setting a register, and we have an
    5468                 :            :          equivalent constant, we want to add a REG_EQUAL note if the constant
    5469                 :            :          is different from the source.  We don't want to do it for a constant
    5470                 :            :          pseudo since verifying that this pseudo hasn't been eliminated is a
    5471                 :            :          pain; moreover such a note won't help anything.
    5472                 :            : 
    5473                 :            :          Avoid a REG_EQUAL note for (CONST (MINUS (LABEL_REF) (LABEL_REF)))
    5474                 :            :          which can be created for a reference to a compile time computable
    5475                 :            :          entry in a jump table.  */
    5476                 :  122667000 :       if (n_sets == 1
    5477                 :  121279000 :           && REG_P (dest)
    5478                 :   86132100 :           && src_const
    5479                 :   17145000 :           && !REG_P (src_const)
    5480                 :   17125900 :           && !(GET_CODE (src_const) == SUBREG
    5481                 :          0 :                && REG_P (SUBREG_REG (src_const)))
    5482                 :   17125900 :           && !(GET_CODE (src_const) == CONST
    5483                 :     193293 :                && GET_CODE (XEXP (src_const, 0)) == MINUS
    5484                 :          0 :                && GET_CODE (XEXP (XEXP (src_const, 0), 0)) == LABEL_REF
    5485                 :          0 :                && GET_CODE (XEXP (XEXP (src_const, 0), 1)) == LABEL_REF)
    5486                 :  139793000 :           && !rtx_equal_p (src, src_const))
    5487                 :            :         {
    5488                 :            :           /* Make sure that the rtx is not shared.  */
    5489                 :    4432930 :           src_const = copy_rtx (src_const);
    5490                 :            : 
    5491                 :            :           /* Record the actual constant value in a REG_EQUAL note,
    5492                 :            :              making a new one if one does not already exist.  */
    5493                 :    4432930 :           set_unique_reg_note (insn, REG_EQUAL, src_const);
    5494                 :    4432930 :           df_notes_rescan (insn);
    5495                 :            :         }
    5496                 :            : 
    5497                 :            :       /* Now deal with the destination.  */
    5498                 :  122667000 :       do_not_record = 0;
    5499                 :            : 
    5500                 :            :       /* Look within any ZERO_EXTRACT to the MEM or REG within it.  */
    5501                 :  123482000 :       while (GET_CODE (dest) == SUBREG
    5502                 :  122683000 :              || GET_CODE (dest) == ZERO_EXTRACT
    5503                 :  246162000 :              || GET_CODE (dest) == STRICT_LOW_PART)
    5504                 :     814220 :         dest = XEXP (dest, 0);
    5505                 :            : 
    5506                 :  122667000 :       sets[i].inner_dest = dest;
    5507                 :            : 
    5508                 :  122667000 :       if (MEM_P (dest))
    5509                 :            :         {
    5510                 :            : #ifdef PUSH_ROUNDING
    5511                 :            :           /* Stack pushes invalidate the stack pointer.  */
    5512                 :   22491900 :           rtx addr = XEXP (dest, 0);
    5513                 :   22491900 :           if (GET_RTX_CLASS (GET_CODE (addr)) == RTX_AUTOINC
    5514                 :    5528970 :               && XEXP (addr, 0) == stack_pointer_rtx)
    5515                 :    5528970 :             invalidate (stack_pointer_rtx, VOIDmode);
    5516                 :            : #endif
    5517                 :   22491900 :           dest = fold_rtx (dest, insn);
    5518                 :            :         }
    5519                 :            : 
    5520                 :            :       /* Compute the hash code of the destination now,
    5521                 :            :          before the effects of this instruction are recorded,
    5522                 :            :          since the register values used in the address computation
    5523                 :            :          are those before this instruction.  */
    5524                 :  192336000 :       sets[i].dest_hash = HASH (dest, mode);
    5525                 :            : 
    5526                 :            :       /* Don't enter a bit-field in the hash table
    5527                 :            :          because the value in it after the store
    5528                 :            :          may not equal what was stored, due to truncation.  */
    5529                 :            : 
    5530                 :  122667000 :       if (GET_CODE (SET_DEST (sets[i].rtl)) == ZERO_EXTRACT)
    5531                 :            :         {
    5532                 :       2719 :           rtx width = XEXP (SET_DEST (sets[i].rtl), 1);
    5533                 :            : 
    5534                 :       2719 :           if (src_const != 0 && CONST_INT_P (src_const)
    5535                 :        379 :               && CONST_INT_P (width)
    5536                 :        379 :               && INTVAL (width) < HOST_BITS_PER_WIDE_INT
    5537                 :        379 :               && ! (INTVAL (src_const)
    5538                 :        379 :                     & (HOST_WIDE_INT_M1U << INTVAL (width))))
    5539                 :            :             /* Exception: if the value is constant,
    5540                 :            :                and it won't be truncated, record it.  */
    5541                 :            :             ;
    5542                 :            :           else
    5543                 :            :             {
    5544                 :            :               /* This is chosen so that the destination will be invalidated
    5545                 :            :                  but no new value will be recorded.
    5546                 :            :                  We must invalidate because sometimes constant
    5547                 :            :                  values can be recorded for bitfields.  */
    5548                 :       2341 :               sets[i].src_elt = 0;
    5549                 :       2341 :               sets[i].src_volatile = 1;
    5550                 :       2341 :               src_eqv = 0;
    5551                 :       2341 :               src_eqv_elt = 0;
    5552                 :            :             }
    5553                 :            :         }
    5554                 :            : 
    5555                 :            :       /* If only one set in a JUMP_INSN and it is now a no-op, we can delete
    5556                 :            :          the insn.  */
    5557                 :  122665000 :       else if (n_sets == 1 && dest == pc_rtx && src == pc_rtx)
    5558                 :            :         {
    5559                 :            :           /* One less use of the label this insn used to jump to.  */
    5560                 :       9175 :           cse_cfg_altered |= delete_insn_and_edges (insn);
    5561                 :       9175 :           cse_jumps_altered = true;
    5562                 :            :           /* No more processing for this set.  */
    5563                 :       9175 :           sets[i].rtl = 0;
    5564                 :            :         }
    5565                 :            : 
    5566                 :            :       /* Similarly for no-op moves.  */
    5567                 :  122655000 :       else if (noop_insn)
    5568                 :            :         {
    5569                 :     109341 :           if (cfun->can_throw_non_call_exceptions && can_throw_internal (insn))
    5570                 :          0 :             cse_cfg_altered = true;
    5571                 :     109341 :           cse_cfg_altered |= delete_insn_and_edges (insn);
    5572                 :            :           /* No more processing for this set.  */
    5573                 :     109341 :           sets[i].rtl = 0;
    5574                 :            :         }
    5575                 :            : 
    5576                 :            :       /* If this SET is now setting PC to a label, we know it used to
    5577                 :            :          be a conditional or computed branch.  */
    5578                 :   12084500 :       else if (dest == pc_rtx && GET_CODE (src) == LABEL_REF
    5579                 :  122550000 :                && !LABEL_REF_NONLOCAL_P (src))
    5580                 :            :         {
    5581                 :            :           /* We reemit the jump in as many cases as possible just in
    5582                 :            :              case the form of an unconditional jump is significantly
    5583                 :            :              different than a computed jump or conditional jump.
    5584                 :            : 
    5585                 :            :              If this insn has multiple sets, then reemitting the
    5586                 :            :              jump is nontrivial.  So instead we just force rerecognition
    5587                 :            :              and hope for the best.  */
    5588                 :       3587 :           if (n_sets == 1)
    5589                 :            :             {
    5590                 :       3587 :               rtx_jump_insn *new_rtx;
    5591                 :       3587 :               rtx note;
    5592                 :            : 
    5593                 :       3587 :               rtx_insn *seq = targetm.gen_jump (XEXP (src, 0));
    5594                 :       3587 :               new_rtx = emit_jump_insn_before (seq, insn);
    5595                 :       3587 :               JUMP_LABEL (new_rtx) = XEXP (src, 0);
    5596                 :       3587 :               LABEL_NUSES (XEXP (src, 0))++;
    5597                 :            : 
    5598                 :            :               /* Make sure to copy over REG_NON_LOCAL_GOTO.  */
    5599                 :       3587 :               note = find_reg_note (insn, REG_NON_LOCAL_GOTO, 0);
    5600                 :       3587 :               if (note)
    5601                 :            :                 {
    5602                 :          0 :                   XEXP (note, 1) = NULL_RTX;
    5603                 :          0 :                   REG_NOTES (new_rtx) = note;
    5604                 :            :                 }
    5605                 :            : 
    5606                 :       3587 :               cse_cfg_altered |= delete_insn_and_edges (insn);
    5607                 :       3587 :               insn = new_rtx;
    5608                 :            :             }
    5609                 :            :           else
    5610                 :          0 :             INSN_CODE (insn) = -1;
    5611                 :            : 
    5612                 :            :           /* Do not bother deleting any unreachable code, let jump do it.  */
    5613                 :       3587 :           cse_jumps_altered = true;
    5614                 :       3587 :           sets[i].rtl = 0;
    5615                 :            :         }
    5616                 :            : 
    5617                 :            :       /* If destination is volatile, invalidate it and then do no further
    5618                 :            :          processing for this assignment.  */
    5619                 :            : 
    5620                 :  122543000 :       else if (do_not_record)
    5621                 :            :         {
    5622                 :   35372800 :           invalidate_dest (dest);
    5623                 :   35372800 :           sets[i].rtl = 0;
    5624                 :            :         }
    5625                 :            : 
    5626                 :  122667000 :       if (sets[i].rtl != 0 && dest != SET_DEST (sets[i].rtl))
    5627                 :            :         {
    5628                 :     882356 :           do_not_record = 0;
    5629                 :     882356 :           sets[i].dest_hash = HASH (SET_DEST (sets[i].rtl), mode);
    5630                 :     882356 :           if (do_not_record)
    5631                 :            :             {
    5632                 :        453 :               invalidate_dest (SET_DEST (sets[i].rtl));
    5633                 :        453 :               sets[i].rtl = 0;
    5634                 :            :             }
    5635                 :            :         }
    5636                 :            : 
    5637                 :            :       /* If setting CC0, record what it was set to, or a constant, if it
    5638                 :            :          is equivalent to a constant.  If it is being set to a floating-point
    5639                 :            :          value, make a COMPARE with the appropriate constant of 0.  If we
    5640                 :            :          don't do this, later code can interpret this as a test against
    5641                 :            :          const0_rtx, which can cause problems if we try to put it into an
    5642                 :            :          insn as a floating-point operand.  */
    5643                 :  122667000 :       if (dest == cc0_rtx)
    5644                 :            :         {
    5645                 :          0 :           this_insn_cc0 = src_const && mode != VOIDmode ? src_const : src;
    5646                 :          0 :           this_insn_cc0_mode = mode;
    5647                 :          0 :           if (FLOAT_MODE_P (mode))
    5648                 :          0 :             this_insn_cc0 = gen_rtx_COMPARE (VOIDmode, this_insn_cc0,
    5649                 :            :                                              CONST0_RTX (mode));
    5650                 :            :         }
    5651                 :            :     }
    5652                 :            : 
    5653                 :            :   /* Now enter all non-volatile source expressions in the hash table
    5654                 :            :      if they are not already present.
    5655                 :            :      Record their equivalence classes in src_elt.
    5656                 :            :      This way we can insert the corresponding destinations into
    5657                 :            :      the same classes even if the actual sources are no longer in them
    5658                 :            :      (having been invalidated).  */
    5659                 :            : 
    5660                 :    3190030 :   if (src_eqv && src_eqv_elt == 0 && sets[0].rtl != 0 && ! src_eqv_volatile
    5661                 :  235008000 :       && ! rtx_equal_p (src_eqv, SET_DEST (sets[0].rtl)))
    5662                 :            :     {
    5663                 :    2499270 :       struct table_elt *elt;
    5664                 :    2499270 :       struct table_elt *classp = sets[0].src_elt;
    5665                 :    2499270 :       rtx dest = SET_DEST (sets[0].rtl);
    5666                 :    2499270 :       machine_mode eqvmode = GET_MODE (dest);
    5667                 :            : 
    5668                 :    2499270 :       if (GET_CODE (dest) == STRICT_LOW_PART)
    5669                 :            :         {
    5670                 :          0 :           eqvmode = GET_MODE (SUBREG_REG (XEXP (dest, 0)));
    5671                 :          0 :           classp = 0;
    5672                 :            :         }
    5673                 :    2499270 :       if (insert_regs (src_eqv, classp, 0))
    5674                 :            :         {
    5675                 :      85711 :           rehash_using_reg (src_eqv);
    5676                 :     171398 :           src_eqv_hash = HASH (src_eqv, eqvmode);
    5677                 :            :         }
    5678                 :    2499270 :       elt = insert (src_eqv, classp, src_eqv_hash, eqvmode);
    5679                 :    2499270 :       elt->in_memory = src_eqv_in_memory;
    5680                 :    2499270 :       src_eqv_elt = elt;
    5681                 :            : 
    5682                 :            :       /* Check to see if src_eqv_elt is the same as a set source which
    5683                 :            :          does not yet have an elt, and if so set the elt of the set source
    5684                 :            :          to src_eqv_elt.  */
    5685                 :    4998540 :       for (i = 0; i < n_sets; i++)
    5686                 :    2499270 :         if (sets[i].rtl && sets[i].src_elt == 0
    5687                 :    4913480 :             && rtx_equal_p (SET_SRC (sets[i].rtl), src_eqv))
    5688                 :      13889 :           sets[i].src_elt = src_eqv_elt;
    5689                 :            :     }
    5690                 :            : 
    5691                 :  355176000 :   for (i = 0; i < n_sets; i++)
    5692                 :   87172000 :     if (sets[i].rtl && ! sets[i].src_volatile
    5693                 :  201102000 :         && ! rtx_equal_p (SET_SRC (sets[i].rtl), SET_DEST (sets[i].rtl)))
    5694                 :            :       {
    5695                 :   78433000 :         if (GET_CODE (SET_DEST (sets[i].rtl)) == STRICT_LOW_PART)
    5696                 :            :           {
    5697                 :            :             /* REG_EQUAL in setting a STRICT_LOW_PART
    5698                 :            :                gives an equivalent for the entire destination register,
    5699                 :            :                not just for the subreg being stored in now.
    5700                 :            :                This is a more interesting equivalence, so we arrange later
    5701                 :            :                to treat the entire reg as the destination.  */
    5702                 :      13097 :             sets[i].src_elt = src_eqv_elt;
    5703                 :      13097 :             sets[i].src_hash = src_eqv_hash;
    5704                 :            :           }
    5705                 :            :         else
    5706                 :            :           {
    5707                 :            :             /* Insert source and constant equivalent into hash table, if not
    5708                 :            :                already present.  */
    5709                 :   78420000 :             struct table_elt *classp = src_eqv_elt;
    5710                 :   78420000 :             rtx src = sets[i].src;
    5711                 :   78420000 :             rtx dest = SET_DEST (sets[i].rtl);
    5712                 :  156840000 :             machine_mode mode
    5713                 :   78420000 :               = GET_MODE (src) == VOIDmode ? GET_MODE (dest) : GET_MODE (src);
    5714                 :            : 
    5715                 :            :             /* It's possible that we have a source value known to be
    5716                 :            :                constant but don't have a REG_EQUAL note on the insn.
    5717                 :            :                Lack of a note will mean src_eqv_elt will be NULL.  This
    5718                 :            :                can happen where we've generated a SUBREG to access a
    5719                 :            :                CONST_INT that is already in a register in a wider mode.
    5720                 :            :                Ensure that the source expression is put in the proper
    5721                 :            :                constant class.  */
    5722                 :   78420000 :             if (!classp)
    5723                 :   75367700 :               classp = sets[i].src_const_elt;
    5724                 :            : 
    5725                 :   78420000 :             if (sets[i].src_elt == 0)
    5726                 :            :               {
    5727                 :   63116700 :                 struct table_elt *elt;
    5728                 :            : 
    5729                 :            :                 /* Note that these insert_regs calls cannot remove
    5730                 :            :                    any of the src_elt's, because they would have failed to
    5731                 :            :                    match if not still valid.  */
    5732                 :   63116700 :                 if (insert_regs (src, classp, 0))
    5733                 :            :                   {
    5734                 :   10442800 :                     rehash_using_reg (src);
    5735                 :   16299000 :                     sets[i].src_hash = HASH (src, mode);
    5736                 :            :                   }
    5737                 :   63116700 :                 elt = insert (src, classp, sets[i].src_hash, mode);
    5738                 :   63116700 :                 elt->in_memory = sets[i].src_in_memory;
    5739                 :            :                 /* If inline asm has any clobbers, ensure we only reuse
    5740                 :            :                    existing inline asms and never try to put the ASM_OPERANDS
    5741                 :            :                    into an insn that isn't inline asm.  */
    5742                 :   63116700 :                 if (GET_CODE (src) == ASM_OPERANDS
    5743                 :       6221 :                     && GET_CODE (x) == PARALLEL)
    5744                 :       6203 :                   elt->cost = MAX_COST;
    5745                 :   63116700 :                 sets[i].src_elt = classp = elt;
    5746                 :            :               }
    5747                 :   15802200 :             if (sets[i].src_const && sets[i].src_const_elt == 0
    5748                 :    8915970 :                 && src != sets[i].src_const
    5749                 :   79491600 :                 && ! rtx_equal_p (sets[i].src_const, src))
    5750                 :    1071630 :               sets[i].src_elt = insert (sets[i].src_const, classp,
    5751                 :    1071630 :                                         sets[i].src_const_hash, mode);
    5752                 :            :           }
    5753                 :            :       }
    5754                 :   44234300 :     else if (sets[i].src_elt == 0)
    5755                 :            :       /* If we did not insert the source into the hash table (e.g., it was
    5756                 :            :          volatile), note the equivalence class for the REG_EQUAL value, if any,
    5757                 :            :          so that the destination goes into that class.  */
    5758                 :   36213500 :       sets[i].src_elt = src_eqv_elt;
    5759                 :            : 
    5760                 :            :   /* Record destination addresses in the hash table.  This allows us to
    5761                 :            :      check if they are invalidated by other sets.  */
    5762                 :  355176000 :   for (i = 0; i < n_sets; i++)
    5763                 :            :     {
    5764                 :  122667000 :       if (sets[i].rtl)
    5765                 :            :         {
    5766                 :   87172000 :           rtx x = sets[i].inner_dest;
    5767                 :   87172000 :           struct table_elt *elt;
    5768                 :   87172000 :           machine_mode mode;
    5769                 :   87172000 :           unsigned hash;
    5770                 :            : 
    5771                 :   87172000 :           if (MEM_P (x))
    5772                 :            :             {
    5773                 :   15910800 :               x = XEXP (x, 0);
    5774                 :   15910800 :               mode = GET_MODE (x);
    5775                 :   30162200 :               hash = HASH (x, mode);
    5776                 :   15910800 :               elt = lookup (x, hash, mode);
    5777                 :   15910800 :               if (!elt)
    5778                 :            :                 {
    5779                 :   14329700 :                   if (insert_regs (x, NULL, 0))
    5780                 :            :                     {
    5781                 :    1254410 :                       rtx dest = SET_DEST (sets[i].rtl);
    5782                 :            : 
    5783                 :    1254410 :                       rehash_using_reg (x);
    5784                 :    1269510 :                       hash = HASH (x, mode);
    5785                 :    1254410 :                       sets[i].dest_hash = HASH (dest, GET_MODE (dest));
    5786                 :            :                     }
    5787                 :   14329700 :                   elt = insert (x, NULL, hash, mode);
    5788                 :            :                 }
    5789                 :            : 
    5790                 :   15910800 :               sets[i].dest_addr_elt = elt;
    5791                 :            :             }
    5792                 :            :           else
    5793                 :   71261200 :             sets[i].dest_addr_elt = NULL;
    5794                 :            :         }
    5795                 :            :     }
    5796                 :            : 
    5797                 :  232509000 :   invalidate_from_clobbers (insn);
    5798                 :            : 
    5799                 :            :   /* Some registers are invalidated by subroutine calls.  Memory is
    5800                 :            :      invalidated by non-constant calls.  */
    5801                 :            : 
    5802                 :  232509000 :   if (CALL_P (insn))
    5803                 :            :     {
    5804                 :   10091300 :       if (!(RTL_CONST_OR_PURE_CALL_P (insn)))
    5805                 :    9406640 :         invalidate_memory ();
    5806                 :            :       else
    5807                 :            :         /* For const/pure calls, invalidate any argument slots, because
    5808                 :            :            those are owned by the callee.  */
    5809                 :    1885950 :         for (tem = CALL_INSN_FUNCTION_USAGE (insn); tem; tem = XEXP (tem, 1))
    5810                 :    1201250 :           if (GET_CODE (XEXP (tem, 0)) == USE
    5811                 :    1201240 :               && MEM_P (XEXP (XEXP (tem, 0), 0)))
    5812                 :      12391 :             invalidate (XEXP (XEXP (tem, 0), 0), VOIDmode);
    5813                 :   10091300 :       invalidate_for_call (insn);
    5814                 :            :     }
    5815                 :            : 
    5816                 :            :   /* Now invalidate everything set by this instruction.
    5817                 :            :      If a SUBREG or other funny destination is being set,
    5818                 :            :      sets[i].rtl is still nonzero, so here we invalidate the reg
    5819                 :            :      a part of which is being set.  */
    5820                 :            : 
    5821                 :  355176000 :   for (i = 0; i < n_sets; i++)
    5822                 :  122667000 :     if (sets[i].rtl)
    5823                 :            :       {
    5824                 :            :         /* We can't use the inner dest, because the mode associated with
    5825                 :            :            a ZERO_EXTRACT is significant.  */
    5826                 :   87172000 :         rtx dest = SET_DEST (sets[i].rtl);
    5827                 :            : 
    5828                 :            :         /* Needed for registers to remove the register from its
    5829                 :            :            previous quantity's chain.
    5830                 :            :            Needed for memory if this is a nonvarying address, unless
    5831                 :            :            we have just done an invalidate_memory that covers even those.  */
    5832                 :   87172000 :         if (REG_P (dest) || GET_CODE (dest) == SUBREG)
    5833                 :   71245300 :           invalidate (dest, VOIDmode);
    5834                 :   15926800 :         else if (MEM_P (dest))
    5835                 :   15910800 :           invalidate (dest, VOIDmode);
    5836                 :      15952 :         else if (GET_CODE (dest) == STRICT_LOW_PART
    5837                 :       2855 :                  || GET_CODE (dest) == ZERO_EXTRACT)
    5838                 :      15406 :           invalidate (XEXP (dest, 0), GET_MODE (dest));
    5839                 :            :       }
    5840                 :            : 
    5841                 :            :   /* Don't cse over a call to setjmp; on some machines (eg VAX)
    5842                 :            :      the regs restored by the longjmp come from a later time
    5843                 :            :      than the setjmp.  */
    5844                 :  232509000 :   if (CALL_P (insn) && find_reg_note (insn, REG_SETJMP, NULL))
    5845                 :            :     {
    5846                 :       1474 :       flush_hash_table ();
    5847                 :       1474 :       goto done;
    5848                 :            :     }
    5849                 :            : 
    5850                 :            :   /* Make sure registers mentioned in destinations
    5851                 :            :      are safe for use in an expression to be inserted.
    5852                 :            :      This removes from the hash table
    5853                 :            :      any invalid entry that refers to one of these registers.
    5854                 :            : 
    5855                 :            :      We don't care about the return value from mention_regs because
    5856                 :            :      we are going to hash the SET_DEST values unconditionally.  */
    5857                 :            : 
    5858                 :  355174000 :   for (i = 0; i < n_sets; i++)
    5859                 :            :     {
    5860                 :  122667000 :       if (sets[i].rtl)
    5861                 :            :         {
    5862                 :   87172000 :           rtx x = SET_DEST (sets[i].rtl);
    5863                 :            : 
    5864                 :   87172000 :           if (!REG_P (x))
    5865                 :   16712000 :             mention_regs (x);
    5866                 :            :           else
    5867                 :            :             {
    5868                 :            :               /* We used to rely on all references to a register becoming
    5869                 :            :                  inaccessible when a register changes to a new quantity,
    5870                 :            :                  since that changes the hash code.  However, that is not
    5871                 :            :                  safe, since after HASH_SIZE new quantities we get a
    5872                 :            :                  hash 'collision' of a register with its own invalid
    5873                 :            :                  entries.  And since SUBREGs have been changed not to
    5874                 :            :                  change their hash code with the hash code of the register,
    5875                 :            :                  it wouldn't work any longer at all.  So we have to check
    5876                 :            :                  for any invalid references lying around now.
    5877                 :            :                  This code is similar to the REG case in mention_regs,
    5878                 :            :                  but it knows that reg_tick has been incremented, and
    5879                 :            :                  it leaves reg_in_table as -1 .  */
    5880                 :   70460000 :               unsigned int regno = REGNO (x);
    5881                 :   70460000 :               unsigned int endregno = END_REGNO (x);
    5882                 :   70460000 :               unsigned int i;
    5883                 :            : 
    5884                 :  140920000 :               for (i = regno; i < endregno; i++)
    5885                 :            :                 {
    5886                 :   70460000 :                   if (REG_IN_TABLE (i) >= 0)
    5887                 :            :                     {
    5888                 :    8335820 :                       remove_invalid_refs (i);
    5889                 :    8335820 :                       REG_IN_TABLE (i) = -1;
    5890                 :            :                     }
    5891                 :            :                 }
    5892                 :            :             }
    5893                 :            :         }
    5894                 :            :     }
    5895                 :            : 
    5896                 :            :   /* We may have just removed some of the src_elt's from the hash table.
    5897                 :            :      So replace each one with the current head of the same class.
    5898                 :            :      Also check if destination addresses have been removed.  */
    5899                 :            : 
    5900                 :  355174000 :   for (i = 0; i < n_sets; i++)
    5901                 :  122667000 :     if (sets[i].rtl)
    5902                 :            :       {
    5903                 :   87172000 :         if (sets[i].dest_addr_elt
    5904                 :   15910800 :             && sets[i].dest_addr_elt->first_same_value == 0)
    5905                 :            :           {
    5906                 :            :             /* The elt was removed, which means this destination is not
    5907                 :            :                valid after this instruction.  */
    5908                 :         12 :             sets[i].rtl = NULL_RTX;
    5909                 :            :           }
    5910                 :   87172000 :         else if (sets[i].src_elt && sets[i].src_elt->first_same_value == 0)
    5911                 :            :           /* If elt was removed, find current head of same class,
    5912                 :            :              or 0 if nothing remains of that class.  */
    5913                 :            :           {
    5914                 :            :             struct table_elt *elt = sets[i].src_elt;
    5915                 :            : 
    5916                 :    6906440 :             while (elt && elt->prev_same_value)
    5917                 :            :               elt = elt->prev_same_value;
    5918                 :            : 
    5919                 :   13747400 :             while (elt && elt->first_same_value == 0)
    5920                 :    6870070 :               elt = elt->next_same_value;
    5921                 :    6877330 :             sets[i].src_elt = elt ? elt->first_same_value : 0;
    5922                 :            :           }
    5923                 :            :       }
    5924                 :            : 
    5925                 :            :   /* Now insert the destinations into their equivalence classes.  */
    5926                 :            : 
    5927                 :  355174000 :   for (i = 0; i < n_sets; i++)
    5928                 :  122667000 :     if (sets[i].rtl)
    5929                 :            :       {
    5930                 :   87172000 :         rtx dest = SET_DEST (sets[i].rtl);
    5931                 :   87172000 :         struct table_elt *elt;
    5932                 :            : 
    5933                 :            :         /* Don't record value if we are not supposed to risk allocating
    5934                 :            :            floating-point values in registers that might be wider than
    5935                 :            :            memory.  */
    5936                 :   87172000 :         if ((flag_float_store
    5937                 :       8442 :              && MEM_P (dest)
    5938                 :       2665 :              && FLOAT_MODE_P (GET_MODE (dest)))
    5939                 :            :             /* Don't record BLKmode values, because we don't know the
    5940                 :            :                size of it, and can't be sure that other BLKmode values
    5941                 :            :                have the same or smaller size.  */
    5942                 :   87170300 :             || GET_MODE (dest) == BLKmode
    5943                 :            :             /* If we didn't put a REG_EQUAL value or a source into the hash
    5944                 :            :                table, there is no point is recording DEST.  */
    5945                 :   87170300 :             || sets[i].src_elt == 0)
    5946                 :   15595000 :           continue;
    5947                 :            : 
    5948                 :            :         /* STRICT_LOW_PART isn't part of the value BEING set,
    5949                 :            :            and neither is the SUBREG inside it.
    5950                 :            :            Note that in this case SETS[I].SRC_ELT is really SRC_EQV_ELT.  */
    5951                 :   71577000 :         if (GET_CODE (dest) == STRICT_LOW_PART)
    5952                 :          0 :           dest = SUBREG_REG (XEXP (dest, 0));
    5953                 :            : 
    5954                 :   71577000 :         if (REG_P (dest) || GET_CODE (dest) == SUBREG)
    5955                 :            :           /* Registers must also be inserted into chains for quantities.  */
    5956                 :   55889500 :           if (insert_regs (dest, sets[i].src_elt, 1))
    5957                 :            :             {
    5958                 :            :               /* If `insert_regs' changes something, the hash code must be
    5959                 :            :                  recalculated.  */
    5960                 :   55889500 :               rehash_using_reg (dest);
    5961                 :   55889500 :               sets[i].dest_hash = HASH (dest, GET_MODE (dest));
    5962                 :            :             }
    5963                 :            : 
    5964                 :            :         /* If DEST is a paradoxical SUBREG, don't record DEST since the bits
    5965                 :            :            outside the mode of GET_MODE (SUBREG_REG (dest)) are undefined.  */
    5966                 :   71577000 :         if (paradoxical_subreg_p (dest))
    5967                 :      43941 :           continue;
    5968                 :            : 
    5969                 :  143066000 :         elt = insert (dest, sets[i].src_elt,
    5970                 :   71533100 :                       sets[i].dest_hash, GET_MODE (dest));
    5971                 :            : 
    5972                 :            :         /* If this is a constant, insert the constant anchors with the
    5973                 :            :            equivalent register-offset expressions using register DEST.  */
    5974                 :   71533100 :         if (targetm.const_anchor
    5975                 :          0 :             && REG_P (dest)
    5976                 :          0 :             && SCALAR_INT_MODE_P (GET_MODE (dest))
    5977                 :          0 :             && GET_CODE (sets[i].src_elt->exp) == CONST_INT)
    5978                 :          0 :           insert_const_anchors (dest, sets[i].src_elt->exp, GET_MODE (dest));
    5979                 :            : 
    5980                 :  143066000 :         elt->in_memory = (MEM_P (sets[i].inner_dest)
    5981                 :   71533100 :                           && !MEM_READONLY_P (sets[i].inner_dest));
    5982                 :            : 
    5983                 :            :         /* If we have (set (subreg:m1 (reg:m2 foo) 0) (bar:m1)), M1 is no
    5984                 :            :            narrower than M2, and both M1 and M2 are the same number of words,
    5985                 :            :            we are also doing (set (reg:m2 foo) (subreg:m2 (bar:m1) 0)) so
    5986                 :            :            make that equivalence as well.
    5987                 :            : 
    5988                 :            :            However, BAR may have equivalences for which gen_lowpart
    5989                 :            :            will produce a simpler value than gen_lowpart applied to
    5990                 :            :            BAR (e.g., if BAR was ZERO_EXTENDed from M2), so we will scan all
    5991                 :            :            BAR's equivalences.  If we don't get a simplified form, make
    5992                 :            :            the SUBREG.  It will not be used in an equivalence, but will
    5993                 :            :            cause two similar assignments to be detected.
    5994                 :            : 
    5995                 :            :            Note the loop below will find SUBREG_REG (DEST) since we have
    5996                 :            :            already entered SRC and DEST of the SET in the table.  */
    5997                 :            : 
    5998                 :   71533100 :         if (GET_CODE (dest) == SUBREG
    5999                 :            :             && (known_equal_after_align_down
    6000                 :  123395000 :                 (GET_MODE_SIZE (GET_MODE (SUBREG_REG (dest))) - 1,
    6001                 :    1421020 :                  GET_MODE_SIZE (GET_MODE (dest)) - 1,
    6002                 :     710512 :                  UNITS_PER_WORD))
    6003                 :      17176 :             && !partial_subreg_p (dest)
    6004                 :   71546000 :             && sets[i].src_elt != 0)
    6005                 :            :           {
    6006                 :      12958 :             machine_mode new_mode = GET_MODE (SUBREG_REG (dest));
    6007                 :      12958 :             struct table_elt *elt, *classp = 0;
    6008                 :            : 
    6009                 :      44082 :             for (elt = sets[i].src_elt->first_same_value; elt;
    6010                 :      31124 :                  elt = elt->next_same_value)
    6011                 :            :               {
    6012                 :      31124 :                 rtx new_src = 0;
    6013                 :      31124 :                 unsigned src_hash;
    6014                 :      31124 :                 struct table_elt *src_elt;
    6015                 :            : 
    6016                 :            :                 /* Ignore invalid entries.  */
    6017                 :      31124 :                 if (!REG_P (elt->exp)
    6018                 :      31124 :                     && ! exp_equiv_p (elt->exp, elt->exp, 1, false))
    6019                 :          0 :                   continue;
    6020                 :            : 
    6021                 :            :                 /* We may have already been playing subreg games.  If the
    6022                 :            :                    mode is already correct for the destination, use it.  */
    6023                 :      31124 :                 if (GET_MODE (elt->exp) == new_mode)
    6024                 :            :                   new_src = elt->exp;
    6025                 :            :                 else
    6026                 :            :                   {
    6027                 :      31124 :                     poly_uint64 byte
    6028                 :      31124 :                       = subreg_lowpart_offset (new_mode, GET_MODE (dest));
    6029                 :      31124 :                     new_src = simplify_gen_subreg (new_mode, elt->exp,
    6030                 :      31124 :                                                    GET_MODE (dest), byte);
    6031                 :            :                   }
    6032                 :            : 
    6033                 :            :                 /* The call to simplify_gen_subreg fails if the value
    6034                 :            :                    is VOIDmode, yet we can't do any simplification, e.g.
    6035                 :            :                    for EXPR_LISTs denoting function call results.
    6036                 :            :                    It is invalid to construct a SUBREG with a VOIDmode
    6037                 :            :                    SUBREG_REG, hence a zero new_src means we can't do
    6038                 :            :                    this substitution.  */
    6039                 :      31124 :                 if (! new_src)
    6040                 :          0 :                   continue;
    6041                 :            : 
    6042                 :      43091 :                 src_hash = HASH (new_src, new_mode);
    6043                 :      31124 :                 src_elt = lookup (new_src, src_hash, new_mode);
    6044                 :            : 
    6045                 :            :                 /* Put the new source in the hash table is if isn't
    6046                 :            :                    already.  */
    6047                 :      31124 :                 if (src_elt == 0)
    6048                 :            :                   {
    6049                 :      25120 :                     if (insert_regs (new_src, classp, 0))
    6050                 :            :                       {
    6051                 :          0 :                         rehash_using_reg (new_src);
    6052                 :          0 :                         src_hash = HASH (new_src, new_mode);
    6053                 :            :                       }
    6054                 :      25120 :                     src_elt = insert (new_src, classp, src_hash, new_mode);
    6055                 :      25120 :                     src_elt->in_memory = elt->in_memory;
    6056                 :      25120 :                     if (GET_CODE (new_src) == ASM_OPERANDS
    6057                 :          0 :                         && elt->cost == MAX_COST)
    6058                 :          0 :                       src_elt->cost = MAX_COST;
    6059                 :            :                   }
    6060                 :       6004 :                 else if (classp && classp != src_elt->first_same_value)
    6061                 :            :                   /* Show that two things that we've seen before are
    6062                 :            :                      actually the same.  */
    6063                 :         13 :                   merge_equiv_classes (src_elt, classp);
    6064                 :            : 
    6065                 :      31124 :                 classp = src_elt->first_same_value;
    6066                 :            :                 /* Ignore invalid entries.  */
    6067                 :      31124 :                 while (classp
    6068                 :      31124 :                        && !REG_P (classp->exp)
    6069                 :      41082 :                        && ! exp_equiv_p (classp->exp, classp->exp, 1, false))
    6070                 :          0 :                   classp = classp->next_same_value;
    6071                 :            :               }
    6072                 :            :           }
    6073                 :            :       }
    6074                 :            : 
    6075                 :            :   /* Special handling for (set REG0 REG1) where REG0 is the
    6076                 :            :      "cheapest", cheaper than REG1.  After cse, REG1 will probably not
    6077                 :            :      be used in the sequel, so (if easily done) change this insn to
    6078                 :            :      (set REG1 REG0) and replace REG1 with REG0 in the previous insn
    6079                 :            :      that computed their value.  Then REG1 will become a dead store
    6080                 :            :      and won't cloud the situation for later optimizations.
    6081                 :            : 
    6082                 :            :      Do not make this change if REG1 is a hard register, because it will
    6083                 :            :      then be used in the sequel and we may be changing a two-operand insn
    6084                 :            :      into a three-operand insn.
    6085                 :            : 
    6086                 :            :      Also do not do this if we are operating on a copy of INSN.  */
    6087                 :            : 
    6088                 :  232507000 :   if (n_sets == 1 && sets[0].rtl)
    6089                 :   86024300 :     try_back_substitute_reg (sets[0].rtl, insn);
    6090                 :            : 
    6091                 :  146483000 : done:;
    6092                 :  232509000 : }
    6093                 :            : 
    6094                 :            : /* Remove from the hash table all expressions that reference memory.  */
    6095                 :            : 
    6096                 :            : static void
    6097                 :    9406640 : invalidate_memory (void)
    6098                 :            : {
    6099                 :    9406640 :   int i;
    6100                 :    9406640 :   struct table_elt *p, *next;
    6101                 :            : 
    6102                 :  310419000 :   for (i = 0; i < HASH_SIZE; i++)
    6103                 :  418896000 :     for (p = table[i]; p; p = next)
    6104                 :            :       {
    6105                 :  117884000 :         next = p->next_same_hash;
    6106                 :  117884000 :         if (p->in_memory)
    6107                 :   13150700 :           remove_from_table (p, i);
    6108                 :            :       }
    6109                 :    9406640 : }
    6110                 :            : 
    6111                 :            : /* Perform invalidation on the basis of everything about INSN,
    6112                 :            :    except for invalidating the actual places that are SET in it.
    6113                 :            :    This includes the places CLOBBERed, and anything that might
    6114                 :            :    alias with something that is SET or CLOBBERed.  */
    6115                 :            : 
    6116                 :            : static void
    6117                 :  232509000 : invalidate_from_clobbers (rtx_insn *insn)
    6118                 :            : {
    6119                 :  232509000 :   rtx x = PATTERN (insn);
    6120                 :            : 
    6121                 :  232509000 :   if (GET_CODE (x) == CLOBBER)
    6122                 :            :     {
    6123                 :      67257 :       rtx ref = XEXP (x, 0);
    6124                 :      67257 :       if (ref)
    6125                 :            :         {
    6126                 :      67257 :           if (REG_P (ref) || GET_CODE (ref) == SUBREG
    6127                 :      10412 :               || MEM_P (ref))
    6128                 :      67257 :             invalidate (ref, VOIDmode);
    6129                 :          0 :           else if (GET_CODE (ref) == STRICT_LOW_PART
    6130                 :          0 :                    || GET_CODE (ref) == ZERO_EXTRACT)
    6131                 :          0 :             invalidate (XEXP (ref, 0), GET_MODE (ref));
    6132                 :            :         }
    6133                 :            :     }
    6134                 :  232441000 :   else if (GET_CODE (x) == PARALLEL)
    6135                 :            :     {
    6136                 :   19006100 :       int i;
    6137                 :   58206500 :       for (i = XVECLEN (x, 0) - 1; i >= 0; i--)
    6138                 :            :         {
    6139                 :   39200300 :           rtx y = XVECEXP (x, 0, i);
    6140                 :   39200300 :           if (GET_CODE (y) == CLOBBER)
    6141                 :            :             {
    6142                 :   18652900 :               rtx ref = XEXP (y, 0);
    6143                 :   18652900 :               if (REG_P (ref) || GET_CODE (ref) == SUBREG
    6144                 :     160438 :                   || MEM_P (ref))
    6145                 :   18541400 :                 invalidate (ref, VOIDmode);
    6146                 :     111511 :               else if (GET_CODE (ref) == STRICT_LOW_PART
    6147                 :     111511 :                        || GET_CODE (ref) == ZERO_EXTRACT)
    6148                 :          0 :                 invalidate (XEXP (ref, 0), GET_MODE (ref));
    6149                 :            :             }
    6150                 :            :         }
    6151                 :            :     }
    6152                 :  232509000 : }
    6153                 :            : 
    6154                 :            : /* Perform invalidation on the basis of everything about INSN.
    6155                 :            :    This includes the places CLOBBERed, and anything that might
    6156                 :            :    alias with something that is SET or CLOBBERed.  */
    6157                 :            : 
    6158                 :            : static void
    6159                 :  232509000 : invalidate_from_sets_and_clobbers (rtx_insn *insn)
    6160                 :            : {
    6161                 :  232509000 :   rtx tem;
    6162                 :  232509000 :   rtx x = PATTERN (insn);
    6163                 :            : 
    6164                 :  232509000 :   if (CALL_P (insn))
    6165                 :            :     {
    6166                 :   26251000 :       for (tem = CALL_INSN_FUNCTION_USAGE (insn); tem; tem = XEXP (tem, 1))
    6167                 :            :         {
    6168                 :   16159700 :           rtx temx = XEXP (tem, 0);
    6169                 :   16159700 :           if (GET_CODE (temx) == CLOBBER)
    6170                 :     236997 :             invalidate (SET_DEST (temx), VOIDmode);
    6171                 :            :         }
    6172                 :            :     }
    6173                 :            : 
    6174                 :            :   /* Ensure we invalidate the destination register of a CALL insn.
    6175                 :            :      This is necessary for machines where this register is a fixed_reg,
    6176                 :            :      because no other code would invalidate it.  */
    6177                 :  232509000 :   if (GET_CODE (x) == SET && GET_CODE (SET_SRC (x)) == CALL)
    6178                 :    4091540 :     invalidate (SET_DEST (x), VOIDmode);
    6179                 :            : 
    6180                 :  228417000 :   else if (GET_CODE (x) == PARALLEL)
    6181                 :            :     {
    6182                 :   19462400 :       int i;
    6183                 :            : 
    6184                 :   59579400 :       for (i = XVECLEN (x, 0) - 1; i >= 0; i--)
    6185                 :            :         {
    6186                 :   40117000 :           rtx y = XVECEXP (x, 0, i);
    6187                 :   40117000 :           if (GET_CODE (y) == CLOBBER)
    6188                 :            :             {
    6189                 :   19113200 :               rtx clobbered = XEXP (y, 0);
    6190                 :            : 
    6191                 :   19113200 :               if (REG_P (clobbered)
    6192                 :     164452 :                   || GET_CODE (clobbered) == SUBREG)
    6193                 :   18948700 :                 invalidate (clobbered, VOIDmode);
    6194                 :     164452 :               else if (GET_CODE (clobbered) == STRICT_LOW_PART
    6195                 :     164452 :                        || GET_CODE (clobbered) == ZERO_EXTRACT)
    6196                 :          0 :                 invalidate (XEXP (clobbered, 0), GET_MODE (clobbered));
    6197                 :            :             }
    6198                 :   21003800 :           else if (GET_CODE (y) == SET && GET_CODE (SET_SRC (y)) == CALL)
    6199                 :       9481 :             invalidate (SET_DEST (y), VOIDmode);
    6200                 :            :         }
    6201                 :            :     }
    6202                 :  232509000 : }
    6203                 :            : 
    6204                 :            : /* Process X, part of the REG_NOTES of an insn.  Look at any REG_EQUAL notes
    6205                 :            :    and replace any registers in them with either an equivalent constant
    6206                 :            :    or the canonical form of the register.  If we are inside an address,
    6207                 :            :    only do this if the address remains valid.
    6208                 :            : 
    6209                 :            :    OBJECT is 0 except when within a MEM in which case it is the MEM.
    6210                 :            : 
    6211                 :            :    Return the replacement for X.  */
    6212                 :            : 
    6213                 :            : static rtx
    6214                 :  160479000 : cse_process_notes_1 (rtx x, rtx object, bool *changed)
    6215                 :            : {
    6216                 :  160479000 :   enum rtx_code code = GET_CODE (x);
    6217                 :  160479000 :   const char *fmt = GET_RTX_FORMAT (code);
    6218                 :  160479000 :   int i;
    6219                 :            : 
    6220                 :  160479000 :   switch (code)
    6221                 :            :     {
    6222                 :            :     case CONST:
    6223                 :            :     case SYMBOL_REF:
    6224                 :            :     case LABEL_REF:
    6225                 :            :     CASE_CONST_ANY:
    6226                 :            :     case PC:
    6227                 :            :     case CC0:
    6228                 :            :     case LO_SUM:
    6229                 :            :       return x;
    6230                 :            : 
    6231                 :     576428 :     case MEM:
    6232                 :    1152860 :       validate_change (x, &XEXP (x, 0),
    6233                 :            :                        cse_process_notes (XEXP (x, 0), x, changed), 0);
    6234                 :     576428 :       return x;
    6235                 :            : 
    6236                 :  133704000 :     case EXPR_LIST:
    6237                 :  133704000 :       if (REG_NOTE_KIND (x) == REG_EQUAL)
    6238                 :   10383900 :         XEXP (x, 0) = cse_process_notes (XEXP (x, 0), NULL_RTX, changed);
    6239                 :            :       /* Fall through.  */
    6240                 :            : 
    6241                 :  145805000 :     case INSN_LIST:
    6242                 :  145805000 :     case INT_LIST:
    6243                 :  145805000 :       if (XEXP (x, 1))
    6244                 :  115675000 :         XEXP (x, 1) = cse_process_notes (XEXP (x, 1), NULL_RTX, changed);
    6245                 :            :       return x;
    6246                 :            : 
    6247                 :      95058 :     case SIGN_EXTEND:
    6248                 :      95058 :     case ZERO_EXTEND:
    6249                 :      95058 :     case SUBREG:
    6250                 :      95058 :       {
    6251                 :     190116 :         rtx new_rtx = cse_process_notes (XEXP (x, 0), object, changed);
    6252                 :            :         /* We don't substitute VOIDmode constants into these rtx,
    6253                 :            :            since they would impede folding.  */
    6254                 :      95058 :         if (GET_MODE (new_rtx) != VOIDmode)
    6255                 :      95042 :           validate_change (object, &XEXP (x, 0), new_rtx, 0);
    6256                 :            :         return x;
    6257                 :            :       }
    6258                 :            : 
    6259                 :        794 :     case UNSIGNED_FLOAT:
    6260                 :        794 :       {
    6261                 :       1588 :         rtx new_rtx = cse_process_notes (XEXP (x, 0), object, changed);
    6262                 :            :         /* We don't substitute negative VOIDmode constants into these rtx,
    6263                 :            :            since they would impede folding.  */
    6264                 :        794 :         if (GET_MODE (new_rtx) != VOIDmode
    6265                 :          0 :             || (CONST_INT_P (new_rtx) && INTVAL (new_rtx) >= 0)
    6266                 :          0 :             || (CONST_DOUBLE_P (new_rtx) && CONST_DOUBLE_HIGH (new_rtx) >= 0))
    6267                 :        794 :           validate_change (object, &XEXP (x, 0), new_rtx, 0);
    6268                 :            :         return x;
    6269                 :            :       }
    6270                 :            : 
    6271                 :    3838920 :     case REG:
    6272                 :    3838920 :       i = REG_QTY (REGNO (x));
    6273                 :            : 
    6274                 :            :       /* Return a constant or a constant register.  */
    6275                 :    3838920 :       if (REGNO_QTY_VALID_P (REGNO (x)))
    6276                 :            :         {
    6277                 :    1064700 :           struct qty_table_elem *ent = &qty_table[i];
    6278                 :            : 
    6279                 :    1064700 :           if (ent->const_rtx != NULL_RTX
    6280                 :       8317 :               && (CONSTANT_P (ent->const_rtx)
    6281                 :       6731 :                   || REG_P (ent->const_rtx)))
    6282                 :            :             {
    6283                 :       1586 :               rtx new_rtx = gen_lowpart (GET_MODE (x), ent->const_rtx);
    6284                 :       1586 :               if (new_rtx)
    6285                 :       1586 :                 return copy_rtx (new_rtx);
    6286                 :            :             }
    6287                 :            :         }
    6288                 :            : 
    6289                 :            :       /* Otherwise, canonicalize this register.  */
    6290                 :    3837340 :       return canon_reg (x, NULL);
    6291                 :            : 
    6292                 :            :     default:
    6293                 :            :       break;
    6294                 :            :     }
    6295                 :            : 
    6296                 :   13356800 :   for (i = 0; i < GET_RTX_LENGTH (code); i++)
    6297                 :    8945030 :     if (fmt[i] == 'e')
    6298                 :   17618200 :       validate_change (object, &XEXP (x, i),
    6299                 :            :                        cse_process_notes (XEXP (x, i), object, changed), 0);
    6300                 :            : 
    6301                 :            :   return x;
    6302                 :            : }
    6303                 :            : 
    6304                 :            : static rtx
    6305                 :  160479000 : cse_process_notes (rtx x, rtx object, bool *changed)
    6306                 :            : {
    6307                 :   72510700 :   rtx new_rtx = cse_process_notes_1 (x, object, changed);
    6308                 :  160479000 :   if (new_rtx != x)
    6309                 :      35393 :     *changed = true;
    6310                 :   72510700 :   return new_rtx;
    6311                 :            : }
    6312                 :            : 
    6313                 :            : 
    6314                 :            : /* Find a path in the CFG, starting with FIRST_BB to perform CSE on.
    6315                 :            : 
    6316                 :            :    DATA is a pointer to a struct cse_basic_block_data, that is used to
    6317                 :            :    describe the path.
    6318                 :            :    It is filled with a queue of basic blocks, starting with FIRST_BB
    6319                 :            :    and following a trace through the CFG.
    6320                 :            : 
    6321                 :            :    If all paths starting at FIRST_BB have been followed, or no new path
    6322                 :            :    starting at FIRST_BB can be constructed, this function returns FALSE.
    6323                 :            :    Otherwise, DATA->path is filled and the function returns TRUE indicating
    6324                 :            :    that a path to follow was found.
    6325                 :            : 
    6326                 :            :    If FOLLOW_JUMPS is false, the maximum path length is 1 and the only
    6327                 :            :    block in the path will be FIRST_BB.  */
    6328                 :            : 
    6329                 :            : static bool
    6330                 :   24998800 : cse_find_path (basic_block first_bb, struct cse_basic_block_data *data,
    6331                 :            :                int follow_jumps)
    6332                 :            : {
    6333                 :   24998800 :   basic_block bb;
    6334                 :   24998800 :   edge e;
    6335                 :   24998800 :   int path_size;
    6336                 :            : 
    6337                 :   24998800 :   bitmap_set_bit (cse_visited_basic_blocks, first_bb->index);
    6338                 :            : 
    6339                 :            :   /* See if there is a previous path.  */
    6340                 :   24998800 :   path_size = data->path_size;
    6341                 :            : 
    6342                 :            :   /* There is a previous path.  Make sure it started with FIRST_BB.  */
    6343                 :   24998800 :   if (path_size)
    6344                 :   13426700 :     gcc_assert (data->path[0].bb == first_bb);
    6345                 :            : 
    6346                 :            :   /* There was only one basic block in the last path.  Clear the path and
    6347                 :            :      return, so that paths starting at another basic block can be tried.  */
    6348                 :   24998800 :   if (path_size == 1)
    6349                 :            :     {
    6350                 :    8886090 :       path_size = 0;
    6351                 :    8886090 :       goto done;
    6352                 :            :     }
    6353                 :            : 
    6354                 :            :   /* If the path was empty from the beginning, construct a new path.  */
    6355                 :   16112700 :   if (path_size == 0)
    6356                 :   11572100 :     data->path[path_size++].bb = first_bb;
    6357                 :            :   else
    6358                 :            :     {
    6359                 :            :       /* Otherwise, path_size must be equal to or greater than 2, because
    6360                 :            :          a previous path exists that is at least two basic blocks long.
    6361                 :            : 
    6362                 :            :          Update the previous branch path, if any.  If the last branch was
    6363                 :            :          previously along the branch edge, take the fallthrough edge now.  */
    6364                 :    9932430 :       while (path_size >= 2)
    6365                 :            :         {
    6366                 :    7246460 :           basic_block last_bb_in_path, previous_bb_in_path;
    6367                 :    7246460 :           edge e;
    6368                 :            : 
    6369                 :    7246460 :           --path_size;
    6370                 :    7246460 :           last_bb_in_path = data->path[path_size].bb;
    6371                 :    7246460 :           previous_bb_in_path = data->path[path_size - 1].bb;
    6372                 :            : 
    6373                 :            :           /* If we previously followed a path along the branch edge, try
    6374                 :            :              the fallthru edge now.  */
    6375                 :   12638200 :           if (EDGE_COUNT (previous_bb_in_path->succs) == 2
    6376                 :    7021700 :               && any_condjump_p (BB_END (previous_bb_in_path))
    6377                 :    7021700 :               && (e = find_edge (previous_bb_in_path, last_bb_in_path))
    6378                 :   14268200 :               && e == BRANCH_EDGE (previous_bb_in_path))
    6379                 :            :             {
    6380                 :    2475860 :               bb = FALLTHRU_EDGE (previous_bb_in_path)->dest;
    6381                 :    2475860 :               if (bb != EXIT_BLOCK_PTR_FOR_FN (cfun)
    6382                 :    2475860 :                   && single_pred_p (bb)
    6383                 :            :                   /* We used to assert here that we would only see blocks
    6384                 :            :                      that we have not visited yet.  But we may end up
    6385                 :            :                      visiting basic blocks twice if the CFG has changed
    6386                 :            :                      in this run of cse_main, because when the CFG changes
    6387                 :            :                      the topological sort of the CFG also changes.  A basic
    6388                 :            :                      blocks that previously had more than two predecessors
    6389                 :            :                      may now have a single predecessor, and become part of
    6390                 :            :                      a path that starts at another basic block.
    6391                 :            : 
    6392                 :            :                      We still want to visit each basic block only once, so
    6393                 :            :                      halt the path here if we have already visited BB.  */
    6394                 :    4330520 :                   && !bitmap_bit_p (cse_visited_basic_blocks, bb->index))
    6395                 :            :                 {
    6396                 :    1854670 :                   bitmap_set_bit (cse_visited_basic_blocks, bb->index);
    6397                 :    1854670 :                   data->path[path_size++].bb = bb;
    6398                 :    1854670 :                   break;
    6399                 :            :                 }
    6400                 :            :             }
    6401                 :            : 
    6402                 :    5391790 :           data->path[path_size].bb = NULL;
    6403                 :            :         }
    6404                 :            : 
    6405                 :            :       /* If only one block remains in the path, bail.  */
    6406                 :    4540640 :       if (path_size == 1)
    6407                 :            :         {
    6408                 :    2685970 :           path_size = 0;
    6409                 :    2685970 :           goto done;
    6410                 :            :         }
    6411                 :            :     }
    6412                 :            : 
    6413                 :            :   /* Extend the path if possible.  */
    6414                 :   13426700 :   if (follow_jumps)
    6415                 :            :     {
    6416                 :    7795060 :       bb = data->path[path_size - 1].bb;
    6417                 :   20892700 :       while (bb && path_size < param_max_cse_path_length)
    6418                 :            :         {
    6419                 :   13097700 :           if (single_succ_p (bb))
    6420                 :    5710190 :             e = single_succ_edge (bb);
    6421                 :   28280200 :           else if (EDGE_COUNT (bb->succs) == 2
    6422                 :    7382620 :                    && any_condjump_p (BB_END (bb)))
    6423                 :            :             {
    6424                 :            :               /* First try to follow the branch.  If that doesn't lead
    6425                 :            :                  to a useful path, follow the fallthru edge.  */
    6426                 :    5711390 :               e = BRANCH_EDGE (bb);
    6427                 :    5711390 :               if (!single_pred_p (e->dest))
    6428                 :    3231490 :                 e = FALLTHRU_EDGE (bb);
    6429                 :            :             }
    6430                 :            :           else
    6431                 :            :             e = NULL;
    6432                 :            : 
    6433                 :   11421600 :           if (e
    6434                 :   11421600 :               && !((e->flags & EDGE_ABNORMAL_CALL) && cfun->has_nonlocal_label)
    6435                 :   11420500 :               && e->dest != EXIT_BLOCK_PTR_FOR_FN (cfun)
    6436                 :    9980450 :               && single_pred_p (e->dest)
    6437                 :            :               /* Avoid visiting basic blocks twice.  The large comment
    6438                 :            :                  above explains why this can happen.  */
    6439                 :   16816000 :               && !bitmap_bit_p (cse_visited_basic_blocks, e->dest->index))
    6440                 :            :             {
    6441                 :    5394380 :               basic_block bb2 = e->dest;
    6442                 :    5394380 :               bitmap_set_bit (cse_visited_basic_blocks, bb2->index);
    6443                 :    5394380 :               data->path[path_size++].bb = bb2;
    6444                 :    5394380 :               bb = bb2;
    6445                 :            :             }
    6446                 :            :           else
    6447                 :            :             bb = NULL;
    6448                 :            :         }
    6449                 :            :     }
    6450                 :            : 
    6451                 :    5631670 : done:
    6452                 :   24998800 :   data->path_size = path_size;
    6453                 :   24998800 :   return path_size != 0;
    6454                 :            : }
    6455                 :            : 
    6456                 :            : /* Dump the path in DATA to file F.  NSETS is the number of sets
    6457                 :            :    in the path.  */
    6458                 :            : 
    6459                 :            : static void
    6460                 :        299 : cse_dump_path (struct cse_basic_block_data *data, int nsets, FILE *f)
    6461                 :            : {
    6462                 :        299 :   int path_entry;
    6463                 :            : 
    6464                 :        299 :   fprintf (f, ";; Following path with %d sets: ", nsets);
    6465                 :        756 :   for (path_entry = 0; path_entry < data->path_size; path_entry++)
    6466                 :        457 :     fprintf (f, "%d ", (data->path[path_entry].bb)->index);
    6467                 :        299 :   fputc ('\n', f);
    6468                 :        299 :   fflush (f);
    6469                 :        299 : }
    6470                 :            : 
    6471                 :            : 
    6472                 :            : /* Return true if BB has exception handling successor edges.  */
    6473                 :            : 
    6474                 :            : static bool
    6475                 :    7436970 : have_eh_succ_edges (basic_block bb)
    6476                 :            : {
    6477                 :    7436970 :   edge e;
    6478                 :    7436970 :   edge_iterator ei;
    6479                 :            : 
    6480                 :   17572400 :   FOR_EACH_EDGE (e, ei, bb->succs)
    6481                 :   10905800 :     if (e->flags & EDGE_EH)
    6482                 :            :       return true;
    6483                 :            : 
    6484                 :            :   return false;
    6485                 :            : }
    6486                 :            : 
    6487                 :            : 
    6488                 :            : /* Scan to the end of the path described by DATA.  Return an estimate of
    6489                 :            :    the total number of SETs of all insns in the path.  */
    6490                 :            : 
    6491                 :            : static void
    6492                 :   13426700 : cse_prescan_path (struct cse_basic_block_data *data)
    6493                 :            : {
    6494                 :   13426700 :   int nsets = 0;
    6495                 :   13426700 :   int path_size = data->path_size;
    6496                 :   13426700 :   int path_entry;
    6497                 :            : 
    6498                 :            :   /* Scan to end of each basic block in the path.  */
    6499                 :   35936200 :   for (path_entry = 0; path_entry < path_size; path_entry++)
    6500                 :            :     {
    6501                 :   22509500 :       basic_block bb;
    6502                 :   22509500 :       rtx_insn *insn;
    6503                 :            : 
    6504                 :   22509500 :       bb = data->path[path_entry].bb;
    6505                 :            : 
    6506                 :  558774000 :       FOR_BB_INSNS (bb, insn)
    6507                 :            :         {
    6508                 :  268132000 :           if (!INSN_P (insn))
    6509                 :   35614200 :             continue;
    6510                 :            : 
    6511                 :            :           /* A PARALLEL can have lots of SETs in it,
    6512                 :            :              especially if it is really an ASM_OPERANDS.  */
    6513                 :  232518000 :           if (GET_CODE (PATTERN (insn)) == PARALLEL)
    6514                 :   19465500 :             nsets += XVECLEN (PATTERN (insn), 0);
    6515                 :            :           else
    6516                 :  213053000 :             nsets += 1;
    6517                 :            :         }
    6518                 :            :     }
    6519                 :            : 
    6520                 :   13426700 :   data->nsets = nsets;
    6521                 :   13426700 : }
    6522                 :            : 
    6523                 :            : /* Return true if the pattern of INSN uses a LABEL_REF for which
    6524                 :            :    there isn't a REG_LABEL_OPERAND note.  */
    6525                 :            : 
    6526                 :            : static bool
    6527                 :  232376000 : check_for_label_ref (rtx_insn *insn)
    6528                 :            : {
    6529                 :            :   /* If this insn uses a LABEL_REF and there isn't a REG_LABEL_OPERAND
    6530                 :            :      note for it, we must rerun jump since it needs to place the note.  If
    6531                 :            :      this is a LABEL_REF for a CODE_LABEL that isn't in the insn chain,
    6532                 :            :      don't do this since no REG_LABEL_OPERAND will be added.  */
    6533                 :  232376000 :   subrtx_iterator::array_type array;
    6534                 : 1196110000 :   FOR_EACH_SUBRTX (iter, array, PATTERN (insn), ALL)
    6535                 :            :     {
    6536                 :  963733000 :       const_rtx x = *iter;
    6537                 :  963733000 :       if (GET_CODE (x) == LABEL_REF
    6538                 :   12103400 :           && !LABEL_REF_NONLOCAL_P (x)
    6539                 :   12102600 :           && (!JUMP_P (insn)
    6540                 :   12078800 :               || !label_is_jump_target_p (label_ref_label (x), insn))
    6541                 :      23849 :           && LABEL_P (label_ref_label (x))
    6542                 :      23508 :           && INSN_UID (label_ref_label (x)) != 0
    6543                 :  963757000 :           && !find_reg_note (insn, REG_LABEL_OPERAND, label_ref_label (x)))
    6544                 :        719 :         return true;
    6545                 :            :     }
    6546                 :  232375000 :   return false;
    6547                 :            : }
    6548                 :            : 
    6549                 :            : /* Process a single extended basic block described by EBB_DATA.  */
    6550                 :            : 
    6551                 :            : static void
    6552                 :   13087400 : cse_extended_basic_block (struct cse_basic_block_data *ebb_data)
    6553                 :            : {
    6554                 :   13087400 :   int path_size = ebb_data->path_size;
    6555                 :   13087400 :   int path_entry;
    6556                 :   13087400 :   int num_insns = 0;
    6557                 :            : 
    6558                 :            :   /* Allocate the space needed by qty_table.  */
    6559                 :   13087400 :   qty_table = XNEWVEC (struct qty_table_elem, max_qty);
    6560                 :            : 
    6561                 :   13087400 :   new_basic_block ();
    6562                 :   13087400 :   cse_ebb_live_in = df_get_live_in (ebb_data->path[0].bb);
    6563                 :   13087400 :   cse_ebb_live_out = df_get_live_out (ebb_data->path[path_size - 1].bb);
    6564                 :   35255000 :   for (path_entry = 0; path_entry < path_size; path_entry++)
    6565                 :            :     {
    6566                 :   22167500 :       basic_block bb;
    6567                 :   22167500 :       rtx_insn *insn;
    6568                 :            : 
    6569                 :   22167500 :       bb = ebb_data->path[path_entry].bb;
    6570                 :            : 
    6571                 :            :       /* Invalidate recorded information for eh regs if there is an EH
    6572                 :            :          edge pointing to that bb.  */
    6573                 :   22167500 :       if (bb_has_eh_pred (bb))
    6574                 :            :         {
    6575                 :     368253 :           df_ref def;
    6576                 :            : 
    6577                 :    1473010 :           FOR_EACH_ARTIFICIAL_DEF (def, bb->index)
    6578                 :     736506 :             if (DF_REF_FLAGS (def) & DF_REF_AT_TOP)
    6579                 :     736506 :               invalidate (DF_REF_REG (def), GET_MODE (DF_REF_REG (def)));
    6580                 :            :         }
    6581                 :            : 
    6582                 :   22167500 :       optimize_this_for_speed_p = optimize_bb_for_speed_p (bb);
    6583                 :  557251000 :       FOR_BB_INSNS (bb, insn)
    6584                 :            :         {
    6585                 :            :           /* If we have processed 1,000 insns, flush the hash table to
    6586                 :            :              avoid extreme quadratic behavior.  We must not include NOTEs
    6587                 :            :              in the count since there may be more of them when generating
    6588                 :            :              debugging information.  If we clear the table at different
    6589                 :            :              times, code generated with -g -O might be different than code
    6590                 :            :              generated with -O but not -g.
    6591                 :            : 
    6592                 :            :              FIXME: This is a real kludge and needs to be done some other
    6593                 :            :                     way.  */
    6594                 :  267542000 :           if (NONDEBUG_INSN_P (insn)
    6595                 :  267542000 :               && num_insns++ > param_max_cse_insns)
    6596                 :            :             {
    6597                 :       1657 :               flush_hash_table ();
    6598                 :       1657 :               num_insns = 0;
    6599                 :            :             }
    6600                 :            : 
    6601                 :  267542000 :           if (INSN_P (insn))
    6602                 :            :             {
    6603                 :            :               /* Process notes first so we have all notes in canonical forms
    6604                 :            :                  when looking for duplicate operations.  */
    6605                 :  232509000 :               if (REG_NOTES (insn))
    6606                 :            :                 {
    6607                 :   87967800 :                   bool changed = false;
    6608                 :   87967800 :                   REG_NOTES (insn) = cse_process_notes (REG_NOTES (insn),
    6609                 :            :                                                         NULL_RTX, &changed);
    6610                 :   87967800 :                   if (changed)
    6611                 :      32584 :                     df_notes_rescan (insn);
    6612                 :            :                 }
    6613                 :            : 
    6614                 :  232509000 :               cse_insn (insn);
    6615                 :            : 
    6616                 :            :               /* If we haven't already found an insn where we added a LABEL_REF,
    6617                 :            :                  check this one.  */
    6618                 :  232509000 :               if (INSN_P (insn) && !recorded_label_ref
    6619                 :  464884000 :                   && check_for_label_ref (insn))
    6620                 :        719 :                 recorded_label_ref = true;
    6621                 :            : 
    6622                 :            :               if (HAVE_cc0 && NONDEBUG_INSN_P (insn))
    6623                 :            :                 {
    6624                 :            :                   /* If the previous insn sets CC0 and this insn no
    6625                 :            :                      longer references CC0, delete the previous insn.
    6626                 :            :                      Here we use fact that nothing expects CC0 to be
    6627                 :            :                      valid over an insn, which is true until the final
    6628                 :            :                      pass.  */
    6629                 :            :                   rtx_insn *prev_insn;
    6630                 :            :                   rtx tem;
    6631                 :            : 
    6632                 :            :                   prev_insn = prev_nonnote_nondebug_insn (insn);
    6633                 :            :                   if (prev_insn && NONJUMP_INSN_P (prev_insn)
    6634                 :            :                       && (tem = single_set (prev_insn)) != NULL_RTX
    6635                 :            :                       && SET_DEST (tem) == cc0_rtx
    6636                 :            :                       && ! reg_mentioned_p (cc0_rtx, PATTERN (insn)))
    6637                 :            :                     delete_insn (prev_insn);
    6638                 :            : 
    6639                 :            :                   /* If this insn is not the last insn in the basic
    6640                 :            :                      block, it will be PREV_INSN(insn) in the next
    6641                 :            :                      iteration.  If we recorded any CC0-related
    6642                 :            :                      information for this insn, remember it.  */
    6643                 :            :                   if (insn != BB_END (bb))
    6644                 :            :                     {
    6645                 :            :                       prev_insn_cc0 = this_insn_cc0;
    6646                 :            :                       prev_insn_cc0_mode = this_insn_cc0_mode;
    6647                 :            :                     }
    6648                 :            :                 }
    6649                 :            :             }
    6650                 :            :         }
    6651                 :            : 
    6652                 :            :       /* With non-call exceptions, we are not always able to update
    6653                 :            :          the CFG properly inside cse_insn.  So clean up possibly
    6654                 :            :          redundant EH edges here.  */
    6655                 :   22167500 :       if (cfun->can_throw_non_call_exceptions && have_eh_succ_edges (bb))
    6656                 :     770352 :         cse_cfg_altered |= purge_dead_edges (bb);
    6657                 :            : 
    6658                 :            :       /* If we changed a conditional jump, we may have terminated
    6659                 :            :          the path we are following.  Check that by verifying that
    6660                 :            :          the edge we would take still exists.  If the edge does
    6661                 :            :          not exist anymore, purge the remainder of the path.
    6662                 :            :          Note that this will cause us to return to the caller.  */
    6663                 :   22167500 :       if (path_entry < path_size - 1)
    6664                 :            :         {
    6665                 :    9082260 :           basic_block next_bb = ebb_data->path[path_entry + 1].bb;
    6666                 :    9082260 :           if (!find_edge (bb, next_bb))
    6667                 :            :             {
    6668                 :       2586 :               do
    6669                 :            :                 {
    6670                 :       2586 :                   path_size--;
    6671                 :            : 
    6672                 :            :                   /* If we truncate the path, we must also reset the
    6673                 :            :                      visited bit on the remaining blocks in the path,
    6674                 :            :                      or we will never visit them at all.  */
    6675                 :       5172 :                   bitmap_clear_bit (cse_visited_basic_blocks,
    6676                 :       2586 :                              ebb_data->path[path_size].bb->index);
    6677                 :       2586 :                   ebb_data->path[path_size].bb = NULL;
    6678                 :            :                 }
    6679                 :       2586 :               while (path_size - 1 != path_entry);
    6680                 :       2152 :               ebb_data->path_size = path_size;
    6681                 :            :             }
    6682                 :            :         }
    6683                 :            : 
    6684                 :            :       /* If this is a conditional jump insn, record any known
    6685                 :            :          equivalences due to the condition being tested.  */
    6686                 :   22167500 :       insn = BB_END (bb);
    6687                 :   22167500 :       if (path_entry < path_size - 1
    6688                 :    9080110 :           && EDGE_COUNT (bb->succs) == 2
    6689                 :    8844250 :           && JUMP_P (insn)
    6690                 :    8844250 :           && single_set (insn)
    6691                 :   31011800 :           && any_condjump_p (insn))
    6692                 :            :         {
    6693                 :    8844250 :           basic_block next_bb = ebb_data->path[path_entry + 1].bb;
    6694                 :    8844250 :           bool taken = (next_bb == BRANCH_EDGE (bb)->dest);
    6695                 :    8844250 :           record_jump_equiv (insn, taken);
    6696                 :            :         }
    6697                 :            : 
    6698                 :            :       /* Clear the CC0-tracking related insns, they can't provide
    6699                 :            :          useful information across basic block boundaries.  */
    6700                 :   22167500 :       prev_insn_cc0 = 0;
    6701                 :            :     }
    6702                 :            : 
    6703                 :   13087400 :   gcc_assert (next_qty <= max_qty);
    6704                 :            : 
    6705                 :   13087400 :   free (qty_table);
    6706                 :   13087400 : }
    6707                 :            : 
    6708                 :            : 
    6709                 :            : /* Perform cse on the instructions of a function.
    6710                 :            :    F is the first instruction.
    6711                 :            :    NREGS is one plus the highest pseudo-reg number used in the instruction.
    6712                 :            : 
    6713                 :            :    Return 2 if jump optimizations should be redone due to simplifications
    6714                 :            :    in conditional jump instructions.
    6715                 :            :    Return 1 if the CFG should be cleaned up because it has been modified.
    6716                 :            :    Return 0 otherwise.  */
    6717                 :            : 
    6718                 :            : static int
    6719                 :    1548700 : cse_main (rtx_insn *f ATTRIBUTE_UNUSED, int nregs)
    6720                 :            : {
    6721                 :    1548700 :   struct cse_basic_block_data ebb_data;
    6722                 :    1548700 :   basic_block bb;
    6723                 :    1548700 :   int *rc_order = XNEWVEC (int, last_basic_block_for_fn (cfun));
    6724                 :    1548700 :   int i, n_blocks;
    6725                 :            : 
    6726                 :            :   /* CSE doesn't use dominane info but can invalidate it in different ways.
    6727                 :            :      For simplicity free dominance info here.  */
    6728                 :    1548700 :   free_dominance_info (CDI_DOMINATORS);
    6729                 :            : 
    6730                 :    1548700 :   df_set_flags (DF_LR_RUN_DCE);
    6731                 :    1548700 :   df_note_add_problem ();
    6732                 :    1548700 :   df_analyze ();
    6733                 :    1548700 :   df_set_flags (DF_DEFER_INSN_RESCAN);
    6734                 :            : 
    6735                 :    1548700 :   reg_scan (get_insns (), max_reg_num ());
    6736                 :    1548700 :   init_cse_reg_info (nregs);
    6737                 :            : 
    6738                 :    1548700 :   ebb_data.path = XNEWVEC (struct branch_path,
    6739                 :            :                            param_max_cse_path_length);
    6740                 :            : 
    6741                 :    1548700 :   cse_cfg_altered = false;
    6742                 :    1548700 :   cse_jumps_altered = false;
    6743                 :    1548700 :   recorded_label_ref = false;
    6744                 :    1548700 :   constant_pool_entries_cost = 0;
    6745                 :    1548700 :   constant_pool_entries_regcost = 0;
    6746                 :    1548700 :   ebb_data.path_size = 0;
    6747                 :    1548700 :   ebb_data.nsets = 0;
    6748                 :    1548700 :   rtl_hooks = cse_rtl_hooks;
    6749                 :            : 
    6750                 :    1548700 :   init_recog ();
    6751                 :    1548700 :   init_alias_analysis ();
    6752                 :            : 
    6753                 :    1548700 :   reg_eqv_table = XNEWVEC (struct reg_eqv_elem, nregs);
    6754                 :            : 
    6755                 :            :   /* Set up the table of already visited basic blocks.  */
    6756                 :    1548700 :   cse_visited_basic_blocks = sbitmap_alloc (last_basic_block_for_fn (cfun));
    6757                 :    1548700 :   bitmap_clear (cse_visited_basic_blocks);
    6758                 :            : 
    6759                 :            :   /* Loop over basic blocks in reverse completion order (RPO),
    6760                 :            :      excluding the ENTRY and EXIT blocks.  */
    6761                 :    1548700 :   n_blocks = pre_and_rev_post_order_compute (NULL, rc_order, false);
    6762                 :    1548700 :   i = 0;
    6763                 :   13120800 :   while (i < n_blocks)
    6764                 :            :     {
    6765                 :            :       /* Find the first block in the RPO queue that we have not yet
    6766                 :            :          processed before.  */
    6767                 :   18541500 :       do
    6768                 :            :         {
    6769                 :   18541500 :           bb = BASIC_BLOCK_FOR_FN (cfun, rc_order[i++]);
    6770                 :            :         }
    6771                 :   37083000 :       while (bitmap_bit_p (cse_visited_basic_blocks, bb->index)
    6772                 :   18541500 :              && i < n_blocks);
    6773                 :            : 
    6774                 :            :       /* Find all paths starting with BB, and process them.  */
    6775                 :   24998800 :       while (cse_find_path (bb, &ebb_data, flag_cse_follow_jumps))
    6776                 :            :         {
    6777                 :            :           /* Pre-scan the path.  */
    6778                 :   13426700 :           cse_prescan_path (&ebb_data);
    6779                 :            : 
    6780                 :            :           /* If this basic block has no sets, skip it.  */
    6781                 :   13426700 :           if (ebb_data.nsets == 0)
    6782                 :     339286 :             continue;
    6783                 :            : 
    6784                 :            :           /* Get a reasonable estimate for the maximum number of qty's
    6785                 :            :              needed for this path.  For this, we take the number of sets
    6786                 :            :              and multiply that by MAX_RECOG_OPERANDS.  */
    6787                 :   13087400 :           max_qty = ebb_data.nsets * MAX_RECOG_OPERANDS;
    6788                 :            : 
    6789                 :            :           /* Dump the path we're about to process.  */
    6790                 :   13087400 :           if (dump_file)
    6791                 :        299 :             cse_dump_path (&ebb_data, ebb_data.nsets, dump_file);
    6792                 :            : 
    6793                 :   13087400 :           cse_extended_basic_block (&ebb_data);
    6794                 :            :         }
    6795                 :            :     }
    6796                 :            : 
    6797                 :            :   /* Clean up.  */
    6798                 :    1548700 :   end_alias_analysis ();
    6799                 :    1548700 :   free (reg_eqv_table);
    6800                 :    1548700 :   free (ebb_data.path);
    6801                 :    1548700 :   sbitmap_free (cse_visited_basic_blocks);
    6802                 :    1548700 :   free (rc_order);
    6803                 :    1548700 :   rtl_hooks = general_rtl_hooks;
    6804                 :            : 
    6805                 :    1548700 :   if (cse_jumps_altered || recorded_label_ref)
    6806                 :            :     return 2;
    6807                 :    1542360 :   else if (cse_cfg_altered)
    6808                 :            :     return 1;
    6809                 :            :   else
    6810                 :    1542270 :     return 0;
    6811                 :            : }
    6812                 :            : 
    6813                 :            : /* Count the number of times registers are used (not set) in X.
    6814                 :            :    COUNTS is an array in which we accumulate the count, INCR is how much
    6815                 :            :    we count each register usage.
    6816                 :            : 
    6817                 :            :    Don't count a usage of DEST, which is the SET_DEST of a SET which
    6818                 :            :    contains X in its SET_SRC.  This is because such a SET does not
    6819                 :            :    modify the liveness of DEST.
    6820                 :            :    DEST is set to pc_rtx for a trapping insn, or for an insn with side effects.
    6821                 :            :    We must then count uses of a SET_DEST regardless, because the insn can't be
    6822                 :            :    deleted here.  */
    6823                 :            : 
    6824                 :            : static void
    6825                 : 1517590000 : count_reg_usage (rtx x, int *counts, rtx dest, int incr)
    6826                 :            : {
    6827                 : 1813600000 :   enum rtx_code code;
    6828                 : 1813600000 :   rtx note;
    6829                 : 1813600000 :   const char *fmt;
    6830                 : 1813600000 :   int i, j;
    6831                 :            : 
    6832                 : 1813600000 :   if (x == 0)
    6833                 :            :     return;
    6834                 :            : 
    6835                 : 1793950000 :   switch (code = GET_CODE (x))
    6836                 :            :     {
    6837                 :  338136000 :     case REG:
    6838                 :  338136000 :       if (x != dest)
    6839                 :  326478000 :         counts[REGNO (x)] += incr;
    6840                 :            :       return;
    6841                 :            : 
    6842                 :            :     case PC:
    6843                 :            :     case CC0:
    6844                 :            :     case CONST:
    6845                 :            :     CASE_CONST_ANY:
    6846                 :            :     case SYMBOL_REF:
    6847                 :            :     case LABEL_REF:
    6848                 :            :       return;
    6849                 :            : 
    6850                 :  101379000 :     case CLOBBER:
    6851                 :            :       /* If we are clobbering a MEM, mark any registers inside the address
    6852                 :            :          as being used.  */
    6853                 :  101379000 :       if (MEM_P (XEXP (x, 0)))
    6854                 :     156287 :         count_reg_usage (XEXP (XEXP (x, 0), 0), counts, NULL_RTX, incr);
    6855                 :            :       return;
    6856                 :            : 
    6857                 :  249465000 :     case SET:
    6858                 :            :       /* Unless we are setting a REG, count everything in SET_DEST.  */
    6859                 :  249465000 :       if (!REG_P (SET_DEST (x)))
    6860                 :   67345700 :         count_reg_usage (SET_DEST (x), counts, NULL_RTX, incr);
    6861                 :  249465000 :       count_reg_usage (SET_SRC (x), counts,
    6862                 :            :                        dest ? dest : SET_DEST (x),
    6863                 :            :                        incr);
    6864                 :  249465000 :       return;
    6865                 :            : 
    6866                 :            :     case DEBUG_INSN:
    6867                 :            :       return;
    6868                 :            : 
    6869                 :  263298000 :     case CALL_INSN:
    6870                 :  263298000 :     case INSN:
    6871                 :  263298000 :     case JUMP_INSN:
    6872                 :            :       /* We expect dest to be NULL_RTX here.  If the insn may throw,
    6873                 :            :          or if it cannot be deleted due to side-effects, mark this fact
    6874                 :            :          by setting DEST to pc_rtx.  */
    6875                 :  263277000 :       if ((!cfun->can_delete_dead_exceptions && !insn_nothrow_p (x))
    6876                 :  510679000 :           || side_effects_p (PATTERN (x)))
    6877                 :   41328900 :         dest = pc_rtx;
    6878                 :  263298000 :       if (code == CALL_INSN)
    6879                 :   19653800 :         count_reg_usage (CALL_INSN_FUNCTION_USAGE (x), counts, dest, incr);
    6880                 :  263298000 :       count_reg_usage (PATTERN (x), counts, dest, incr);
    6881                 :            : 
    6882                 :            :       /* Things used in a REG_EQUAL note aren't dead since loop may try to
    6883                 :            :          use them.  */
    6884                 :            : 
    6885                 :  263298000 :       note = find_reg_equal_equiv_note (x);
    6886                 :  263298000 :       if (note)
    6887                 :            :         {
    6888                 :   13590500 :           rtx eqv = XEXP (note, 0);
    6889                 :            : 
    6890                 :   13590500 :           if (GET_CODE (eqv) == EXPR_LIST)
    6891                 :            :           /* This REG_EQUAL note describes the result of a function call.
    6892                 :            :              Process all the arguments.  */
    6893                 :          0 :             do
    6894                 :            :               {
    6895                 :          0 :                 count_reg_usage (XEXP (eqv, 0), counts, dest, incr);
    6896                 :          0 :                 eqv = XEXP (eqv, 1);
    6897                 :            :               }
    6898                 :          0 :             while (eqv && GET_CODE (eqv) == EXPR_LIST);
    6899                 :            :           else
    6900                 :            :             count_reg_usage (eqv, counts, dest, incr);
    6901                 :            :         }
    6902                 :            :       return;
    6903                 :            : 
    6904                 :   32803300 :     case EXPR_LIST:
    6905                 :   32803300 :       if (REG_NOTE_KIND (x) == REG_EQUAL
    6906                 :   32803300 :           || (REG_NOTE_KIND (x) != REG_NONNEG && GET_CODE (XEXP (x,0)) == USE)
    6907                 :            :           /* FUNCTION_USAGE expression lists may include (CLOBBER (mem /u)),
    6908                 :            :              involving registers in the address.  */
    6909                 :     967901 :           || GET_CODE (XEXP (x, 0)) == CLOBBER)
    6910                 :   32522500 :         count_reg_usage (XEXP (x, 0), counts, NULL_RTX, incr);
    6911                 :            : 
    6912                 :   32803300 :       count_reg_usage (XEXP (x, 1), counts, NULL_RTX, incr);
    6913                 :   32803300 :       return;
    6914                 :            : 
    6915                 :     640395 :     case ASM_OPERANDS:
    6916                 :            :       /* Iterate over just the inputs, not the constraints as well.  */
    6917                 :    1200240 :       for (i = ASM_OPERANDS_INPUT_LENGTH (x) - 1; i >= 0; i--)
    6918                 :     559842 :         count_reg_usage (ASM_OPERANDS_INPUT (x, i), counts, dest, incr);
    6919                 :            :       return;
    6920                 :            : 
    6921                 :          0 :     case INSN_LIST:
    6922                 :          0 :     case INT_LIST:
    6923                 :          0 :       gcc_unreachable ();
    6924                 :            : 
    6925                 :  454566000 :     default:
    6926                 :  454566000 :       break;
    6927                 :            :     }
    6928                 :            : 
    6929                 :  454566000 :   fmt = GET_RTX_FORMAT (code);
    6930                 : 1264940000 :   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
    6931                 :            :     {
    6932                 :  810369000 :       if (fmt[i] == 'e')
    6933                 :  614348000 :         count_reg_usage (XEXP (x, i), counts, dest, incr);
    6934                 :  196021000 :       else if (fmt[i] == 'E')
    6935                 :  131359000 :         for (j = XVECLEN (x, i) - 1; j >= 0; j--)
    6936                 :   88039200 :           count_reg_usage (XVECEXP (x, i, j), counts, dest, incr);
    6937                 :            :     }
    6938                 :            : }
    6939                 :            : 
    6940                 :            : /* Return true if X is a dead register.  */
    6941                 :            : 
    6942                 :            : static inline int
    6943                 :  461098000 : is_dead_reg (const_rtx x, int *counts)
    6944                 :            : {
    6945                 :  461098000 :   return (REG_P (x)
    6946                 :  202520000 :           && REGNO (x) >= FIRST_PSEUDO_REGISTER
    6947                 :  126762000 :           && counts[REGNO (x)] == 0);
    6948                 :            : }
    6949                 :            : 
    6950                 :            : /* Return true if set is live.  */
    6951                 :            : static bool
    6952                 :  232601000 : set_live_p (rtx set, rtx_insn *insn ATTRIBUTE_UNUSED, /* Only used with HAVE_cc0.  */
    6953                 :            :             int *counts)
    6954                 :            : {
    6955                 :  232601000 :   rtx_insn *tem;
    6956                 :            : 
    6957                 :  232601000 :   if (set_noop_p (set))
    6958                 :            :     ;
    6959                 :            : 
    6960                 :  232582000 :   else if (GET_CODE (SET_DEST (set)) == CC0
    6961                 :          0 :            && !side_effects_p (SET_SRC (set))
    6962                 :  232582000 :            && ((tem = next_nonnote_nondebug_insn (insn)) == NULL_RTX
    6963                 :          0 :                || !INSN_P (tem)
    6964                 :          0 :                || !reg_referenced_p (cc0_rtx, PATTERN (tem))))
    6965                 :          0 :     return false;
    6966                 :  232582000 :   else if (!is_dead_reg (SET_DEST (set), counts)
    6967                 :    6001010 :            || side_effects_p (SET_SRC (set)))
    6968                 :  226597000 :     return true;
    6969                 :            :   return false;
    6970                 :            : }
    6971                 :            : 
    6972                 :            : /* Return true if insn is live.  */
    6973                 :            : 
    6974                 :            : static bool
    6975                 :  424365000 : insn_live_p (rtx_insn *insn, int *counts)
    6976                 :            : {
    6977                 :  424365000 :   int i;
    6978                 :  424365000 :   if (!cfun->can_delete_dead_exceptions && !insn_nothrow_p (insn))
    6979                 :            :     return true;
    6980                 :  408266000 :   else if (GET_CODE (PATTERN (insn)) == SET)
    6981                 :  195707000 :     return set_live_p (PATTERN (insn), insn, counts);
    6982                 :  212559000 :   else if (GET_CODE (PATTERN (insn)) == PARALLEL)
    6983                 :            :     {
    6984                 :   75042900 :       for (i = XVECLEN (PATTERN (insn), 0) - 1; i >= 0; i--)
    6985                 :            :         {
    6986                 :   74797500 :           rtx elt = XVECEXP (PATTERN (insn), 0, i);
    6987                 :            : 
    6988                 :   74797500 :           if (GET_CODE (elt) == SET)
    6989                 :            :             {
    6990                 :   36893700 :               if (set_live_p (elt, insn, counts))
    6991                 :            :                 return true;
    6992                 :            :             }
    6993                 :   37903700 :           else if (GET_CODE (elt) != CLOBBER && GET_CODE (elt) != USE)
    6994                 :            :             return true;
    6995                 :            :         }
    6996                 :            :       return false;
    6997                 :            :     }
    6998                 :  175671000 :   else if (DEBUG_INSN_P (insn))
    6999                 :            :     {
    7000                 :  166550000 :       rtx_insn *next;
    7001                 :            : 
    7002                 :  166550000 :       if (DEBUG_MARKER_INSN_P (insn))
    7003                 :            :         return true;
    7004                 :            : 
    7005                 :  949084000 :       for (next = NEXT_INSN (insn); next; next = NEXT_INSN (next))
    7006                 :  539308000 :         if (NOTE_P (next))
    7007                 :     588065 :           continue;
    7008                 :  538720000 :         else if (!DEBUG_INSN_P (next))
    7009                 :            :           return true;
    7010                 :            :         /* If we find an inspection point, such as a debug begin stmt,
    7011                 :            :            we want to keep the earlier debug insn.  */
    7012                 :  497221000 :         else if (DEBUG_MARKER_INSN_P (next))
    7013                 :            :           return true;
    7014                 :  410677000 :         else if (INSN_VAR_LOCATION_DECL (insn) == INSN_VAR_LOCATION_DECL (next))
    7015                 :            :           return false;
    7016                 :            : 
    7017                 :            :       return true;
    7018                 :            :     }
    7019                 :            :   else
    7020                 :            :     return true;
    7021                 :            : }
    7022                 :            : 
    7023                 :            : /* Count the number of stores into pseudo.  Callback for note_stores.  */
    7024                 :            : 
    7025                 :            : static void
    7026                 :  169382000 : count_stores (rtx x, const_rtx set ATTRIBUTE_UNUSED, void *data)
    7027                 :            : {
    7028                 :  169382000 :   int *counts = (int *) data;
    7029                 :  169382000 :   if (REG_P (x) && REGNO (x) >= FIRST_PSEUDO_REGISTER)
    7030                 :   59230700 :     counts[REGNO (x)]++;
    7031                 :  169382000 : }
    7032                 :            : 
    7033                 :            : /* Return if DEBUG_INSN pattern PAT needs to be reset because some dead
    7034                 :            :    pseudo doesn't have a replacement.  COUNTS[X] is zero if register X
    7035                 :            :    is dead and REPLACEMENTS[X] is null if it has no replacemenet.
    7036                 :            :    Set *SEEN_REPL to true if we see a dead register that does have
    7037                 :            :    a replacement.  */
    7038                 :            : 
    7039                 :            : static bool
    7040                 :  128524000 : is_dead_debug_insn (const_rtx pat, int *counts, rtx *replacements,
    7041                 :            :                     bool *seen_repl)
    7042                 :            : {
    7043                 :  128524000 :   subrtx_iterator::array_type array;
    7044                 :  354151000 :   FOR_EACH_SUBRTX (iter, array, pat, NONCONST)
    7045                 :            :     {
    7046                 :  225630000 :       const_rtx x = *iter;
    7047                 :  258553000 :       if (is_dead_reg (x, counts))
    7048                 :            :         {
    7049                 :      15390 :           if (replacements && replacements[REGNO (x)] != NULL_RTX)
    7050                 :      12499 :             *seen_repl = true;
    7051                 :            :           else
    7052                 :       2891 :             return true;
    7053                 :            :         }
    7054                 :            :     }
    7055                 :  128521000 :   return false;
    7056                 :            : }
    7057                 :            : 
    7058                 :            : /* Replace a dead pseudo in a DEBUG_INSN with replacement DEBUG_EXPR.
    7059                 :            :    Callback for simplify_replace_fn_rtx.  */
    7060                 :            : 
    7061                 :            : static rtx
    7062                 :      25211 : replace_dead_reg (rtx x, const_rtx old_rtx ATTRIBUTE_UNUSED, void *data)
    7063                 :            : {
    7064                 :      25211 :   rtx *replacements = (rtx *) data;
    7065                 :            : 
    7066                 :      25211 :   if (REG_P (x)
    7067                 :      15912 :       && REGNO (x) >= FIRST_PSEUDO_REGISTER
    7068                 :      41123 :       && replacements[REGNO (x)] != NULL_RTX)
    7069                 :            :     {
    7070                 :      12499 :       if (GET_MODE (x) == GET_MODE (replacements[REGNO (x)]))
    7071                 :            :         return replacements[REGNO (x)];
    7072                 :          0 :       return lowpart_subreg (GET_MODE (x), replacements[REGNO (x)],
    7073                 :          0 :                              GET_MODE (replacements[REGNO (x)]));
    7074                 :            :     }
    7075                 :            :   return NULL_RTX;
    7076                 :            : }
    7077                 :            : 
    7078                 :            : /* Scan all the insns and delete any that are dead; i.e., they store a register
    7079                 :            :    that is never used or they copy a register to itself.
    7080                 :            : 
    7081                 :            :    This is used to remove insns made obviously dead by cse, loop or other
    7082                 :            :    optimizations.  It improves the heuristics in loop since it won't try to
    7083                 :            :    move dead invariants out of loops or make givs for dead quantities.  The
    7084                 :            :    remaining passes of the compilation are also sped up.  */
    7085                 :            : 
    7086                 :            : int
    7087                 :    4166530 : delete_trivially_dead_insns (rtx_insn *insns, int nreg)
    7088                 :            : {
    7089                 :    4166530 :   int *counts;
    7090                 :    4166530 :   rtx_insn *insn, *prev;
    7091                 :    4166530 :   rtx *replacements = NULL;
    7092                 :    4166530 :   int ndead = 0;
    7093                 :            : 
    7094                 :    4166530 :   timevar_push (TV_DELETE_TRIVIALLY_DEAD);
    7095                 :            :   /* First count the number of times each register is used.  */
    7096                 :    4166530 :   if (MAY_HAVE_DEBUG_BIND_INSNS)
    7097                 :            :     {
    7098                 :    1812910 :       counts = XCNEWVEC (int, nreg * 3);
    7099                 :  738305000 :       for (insn = insns; insn; insn = NEXT_INSN (insn))
    7100                 :  368246000 :         if (DEBUG_BIND_INSN_P (insn))
    7101                 :  130271000 :           count_reg_usage (INSN_VAR_LOCATION_LOC (insn), counts + nreg,
    7102                 :            :                            NULL_RTX, 1);
    7103                 :  237975000 :         else if (INSN_P (insn))
    7104                 :            :           {
    7105                 :  191792000 :             count_reg_usage (insn, counts, NULL_RTX, 1);
    7106                 :  191792000 :             note_stores (insn, count_stores, counts + nreg * 2);
    7107                 :            :           }
    7108                 :            :       /* If there can be debug insns, COUNTS are 3 consecutive arrays.
    7109                 :            :          First one counts how many times each pseudo is used outside
    7110                 :            :          of debug insns, second counts how many times each pseudo is
    7111                 :            :          used in debug insns and third counts how many times a pseudo
    7112                 :            :          is stored.  */
    7113                 :            :     }
    7114                 :            :   else
    7115                 :            :     {
    7116                 :    2353620 :       counts = XCNEWVEC (int, nreg);
    7117                 :  265042000 :       for (insn = insns; insn; insn = NEXT_INSN (insn))
    7118                 :  131344000 :         if (INSN_P (insn))
    7119                 :  102302000 :           count_reg_usage (insn, counts, NULL_RTX, 1);
    7120                 :            :       /* If no debug insns can be present, COUNTS is just an array
    7121                 :            :          which counts how many times each pseudo is used.  */
    7122                 :            :     }
    7123                 :            :   /* Pseudo PIC register should be considered as used due to possible
    7124                 :            :      new usages generated.  */
    7125                 :    4166530 :   if (!reload_completed
    7126                 :    4166530 :       && pic_offset_table_rtx
    7127                 :    4332660 :       && REGNO (pic_offset_table_rtx) >= FIRST_PSEUDO_REGISTER)
    7128                 :     166130 :     counts[REGNO (pic_offset_table_rtx)]++;
    7129                 :            :   /* Go from the last insn to the first and delete insns that only set unused
    7130                 :            :      registers or copy a register to itself.  As we delete an insn, remove
    7131                 :            :      usage counts for registers it uses.
    7132                 :            : 
    7133                 :            :      The first jump optimization pass may leave a real insn as the last
    7134                 :            :      insn in the function.   We must not skip that insn or we may end
    7135                 :            :      up deleting code that is not really dead.
    7136                 :            : 
    7137                 :            :      If some otherwise unused register is only used in DEBUG_INSNs,
    7138                 :            :      try to create a DEBUG_EXPR temporary and emit a DEBUG_INSN before
    7139                 :            :      the setter.  Then go through DEBUG_INSNs and if a DEBUG_EXPR
    7140                 :            :      has been created for the unused register, replace it with
    7141                 :            :      the DEBUG_EXPR, otherwise reset the DEBUG_INSN.  */
    7142                 :  503757000 :   for (insn = get_last_insn (); insn; insn = prev)
    7143                 :            :     {
    7144                 :  499590000 :       int live_insn = 0;
    7145                 :            : 
    7146                 :  499590000 :       prev = PREV_INSN (insn);
    7147                 :  499590000 :       if (!INSN_P (insn))
    7148                 :   75225000 :         continue;
    7149                 :            : 
    7150                 :  424365000 :       live_insn = insn_live_p (insn, counts);
    7151                 :            : 
    7152                 :            :       /* If this is a dead insn, delete it and show registers in it aren't
    7153                 :            :          being used.  */
    7154                 :            : 
    7155                 :  424365000 :       if (! live_insn && dbg_cnt (delete_trivial_dead))
    7156                 :            :         {
    7157                 :    7443930 :           if (DEBUG_INSN_P (insn))
    7158                 :            :             {
    7159                 :    1757380 :               if (DEBUG_BIND_INSN_P (insn))
    7160                 :    1757380 :                 count_reg_usage (INSN_VAR_LOCATION_LOC (insn), counts + nreg,
    7161                 :            :                                  NULL_RTX, -1);
    7162                 :            :             }
    7163                 :            :           else
    7164                 :            :             {
    7165                 :    5686550 :               rtx set;
    7166                 :    5686550 :               if (MAY_HAVE_DEBUG_BIND_INSNS
    7167                 :    2885820 :                   && (set = single_set (insn)) != NULL_RTX
    7168                 :    2885810 :                   && is_dead_reg (SET_DEST (set), counts)
    7169                 :            :                   /* Used at least once in some DEBUG_INSN.  */
    7170                 :    2875660 :                   && counts[REGNO (SET_DEST (set)) + nreg] > 0
    7171                 :            :                   /* And set exactly once.  */
    7172                 :      10472 :                   && counts[REGNO (SET_DEST (set)) + nreg * 2] == 1
    7173                 :      10111 :                   && !side_effects_p (SET_SRC (set))
    7174                 :    5696660 :                   && asm_noperands (PATTERN (insn)) < 0)
    7175                 :            :                 {
    7176                 :      10093 :                   rtx dval, bind_var_loc;
    7177                 :      10093 :                   rtx_insn *bind;
    7178                 :            : 
    7179                 :            :                   /* Create DEBUG_EXPR (and DEBUG_EXPR_DECL).  */
    7180                 :      10093 :                   dval = make_debug_expr_from_rtl (SET_DEST (set));
    7181                 :            : 
    7182                 :            :                   /* Emit a debug bind insn before the insn in which
    7183                 :            :                      reg dies.  */
    7184                 :      10093 :                   bind_var_loc =
    7185                 :      10093 :                     gen_rtx_VAR_LOCATION (GET_MODE (SET_DEST (set)),
    7186                 :            :                                           DEBUG_EXPR_TREE_DECL (dval),
    7187                 :            :                                           SET_SRC (set),
    7188                 :            :                                           VAR_INIT_STATUS_INITIALIZED);
    7189                 :      10093 :                   count_reg_usage (bind_var_loc, counts + nreg, NULL_RTX, 1);
    7190                 :            : 
    7191                 :      10093 :                   bind = emit_debug_insn_before (bind_var_loc, insn);
    7192                 :      10093 :                   df_insn_rescan (bind);
    7193                 :            : 
    7194                 :      10093 :                   if (replacements == NULL)
    7195                 :       5587 :                     replacements = XCNEWVEC (rtx, nreg);
    7196                 :      10093 :                   replacements[REGNO (SET_DEST (set))] = dval;
    7197                 :            :                 }
    7198                 :            : 
    7199                 :    5686550 :               count_reg_usage (insn, counts, NULL_RTX, -1);
    7200                 :    5686550 :               ndead++;
    7201                 :            :             }
    7202                 :    7443930 :           cse_cfg_altered |= delete_insn_and_edges (insn);
    7203                 :            :         }
    7204                 :            :     }
    7205                 :            : 
    7206                 :    4166530 :   if (MAY_HAVE_DEBUG_BIND_INSNS)
    7207                 :            :     {
    7208                 :  729039000 :       for (insn = get_last_insn (); insn; insn = PREV_INSN (insn))
    7209                 :  363613000 :         if (DEBUG_BIND_INSN_P (insn))
    7210                 :            :           {
    7211                 :            :             /* If this debug insn references a dead register that wasn't replaced
    7212                 :            :                with an DEBUG_EXPR, reset the DEBUG_INSN.  */
    7213                 :  128524000 :             bool seen_repl = false;
    7214                 :  128524000 :             if (is_dead_debug_insn (INSN_VAR_LOCATION_LOC (insn),
    7215                 :            :                                     counts, replacements, &seen_repl))
    7216                 :            :               {
    7217                 :       2891 :                 INSN_VAR_LOCATION_LOC (insn) = gen_rtx_UNKNOWN_VAR_LOC ();
    7218                 :       2891 :                 df_insn_rescan (insn);
    7219                 :            :               }
    7220                 :  128521000 :             else if (seen_repl)
    7221                 :            :               {
    7222                 :      24066 :                 INSN_VAR_LOCATION_LOC (insn)
    7223                 :      12033 :                   = simplify_replace_fn_rtx (INSN_VAR_LOCATION_LOC (insn),
    7224                 :            :                                              NULL_RTX, replace_dead_reg,
    7225                 :            :                                              replacements);
    7226                 :      12033 :                 df_insn_rescan (insn);
    7227                 :            :               }
    7228                 :            :           }
    7229                 :    1812910 :       free (replacements);
    7230                 :            :     }
    7231                 :            : 
    7232                 :    4166530 :   if (dump_file && ndead)
    7233                 :         25 :     fprintf (dump_file, "Deleted %i trivially dead insns\n",
    7234                 :            :              ndead);
    7235                 :            :   /* Clean up.  */
    7236                 :    4166530 :   free (counts);
    7237                 :    4166530 :   timevar_pop (TV_DELETE_TRIVIALLY_DEAD);
    7238                 :    4166530 :   return ndead;
    7239                 :            : }
    7240                 :            : 
    7241                 :            : /* If LOC contains references to NEWREG in a different mode, change them
    7242                 :            :    to use NEWREG instead.  */
    7243                 :            : 
    7244                 :            : static void
    7245                 :      55174 : cse_change_cc_mode (subrtx_ptr_iterator::array_type &array,
    7246                 :            :                     rtx *loc, rtx_insn *insn, rtx newreg)
    7247                 :            : {
    7248                 :     313413 :   FOR_EACH_SUBRTX_PTR (iter, array, loc, NONCONST)
    7249                 :            :     {
    7250                 :     258239 :       rtx *loc = *iter;
    7251                 :     258239 :       rtx x = *loc;
    7252                 :     258239 :       if (x
    7253                 :     230652 :           && REG_P (x)
    7254                 :      63555 :           && REGNO (x) == REGNO (newreg)
    7255                 :     300894 :           && GET_MODE (x) != GET_MODE (newreg))
    7256                 :            :         {
    7257                 :      42655 :           validate_change (insn, loc, newreg, 1);
    7258                 :      42655 :           iter.skip_subrtxes ();
    7259                 :            :         }
    7260                 :            :     }
    7261                 :      55174 : }
    7262                 :            : 
    7263                 :            : /* Change the mode of any reference to the register REGNO (NEWREG) to
    7264                 :            :    GET_MODE (NEWREG) in INSN.  */
    7265                 :            : 
    7266                 :            : static void
    7267                 :      27587 : cse_change_cc_mode_insn (rtx_insn *insn, rtx newreg)
    7268                 :            : {
    7269                 :      27587 :   int success;
    7270                 :            : 
    7271                 :      27587 :   if (!INSN_P (insn))
    7272                 :          0 :     return;
    7273                 :            : 
    7274                 :      55174 :   subrtx_ptr_iterator::array_type array;
    7275                 :      27587 :   cse_change_cc_mode (array, &PATTERN (insn), insn, newreg);
    7276                 :      27587 :   cse_change_cc_mode (array, &REG_NOTES (insn), insn, newreg);
    7277                 :            : 
    7278                 :            :   /* If the following assertion was triggered, there is most probably
    7279                 :            :      something wrong with the cc_modes_compatible back end function.
    7280                 :            :      CC modes only can be considered compatible if the insn - with the mode
    7281                 :            :      replaced by any of the compatible modes - can still be recognized.  */
    7282                 :      27587 :   success = apply_change_group ();
    7283                 :      27587 :   gcc_assert (success);
    7284                 :            : }
    7285                 :            : 
    7286                 :            : /* Change the mode of any reference to the register REGNO (NEWREG) to
    7287                 :            :    GET_MODE (NEWREG), starting at START.  Stop before END.  Stop at
    7288                 :            :    any instruction which modifies NEWREG.  */
    7289                 :            : 
    7290                 :            : static void
    7291                 :      15423 : cse_change_cc_mode_insns (rtx_insn *start, rtx_insn *end, rtx newreg)
    7292                 :            : {
    7293                 :      15423 :   rtx_insn *insn;
    7294                 :            : 
    7295                 :      47293 :   for (insn = start; insn != end; insn = NEXT_INSN (insn))
    7296                 :            :     {
    7297                 :      16478 :       if (! INSN_P (insn))
    7298                 :          0 :         continue;
    7299                 :            : 
    7300                 :      16478 :       if (reg_set_p (newreg, insn))
    7301                 :            :         return;
    7302                 :            : 
    7303                 :      15935 :       cse_change_cc_mode_insn (insn, newreg);
    7304                 :            :     }
    7305                 :            : }
    7306                 :            : 
    7307                 :            : /* BB is a basic block which finishes with CC_REG as a condition code
    7308                 :            :    register which is set to CC_SRC.  Look through the successors of BB
    7309                 :            :    to find blocks which have a single predecessor (i.e., this one),
    7310                 :            :    and look through those blocks for an assignment to CC_REG which is
    7311                 :            :    equivalent to CC_SRC.  CAN_CHANGE_MODE indicates whether we are
    7312                 :            :    permitted to change the mode of CC_SRC to a compatible mode.  This
    7313                 :            :    returns VOIDmode if no equivalent assignments were found.
    7314                 :            :    Otherwise it returns the mode which CC_SRC should wind up with.
    7315                 :            :    ORIG_BB should be the same as BB in the outermost cse_cc_succs call,
    7316                 :            :    but is passed unmodified down to recursive calls in order to prevent
    7317                 :            :    endless recursion.
    7318                 :            : 
    7319                 :            :    The main complexity in this function is handling the mode issues.
    7320                 :            :    We may have more than one duplicate which we can eliminate, and we
    7321                 :            :    try to find a mode which will work for multiple duplicates.  */
    7322                 :            : 
    7323                 :            : static machine_mode
    7324                 :    3444200 : cse_cc_succs (basic_block bb, basic_block orig_bb, rtx cc_reg, rtx cc_src,
    7325                 :            :               bool can_change_mode)
    7326                 :            : {
    7327                 :    3444200 :   bool found_equiv;
    7328                 :    3444200 :   machine_mode mode;
    7329                 :    3444200 :   unsigned int insn_count;
    7330                 :    3444200 :   edge e;
    7331                 :    3444200 :   rtx_insn *insns[2];
    7332                 :    3444200 :   machine_mode modes[2];
    7333                 :    3444200 :   rtx_insn *last_insns[2];
    7334                 :    3444200 :   unsigned int i;
    7335                 :    3444200 :   rtx newreg;
    7336                 :    3444200 :   edge_iterator ei;
    7337                 :            : 
    7338                 :            :   /* We expect to have two successors.  Look at both before picking
    7339                 :            :      the final mode for the comparison.  If we have more successors
    7340                 :            :      (i.e., some sort of table jump, although that seems unlikely),
    7341                 :            :      then we require all beyond the first two to use the same
    7342                 :            :      mode.  */
    7343                 :            : 
    7344                 :    3444200 :   found_equiv = false;
    7345                 :    3444200 :   mode = GET_MODE (cc_src);
    7346                 :    3444200 :   insn_count = 0;
    7347                 :    9767030 :   FOR_EACH_EDGE (e, ei, bb->succs)
    7348                 :            :     {
    7349                 :    6322830 :       rtx_insn *insn;
    7350                 :    6322830 :       rtx_insn *end;
    7351                 :            : 
    7352                 :    6322830 :       if (e->flags & EDGE_COMPLEX)
    7353                 :      28395 :         continue;
    7354                 :            : 
    7355                 :    6294440 :       if (EDGE_COUNT (e->dest->preds) != 1
    7356                 :    3541780 :           || e->dest == EXIT_BLOCK_PTR_FOR_FN (cfun)
    7357                 :            :           /* Avoid endless recursion on unreachable blocks.  */
    7358                 :    9766970 :           || e->dest == orig_bb)
    7359                 :    2821900 :         continue;
    7360                 :            : 
    7361                 :    3472530 :       end = NEXT_INSN (BB_END (e->dest));
    7362                 :   19291300 :       for (insn = BB_HEAD (e->dest); insn != end; insn = NEXT_INSN (insn))
    7363                 :            :         {
    7364                 :   18651400 :           rtx set;
    7365                 :            : 
    7366                 :   18651400 :           if (! INSN_P (insn))
    7367                 :    4669260 :             continue;
    7368                 :            : 
    7369                 :            :           /* If CC_SRC is modified, we have to stop looking for
    7370                 :            :              something which uses it.  */
    7371                 :   13982100 :           if (modified_in_p (cc_src, insn))
    7372                 :            :             break;
    7373                 :            : 
    7374                 :            :           /* Check whether INSN sets CC_REG to CC_SRC.  */
    7375                 :   13624400 :           set = single_set (insn);
    7376                 :   13624400 :           if (set
    7377                 :    6581750 :               && REG_P (SET_DEST (set))
    7378                 :   19234600 :               && REGNO (SET_DEST (set)) == REGNO (cc_reg))
    7379                 :            :             {
    7380                 :     935360 :               bool found;
    7381                 :     935360 :               machine_mode set_mode;
    7382                 :     935360 :               machine_mode comp_mode;
    7383                 :            : 
    7384                 :     935360 :               found = false;
    7385                 :     935360 :               set_mode = GET_MODE (SET_SRC (set));
    7386                 :     935360 :               comp_mode = set_mode;
    7387                 :     935360 :               if (rtx_equal_p (cc_src, SET_SRC (set)))
    7388                 :            :                 found = true;
    7389                 :     934720 :               else if (GET_CODE (cc_src) == COMPARE
    7390                 :     836420 :                        && GET_CODE (SET_SRC (set)) == COMPARE
    7391                 :     739080 :                        && mode != set_mode
    7392                 :     216320 :                        && rtx_equal_p (XEXP (cc_src, 0),
    7393                 :     216320 :                                        XEXP (SET_SRC (set), 0))
    7394                 :     981119 :                        && rtx_equal_p (XEXP (cc_src, 1),
    7395                 :      46399 :                                        XEXP (SET_SRC (set), 1)))
    7396                 :            : 
    7397                 :            :                 {
    7398                 :      15427 :                   comp_mode = targetm.cc_modes_compatible (mode, set_mode);
    7399                 :      15427 :                   if (comp_mode != VOIDmode
    7400                 :      15427 :                       && (can_change_mode || comp_mode == mode))
    7401                 :            :                     found = true;
    7402                 :            :                 }
    7403                 :            : 
    7404                 :      16063 :               if (found)
    7405                 :            :                 {
    7406                 :      16063 :                   found_equiv = true;
    7407                 :      16063 :                   if (insn_count < ARRAY_SIZE (insns))
    7408                 :            :                     {
    7409                 :      16063 :                       insns[insn_count] = insn;
    7410                 :      16063 :                       modes[insn_count] = set_mode;
    7411                 :      16063 :                       last_insns[insn_count] = end;
    7412                 :      16063 :                       ++insn_count;
    7413                 :            : 
    7414                 :      16063 :                       if (mode != comp_mode)
    7415                 :            :                         {
    7416                 :      11652 :                           gcc_assert (can_change_mode);
    7417                 :      11652 :                           mode = comp_mode;
    7418                 :            : 
    7419                 :            :                           /* The modified insn will be re-recognized later.  */
    7420                 :      11652 :                           PUT_MODE (cc_src, mode);
    7421                 :            :                         }
    7422                 :            :                     }
    7423                 :            :                   else
    7424                 :            :                     {
    7425                 :          0 :                       if (set_mode != mode)
    7426                 :            :                         {
    7427                 :            :                           /* We found a matching expression in the
    7428                 :            :                              wrong mode, but we don't have room to
    7429                 :            :                              store it in the array.  Punt.  This case
    7430                 :            :                              should be rare.  */
    7431                 :            :                           break;
    7432                 :            :                         }
    7433                 :            :                       /* INSN sets CC_REG to a value equal to CC_SRC
    7434                 :            :                          with the right mode.  We can simply delete
    7435                 :            :                          it.  */
    7436                 :          0 :                       delete_insn (insn);
    7437                 :            :                     }
    7438                 :            : 
    7439                 :            :                   /* We found an instruction to delete.  Keep looking,
    7440                 :            :                      in the hopes of finding a three-way jump.  */
    7441                 :      16063 :                   continue;
    7442                 :            :                 }
    7443                 :            : 
    7444                 :            :               /* We found an instruction which sets the condition
    7445                 :            :                  code, so don't look any farther.  */
    7446                 :            :               break;
    7447                 :            :             }
    7448                 :            : 
    7449                 :            :           /* If INSN sets CC_REG in some other way, don't look any
    7450                 :            :              farther.  */
    7451                 :   12689000 :           if (reg_set_p (cc_reg, insn))
    7452                 :            :             break;
    7453                 :            :         }
    7454                 :            : 
    7455                 :            :       /* If we fell off the bottom of the block, we can keep looking
    7456                 :            :          through successors.  We pass CAN_CHANGE_MODE as false because
    7457                 :            :          we aren't prepared to handle compatibility between the
    7458                 :            :          further blocks and this block.  */
    7459                 :    3472530 :       if (insn == end)
    7460                 :            :         {
    7461                 :     639884 :           machine_mode submode;
    7462                 :            : 
    7463                 :     639884 :           submode = cse_cc_succs (e->dest, orig_bb, cc_reg, cc_src, false);
    7464                 :     639884 :           if (submode != VOIDmode)
    7465                 :            :             {
    7466                 :         43 :               gcc_assert (submode == mode);
    7467                 :            :               found_equiv = true;
    7468                 :            :               can_change_mode = false;
    7469                 :            :             }
    7470                 :            :         }
    7471                 :            :     }
    7472                 :            : 
    7473                 :    3444200 :   if (! found_equiv)
    7474                 :            :     return VOIDmode;
    7475                 :            : 
    7476                 :            :   /* Now INSN_COUNT is the number of instructions we found which set
    7477                 :            :      CC_REG to a value equivalent to CC_SRC.  The instructions are in
    7478                 :            :      INSNS.  The modes used by those instructions are in MODES.  */
    7479                 :            : 
    7480                 :            :   newreg = NULL_RTX;
    7481                 :      32127 :   for (i = 0; i < insn_count; ++i)
    7482                 :            :     {
    7483                 :      16063 :       if (modes[i] != mode)
    7484                 :            :         {
    7485                 :            :           /* We need to change the mode of CC_REG in INSNS[i] and
    7486                 :            :              subsequent instructions.  */
    7487                 :       3771 :           if (! newreg)
    7488                 :            :             {
    7489                 :       3771 :               if (GET_MODE (cc_reg) == mode)
    7490                 :            :                 newreg = cc_reg;
    7491                 :            :               else
    7492                 :       2775 :                 newreg = gen_rtx_REG (mode, REGNO (cc_reg));
    7493                 :            :             }
    7494                 :       3771 :           cse_change_cc_mode_insns (NEXT_INSN (insns[i]), last_insns[i],
    7495                 :            :                                     newreg);
    7496                 :            :         }
    7497                 :            : 
    7498                 :      16063 :       cse_cfg_altered |= delete_insn_and_edges (insns[i]);
    7499                 :            :     }
    7500                 :            : 
    7501                 :            :   return mode;
    7502                 :            : }
    7503                 :            : 
    7504                 :            : /* If we have a fixed condition code register (or two), walk through
    7505                 :            :    the instructions and try to eliminate duplicate assignments.  */
    7506                 :            : 
    7507                 :            : static void
    7508                 :     644243 : cse_condition_code_reg (void)
    7509                 :            : {
    7510                 :     644243 :   unsigned int cc_regno_1;
    7511                 :     644243 :   unsigned int cc_regno_2;
    7512                 :     644243 :   rtx cc_reg_1;
    7513                 :     644243 :   rtx cc_reg_2;
    7514                 :     644243 :   basic_block bb;
    7515                 :            : 
    7516                 :     644243 :   if (! targetm.fixed_condition_code_regs (&cc_regno_1, &cc_regno_2))
    7517                 :          0 :     return;
    7518                 :            : 
    7519                 :     644243 :   cc_reg_1 = gen_rtx_REG (CCmode, cc_regno_1);
    7520                 :     644243 :   if (cc_regno_2 != INVALID_REGNUM)
    7521                 :          0 :     cc_reg_2 = gen_rtx_REG (CCmode, cc_regno_2);
    7522                 :            :   else
    7523                 :            :     cc_reg_2 = NULL_RTX;
    7524                 :            : 
    7525                 :    6937190 :   FOR_EACH_BB_FN (bb, cfun)
    7526                 :            :     {
    7527                 :    6292950 :       rtx_insn *last_insn;
    7528                 :    6292950 :       rtx cc_reg;
    7529                 :    6292950 :       rtx_insn *insn;
    7530                 :    6292950 :       rtx_insn *cc_src_insn;
    7531                 :    6292950 :       rtx cc_src;
    7532                 :    6292950 :       machine_mode mode;
    7533                 :    6292950 :       machine_mode orig_mode;
    7534                 :            : 
    7535                 :            :       /* Look for blocks which end with a conditional jump based on a
    7536                 :            :          condition code register.  Then look for the instruction which
    7537                 :            :          sets the condition code register.  Then look through the
    7538                 :            :          successor blocks for instructions which set the condition
    7539                 :            :          code register to the same value.  There are other possible
    7540                 :            :          uses of the condition code register, but these are by far the
    7541                 :            :          most common and the ones which we are most likely to be able
    7542                 :            :          to optimize.  */
    7543                 :            : 
    7544                 :    6292950 :       last_insn = BB_END (bb);
    7545                 :    6292950 :       if (!JUMP_P (last_insn))
    7546                 :    3439920 :         continue;
    7547                 :            : 
    7548                 :    2853030 :       if (reg_referenced_p (cc_reg_1, PATTERN (last_insn)))
    7549                 :            :         cc_reg = cc_reg_1;
    7550                 :       4259 :       else if (cc_reg_2 && reg_referenced_p (cc_reg_2, PATTERN (last_insn)))
    7551                 :            :         cc_reg = cc_reg_2;
    7552                 :            :       else
    7553                 :       4259 :         continue;
    7554                 :            : 
    7555                 :    2848770 :       cc_src_insn = NULL;
    7556                 :    2848770 :       cc_src = NULL_RTX;
    7557                 :    2848770 :       for (insn = PREV_INSN (last_insn);
    7558                 :    2927970 :            insn && insn != PREV_INSN (BB_HEAD (bb));
    7559                 :      79207 :            insn = PREV_INSN (insn))
    7560                 :            :         {
    7561                 :    2897100 :           rtx set;
    7562                 :            : 
    7563                 :    2897100 :           if (! INSN_P (insn))
    7564                 :      34845 :             continue;
    7565                 :    2862260 :           set = single_set (insn);
    7566                 :    2862260 :           if (set
    7567                 :    2816120 :               && REG_P (SET_DEST (set))
    7568                 :    5677420 :               && REGNO (SET_DEST (set)) == REGNO (cc_reg))
    7569                 :            :             {
    7570                 :    2804330 :               cc_src_insn = insn;
    7571                 :    2804330 :               cc_src = SET_SRC (set);
    7572                 :    2804330 :               break;
    7573                 :            :             }
    7574                 :      57931 :           else if (reg_set_p (cc_reg, insn))
    7575                 :            :             break;
    7576                 :            :         }
    7577                 :            : 
    7578                 :    2848770 :       if (! cc_src_insn)
    7579                 :      44439 :         continue;
    7580                 :            : 
    7581                 :    2804330 :       if (modified_between_p (cc_src, cc_src_insn, NEXT_INSN (last_insn)))
    7582                 :         12 :         continue;
    7583                 :            : 
    7584                 :            :       /* Now CC_REG is a condition code register used for a
    7585                 :            :          conditional jump at the end of the block, and CC_SRC, in
    7586                 :            :          CC_SRC_INSN, is the value to which that condition code
    7587                 :            :          register is set, and CC_SRC is still meaningful at the end of
    7588                 :            :          the basic block.  */
    7589                 :            : 
    7590                 :    2804320 :       orig_mode = GET_MODE (cc_src);
    7591                 :    2804320 :       mode = cse_cc_succs (bb, bb, cc_reg, cc_src, true);
    7592                 :    2804320 :       if (mode != VOIDmode)
    7593                 :            :         {
    7594                 :      16021 :           gcc_assert (mode == GET_MODE (cc_src));
    7595                 :      16021 :           if (mode != orig_mode)
    7596                 :            :             {
    7597                 :      11652 :               rtx newreg = gen_rtx_REG (mode, REGNO (cc_reg));
    7598                 :            : 
    7599                 :      11652 :               cse_change_cc_mode_insn (cc_src_insn, newreg);
    7600                 :            : 
    7601                 :            :               /* Do the same in the following insns that use the
    7602                 :            :                  current value of CC_REG within BB.  */
    7603                 :      11652 :               cse_change_cc_mode_insns (NEXT_INSN (cc_src_insn),
    7604                 :            :                                         NEXT_INSN (last_insn),
    7605                 :            :                                         newreg);
    7606                 :            :             }
    7607                 :            :         }
    7608                 :            :     }
    7609                 :            : }
    7610                 :            : 
    7611                 :            : 
    7612                 :            : /* Perform common subexpression elimination.  Nonzero value from
    7613                 :            :    `cse_main' means that jumps were simplified and some code may now
    7614                 :            :    be unreachable, so do jump optimization again.  */
    7615                 :            : static unsigned int
    7616                 :     687424 : rest_of_handle_cse (void)
    7617                 :            : {
    7618                 :     687424 :   int tem;
    7619                 :            : 
    7620                 :     687424 :   if (dump_file)
    7621                 :         32 :     dump_flow_info (dump_file, dump_flags);
    7622                 :            : 
    7623                 :     687424 :   tem = cse_main (get_insns (), max_reg_num ());
    7624                 :            : 
    7625                 :            :   /* If we are not running more CSE passes, then we are no longer
    7626                 :            :      expecting CSE to be run.  But always rerun it in a cheap mode.  */
    7627                 :     687424 :   cse_not_expected = !flag_rerun_cse_after_loop && !flag_gcse;
    7628                 :            : 
    7629                 :     687424 :   if (tem == 2)
    7630                 :            :     {
    7631                 :       5269 :       timevar_push (TV_JUMP);
    7632                 :       5269 :       rebuild_jump_labels (get_insns ());
    7633                 :       5269 :       cse_cfg_altered |= cleanup_cfg (CLEANUP_CFG_CHANGED);
    7634                 :       5269 :       timevar_pop (TV_JUMP);
    7635                 :            :     }
    7636                 :     682155 :   else if (tem == 1 || optimize > 1)
    7637                 :     639269 :     cse_cfg_altered |= cleanup_cfg (0);
    7638                 :            : 
    7639                 :     687424 :   return 0;
    7640                 :            : }
    7641                 :            : 
    7642                 :            : namespace {
    7643                 :            : 
    7644                 :            : const pass_data pass_data_cse =
    7645                 :            : {
    7646                 :            :   RTL_PASS, /* type */
    7647                 :            :   "cse1", /* name */
    7648                 :            :   OPTGROUP_NONE, /* optinfo_flags */
    7649                 :            :   TV_CSE, /* tv_id */
    7650                 :            :   0, /* properties_required */
    7651                 :            :   0, /* properties_provided */
    7652                 :            :   0, /* properties_destroyed */
    7653                 :            :   0, /* todo_flags_start */
    7654                 :            :   TODO_df_finish, /* todo_flags_finish */
    7655                 :            : };
    7656                 :            : 
    7657                 :            : class pass_cse : public rtl_opt_pass
    7658                 :            : {
    7659                 :            : public:
    7660                 :     200540 :   pass_cse (gcc::context *ctxt)
    7661                 :     401080 :     : rtl_opt_pass (pass_data_cse, ctxt)
    7662                 :            :   {}
    7663                 :            : 
    7664                 :            :   /* opt_pass methods: */
    7665                 :     942964 :   virtual bool gate (function *) { return optimize > 0; }
    7666                 :     687424 :   virtual unsigned int execute (function *) { return rest_of_handle_cse (); }
    7667                 :            : 
    7668                 :            : }; // class pass_cse
    7669                 :            : 
    7670                 :            : } // anon namespace
    7671                 :            : 
    7672                 :            : rtl_opt_pass *
    7673                 :     200540 : make_pass_cse (gcc::context *ctxt)
    7674                 :            : {
    7675                 :     200540 :   return new pass_cse (ctxt);
    7676                 :            : }
    7677                 :            : 
    7678                 :            : 
    7679                 :            : /* Run second CSE pass after loop optimizations.  */
    7680                 :            : static unsigned int
    7681                 :     644243 : rest_of_handle_cse2 (void)
    7682                 :            : {
    7683                 :     644243 :   int tem;
    7684                 :            : 
    7685                 :     644243 :   if (dump_file)
    7686                 :         22 :     dump_flow_info (dump_file, dump_flags);
    7687                 :            : 
    7688                 :     644243 :   tem = cse_main (get_insns (), max_reg_num ());
    7689                 :            : 
    7690                 :            :   /* Run a pass to eliminate duplicated assignments to condition code
    7691                 :            :      registers.  We have to run this after bypass_jumps, because it
    7692                 :            :      makes it harder for that pass to determine whether a jump can be
    7693                 :            :      bypassed safely.  */
    7694                 :     644243 :   cse_condition_code_reg ();
    7695                 :            : 
    7696                 :     644243 :   delete_trivially_dead_insns (get_insns (), max_reg_num ());
    7697                 :            : 
    7698                 :     644243 :   if (tem == 2)
    7699                 :            :     {
    7700                 :        932 :       timevar_push (TV_JUMP);
    7701                 :        932 :       rebuild_jump_labels (get_insns ());
    7702                 :        932 :       cse_cfg_altered |= cleanup_cfg (CLEANUP_CFG_CHANGED);
    7703                 :        932 :       timevar_pop (TV_JUMP);
    7704                 :            :     }
    7705                 :     643311 :   else if (tem == 1 || cse_cfg_altered)
    7706                 :         10 :     cse_cfg_altered |= cleanup_cfg (0);
    7707                 :            : 
    7708                 :     644243 :   cse_not_expected = 1;
    7709                 :     644243 :   return 0;
    7710                 :            : }
    7711                 :            : 
    7712                 :            : 
    7713                 :            : namespace {
    7714                 :            : 
    7715                 :            : const pass_data pass_data_cse2 =
    7716                 :            : {
    7717                 :            :   RTL_PASS, /* type */
    7718                 :            :   "cse2", /* name */
    7719                 :            :   OPTGROUP_NONE, /* optinfo_flags */
    7720                 :            :   TV_CSE2, /* tv_id */
    7721                 :            :   0, /* properties_required */
    7722                 :            :   0, /* properties_provided */
    7723                 :            :   0, /* properties_destroyed */
    7724                 :            :   0, /* todo_flags_start */
    7725                 :            :   TODO_df_finish, /* todo_flags_finish */
    7726                 :            : };
    7727                 :            : 
    7728                 :            : class pass_cse2 : public rtl_opt_pass
    7729                 :            : {
    7730                 :            : public:
    7731                 :     200540 :   pass_cse2 (gcc::context *ctxt)
    7732                 :     401080 :     : rtl_opt_pass (pass_data_cse2, ctxt)
    7733                 :            :   {}
    7734                 :            : 
    7735                 :            :   /* opt_pass methods: */
    7736                 :     942964 :   virtual bool gate (function *)
    7737                 :            :     {
    7738                 :     942964 :       return optimize > 0 && flag_rerun_cse_after_loop;
    7739                 :            :     }
    7740                 :            : 
    7741                 :     644243 :   virtual unsigned int execute (function *) { return rest_of_handle_cse2 (); }
    7742                 :            : 
    7743                 :            : }; // class pass_cse2
    7744                 :            : 
    7745                 :            : } // anon namespace
    7746                 :            : 
    7747                 :            : rtl_opt_pass *
    7748                 :     200540 : make_pass_cse2 (gcc::context *ctxt)
    7749                 :            : {
    7750                 :     200540 :   return new pass_cse2 (ctxt);
    7751                 :            : }
    7752                 :            : 
    7753                 :            : /* Run second CSE pass after loop optimizations.  */
    7754                 :            : static unsigned int
    7755                 :     217029 : rest_of_handle_cse_after_global_opts (void)
    7756                 :            : {
    7757                 :     217029 :   int save_cfj;
    7758                 :     217029 :   int tem;
    7759                 :            : 
    7760                 :            :   /* We only want to do local CSE, so don't follow jumps.  */
    7761                 :     217029 :   save_cfj = flag_cse_follow_jumps;
    7762                 :     217029 :   flag_cse_follow_jumps = 0;
    7763                 :            : 
    7764                 :     217029 :   rebuild_jump_labels (get_insns ());
    7765                 :     217029 :   tem = cse_main (get_insns (), max_reg_num ());
    7766                 :     217029 :   cse_cfg_altered |= purge_all_dead_edges ();
    7767                 :     217029 :   delete_trivially_dead_insns (get_insns (), max_reg_num ());
    7768                 :            : 
    7769                 :     217029 :   cse_not_expected = !flag_rerun_cse_after_loop;
    7770                 :            : 
    7771                 :            :   /* If cse altered any jumps, rerun jump opts to clean things up.  */
    7772                 :     217029 :   if (tem == 2)
    7773                 :            :     {