Annotation of gcc/cse.c, revision 1.1.1.3

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.