OSDN Git Service

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