OSDN Git Service

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