OSDN Git Service

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