OSDN Git Service

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