OSDN Git Service

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