OSDN Git Service

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