OSDN Git Service

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