Annotation of gcc/cse.c, revision 1.1.1.8

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

unix.superglobalmegacorp.com

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