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