OSDN Git Service

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