OSDN Git Service

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