OSDN Git Service

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