OSDN Git Service

* pa-64.h (WCHAR_TYPE, WCHAR_TYPE_SIZE): Define.
[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_PTR, 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_PTR, 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_PTR, 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_PTR, 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, NULL_PTR))
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, NULL_PTR))
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_PTR, 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_PTR, 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_PTR, 0))
4635                 {
4636                   rehash_using_reg (op1);
4637                   op1_hash = HASH (op1, mode);
4638                 }
4639
4640               op1_elt = insert (op1, NULL_PTR, 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_PTR, 0))
4662         {
4663           rehash_using_reg (op0);
4664           op0_hash = HASH (op0, mode);
4665         }
4666
4667       op0_elt = insert (op0, NULL_PTR, 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_PTR, 0))
4674         {
4675           rehash_using_reg (op1);
4676           op1_hash = HASH (op1, mode);
4677         }
4678
4679       op1_elt = insert (op1, NULL_PTR, 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 *) NULL_PTR;
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 that is set more than once, do not record SRC.  Using
5071          SRC as a replacement for anything else will be incorrect in that
5072          situation.  Note that this usually occurs only for stack slots,
5073          in which case all the RTL would be referring to SRC, so we don't
5074          lose any optimization opportunities by not having SRC in the
5075          hash table.  */
5076
5077       if (GET_CODE (src) == MEM
5078           && find_reg_note (insn, REG_EQUIV, src) != 0
5079           && GET_CODE (dest) == REG
5080           && REGNO (dest) >= FIRST_PSEUDO_REGISTER
5081           && REG_N_SETS (REGNO (dest)) != 1)
5082         sets[i].src_volatile = 1;
5083
5084 #if 0
5085       /* It is no longer clear why we used to do this, but it doesn't
5086          appear to still be needed.  So let's try without it since this
5087          code hurts cse'ing widened ops.  */
5088       /* If source is a perverse subreg (such as QI treated as an SI),
5089          treat it as volatile.  It may do the work of an SI in one context
5090          where the extra bits are not being used, but cannot replace an SI
5091          in general.  */
5092       if (GET_CODE (src) == SUBREG
5093           && (GET_MODE_SIZE (GET_MODE (src))
5094               > GET_MODE_SIZE (GET_MODE (SUBREG_REG (src)))))
5095         sets[i].src_volatile = 1;
5096 #endif
5097
5098       /* Locate all possible equivalent forms for SRC.  Try to replace
5099          SRC in the insn with each cheaper equivalent.
5100
5101          We have the following types of equivalents: SRC itself, a folded
5102          version, a value given in a REG_EQUAL note, or a value related
5103          to a constant.
5104
5105          Each of these equivalents may be part of an additional class
5106          of equivalents (if more than one is in the table, they must be in
5107          the same class; we check for this).
5108
5109          If the source is volatile, we don't do any table lookups.
5110
5111          We note any constant equivalent for possible later use in a
5112          REG_NOTE.  */
5113
5114       if (!sets[i].src_volatile)
5115         elt = lookup (src, sets[i].src_hash, mode);
5116
5117       sets[i].src_elt = elt;
5118
5119       if (elt && src_eqv_here && src_eqv_elt)
5120         {
5121           if (elt->first_same_value != src_eqv_elt->first_same_value)
5122             {
5123               /* The REG_EQUAL is indicating that two formerly distinct
5124                  classes are now equivalent.  So merge them.  */
5125               merge_equiv_classes (elt, src_eqv_elt);
5126               src_eqv_hash = HASH (src_eqv, elt->mode);
5127               src_eqv_elt = lookup (src_eqv, src_eqv_hash, elt->mode);
5128             }
5129
5130           src_eqv_here = 0;
5131         }
5132
5133       else if (src_eqv_elt)
5134         elt = src_eqv_elt;
5135
5136       /* Try to find a constant somewhere and record it in `src_const'.
5137          Record its table element, if any, in `src_const_elt'.  Look in
5138          any known equivalences first.  (If the constant is not in the
5139          table, also set `sets[i].src_const_hash').  */
5140       if (elt)
5141         for (p = elt->first_same_value; p; p = p->next_same_value)
5142           if (p->is_const)
5143             {
5144               src_const = p->exp;
5145               src_const_elt = elt;
5146               break;
5147             }
5148
5149       if (src_const == 0
5150           && (CONSTANT_P (src_folded)
5151               /* Consider (minus (label_ref L1) (label_ref L2)) as
5152                  "constant" here so we will record it. This allows us
5153                  to fold switch statements when an ADDR_DIFF_VEC is used.  */
5154               || (GET_CODE (src_folded) == MINUS
5155                   && GET_CODE (XEXP (src_folded, 0)) == LABEL_REF
5156                   && GET_CODE (XEXP (src_folded, 1)) == LABEL_REF)))
5157         src_const = src_folded, src_const_elt = elt;
5158       else if (src_const == 0 && src_eqv_here && CONSTANT_P (src_eqv_here))
5159         src_const = src_eqv_here, src_const_elt = src_eqv_elt;
5160
5161       /* If we don't know if the constant is in the table, get its
5162          hash code and look it up.  */
5163       if (src_const && src_const_elt == 0)
5164         {
5165           sets[i].src_const_hash = HASH (src_const, mode);
5166           src_const_elt = lookup (src_const, sets[i].src_const_hash, mode);
5167         }
5168
5169       sets[i].src_const = src_const;
5170       sets[i].src_const_elt = src_const_elt;
5171
5172       /* If the constant and our source are both in the table, mark them as
5173          equivalent.  Otherwise, if a constant is in the table but the source
5174          isn't, set ELT to it.  */
5175       if (src_const_elt && elt
5176           && src_const_elt->first_same_value != elt->first_same_value)
5177         merge_equiv_classes (elt, src_const_elt);
5178       else if (src_const_elt && elt == 0)
5179         elt = src_const_elt;
5180
5181       /* See if there is a register linearly related to a constant
5182          equivalent of SRC.  */
5183       if (src_const
5184           && (GET_CODE (src_const) == CONST
5185               || (src_const_elt && src_const_elt->related_value != 0)))
5186         {
5187           src_related = use_related_value (src_const, src_const_elt);
5188           if (src_related)
5189             {
5190               struct table_elt *src_related_elt
5191                 = lookup (src_related, HASH (src_related, mode), mode);
5192               if (src_related_elt && elt)
5193                 {
5194                   if (elt->first_same_value
5195                       != src_related_elt->first_same_value)
5196                     /* This can occur when we previously saw a CONST
5197                        involving a SYMBOL_REF and then see the SYMBOL_REF
5198                        twice.  Merge the involved classes.  */
5199                     merge_equiv_classes (elt, src_related_elt);
5200
5201                   src_related = 0;
5202                   src_related_elt = 0;
5203                 }
5204               else if (src_related_elt && elt == 0)
5205                 elt = src_related_elt;
5206             }
5207         }
5208
5209       /* See if we have a CONST_INT that is already in a register in a
5210          wider mode.  */
5211
5212       if (src_const && src_related == 0 && GET_CODE (src_const) == CONST_INT
5213           && GET_MODE_CLASS (mode) == MODE_INT
5214           && GET_MODE_BITSIZE (mode) < BITS_PER_WORD)
5215         {
5216           enum machine_mode wider_mode;
5217
5218           for (wider_mode = GET_MODE_WIDER_MODE (mode);
5219                GET_MODE_BITSIZE (wider_mode) <= BITS_PER_WORD
5220                && src_related == 0;
5221                wider_mode = GET_MODE_WIDER_MODE (wider_mode))
5222             {
5223               struct table_elt *const_elt
5224                 = lookup (src_const, HASH (src_const, wider_mode), wider_mode);
5225
5226               if (const_elt == 0)
5227                 continue;
5228
5229               for (const_elt = const_elt->first_same_value;
5230                    const_elt; const_elt = const_elt->next_same_value)
5231                 if (GET_CODE (const_elt->exp) == REG)
5232                   {
5233                     src_related = gen_lowpart_if_possible (mode,
5234                                                            const_elt->exp);
5235                     break;
5236                   }
5237             }
5238         }
5239
5240       /* Another possibility is that we have an AND with a constant in
5241          a mode narrower than a word.  If so, it might have been generated
5242          as part of an "if" which would narrow the AND.  If we already
5243          have done the AND in a wider mode, we can use a SUBREG of that
5244          value.  */
5245
5246       if (flag_expensive_optimizations && ! src_related
5247           && GET_CODE (src) == AND && GET_CODE (XEXP (src, 1)) == CONST_INT
5248           && GET_MODE_SIZE (mode) < UNITS_PER_WORD)
5249         {
5250           enum machine_mode tmode;
5251           rtx new_and = gen_rtx_AND (VOIDmode, NULL_RTX, XEXP (src, 1));
5252
5253           for (tmode = GET_MODE_WIDER_MODE (mode);
5254                GET_MODE_SIZE (tmode) <= UNITS_PER_WORD;
5255                tmode = GET_MODE_WIDER_MODE (tmode))
5256             {
5257               rtx inner = gen_lowpart_if_possible (tmode, XEXP (src, 0));
5258               struct table_elt *larger_elt;
5259
5260               if (inner)
5261                 {
5262                   PUT_MODE (new_and, tmode);
5263                   XEXP (new_and, 0) = inner;
5264                   larger_elt = lookup (new_and, HASH (new_and, tmode), tmode);
5265                   if (larger_elt == 0)
5266                     continue;
5267
5268                   for (larger_elt = larger_elt->first_same_value;
5269                        larger_elt; larger_elt = larger_elt->next_same_value)
5270                     if (GET_CODE (larger_elt->exp) == REG)
5271                       {
5272                         src_related
5273                           = gen_lowpart_if_possible (mode, larger_elt->exp);
5274                         break;
5275                       }
5276
5277                   if (src_related)
5278                     break;
5279                 }
5280             }
5281         }
5282
5283 #ifdef LOAD_EXTEND_OP
5284       /* See if a MEM has already been loaded with a widening operation;
5285          if it has, we can use a subreg of that.  Many CISC machines
5286          also have such operations, but this is only likely to be
5287          beneficial these machines.  */
5288
5289       if (flag_expensive_optimizations && src_related == 0
5290           && (GET_MODE_SIZE (mode) < UNITS_PER_WORD)
5291           && GET_MODE_CLASS (mode) == MODE_INT
5292           && GET_CODE (src) == MEM && ! do_not_record
5293           && LOAD_EXTEND_OP (mode) != NIL)
5294         {
5295           enum machine_mode tmode;
5296
5297           /* Set what we are trying to extend and the operation it might
5298              have been extended with.  */
5299           PUT_CODE (memory_extend_rtx, LOAD_EXTEND_OP (mode));
5300           XEXP (memory_extend_rtx, 0) = src;
5301
5302           for (tmode = GET_MODE_WIDER_MODE (mode);
5303                GET_MODE_SIZE (tmode) <= UNITS_PER_WORD;
5304                tmode = GET_MODE_WIDER_MODE (tmode))
5305             {
5306               struct table_elt *larger_elt;
5307
5308               PUT_MODE (memory_extend_rtx, tmode);
5309               larger_elt = lookup (memory_extend_rtx,
5310                                    HASH (memory_extend_rtx, tmode), tmode);
5311               if (larger_elt == 0)
5312                 continue;
5313
5314               for (larger_elt = larger_elt->first_same_value;
5315                    larger_elt; larger_elt = larger_elt->next_same_value)
5316                 if (GET_CODE (larger_elt->exp) == REG)
5317                   {
5318                     src_related = gen_lowpart_if_possible (mode,
5319                                                            larger_elt->exp);
5320                     break;
5321                   }
5322
5323               if (src_related)
5324                 break;
5325             }
5326         }
5327 #endif /* LOAD_EXTEND_OP */
5328
5329       if (src == src_folded)
5330         src_folded = 0;
5331
5332       /* At this point, ELT, if non-zero, points to a class of expressions
5333          equivalent to the source of this SET and SRC, SRC_EQV, SRC_FOLDED,
5334          and SRC_RELATED, if non-zero, each contain additional equivalent
5335          expressions.  Prune these latter expressions by deleting expressions
5336          already in the equivalence class.
5337
5338          Check for an equivalent identical to the destination.  If found,
5339          this is the preferred equivalent since it will likely lead to
5340          elimination of the insn.  Indicate this by placing it in
5341          `src_related'.  */
5342
5343       if (elt)
5344         elt = elt->first_same_value;
5345       for (p = elt; p; p = p->next_same_value)
5346         {
5347           enum rtx_code code = GET_CODE (p->exp);
5348
5349           /* If the expression is not valid, ignore it.  Then we do not
5350              have to check for validity below.  In most cases, we can use
5351              `rtx_equal_p', since canonicalization has already been done.  */
5352           if (code != REG && ! exp_equiv_p (p->exp, p->exp, 1, 0))
5353             continue;
5354
5355           /* Also skip paradoxical subregs, unless that's what we're
5356              looking for.  */
5357           if (code == SUBREG
5358               && (GET_MODE_SIZE (GET_MODE (p->exp))
5359                   > GET_MODE_SIZE (GET_MODE (SUBREG_REG (p->exp))))
5360               && ! (src != 0
5361                     && GET_CODE (src) == SUBREG
5362                     && GET_MODE (src) == GET_MODE (p->exp)
5363                     && (GET_MODE_SIZE (GET_MODE (SUBREG_REG (src)))
5364                         < GET_MODE_SIZE (GET_MODE (SUBREG_REG (p->exp))))))
5365             continue;
5366
5367           if (src && GET_CODE (src) == code && rtx_equal_p (src, p->exp))
5368             src = 0;
5369           else if (src_folded && GET_CODE (src_folded) == code
5370                    && rtx_equal_p (src_folded, p->exp))
5371             src_folded = 0;
5372           else if (src_eqv_here && GET_CODE (src_eqv_here) == code
5373                    && rtx_equal_p (src_eqv_here, p->exp))
5374             src_eqv_here = 0;
5375           else if (src_related && GET_CODE (src_related) == code
5376                    && rtx_equal_p (src_related, p->exp))
5377             src_related = 0;
5378
5379           /* This is the same as the destination of the insns, we want
5380              to prefer it.  Copy it to src_related.  The code below will
5381              then give it a negative cost.  */
5382           if (GET_CODE (dest) == code && rtx_equal_p (p->exp, dest))
5383             src_related = dest;
5384         }
5385
5386       /* Find the cheapest valid equivalent, trying all the available
5387          possibilities.  Prefer items not in the hash table to ones
5388          that are when they are equal cost.  Note that we can never
5389          worsen an insn as the current contents will also succeed.
5390          If we find an equivalent identical to the destination, use it as best,
5391          since this insn will probably be eliminated in that case.  */
5392       if (src)
5393         {
5394           if (rtx_equal_p (src, dest))
5395             src_cost = src_regcost = -1;
5396           else
5397             {
5398               src_cost = COST (src);
5399               src_regcost = approx_reg_cost (src);
5400             }
5401         }
5402
5403       if (src_eqv_here)
5404         {
5405           if (rtx_equal_p (src_eqv_here, dest))
5406             src_eqv_cost = src_eqv_regcost = -1;
5407           else
5408             {
5409               src_eqv_cost = COST (src_eqv_here);
5410               src_eqv_regcost = approx_reg_cost (src_eqv_here);
5411             }
5412         }
5413
5414       if (src_folded)
5415         {
5416           if (rtx_equal_p (src_folded, dest))
5417             src_folded_cost = src_folded_regcost = -1;
5418           else
5419             {
5420               src_folded_cost = COST (src_folded);
5421               src_folded_regcost = approx_reg_cost (src_folded);
5422             }
5423         }
5424
5425       if (src_related)
5426         {
5427           if (rtx_equal_p (src_related, dest))
5428             src_related_cost = src_related_regcost = -1;
5429           else
5430             {
5431               src_related_cost = COST (src_related);
5432               src_related_regcost = approx_reg_cost (src_related);
5433             }
5434         }
5435
5436       /* If this was an indirect jump insn, a known label will really be
5437          cheaper even though it looks more expensive.  */
5438       if (dest == pc_rtx && src_const && GET_CODE (src_const) == LABEL_REF)
5439         src_folded = src_const, src_folded_cost = src_folded_regcost = -1;
5440
5441       /* Terminate loop when replacement made.  This must terminate since
5442          the current contents will be tested and will always be valid.  */
5443       while (1)
5444         {
5445           rtx trial;
5446
5447           /* Skip invalid entries.  */
5448           while (elt && GET_CODE (elt->exp) != REG
5449                  && ! exp_equiv_p (elt->exp, elt->exp, 1, 0))
5450             elt = elt->next_same_value;
5451
5452           /* A paradoxical subreg would be bad here: it'll be the right
5453              size, but later may be adjusted so that the upper bits aren't
5454              what we want.  So reject it.  */
5455           if (elt != 0
5456               && GET_CODE (elt->exp) == SUBREG
5457               && (GET_MODE_SIZE (GET_MODE (elt->exp))
5458                   > GET_MODE_SIZE (GET_MODE (SUBREG_REG (elt->exp))))
5459               /* It is okay, though, if the rtx we're trying to match
5460                  will ignore any of the bits we can't predict.  */
5461               && ! (src != 0
5462                     && GET_CODE (src) == SUBREG
5463                     && GET_MODE (src) == GET_MODE (elt->exp)
5464                     && (GET_MODE_SIZE (GET_MODE (SUBREG_REG (src)))
5465                         < GET_MODE_SIZE (GET_MODE (SUBREG_REG (elt->exp))))))
5466             {
5467               elt = elt->next_same_value;
5468               continue;
5469             }
5470
5471           if (elt)
5472             {
5473               src_elt_cost = elt->cost;
5474               src_elt_regcost = elt->regcost;
5475             }
5476
5477           /* Find cheapest and skip it for the next time.   For items
5478              of equal cost, use this order:
5479              src_folded, src, src_eqv, src_related and hash table entry.  */
5480           if (src_folded
5481               && preferrable (src_folded_cost, src_folded_regcost,
5482                               src_cost, src_regcost) <= 0
5483               && preferrable (src_folded_cost, src_folded_regcost,
5484                               src_eqv_cost, src_eqv_regcost) <= 0
5485               && preferrable (src_folded_cost, src_folded_regcost,
5486                               src_related_cost, src_related_regcost) <= 0
5487               && preferrable (src_folded_cost, src_folded_regcost,
5488                               src_elt_cost, src_elt_regcost) <= 0)
5489             {
5490               trial = src_folded, src_folded_cost = MAX_COST;
5491               if (src_folded_force_flag)
5492                 trial = force_const_mem (mode, trial);
5493             }
5494           else if (src
5495                    && preferrable (src_cost, src_regcost,
5496                                    src_eqv_cost, src_eqv_regcost) <= 0
5497                    && preferrable (src_cost, src_regcost,
5498                                    src_related_cost, src_related_regcost) <= 0
5499                    && preferrable (src_cost, src_regcost,
5500                                    src_elt_cost, src_elt_regcost) <= 0)
5501             trial = src, src_cost = MAX_COST;
5502           else if (src_eqv_here
5503                    && preferrable (src_eqv_cost, src_eqv_regcost,
5504                                    src_related_cost, src_related_regcost) <= 0
5505                    && preferrable (src_eqv_cost, src_eqv_regcost,
5506                                    src_elt_cost, src_elt_regcost) <= 0)
5507             trial = copy_rtx (src_eqv_here), src_eqv_cost = MAX_COST;
5508           else if (src_related
5509                    && preferrable (src_related_cost, src_related_regcost,
5510                                    src_elt_cost, src_elt_regcost) <= 0)
5511             trial = copy_rtx (src_related), src_related_cost = MAX_COST;
5512           else
5513             {
5514               trial = copy_rtx (elt->exp);
5515               elt = elt->next_same_value;
5516               src_elt_cost = MAX_COST;
5517             }
5518
5519           /* We don't normally have an insn matching (set (pc) (pc)), so
5520              check for this separately here.  We will delete such an
5521              insn below.
5522
5523              Tablejump insns contain a USE of the table, so simply replacing
5524              the operand with the constant won't match.  This is simply an
5525              unconditional branch, however, and is therefore valid.  Just
5526              insert the substitution here and we will delete and re-emit
5527              the insn later.  */
5528
5529           if (n_sets == 1 && dest == pc_rtx
5530               && (trial == pc_rtx
5531                   || (GET_CODE (trial) == LABEL_REF
5532                       && ! condjump_p (insn))))
5533             {
5534               if (trial == pc_rtx)
5535                 {
5536                   SET_SRC (sets[i].rtl) = trial;
5537                   cse_jumps_altered = 1;
5538                   break;
5539                 }
5540
5541               PATTERN (insn) = gen_jump (XEXP (trial, 0));
5542               INSN_CODE (insn) = -1;
5543
5544               if (NEXT_INSN (insn) != 0
5545                   && GET_CODE (NEXT_INSN (insn)) != BARRIER)
5546                 emit_barrier_after (insn);
5547
5548               cse_jumps_altered = 1;
5549               break;
5550             }
5551
5552           /* Look for a substitution that makes a valid insn.  */
5553           else if (validate_change (insn, &SET_SRC (sets[i].rtl), trial, 0))
5554             {
5555               /* If we just made a substitution inside a libcall, then we
5556                  need to make the same substitution in any notes attached
5557                  to the RETVAL insn.  */
5558               if (libcall_insn
5559                   && (GET_CODE (sets[i].orig_src) == REG
5560                       || GET_CODE (sets[i].orig_src) == SUBREG
5561                       || GET_CODE (sets[i].orig_src) == MEM))
5562                 replace_rtx (REG_NOTES (libcall_insn), sets[i].orig_src,
5563                              canon_reg (SET_SRC (sets[i].rtl), insn));
5564
5565               /* The result of apply_change_group can be ignored; see
5566                  canon_reg.  */
5567
5568               validate_change (insn, &SET_SRC (sets[i].rtl),
5569                                canon_reg (SET_SRC (sets[i].rtl), insn),
5570                                1);
5571               apply_change_group ();
5572               break;
5573             }
5574
5575           /* If we previously found constant pool entries for
5576              constants and this is a constant, try making a
5577              pool entry.  Put it in src_folded unless we already have done
5578              this since that is where it likely came from.  */
5579
5580           else if (constant_pool_entries_cost
5581                    && CONSTANT_P (trial)
5582                    /* Reject cases that will abort in decode_rtx_const.
5583                       On the alpha when simplifying a switch, we get
5584                       (const (truncate (minus (label_ref) (label_ref)))).  */
5585                    && ! (GET_CODE (trial) == CONST
5586                          && GET_CODE (XEXP (trial, 0)) == TRUNCATE)
5587                    /* Likewise on IA-64, except without the truncate.  */
5588                    && ! (GET_CODE (trial) == CONST
5589                          && GET_CODE (XEXP (trial, 0)) == MINUS
5590                          && GET_CODE (XEXP (XEXP (trial, 0), 0)) == LABEL_REF
5591                          && GET_CODE (XEXP (XEXP (trial, 0), 1)) == LABEL_REF)
5592                    && (src_folded == 0
5593                        || (GET_CODE (src_folded) != MEM
5594                            && ! src_folded_force_flag))
5595                    && GET_MODE_CLASS (mode) != MODE_CC
5596                    && mode != VOIDmode)
5597             {
5598               src_folded_force_flag = 1;
5599               src_folded = trial;
5600               src_folded_cost = constant_pool_entries_cost;
5601             }
5602         }
5603
5604       src = SET_SRC (sets[i].rtl);
5605
5606       /* In general, it is good to have a SET with SET_SRC == SET_DEST.
5607          However, there is an important exception:  If both are registers
5608          that are not the head of their equivalence class, replace SET_SRC
5609          with the head of the class.  If we do not do this, we will have
5610          both registers live over a portion of the basic block.  This way,
5611          their lifetimes will likely abut instead of overlapping.  */
5612       if (GET_CODE (dest) == REG
5613           && REGNO_QTY_VALID_P (REGNO (dest)))
5614         {
5615           int dest_q = REG_QTY (REGNO (dest));
5616           struct qty_table_elem *dest_ent = &qty_table[dest_q];
5617
5618           if (dest_ent->mode == GET_MODE (dest)
5619               && dest_ent->first_reg != REGNO (dest)
5620               && GET_CODE (src) == REG && REGNO (src) == REGNO (dest)
5621               /* Don't do this if the original insn had a hard reg as
5622                  SET_SRC or SET_DEST.  */
5623               && (GET_CODE (sets[i].src) != REG
5624                   || REGNO (sets[i].src) >= FIRST_PSEUDO_REGISTER)
5625               && (GET_CODE (dest) != REG || REGNO (dest) >= FIRST_PSEUDO_REGISTER))
5626             /* We can't call canon_reg here because it won't do anything if
5627                SRC is a hard register.  */
5628             {
5629               int src_q = REG_QTY (REGNO (src));
5630               struct qty_table_elem *src_ent = &qty_table[src_q];
5631               int first = src_ent->first_reg;
5632               rtx new_src
5633                 = (first >= FIRST_PSEUDO_REGISTER
5634                    ? regno_reg_rtx[first] : gen_rtx_REG (GET_MODE (src), first));
5635
5636               /* We must use validate-change even for this, because this
5637                  might be a special no-op instruction, suitable only to
5638                  tag notes onto.  */
5639               if (validate_change (insn, &SET_SRC (sets[i].rtl), new_src, 0))
5640                 {
5641                   src = new_src;
5642                   /* If we had a constant that is cheaper than what we are now
5643                      setting SRC to, use that constant.  We ignored it when we
5644                      thought we could make this into a no-op.  */
5645                   if (src_const && COST (src_const) < COST (src)
5646                       && validate_change (insn, &SET_SRC (sets[i].rtl),
5647                                           src_const, 0))
5648                     src = src_const;
5649                 }
5650             }
5651         }
5652
5653       /* If we made a change, recompute SRC values.  */
5654       if (src != sets[i].src)
5655         {
5656           cse_altered = 1;
5657           do_not_record = 0;
5658           hash_arg_in_memory = 0;
5659           sets[i].src = src;
5660           sets[i].src_hash = HASH (src, mode);
5661           sets[i].src_volatile = do_not_record;
5662           sets[i].src_in_memory = hash_arg_in_memory;
5663           sets[i].src_elt = lookup (src, sets[i].src_hash, mode);
5664         }
5665
5666       /* If this is a single SET, we are setting a register, and we have an
5667          equivalent constant, we want to add a REG_NOTE.   We don't want
5668          to write a REG_EQUAL note for a constant pseudo since verifying that
5669          that pseudo hasn't been eliminated is a pain.  Such a note also
5670          won't help anything.
5671
5672          Avoid a REG_EQUAL note for (CONST (MINUS (LABEL_REF) (LABEL_REF)))
5673          which can be created for a reference to a compile time computable
5674          entry in a jump table.  */
5675
5676       if (n_sets == 1 && src_const && GET_CODE (dest) == REG
5677           && GET_CODE (src_const) != REG
5678           && ! (GET_CODE (src_const) == CONST
5679                 && GET_CODE (XEXP (src_const, 0)) == MINUS
5680                 && GET_CODE (XEXP (XEXP (src_const, 0), 0)) == LABEL_REF
5681                 && GET_CODE (XEXP (XEXP (src_const, 0), 1)) == LABEL_REF))
5682         {
5683           tem = find_reg_note (insn, REG_EQUAL, NULL_RTX);
5684
5685           /* Make sure that the rtx is not shared with any other insn.  */
5686           src_const = copy_rtx (src_const);
5687
5688           /* Record the actual constant value in a REG_EQUAL note, making
5689              a new one if one does not already exist.  */
5690           if (tem)
5691             XEXP (tem, 0) = src_const;
5692           else
5693             REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_EQUAL,
5694                                                   src_const, REG_NOTES (insn));
5695
5696           /* If storing a constant value in a register that
5697              previously held the constant value 0,
5698              record this fact with a REG_WAS_0 note on this insn.
5699
5700              Note that the *register* is required to have previously held 0,
5701              not just any register in the quantity and we must point to the
5702              insn that set that register to zero.
5703
5704              Rather than track each register individually, we just see if
5705              the last set for this quantity was for this register.  */
5706
5707           if (REGNO_QTY_VALID_P (REGNO (dest)))
5708             {
5709               int dest_q = REG_QTY (REGNO (dest));
5710               struct qty_table_elem *dest_ent = &qty_table[dest_q];
5711
5712               if (dest_ent->const_rtx == const0_rtx)
5713                 {
5714                   /* See if we previously had a REG_WAS_0 note.  */
5715                   rtx note = find_reg_note (insn, REG_WAS_0, NULL_RTX);
5716                   rtx const_insn = dest_ent->const_insn;
5717
5718                   if ((tem = single_set (const_insn)) != 0
5719                       && rtx_equal_p (SET_DEST (tem), dest))
5720                     {
5721                       if (note)
5722                         XEXP (note, 0) = const_insn;
5723                       else
5724                         REG_NOTES (insn)
5725                           = gen_rtx_INSN_LIST (REG_WAS_0, const_insn,
5726                                                REG_NOTES (insn));
5727                     }
5728                 }
5729             }
5730         }
5731
5732       /* Now deal with the destination.  */
5733       do_not_record = 0;
5734
5735       /* Look within any SIGN_EXTRACT or ZERO_EXTRACT
5736          to the MEM or REG within it.  */
5737       while (GET_CODE (dest) == SIGN_EXTRACT
5738              || GET_CODE (dest) == ZERO_EXTRACT
5739              || GET_CODE (dest) == SUBREG
5740              || GET_CODE (dest) == STRICT_LOW_PART)
5741         dest = XEXP (dest, 0);
5742
5743       sets[i].inner_dest = dest;
5744
5745       if (GET_CODE (dest) == MEM)
5746         {
5747 #ifdef PUSH_ROUNDING
5748           /* Stack pushes invalidate the stack pointer.  */
5749           rtx addr = XEXP (dest, 0);
5750           if (GET_RTX_CLASS (GET_CODE (addr)) == 'a'
5751               && XEXP (addr, 0) == stack_pointer_rtx)
5752             invalidate (stack_pointer_rtx, Pmode);
5753 #endif
5754           dest = fold_rtx (dest, insn);
5755         }
5756
5757       /* Compute the hash code of the destination now,
5758          before the effects of this instruction are recorded,
5759          since the register values used in the address computation
5760          are those before this instruction.  */
5761       sets[i].dest_hash = HASH (dest, mode);
5762
5763       /* Don't enter a bit-field in the hash table
5764          because the value in it after the store
5765          may not equal what was stored, due to truncation.  */
5766
5767       if (GET_CODE (SET_DEST (sets[i].rtl)) == ZERO_EXTRACT
5768           || GET_CODE (SET_DEST (sets[i].rtl)) == SIGN_EXTRACT)
5769         {
5770           rtx width = XEXP (SET_DEST (sets[i].rtl), 1);
5771
5772           if (src_const != 0 && GET_CODE (src_const) == CONST_INT
5773               && GET_CODE (width) == CONST_INT
5774               && INTVAL (width) < HOST_BITS_PER_WIDE_INT
5775               && ! (INTVAL (src_const)
5776                     & ((HOST_WIDE_INT) (-1) << INTVAL (width))))
5777             /* Exception: if the value is constant,
5778                and it won't be truncated, record it.  */
5779             ;
5780           else
5781             {
5782               /* This is chosen so that the destination will be invalidated
5783                  but no new value will be recorded.
5784                  We must invalidate because sometimes constant
5785                  values can be recorded for bitfields.  */
5786               sets[i].src_elt = 0;
5787               sets[i].src_volatile = 1;
5788               src_eqv = 0;
5789               src_eqv_elt = 0;
5790             }
5791         }
5792
5793       /* If only one set in a JUMP_INSN and it is now a no-op, we can delete
5794          the insn.  */
5795       else if (n_sets == 1 && dest == pc_rtx && src == pc_rtx)
5796         {
5797           /* One less use of the label this insn used to jump to.  */
5798           if (JUMP_LABEL (insn) != 0)
5799             --LABEL_NUSES (JUMP_LABEL (insn));
5800           PUT_CODE (insn, NOTE);
5801           NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED;
5802           NOTE_SOURCE_FILE (insn) = 0;
5803           cse_jumps_altered = 1;
5804           /* No more processing for this set.  */
5805           sets[i].rtl = 0;
5806         }
5807
5808       /* If this SET is now setting PC to a label, we know it used to
5809          be a conditional or computed branch.  So we see if we can follow
5810          it.  If it was a computed branch, delete it and re-emit.  */
5811       else if (dest == pc_rtx && GET_CODE (src) == LABEL_REF)
5812         {
5813           /* If this is not in the format for a simple branch and
5814              we are the only SET in it, re-emit it.  */
5815           if (! simplejump_p (insn) && n_sets == 1)
5816             {
5817               rtx new = emit_jump_insn_before (gen_jump (XEXP (src, 0)), insn);
5818               JUMP_LABEL (new) = XEXP (src, 0);
5819               LABEL_NUSES (XEXP (src, 0))++;
5820               insn = new;
5821             }
5822           else
5823             /* Otherwise, force rerecognition, since it probably had
5824                a different pattern before.
5825                This shouldn't really be necessary, since whatever
5826                changed the source value above should have done this.
5827                Until the right place is found, might as well do this here.  */
5828             INSN_CODE (insn) = -1;
5829
5830           never_reached_warning (insn);
5831
5832           /* Now emit a BARRIER after the unconditional jump.  Do not bother
5833              deleting any unreachable code, let jump/flow do that.  */
5834           if (NEXT_INSN (insn) != 0
5835               && GET_CODE (NEXT_INSN (insn)) != BARRIER)
5836             emit_barrier_after (insn);
5837
5838           cse_jumps_altered = 1;
5839           sets[i].rtl = 0;
5840         }
5841
5842       /* If destination is volatile, invalidate it and then do no further
5843          processing for this assignment.  */
5844
5845       else if (do_not_record)
5846         {
5847           if (GET_CODE (dest) == REG || GET_CODE (dest) == SUBREG)
5848             invalidate (dest, VOIDmode);
5849           else if (GET_CODE (dest) == MEM)
5850             {
5851               /* Outgoing arguments for a libcall don't
5852                  affect any recorded expressions.  */
5853               if (! libcall_insn || insn == libcall_insn)
5854                 invalidate (dest, VOIDmode);
5855             }
5856           else if (GET_CODE (dest) == STRICT_LOW_PART
5857                    || GET_CODE (dest) == ZERO_EXTRACT)
5858             invalidate (XEXP (dest, 0), GET_MODE (dest));
5859           sets[i].rtl = 0;
5860         }
5861
5862       if (sets[i].rtl != 0 && dest != SET_DEST (sets[i].rtl))
5863         sets[i].dest_hash = HASH (SET_DEST (sets[i].rtl), mode);
5864
5865 #ifdef HAVE_cc0
5866       /* If setting CC0, record what it was set to, or a constant, if it
5867          is equivalent to a constant.  If it is being set to a floating-point
5868          value, make a COMPARE with the appropriate constant of 0.  If we
5869          don't do this, later code can interpret this as a test against
5870          const0_rtx, which can cause problems if we try to put it into an
5871          insn as a floating-point operand.  */
5872       if (dest == cc0_rtx)
5873         {
5874           this_insn_cc0 = src_const && mode != VOIDmode ? src_const : src;
5875           this_insn_cc0_mode = mode;
5876           if (FLOAT_MODE_P (mode))
5877             this_insn_cc0 = gen_rtx_COMPARE (VOIDmode, this_insn_cc0,
5878                                              CONST0_RTX (mode));
5879         }
5880 #endif
5881     }
5882
5883   /* Now enter all non-volatile source expressions in the hash table
5884      if they are not already present.
5885      Record their equivalence classes in src_elt.
5886      This way we can insert the corresponding destinations into
5887      the same classes even if the actual sources are no longer in them
5888      (having been invalidated).  */
5889
5890   if (src_eqv && src_eqv_elt == 0 && sets[0].rtl != 0 && ! src_eqv_volatile
5891       && ! rtx_equal_p (src_eqv, SET_DEST (sets[0].rtl)))
5892     {
5893       register struct table_elt *elt;
5894       register struct table_elt *classp = sets[0].src_elt;
5895       rtx dest = SET_DEST (sets[0].rtl);
5896       enum machine_mode eqvmode = GET_MODE (dest);
5897
5898       if (GET_CODE (dest) == STRICT_LOW_PART)
5899         {
5900           eqvmode = GET_MODE (SUBREG_REG (XEXP (dest, 0)));
5901           classp = 0;
5902         }
5903       if (insert_regs (src_eqv, classp, 0))
5904         {
5905           rehash_using_reg (src_eqv);
5906           src_eqv_hash = HASH (src_eqv, eqvmode);
5907         }
5908       elt = insert (src_eqv, classp, src_eqv_hash, eqvmode);
5909       elt->in_memory = src_eqv_in_memory;
5910       src_eqv_elt = elt;
5911
5912       /* Check to see if src_eqv_elt is the same as a set source which
5913          does not yet have an elt, and if so set the elt of the set source
5914          to src_eqv_elt.  */
5915       for (i = 0; i < n_sets; i++)
5916         if (sets[i].rtl && sets[i].src_elt == 0
5917             && rtx_equal_p (SET_SRC (sets[i].rtl), src_eqv))
5918           sets[i].src_elt = src_eqv_elt;
5919     }
5920
5921   for (i = 0; i < n_sets; i++)
5922     if (sets[i].rtl && ! sets[i].src_volatile
5923         && ! rtx_equal_p (SET_SRC (sets[i].rtl), SET_DEST (sets[i].rtl)))
5924       {
5925         if (GET_CODE (SET_DEST (sets[i].rtl)) == STRICT_LOW_PART)
5926           {
5927             /* REG_EQUAL in setting a STRICT_LOW_PART
5928                gives an equivalent for the entire destination register,
5929                not just for the subreg being stored in now.
5930                This is a more interesting equivalence, so we arrange later
5931                to treat the entire reg as the destination.  */
5932             sets[i].src_elt = src_eqv_elt;
5933             sets[i].src_hash = src_eqv_hash;
5934           }
5935         else
5936           {
5937             /* Insert source and constant equivalent into hash table, if not
5938                already present.  */
5939             register struct table_elt *classp = src_eqv_elt;
5940             register rtx src = sets[i].src;
5941             register rtx dest = SET_DEST (sets[i].rtl);
5942             enum machine_mode mode
5943               = GET_MODE (src) == VOIDmode ? GET_MODE (dest) : GET_MODE (src);
5944
5945             if (sets[i].src_elt == 0)
5946               {
5947                 /* Don't put a hard register source into the table if this is
5948                    the last insn of a libcall.  In this case, we only need
5949                    to put src_eqv_elt in src_elt.  */
5950                 if (GET_CODE (src) != REG
5951                     || REGNO (src) >= FIRST_PSEUDO_REGISTER
5952                     || ! find_reg_note (insn, REG_RETVAL, NULL_RTX))
5953                   {
5954                     register struct table_elt *elt;
5955
5956                     /* Note that these insert_regs calls cannot remove
5957                        any of the src_elt's, because they would have failed to
5958                        match if not still valid.  */
5959                     if (insert_regs (src, classp, 0))
5960                       {
5961                         rehash_using_reg (src);
5962                         sets[i].src_hash = HASH (src, mode);
5963                       }
5964                     elt = insert (src, classp, sets[i].src_hash, mode);
5965                     elt->in_memory = sets[i].src_in_memory;
5966                     sets[i].src_elt = classp = elt;
5967                   }
5968                 else
5969                   sets[i].src_elt = classp;
5970               }
5971             if (sets[i].src_const && sets[i].src_const_elt == 0
5972                 && src != sets[i].src_const
5973                 && ! rtx_equal_p (sets[i].src_const, src))
5974               sets[i].src_elt = insert (sets[i].src_const, classp,
5975                                         sets[i].src_const_hash, mode);
5976           }
5977       }
5978     else if (sets[i].src_elt == 0)
5979       /* If we did not insert the source into the hash table (e.g., it was
5980          volatile), note the equivalence class for the REG_EQUAL value, if any,
5981          so that the destination goes into that class.  */
5982       sets[i].src_elt = src_eqv_elt;
5983
5984   invalidate_from_clobbers (x);
5985
5986   /* Some registers are invalidated by subroutine calls.  Memory is
5987      invalidated by non-constant calls.  */
5988
5989   if (GET_CODE (insn) == CALL_INSN)
5990     {
5991       if (! CONST_CALL_P (insn))
5992         invalidate_memory ();
5993       invalidate_for_call ();
5994     }
5995
5996   /* Now invalidate everything set by this instruction.
5997      If a SUBREG or other funny destination is being set,
5998      sets[i].rtl is still nonzero, so here we invalidate the reg
5999      a part of which is being set.  */
6000
6001   for (i = 0; i < n_sets; i++)
6002     if (sets[i].rtl)
6003       {
6004         /* We can't use the inner dest, because the mode associated with
6005            a ZERO_EXTRACT is significant.  */
6006         register rtx dest = SET_DEST (sets[i].rtl);
6007
6008         /* Needed for registers to remove the register from its
6009            previous quantity's chain.
6010            Needed for memory if this is a nonvarying address, unless
6011            we have just done an invalidate_memory that covers even those.  */
6012         if (GET_CODE (dest) == REG || GET_CODE (dest) == SUBREG)
6013           invalidate (dest, VOIDmode);
6014         else if (GET_CODE (dest) == MEM)
6015           {
6016             /* Outgoing arguments for a libcall don't
6017                affect any recorded expressions.  */
6018             if (! libcall_insn || insn == libcall_insn)
6019               invalidate (dest, VOIDmode);
6020           }
6021         else if (GET_CODE (dest) == STRICT_LOW_PART
6022                  || GET_CODE (dest) == ZERO_EXTRACT)
6023           invalidate (XEXP (dest, 0), GET_MODE (dest));
6024       }
6025
6026   /* A volatile ASM invalidates everything.  */
6027   if (GET_CODE (insn) == INSN
6028       && GET_CODE (PATTERN (insn)) == ASM_OPERANDS
6029       && MEM_VOLATILE_P (PATTERN (insn)))
6030     flush_hash_table ();
6031
6032   /* Make sure registers mentioned in destinations
6033      are safe for use in an expression to be inserted.
6034      This removes from the hash table
6035      any invalid entry that refers to one of these registers.
6036
6037      We don't care about the return value from mention_regs because
6038      we are going to hash the SET_DEST values unconditionally.  */
6039
6040   for (i = 0; i < n_sets; i++)
6041     {
6042       if (sets[i].rtl)
6043         {
6044           rtx x = SET_DEST (sets[i].rtl);
6045
6046           if (GET_CODE (x) != REG)
6047             mention_regs (x);
6048           else
6049             {
6050               /* We used to rely on all references to a register becoming
6051                  inaccessible when a register changes to a new quantity,
6052                  since that changes the hash code.  However, that is not
6053                  safe, since after HASH_SIZE new quantities we get a
6054                  hash 'collision' of a register with its own invalid
6055                  entries.  And since SUBREGs have been changed not to
6056                  change their hash code with the hash code of the register,
6057                  it wouldn't work any longer at all.  So we have to check
6058                  for any invalid references lying around now.
6059                  This code is similar to the REG case in mention_regs,
6060                  but it knows that reg_tick has been incremented, and
6061                  it leaves reg_in_table as -1 .  */
6062               unsigned int regno = REGNO (x);
6063               unsigned int endregno
6064                 = regno + (regno >= FIRST_PSEUDO_REGISTER ? 1
6065                            : HARD_REGNO_NREGS (regno, GET_MODE (x)));
6066               unsigned int i;
6067
6068               for (i = regno; i < endregno; i++)
6069                 {
6070                   if (REG_IN_TABLE (i) >= 0)
6071                     {
6072                       remove_invalid_refs (i);
6073                       REG_IN_TABLE (i) = -1;
6074                     }
6075                 }
6076             }
6077         }
6078     }
6079
6080   /* We may have just removed some of the src_elt's from the hash table.
6081      So replace each one with the current head of the same class.  */
6082
6083   for (i = 0; i < n_sets; i++)
6084     if (sets[i].rtl)
6085       {
6086         if (sets[i].src_elt && sets[i].src_elt->first_same_value == 0)
6087           /* If elt was removed, find current head of same class,
6088              or 0 if nothing remains of that class.  */
6089           {
6090             register struct table_elt *elt = sets[i].src_elt;
6091
6092             while (elt && elt->prev_same_value)
6093               elt = elt->prev_same_value;
6094
6095             while (elt && elt->first_same_value == 0)
6096               elt = elt->next_same_value;
6097             sets[i].src_elt = elt ? elt->first_same_value : 0;
6098           }
6099       }
6100
6101   /* Now insert the destinations into their equivalence classes.  */
6102
6103   for (i = 0; i < n_sets; i++)
6104     if (sets[i].rtl)
6105       {
6106         register rtx dest = SET_DEST (sets[i].rtl);
6107         rtx inner_dest = sets[i].inner_dest;
6108         register struct table_elt *elt;
6109
6110         /* Don't record value if we are not supposed to risk allocating
6111            floating-point values in registers that might be wider than
6112            memory.  */
6113         if ((flag_float_store
6114              && GET_CODE (dest) == MEM
6115              && FLOAT_MODE_P (GET_MODE (dest)))
6116             /* Don't record BLKmode values, because we don't know the
6117                size of it, and can't be sure that other BLKmode values
6118                have the same or smaller size.  */
6119             || GET_MODE (dest) == BLKmode
6120             /* Don't record values of destinations set inside a libcall block
6121                since we might delete the libcall.  Things should have been set
6122                up so we won't want to reuse such a value, but we play it safe
6123                here.  */
6124             || libcall_insn
6125             /* If we didn't put a REG_EQUAL value or a source into the hash
6126                table, there is no point is recording DEST.  */
6127             || sets[i].src_elt == 0
6128             /* If DEST is a paradoxical SUBREG and SRC is a ZERO_EXTEND
6129                or SIGN_EXTEND, don't record DEST since it can cause
6130                some tracking to be wrong.
6131
6132                ??? Think about this more later.  */
6133             || (GET_CODE (dest) == SUBREG
6134                 && (GET_MODE_SIZE (GET_MODE (dest))
6135                     > GET_MODE_SIZE (GET_MODE (SUBREG_REG (dest))))
6136                 && (GET_CODE (sets[i].src) == SIGN_EXTEND
6137                     || GET_CODE (sets[i].src) == ZERO_EXTEND)))
6138           continue;
6139
6140         /* STRICT_LOW_PART isn't part of the value BEING set,
6141            and neither is the SUBREG inside it.
6142            Note that in this case SETS[I].SRC_ELT is really SRC_EQV_ELT.  */
6143         if (GET_CODE (dest) == STRICT_LOW_PART)
6144           dest = SUBREG_REG (XEXP (dest, 0));
6145
6146         if (GET_CODE (dest) == REG || GET_CODE (dest) == SUBREG)
6147           /* Registers must also be inserted into chains for quantities.  */
6148           if (insert_regs (dest, sets[i].src_elt, 1))
6149             {
6150               /* If `insert_regs' changes something, the hash code must be
6151                  recalculated.  */
6152               rehash_using_reg (dest);
6153               sets[i].dest_hash = HASH (dest, GET_MODE (dest));
6154             }
6155
6156         if (GET_CODE (inner_dest) == MEM
6157             && GET_CODE (XEXP (inner_dest, 0)) == ADDRESSOF)
6158           /* Given (SET (MEM (ADDRESSOF (X))) Y) we don't want to say
6159              that (MEM (ADDRESSOF (X))) is equivalent to Y.
6160              Consider the case in which the address of the MEM is
6161              passed to a function, which alters the MEM.  Then, if we
6162              later use Y instead of the MEM we'll miss the update.  */
6163           elt = insert (dest, 0, sets[i].dest_hash, GET_MODE (dest));
6164         else
6165           elt = insert (dest, sets[i].src_elt,
6166                         sets[i].dest_hash, GET_MODE (dest));
6167
6168         elt->in_memory = (GET_CODE (sets[i].inner_dest) == MEM
6169                           && (! RTX_UNCHANGING_P (sets[i].inner_dest)
6170                               || FIXED_BASE_PLUS_P (XEXP (sets[i].inner_dest,
6171                                                           0))));
6172
6173         /* If we have (set (subreg:m1 (reg:m2 foo) 0) (bar:m1)), M1 is no
6174            narrower than M2, and both M1 and M2 are the same number of words,
6175            we are also doing (set (reg:m2 foo) (subreg:m2 (bar:m1) 0)) so
6176            make that equivalence as well.
6177
6178            However, BAR may have equivalences for which gen_lowpart_if_possible
6179            will produce a simpler value than gen_lowpart_if_possible applied to
6180            BAR (e.g., if BAR was ZERO_EXTENDed from M2), so we will scan all
6181            BAR's equivalences.  If we don't get a simplified form, make
6182            the SUBREG.  It will not be used in an equivalence, but will
6183            cause two similar assignments to be detected.
6184
6185            Note the loop below will find SUBREG_REG (DEST) since we have
6186            already entered SRC and DEST of the SET in the table.  */
6187
6188         if (GET_CODE (dest) == SUBREG
6189             && (((GET_MODE_SIZE (GET_MODE (SUBREG_REG (dest))) - 1)
6190                  / UNITS_PER_WORD)
6191                 == (GET_MODE_SIZE (GET_MODE (dest)) - 1) / UNITS_PER_WORD)
6192             && (GET_MODE_SIZE (GET_MODE (dest))
6193                 >= GET_MODE_SIZE (GET_MODE (SUBREG_REG (dest))))
6194             && sets[i].src_elt != 0)
6195           {
6196             enum machine_mode new_mode = GET_MODE (SUBREG_REG (dest));
6197             struct table_elt *elt, *classp = 0;
6198
6199             for (elt = sets[i].src_elt->first_same_value; elt;
6200                  elt = elt->next_same_value)
6201               {
6202                 rtx new_src = 0;
6203                 unsigned src_hash;
6204                 struct table_elt *src_elt;
6205
6206                 /* Ignore invalid entries.  */
6207                 if (GET_CODE (elt->exp) != REG
6208                     && ! exp_equiv_p (elt->exp, elt->exp, 1, 0))
6209                   continue;
6210
6211                 new_src = gen_lowpart_if_possible (new_mode, elt->exp);
6212                 if (new_src == 0)
6213                   new_src = gen_rtx_SUBREG (new_mode, elt->exp, 0);
6214
6215                 src_hash = HASH (new_src, new_mode);
6216                 src_elt = lookup (new_src, src_hash, new_mode);
6217
6218                 /* Put the new source in the hash table is if isn't
6219                    already.  */
6220                 if (src_elt == 0)
6221                   {
6222                     if (insert_regs (new_src, classp, 0))
6223                       {
6224                         rehash_using_reg (new_src);
6225                         src_hash = HASH (new_src, new_mode);
6226                       }
6227                     src_elt = insert (new_src, classp, src_hash, new_mode);
6228                     src_elt->in_memory = elt->in_memory;
6229                   }
6230                 else if (classp && classp != src_elt->first_same_value)
6231                   /* Show that two things that we've seen before are
6232                      actually the same.  */
6233                   merge_equiv_classes (src_elt, classp);
6234
6235                 classp = src_elt->first_same_value;
6236                 /* Ignore invalid entries.  */
6237                 while (classp
6238                        && GET_CODE (classp->exp) != REG
6239                        && ! exp_equiv_p (classp->exp, classp->exp, 1, 0))
6240                   classp = classp->next_same_value;
6241               }
6242           }
6243       }
6244
6245   /* Special handling for (set REG0 REG1) where REG0 is the
6246      "cheapest", cheaper than REG1.  After cse, REG1 will probably not
6247      be used in the sequel, so (if easily done) change this insn to
6248      (set REG1 REG0) and replace REG1 with REG0 in the previous insn
6249      that computed their value.  Then REG1 will become a dead store
6250      and won't cloud the situation for later optimizations.
6251
6252      Do not make this change if REG1 is a hard register, because it will
6253      then be used in the sequel and we may be changing a two-operand insn
6254      into a three-operand insn.
6255
6256      Also do not do this if we are operating on a copy of INSN.
6257
6258      Also don't do this if INSN ends a libcall; this would cause an unrelated
6259      register to be set in the middle of a libcall, and we then get bad code
6260      if the libcall is deleted.  */
6261
6262   if (n_sets == 1 && sets[0].rtl && GET_CODE (SET_DEST (sets[0].rtl)) == REG
6263       && NEXT_INSN (PREV_INSN (insn)) == insn
6264       && GET_CODE (SET_SRC (sets[0].rtl)) == REG
6265       && REGNO (SET_SRC (sets[0].rtl)) >= FIRST_PSEUDO_REGISTER
6266       && REGNO_QTY_VALID_P (REGNO (SET_SRC (sets[0].rtl))))
6267     {
6268       int src_q = REG_QTY (REGNO (SET_SRC (sets[0].rtl)));
6269       struct qty_table_elem *src_ent = &qty_table[src_q];
6270
6271       if ((src_ent->first_reg == REGNO (SET_DEST (sets[0].rtl)))
6272           && ! find_reg_note (insn, REG_RETVAL, NULL_RTX))
6273         {
6274           rtx prev = prev_nonnote_insn (insn);
6275
6276           /* Do not swap the registers around if the previous instruction
6277              attaches a REG_EQUIV note to REG1.
6278
6279              ??? It's not entirely clear whether we can transfer a REG_EQUIV
6280              from the pseudo that originally shadowed an incoming argument
6281              to another register.  Some uses of REG_EQUIV might rely on it
6282              being attached to REG1 rather than REG2.
6283
6284              This section previously turned the REG_EQUIV into a REG_EQUAL
6285              note.  We cannot do that because REG_EQUIV may provide an
6286              uninitialised stack slot when REG_PARM_STACK_SPACE is used. */
6287
6288           if (prev != 0 && GET_CODE (prev) == INSN
6289               && GET_CODE (PATTERN (prev)) == SET
6290               && SET_DEST (PATTERN (prev)) == SET_SRC (sets[0].rtl)
6291               && ! find_reg_note (prev, REG_EQUIV, NULL_RTX))
6292             {
6293               rtx dest = SET_DEST (sets[0].rtl);
6294               rtx src = SET_SRC (sets[0].rtl);
6295               rtx note;
6296
6297               validate_change (prev, &SET_DEST (PATTERN (prev)), dest, 1);
6298               validate_change (insn, &SET_DEST (sets[0].rtl), src, 1);
6299               validate_change (insn, &SET_SRC (sets[0].rtl), dest, 1);
6300               apply_change_group ();
6301
6302               /* If there was a REG_WAS_0 note on PREV, remove it.  Move
6303                  any REG_WAS_0 note on INSN to PREV.  */
6304               note = find_reg_note (prev, REG_WAS_0, NULL_RTX);
6305               if (note)
6306                 remove_note (prev, note);
6307
6308               note = find_reg_note (insn, REG_WAS_0, NULL_RTX);
6309               if (note)
6310                 {
6311                   remove_note (insn, note);
6312                   XEXP (note, 1) = REG_NOTES (prev);
6313                   REG_NOTES (prev) = note;
6314                 }
6315
6316               /* If INSN has a REG_EQUAL note, and this note mentions
6317                  REG0, then we must delete it, because the value in
6318                  REG0 has changed.  If the note's value is REG1, we must
6319                  also delete it because that is now this insn's dest.  */
6320               note = find_reg_note (insn, REG_EQUAL, NULL_RTX);
6321               if (note != 0
6322                   && (reg_mentioned_p (dest, XEXP (note, 0))
6323                       || rtx_equal_p (src, XEXP (note, 0))))
6324                 remove_note (insn, note);
6325             }
6326         }
6327     }
6328
6329   /* If this is a conditional jump insn, record any known equivalences due to
6330      the condition being tested.  */
6331
6332   last_jump_equiv_class = 0;
6333   if (GET_CODE (insn) == JUMP_INSN
6334       && n_sets == 1 && GET_CODE (x) == SET
6335       && GET_CODE (SET_SRC (x)) == IF_THEN_ELSE)
6336     record_jump_equiv (insn, 0);
6337
6338 #ifdef HAVE_cc0
6339   /* If the previous insn set CC0 and this insn no longer references CC0,
6340      delete the previous insn.  Here we use the fact that nothing expects CC0
6341      to be valid over an insn, which is true until the final pass.  */
6342   if (prev_insn && GET_CODE (prev_insn) == INSN
6343       && (tem = single_set (prev_insn)) != 0
6344       && SET_DEST (tem) == cc0_rtx
6345       && ! reg_mentioned_p (cc0_rtx, x))
6346     {
6347       PUT_CODE (prev_insn, NOTE);
6348       NOTE_LINE_NUMBER (prev_insn) = NOTE_INSN_DELETED;
6349       NOTE_SOURCE_FILE (prev_insn) = 0;
6350     }
6351
6352   prev_insn_cc0 = this_insn_cc0;
6353   prev_insn_cc0_mode = this_insn_cc0_mode;
6354 #endif
6355
6356   prev_insn = insn;
6357 }
6358 \f
6359 /* Remove from the hash table all expressions that reference memory.  */
6360
6361 static void
6362 invalidate_memory ()
6363 {
6364   register int i;
6365   register struct table_elt *p, *next;
6366
6367   for (i = 0; i < HASH_SIZE; i++)
6368     for (p = table[i]; p; p = next)
6369       {
6370         next = p->next_same_hash;
6371         if (p->in_memory)
6372           remove_from_table (p, i);
6373       }
6374 }
6375
6376 /* If ADDR is an address that implicitly affects the stack pointer, return
6377    1 and update the register tables to show the effect.  Else, return 0.  */
6378
6379 static int
6380 addr_affects_sp_p (addr)
6381      register rtx addr;
6382 {
6383   if (GET_RTX_CLASS (GET_CODE (addr)) == 'a'
6384       && GET_CODE (XEXP (addr, 0)) == REG
6385       && REGNO (XEXP (addr, 0)) == STACK_POINTER_REGNUM)
6386     {
6387       if (REG_TICK (STACK_POINTER_REGNUM) >= 0)
6388         REG_TICK (STACK_POINTER_REGNUM)++;
6389
6390       /* This should be *very* rare.  */
6391       if (TEST_HARD_REG_BIT (hard_regs_in_table, STACK_POINTER_REGNUM))
6392         invalidate (stack_pointer_rtx, VOIDmode);
6393
6394       return 1;
6395     }
6396
6397   return 0;
6398 }
6399
6400 /* Perform invalidation on the basis of everything about an insn
6401    except for invalidating the actual places that are SET in it.
6402    This includes the places CLOBBERed, and anything that might
6403    alias with something that is SET or CLOBBERed.
6404
6405    X is the pattern of the insn.  */
6406
6407 static void
6408 invalidate_from_clobbers (x)
6409      rtx x;
6410 {
6411   if (GET_CODE (x) == CLOBBER)
6412     {
6413       rtx ref = XEXP (x, 0);
6414       if (ref)
6415         {
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   else if (GET_CODE (x) == PARALLEL)
6425     {
6426       register int i;
6427       for (i = XVECLEN (x, 0) - 1; i >= 0; i--)
6428         {
6429           register rtx y = XVECEXP (x, 0, i);
6430           if (GET_CODE (y) == CLOBBER)
6431             {
6432               rtx ref = XEXP (y, 0);
6433               if (GET_CODE (ref) == REG || GET_CODE (ref) == SUBREG
6434                   || GET_CODE (ref) == MEM)
6435                 invalidate (ref, VOIDmode);
6436               else if (GET_CODE (ref) == STRICT_LOW_PART
6437                        || GET_CODE (ref) == ZERO_EXTRACT)
6438                 invalidate (XEXP (ref, 0), GET_MODE (ref));
6439             }
6440         }
6441     }
6442 }
6443 \f
6444 /* Process X, part of the REG_NOTES of an insn.  Look at any REG_EQUAL notes
6445    and replace any registers in them with either an equivalent constant
6446    or the canonical form of the register.  If we are inside an address,
6447    only do this if the address remains valid.
6448
6449    OBJECT is 0 except when within a MEM in which case it is the MEM.
6450
6451    Return the replacement for X.  */
6452
6453 static rtx
6454 cse_process_notes (x, object)
6455      rtx x;
6456      rtx object;
6457 {
6458   enum rtx_code code = GET_CODE (x);
6459   const char *fmt = GET_RTX_FORMAT (code);
6460   int i;
6461
6462   switch (code)
6463     {
6464     case CONST_INT:
6465     case CONST:
6466     case SYMBOL_REF:
6467     case LABEL_REF:
6468     case CONST_DOUBLE:
6469     case PC:
6470     case CC0:
6471     case LO_SUM:
6472       return x;
6473
6474     case MEM:
6475       XEXP (x, 0) = cse_process_notes (XEXP (x, 0), x);
6476       return x;
6477
6478     case EXPR_LIST:
6479     case INSN_LIST:
6480       if (REG_NOTE_KIND (x) == REG_EQUAL)
6481         XEXP (x, 0) = cse_process_notes (XEXP (x, 0), NULL_RTX);
6482       if (XEXP (x, 1))
6483         XEXP (x, 1) = cse_process_notes (XEXP (x, 1), NULL_RTX);
6484       return x;
6485
6486     case SIGN_EXTEND:
6487     case ZERO_EXTEND:
6488     case SUBREG:
6489       {
6490         rtx new = cse_process_notes (XEXP (x, 0), object);
6491         /* We don't substitute VOIDmode constants into these rtx,
6492            since they would impede folding.  */
6493         if (GET_MODE (new) != VOIDmode)
6494           validate_change (object, &XEXP (x, 0), new, 0);
6495         return x;
6496       }
6497
6498     case REG:
6499       i = REG_QTY (REGNO (x));
6500
6501       /* Return a constant or a constant register.  */
6502       if (REGNO_QTY_VALID_P (REGNO (x)))
6503         {
6504           struct qty_table_elem *ent = &qty_table[i];
6505
6506           if (ent->const_rtx != NULL_RTX
6507               && (CONSTANT_P (ent->const_rtx)
6508                   || GET_CODE (ent->const_rtx) == REG))
6509             {
6510               rtx new = gen_lowpart_if_possible (GET_MODE (x), ent->const_rtx);
6511               if (new)
6512                 return new;
6513             }
6514         }
6515
6516       /* Otherwise, canonicalize this register.  */
6517       return canon_reg (x, NULL_RTX);
6518
6519     default:
6520       break;
6521     }
6522
6523   for (i = 0; i < GET_RTX_LENGTH (code); i++)
6524     if (fmt[i] == 'e')
6525       validate_change (object, &XEXP (x, i),
6526                        cse_process_notes (XEXP (x, i), object), 0);
6527
6528   return x;
6529 }
6530 \f
6531 /* Find common subexpressions between the end test of a loop and the beginning
6532    of the loop.  LOOP_START is the CODE_LABEL at the start of a loop.
6533
6534    Often we have a loop where an expression in the exit test is used
6535    in the body of the loop.  For example "while (*p) *q++ = *p++;".
6536    Because of the way we duplicate the loop exit test in front of the loop,
6537    however, we don't detect that common subexpression.  This will be caught
6538    when global cse is implemented, but this is a quite common case.
6539
6540    This function handles the most common cases of these common expressions.
6541    It is called after we have processed the basic block ending with the
6542    NOTE_INSN_LOOP_END note that ends a loop and the previous JUMP_INSN
6543    jumps to a label used only once.  */
6544
6545 static void
6546 cse_around_loop (loop_start)
6547      rtx loop_start;
6548 {
6549   rtx insn;
6550   int i;
6551   struct table_elt *p;
6552
6553   /* If the jump at the end of the loop doesn't go to the start, we don't
6554      do anything.  */
6555   for (insn = PREV_INSN (loop_start);
6556        insn && (GET_CODE (insn) == NOTE && NOTE_LINE_NUMBER (insn) >= 0);
6557        insn = PREV_INSN (insn))
6558     ;
6559
6560   if (insn == 0
6561       || GET_CODE (insn) != NOTE
6562       || NOTE_LINE_NUMBER (insn) != NOTE_INSN_LOOP_BEG)
6563     return;
6564
6565   /* If the last insn of the loop (the end test) was an NE comparison,
6566      we will interpret it as an EQ comparison, since we fell through
6567      the loop.  Any equivalences resulting from that comparison are
6568      therefore not valid and must be invalidated.  */
6569   if (last_jump_equiv_class)
6570     for (p = last_jump_equiv_class->first_same_value; p;
6571          p = p->next_same_value)
6572       {
6573         if (GET_CODE (p->exp) == MEM || GET_CODE (p->exp) == REG
6574             || (GET_CODE (p->exp) == SUBREG
6575                 && GET_CODE (SUBREG_REG (p->exp)) == REG))
6576           invalidate (p->exp, VOIDmode);
6577         else if (GET_CODE (p->exp) == STRICT_LOW_PART
6578                  || GET_CODE (p->exp) == ZERO_EXTRACT)
6579           invalidate (XEXP (p->exp, 0), GET_MODE (p->exp));
6580       }
6581
6582   /* Process insns starting after LOOP_START until we hit a CALL_INSN or
6583      a CODE_LABEL (we could handle a CALL_INSN, but it isn't worth it).
6584
6585      The only thing we do with SET_DEST is invalidate entries, so we
6586      can safely process each SET in order.  It is slightly less efficient
6587      to do so, but we only want to handle the most common cases.
6588
6589      The gen_move_insn call in cse_set_around_loop may create new pseudos.
6590      These pseudos won't have valid entries in any of the tables indexed
6591      by register number, such as reg_qty.  We avoid out-of-range array
6592      accesses by not processing any instructions created after cse started.  */
6593
6594   for (insn = NEXT_INSN (loop_start);
6595        GET_CODE (insn) != CALL_INSN && GET_CODE (insn) != CODE_LABEL
6596        && INSN_UID (insn) < max_insn_uid
6597        && ! (GET_CODE (insn) == NOTE
6598              && NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_END);
6599        insn = NEXT_INSN (insn))
6600     {
6601       if (INSN_P (insn)
6602           && (GET_CODE (PATTERN (insn)) == SET
6603               || GET_CODE (PATTERN (insn)) == CLOBBER))
6604         cse_set_around_loop (PATTERN (insn), insn, loop_start);
6605       else if (INSN_P (insn) && GET_CODE (PATTERN (insn)) == PARALLEL)
6606         for (i = XVECLEN (PATTERN (insn), 0) - 1; i >= 0; i--)
6607           if (GET_CODE (XVECEXP (PATTERN (insn), 0, i)) == SET
6608               || GET_CODE (XVECEXP (PATTERN (insn), 0, i)) == CLOBBER)
6609             cse_set_around_loop (XVECEXP (PATTERN (insn), 0, i), insn,
6610                                  loop_start);
6611     }
6612 }
6613 \f
6614 /* Process one SET of an insn that was skipped.  We ignore CLOBBERs
6615    since they are done elsewhere.  This function is called via note_stores.  */
6616
6617 static void
6618 invalidate_skipped_set (dest, set, data)
6619      rtx set;
6620      rtx dest;
6621      void *data ATTRIBUTE_UNUSED;
6622 {
6623   enum rtx_code code = GET_CODE (dest);
6624
6625   if (code == MEM
6626       && ! addr_affects_sp_p (dest)     /* If this is not a stack push ...  */
6627       /* There are times when an address can appear varying and be a PLUS
6628          during this scan when it would be a fixed address were we to know
6629          the proper equivalences.  So invalidate all memory if there is
6630          a BLKmode or nonscalar memory reference or a reference to a
6631          variable address.  */
6632       && (MEM_IN_STRUCT_P (dest) || GET_MODE (dest) == BLKmode
6633           || cse_rtx_varies_p (XEXP (dest, 0), 0)))
6634     {
6635       invalidate_memory ();
6636       return;
6637     }
6638
6639   if (GET_CODE (set) == CLOBBER
6640 #ifdef HAVE_cc0
6641       || dest == cc0_rtx
6642 #endif
6643       || dest == pc_rtx)
6644     return;
6645
6646   if (code == STRICT_LOW_PART || code == ZERO_EXTRACT)
6647     invalidate (XEXP (dest, 0), GET_MODE (dest));
6648   else if (code == REG || code == SUBREG || code == MEM)
6649     invalidate (dest, VOIDmode);
6650 }
6651
6652 /* Invalidate all insns from START up to the end of the function or the
6653    next label.  This called when we wish to CSE around a block that is
6654    conditionally executed.  */
6655
6656 static void
6657 invalidate_skipped_block (start)
6658      rtx start;
6659 {
6660   rtx insn;
6661
6662   for (insn = start; insn && GET_CODE (insn) != CODE_LABEL;
6663        insn = NEXT_INSN (insn))
6664     {
6665       if (! INSN_P (insn))
6666         continue;
6667
6668       if (GET_CODE (insn) == CALL_INSN)
6669         {
6670           if (! CONST_CALL_P (insn))
6671             invalidate_memory ();
6672           invalidate_for_call ();
6673         }
6674
6675       invalidate_from_clobbers (PATTERN (insn));
6676       note_stores (PATTERN (insn), invalidate_skipped_set, NULL);
6677     }
6678 }
6679 \f
6680 /* If modifying X will modify the value in *DATA (which is really an
6681    `rtx *'), indicate that fact by setting the pointed to value to
6682    NULL_RTX.  */
6683
6684 static void
6685 cse_check_loop_start (x, set, data)
6686      rtx x;
6687      rtx set ATTRIBUTE_UNUSED;
6688      void *data;
6689 {
6690   rtx *cse_check_loop_start_value = (rtx *) data;
6691
6692   if (*cse_check_loop_start_value == NULL_RTX
6693       || GET_CODE (x) == CC0 || GET_CODE (x) == PC)
6694     return;
6695
6696   if ((GET_CODE (x) == MEM && GET_CODE (*cse_check_loop_start_value) == MEM)
6697       || reg_overlap_mentioned_p (x, *cse_check_loop_start_value))
6698     *cse_check_loop_start_value = NULL_RTX;
6699 }
6700
6701 /* X is a SET or CLOBBER contained in INSN that was found near the start of
6702    a loop that starts with the label at LOOP_START.
6703
6704    If X is a SET, we see if its SET_SRC is currently in our hash table.
6705    If so, we see if it has a value equal to some register used only in the
6706    loop exit code (as marked by jump.c).
6707
6708    If those two conditions are true, we search backwards from the start of
6709    the loop to see if that same value was loaded into a register that still
6710    retains its value at the start of the loop.
6711
6712    If so, we insert an insn after the load to copy the destination of that
6713    load into the equivalent register and (try to) replace our SET_SRC with that
6714    register.
6715
6716    In any event, we invalidate whatever this SET or CLOBBER modifies.  */
6717
6718 static void
6719 cse_set_around_loop (x, insn, loop_start)
6720      rtx x;
6721      rtx insn;
6722      rtx loop_start;
6723 {
6724   struct table_elt *src_elt;
6725
6726   /* If this is a SET, see if we can replace SET_SRC, but ignore SETs that
6727      are setting PC or CC0 or whose SET_SRC is already a register.  */
6728   if (GET_CODE (x) == SET
6729       && GET_CODE (SET_DEST (x)) != PC && GET_CODE (SET_DEST (x)) != CC0
6730       && GET_CODE (SET_SRC (x)) != REG)
6731     {
6732       src_elt = lookup (SET_SRC (x),
6733                         HASH (SET_SRC (x), GET_MODE (SET_DEST (x))),
6734                         GET_MODE (SET_DEST (x)));
6735
6736       if (src_elt)
6737         for (src_elt = src_elt->first_same_value; src_elt;
6738              src_elt = src_elt->next_same_value)
6739           if (GET_CODE (src_elt->exp) == REG && REG_LOOP_TEST_P (src_elt->exp)
6740               && COST (src_elt->exp) < COST (SET_SRC (x)))
6741             {
6742               rtx p, set;
6743
6744               /* Look for an insn in front of LOOP_START that sets
6745                  something in the desired mode to SET_SRC (x) before we hit
6746                  a label or CALL_INSN.  */
6747
6748               for (p = prev_nonnote_insn (loop_start);
6749                    p && GET_CODE (p) != CALL_INSN
6750                    && GET_CODE (p) != CODE_LABEL;
6751                    p = prev_nonnote_insn  (p))
6752                 if ((set = single_set (p)) != 0
6753                     && GET_CODE (SET_DEST (set)) == REG
6754                     && GET_MODE (SET_DEST (set)) == src_elt->mode
6755                     && rtx_equal_p (SET_SRC (set), SET_SRC (x)))
6756                   {
6757                     /* We now have to ensure that nothing between P
6758                        and LOOP_START modified anything referenced in
6759                        SET_SRC (x).  We know that nothing within the loop
6760                        can modify it, or we would have invalidated it in
6761                        the hash table.  */
6762                     rtx q;
6763                     rtx cse_check_loop_start_value = SET_SRC (x);
6764                     for (q = p; q != loop_start; q = NEXT_INSN (q))
6765                       if (INSN_P (q))
6766                         note_stores (PATTERN (q),
6767                                      cse_check_loop_start,
6768                                      &cse_check_loop_start_value);
6769
6770                     /* If nothing was changed and we can replace our
6771                        SET_SRC, add an insn after P to copy its destination
6772                        to what we will be replacing SET_SRC with.  */
6773                     if (cse_check_loop_start_value
6774                         && validate_change (insn, &SET_SRC (x),
6775                                             src_elt->exp, 0))
6776                       {
6777                         /* If this creates new pseudos, this is unsafe,
6778                            because the regno of new pseudo is unsuitable
6779                            to index into reg_qty when cse_insn processes
6780                            the new insn.  Therefore, if a new pseudo was
6781                            created, discard this optimization.  */
6782                         int nregs = max_reg_num ();
6783                         rtx move
6784                           = gen_move_insn (src_elt->exp, SET_DEST (set));
6785                         if (nregs != max_reg_num ())
6786                           {
6787                             if (! validate_change (insn, &SET_SRC (x),
6788                                                    SET_SRC (set), 0))
6789                               abort ();
6790                           }
6791                         else
6792                           emit_insn_after (move, p);
6793                       }
6794                     break;
6795                   }
6796             }
6797     }
6798
6799   /* Deal with the destination of X affecting the stack pointer.  */
6800   addr_affects_sp_p (SET_DEST (x));
6801
6802   /* See comment on similar code in cse_insn for explanation of these
6803      tests.  */
6804   if (GET_CODE (SET_DEST (x)) == REG || GET_CODE (SET_DEST (x)) == SUBREG
6805       || GET_CODE (SET_DEST (x)) == MEM)
6806     invalidate (SET_DEST (x), VOIDmode);
6807   else if (GET_CODE (SET_DEST (x)) == STRICT_LOW_PART
6808            || GET_CODE (SET_DEST (x)) == ZERO_EXTRACT)
6809     invalidate (XEXP (SET_DEST (x), 0), GET_MODE (SET_DEST (x)));
6810 }
6811 \f
6812 /* Find the end of INSN's basic block and return its range,
6813    the total number of SETs in all the insns of the block, the last insn of the
6814    block, and the branch path.
6815
6816    The branch path indicates which branches should be followed.  If a non-zero
6817    path size is specified, the block should be rescanned and a different set
6818    of branches will be taken.  The branch path is only used if
6819    FLAG_CSE_FOLLOW_JUMPS or FLAG_CSE_SKIP_BLOCKS is non-zero.
6820
6821    DATA is a pointer to a struct cse_basic_block_data, defined below, that is
6822    used to describe the block.  It is filled in with the information about
6823    the current block.  The incoming structure's branch path, if any, is used
6824    to construct the output branch path.  */
6825
6826 void
6827 cse_end_of_basic_block (insn, data, follow_jumps, after_loop, skip_blocks)
6828      rtx insn;
6829      struct cse_basic_block_data *data;
6830      int follow_jumps;
6831      int after_loop;
6832      int skip_blocks;
6833 {
6834   rtx p = insn, q;
6835   int nsets = 0;
6836   int low_cuid = INSN_CUID (insn), high_cuid = INSN_CUID (insn);
6837   rtx next = INSN_P (insn) ? insn : next_real_insn (insn);
6838   int path_size = data->path_size;
6839   int path_entry = 0;
6840   int i;
6841
6842   /* Update the previous branch path, if any.  If the last branch was
6843      previously TAKEN, mark it NOT_TAKEN.  If it was previously NOT_TAKEN,
6844      shorten the path by one and look at the previous branch.  We know that
6845      at least one branch must have been taken if PATH_SIZE is non-zero.  */
6846   while (path_size > 0)
6847     {
6848       if (data->path[path_size - 1].status != NOT_TAKEN)
6849         {
6850           data->path[path_size - 1].status = NOT_TAKEN;
6851           break;
6852         }
6853       else
6854         path_size--;
6855     }
6856
6857   /* If the first instruction is marked with QImode, that means we've
6858      already processed this block.  Our caller will look at DATA->LAST
6859      to figure out where to go next.  We want to return the next block
6860      in the instruction stream, not some branched-to block somewhere
6861      else.  We accomplish this by pretending our called forbid us to
6862      follow jumps, or skip blocks.  */
6863   if (GET_MODE (insn) == QImode)
6864     follow_jumps = skip_blocks = 0;
6865
6866   /* Scan to end of this basic block.  */
6867   while (p && GET_CODE (p) != CODE_LABEL)
6868     {
6869       /* Don't cse out the end of a loop.  This makes a difference
6870          only for the unusual loops that always execute at least once;
6871          all other loops have labels there so we will stop in any case.
6872          Cse'ing out the end of the loop is dangerous because it
6873          might cause an invariant expression inside the loop
6874          to be reused after the end of the loop.  This would make it
6875          hard to move the expression out of the loop in loop.c,
6876          especially if it is one of several equivalent expressions
6877          and loop.c would like to eliminate it.
6878
6879          If we are running after loop.c has finished, we can ignore
6880          the NOTE_INSN_LOOP_END.  */
6881
6882       if (! after_loop && GET_CODE (p) == NOTE
6883           && NOTE_LINE_NUMBER (p) == NOTE_INSN_LOOP_END)
6884         break;
6885
6886       /* Don't cse over a call to setjmp; on some machines (eg vax)
6887          the regs restored by the longjmp come from
6888          a later time than the setjmp.  */
6889       if (GET_CODE (p) == NOTE
6890           && NOTE_LINE_NUMBER (p) == NOTE_INSN_SETJMP)
6891         break;
6892
6893       /* A PARALLEL can have lots of SETs in it,
6894          especially if it is really an ASM_OPERANDS.  */
6895       if (INSN_P (p) && GET_CODE (PATTERN (p)) == PARALLEL)
6896         nsets += XVECLEN (PATTERN (p), 0);
6897       else if (GET_CODE (p) != NOTE)
6898         nsets += 1;
6899
6900       /* Ignore insns made by CSE; they cannot affect the boundaries of
6901          the basic block.  */
6902
6903       if (INSN_UID (p) <= max_uid && INSN_CUID (p) > high_cuid)
6904         high_cuid = INSN_CUID (p);
6905       if (INSN_UID (p) <= max_uid && INSN_CUID (p) < low_cuid)
6906         low_cuid = INSN_CUID (p);
6907
6908       /* See if this insn is in our branch path.  If it is and we are to
6909          take it, do so.  */
6910       if (path_entry < path_size && data->path[path_entry].branch == p)
6911         {
6912           if (data->path[path_entry].status != NOT_TAKEN)
6913             p = JUMP_LABEL (p);
6914
6915           /* Point to next entry in path, if any.  */
6916           path_entry++;
6917         }
6918
6919       /* If this is a conditional jump, we can follow it if -fcse-follow-jumps
6920          was specified, we haven't reached our maximum path length, there are
6921          insns following the target of the jump, this is the only use of the
6922          jump label, and the target label is preceded by a BARRIER.
6923
6924          Alternatively, we can follow the jump if it branches around a
6925          block of code and there are no other branches into the block.
6926          In this case invalidate_skipped_block will be called to invalidate any
6927          registers set in the block when following the jump.  */
6928
6929       else if ((follow_jumps || skip_blocks) && path_size < PATHLENGTH - 1
6930                && GET_CODE (p) == JUMP_INSN
6931                && GET_CODE (PATTERN (p)) == SET
6932                && GET_CODE (SET_SRC (PATTERN (p))) == IF_THEN_ELSE
6933                && JUMP_LABEL (p) != 0
6934                && LABEL_NUSES (JUMP_LABEL (p)) == 1
6935                && NEXT_INSN (JUMP_LABEL (p)) != 0)
6936         {
6937           for (q = PREV_INSN (JUMP_LABEL (p)); q; q = PREV_INSN (q))
6938             if ((GET_CODE (q) != NOTE
6939                  || NOTE_LINE_NUMBER (q) == NOTE_INSN_LOOP_END
6940                  || NOTE_LINE_NUMBER (q) == NOTE_INSN_SETJMP)
6941                 && (GET_CODE (q) != CODE_LABEL || LABEL_NUSES (q) != 0))
6942               break;
6943
6944           /* If we ran into a BARRIER, this code is an extension of the
6945              basic block when the branch is taken.  */
6946           if (follow_jumps && q != 0 && GET_CODE (q) == BARRIER)
6947             {
6948               /* Don't allow ourself to keep walking around an
6949                  always-executed loop.  */
6950               if (next_real_insn (q) == next)
6951                 {
6952                   p = NEXT_INSN (p);
6953                   continue;
6954                 }
6955
6956               /* Similarly, don't put a branch in our path more than once.  */
6957               for (i = 0; i < path_entry; i++)
6958                 if (data->path[i].branch == p)
6959                   break;
6960
6961               if (i != path_entry)
6962                 break;
6963
6964               data->path[path_entry].branch = p;
6965               data->path[path_entry++].status = TAKEN;
6966
6967               /* This branch now ends our path.  It was possible that we
6968                  didn't see this branch the last time around (when the
6969                  insn in front of the target was a JUMP_INSN that was
6970                  turned into a no-op).  */
6971               path_size = path_entry;
6972
6973               p = JUMP_LABEL (p);
6974               /* Mark block so we won't scan it again later.  */
6975               PUT_MODE (NEXT_INSN (p), QImode);
6976             }
6977           /* Detect a branch around a block of code.  */
6978           else if (skip_blocks && q != 0 && GET_CODE (q) != CODE_LABEL)
6979             {
6980               register rtx tmp;
6981
6982               if (next_real_insn (q) == next)
6983                 {
6984                   p = NEXT_INSN (p);
6985                   continue;
6986                 }
6987
6988               for (i = 0; i < path_entry; i++)
6989                 if (data->path[i].branch == p)
6990                   break;
6991
6992               if (i != path_entry)
6993                 break;
6994
6995               /* This is no_labels_between_p (p, q) with an added check for
6996                  reaching the end of a function (in case Q precedes P).  */
6997               for (tmp = NEXT_INSN (p); tmp && tmp != q; tmp = NEXT_INSN (tmp))
6998                 if (GET_CODE (tmp) == CODE_LABEL)
6999                   break;
7000
7001               if (tmp == q)
7002                 {
7003                   data->path[path_entry].branch = p;
7004                   data->path[path_entry++].status = AROUND;
7005
7006                   path_size = path_entry;
7007
7008                   p = JUMP_LABEL (p);
7009                   /* Mark block so we won't scan it again later.  */
7010                   PUT_MODE (NEXT_INSN (p), QImode);
7011                 }
7012             }
7013         }
7014       p = NEXT_INSN (p);
7015     }
7016
7017   data->low_cuid = low_cuid;
7018   data->high_cuid = high_cuid;
7019   data->nsets = nsets;
7020   data->last = p;
7021
7022   /* If all jumps in the path are not taken, set our path length to zero
7023      so a rescan won't be done.  */
7024   for (i = path_size - 1; i >= 0; i--)
7025     if (data->path[i].status != NOT_TAKEN)
7026       break;
7027
7028   if (i == -1)
7029     data->path_size = 0;
7030   else
7031     data->path_size = path_size;
7032
7033   /* End the current branch path.  */
7034   data->path[path_size].branch = 0;
7035 }
7036 \f
7037 /* Perform cse on the instructions of a function.
7038    F is the first instruction.
7039    NREGS is one plus the highest pseudo-reg number used in the instruction.
7040
7041    AFTER_LOOP is 1 if this is the cse call done after loop optimization
7042    (only if -frerun-cse-after-loop).
7043
7044    Returns 1 if jump_optimize should be redone due to simplifications
7045    in conditional jump instructions.  */
7046
7047 int
7048 cse_main (f, nregs, after_loop, file)
7049      rtx f;
7050      int nregs;
7051      int after_loop;
7052      FILE *file;
7053 {
7054   struct cse_basic_block_data val;
7055   register rtx insn = f;
7056   register int i;
7057
7058   cse_jumps_altered = 0;
7059   recorded_label_ref = 0;
7060   constant_pool_entries_cost = 0;
7061   val.path_size = 0;
7062
7063   init_recog ();
7064   init_alias_analysis ();
7065
7066   max_reg = nregs;
7067
7068   max_insn_uid = get_max_uid ();
7069
7070   reg_eqv_table = (struct reg_eqv_elem *)
7071     xmalloc (nregs * sizeof (struct reg_eqv_elem));
7072
7073 #ifdef LOAD_EXTEND_OP
7074
7075   /* Allocate scratch rtl here.  cse_insn will fill in the memory reference
7076      and change the code and mode as appropriate.  */
7077   memory_extend_rtx = gen_rtx_ZERO_EXTEND (VOIDmode, NULL_RTX);
7078 #endif
7079
7080   /* Reset the counter indicating how many elements have been made
7081      thus far.  */
7082   n_elements_made = 0;
7083
7084   /* Find the largest uid.  */
7085
7086   max_uid = get_max_uid ();
7087   uid_cuid = (int *) xcalloc (max_uid + 1, sizeof (int));
7088
7089   /* Compute the mapping from uids to cuids.
7090      CUIDs are numbers assigned to insns, like uids,
7091      except that cuids increase monotonically through the code.
7092      Don't assign cuids to line-number NOTEs, so that the distance in cuids
7093      between two insns is not affected by -g.  */
7094
7095   for (insn = f, i = 0; insn; insn = NEXT_INSN (insn))
7096     {
7097       if (GET_CODE (insn) != NOTE
7098           || NOTE_LINE_NUMBER (insn) < 0)
7099         INSN_CUID (insn) = ++i;
7100       else
7101         /* Give a line number note the same cuid as preceding insn.  */
7102         INSN_CUID (insn) = i;
7103     }
7104
7105   /* Initialize which registers are clobbered by calls.  */
7106
7107   CLEAR_HARD_REG_SET (regs_invalidated_by_call);
7108
7109   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
7110     if ((call_used_regs[i]
7111          /* Used to check !fixed_regs[i] here, but that isn't safe;
7112             fixed regs are still call-clobbered, and sched can get
7113             confused if they can "live across calls".
7114
7115             The frame pointer is always preserved across calls.  The arg
7116             pointer is if it is fixed.  The stack pointer usually is, unless
7117             RETURN_POPS_ARGS, in which case an explicit CLOBBER
7118             will be present.  If we are generating PIC code, the PIC offset
7119             table register is preserved across calls.  */
7120
7121          && i != STACK_POINTER_REGNUM
7122          && i != FRAME_POINTER_REGNUM
7123 #if HARD_FRAME_POINTER_REGNUM != FRAME_POINTER_REGNUM
7124          && i != HARD_FRAME_POINTER_REGNUM
7125 #endif
7126 #if ARG_POINTER_REGNUM != FRAME_POINTER_REGNUM
7127          && ! (i == ARG_POINTER_REGNUM && fixed_regs[i])
7128 #endif
7129 #if !defined (PIC_OFFSET_TABLE_REG_CALL_CLOBBERED)
7130          && ! (i == PIC_OFFSET_TABLE_REGNUM && flag_pic)
7131 #endif
7132          )
7133         || global_regs[i])
7134       SET_HARD_REG_BIT (regs_invalidated_by_call, i);
7135
7136   ggc_push_context ();
7137
7138   /* Loop over basic blocks.
7139      Compute the maximum number of qty's needed for each basic block
7140      (which is 2 for each SET).  */
7141   insn = f;
7142   while (insn)
7143     {
7144       cse_altered = 0;
7145       cse_end_of_basic_block (insn, &val, flag_cse_follow_jumps, after_loop,
7146                               flag_cse_skip_blocks);
7147
7148       /* If this basic block was already processed or has no sets, skip it.  */
7149       if (val.nsets == 0 || GET_MODE (insn) == QImode)
7150         {
7151           PUT_MODE (insn, VOIDmode);
7152           insn = (val.last ? NEXT_INSN (val.last) : 0);
7153           val.path_size = 0;
7154           continue;
7155         }
7156
7157       cse_basic_block_start = val.low_cuid;
7158       cse_basic_block_end = val.high_cuid;
7159       max_qty = val.nsets * 2;
7160
7161       if (file)
7162         fnotice (file, ";; Processing block from %d to %d, %d sets.\n",
7163                  INSN_UID (insn), val.last ? INSN_UID (val.last) : 0,
7164                  val.nsets);
7165
7166       /* Make MAX_QTY bigger to give us room to optimize
7167          past the end of this basic block, if that should prove useful.  */
7168       if (max_qty < 500)
7169         max_qty = 500;
7170
7171       max_qty += max_reg;
7172
7173       /* If this basic block is being extended by following certain jumps,
7174          (see `cse_end_of_basic_block'), we reprocess the code from the start.
7175          Otherwise, we start after this basic block.  */
7176       if (val.path_size > 0)
7177         cse_basic_block (insn, val.last, val.path, 0);
7178       else
7179         {
7180           int old_cse_jumps_altered = cse_jumps_altered;
7181           rtx temp;
7182
7183           /* When cse changes a conditional jump to an unconditional
7184              jump, we want to reprocess the block, since it will give
7185              us a new branch path to investigate.  */
7186           cse_jumps_altered = 0;
7187           temp = cse_basic_block (insn, val.last, val.path, ! after_loop);
7188           if (cse_jumps_altered == 0
7189               || (flag_cse_follow_jumps == 0 && flag_cse_skip_blocks == 0))
7190             insn = temp;
7191
7192           cse_jumps_altered |= old_cse_jumps_altered;
7193         }
7194
7195       if (cse_altered)
7196         ggc_collect ();
7197
7198 #ifdef USE_C_ALLOCA
7199       alloca (0);
7200 #endif
7201     }
7202
7203   ggc_pop_context ();
7204
7205   if (max_elements_made < n_elements_made)
7206     max_elements_made = n_elements_made;
7207
7208   /* Clean up.  */
7209   end_alias_analysis ();
7210   free (uid_cuid);
7211   free (reg_eqv_table);
7212
7213   return cse_jumps_altered || recorded_label_ref;
7214 }
7215
7216 /* Process a single basic block.  FROM and TO and the limits of the basic
7217    block.  NEXT_BRANCH points to the branch path when following jumps or
7218    a null path when not following jumps.
7219
7220    AROUND_LOOP is non-zero if we are to try to cse around to the start of a
7221    loop.  This is true when we are being called for the last time on a
7222    block and this CSE pass is before loop.c.  */
7223
7224 static rtx
7225 cse_basic_block (from, to, next_branch, around_loop)
7226      register rtx from, to;
7227      struct branch_path *next_branch;
7228      int around_loop;
7229 {
7230   register rtx insn;
7231   int to_usage = 0;
7232   rtx libcall_insn = NULL_RTX;
7233   int num_insns = 0;
7234
7235   /* This array is undefined before max_reg, so only allocate
7236      the space actually needed and adjust the start.  */
7237
7238   qty_table
7239     = (struct qty_table_elem *) xmalloc ((max_qty - max_reg)
7240                                          * sizeof (struct qty_table_elem));
7241   qty_table -= max_reg;
7242
7243   new_basic_block ();
7244
7245   /* TO might be a label.  If so, protect it from being deleted.  */
7246   if (to != 0 && GET_CODE (to) == CODE_LABEL)
7247     ++LABEL_NUSES (to);
7248
7249   for (insn = from; insn != to; insn = NEXT_INSN (insn))
7250     {
7251       register enum rtx_code code = GET_CODE (insn);
7252
7253       /* If we have processed 1,000 insns, flush the hash table to
7254          avoid extreme quadratic behavior.  We must not include NOTEs
7255          in the count since there may be more of them when generating
7256          debugging information.  If we clear the table at different
7257          times, code generated with -g -O might be different than code
7258          generated with -O but not -g.
7259
7260          ??? This is a real kludge and needs to be done some other way.
7261          Perhaps for 2.9.  */
7262       if (code != NOTE && num_insns++ > 1000)
7263         {
7264           flush_hash_table ();
7265           num_insns = 0;
7266         }
7267
7268       /* See if this is a branch that is part of the path.  If so, and it is
7269          to be taken, do so.  */
7270       if (next_branch->branch == insn)
7271         {
7272           enum taken status = next_branch++->status;
7273           if (status != NOT_TAKEN)
7274             {
7275               if (status == TAKEN)
7276                 record_jump_equiv (insn, 1);
7277               else
7278                 invalidate_skipped_block (NEXT_INSN (insn));
7279
7280               /* Set the last insn as the jump insn; it doesn't affect cc0.
7281                  Then follow this branch.  */
7282 #ifdef HAVE_cc0
7283               prev_insn_cc0 = 0;
7284 #endif
7285               prev_insn = insn;
7286               insn = JUMP_LABEL (insn);
7287               continue;
7288             }
7289         }
7290
7291       if (GET_MODE (insn) == QImode)
7292         PUT_MODE (insn, VOIDmode);
7293
7294       if (GET_RTX_CLASS (code) == 'i')
7295         {
7296           rtx p;
7297
7298           /* Process notes first so we have all notes in canonical forms when
7299              looking for duplicate operations.  */
7300
7301           if (REG_NOTES (insn))
7302             REG_NOTES (insn) = cse_process_notes (REG_NOTES (insn), NULL_RTX);
7303
7304           /* Track when we are inside in LIBCALL block.  Inside such a block,
7305              we do not want to record destinations.  The last insn of a
7306              LIBCALL block is not considered to be part of the block, since
7307              its destination is the result of the block and hence should be
7308              recorded.  */
7309
7310           if (REG_NOTES (insn) != 0)
7311             {
7312               if ((p = find_reg_note (insn, REG_LIBCALL, NULL_RTX)))
7313                 libcall_insn = XEXP (p, 0);
7314               else if (find_reg_note (insn, REG_RETVAL, NULL_RTX))
7315                 libcall_insn = 0;
7316             }
7317
7318           new_label_ref = 0;
7319           cse_insn (insn, libcall_insn);
7320
7321           /* If this insn uses a LABEL_REF and there isn't a REG_LABEL
7322              note for it, we must rerun jump since it needs to place the
7323              note.  If this is a LABEL_REF for a CODE_LABEL that isn't in
7324              the insn chain, don't do this since no REG_LABEL will be added. */
7325           if (new_label_ref != 0 && INSN_UID (XEXP (new_label_ref, 0)) != 0
7326               && reg_mentioned_p (new_label_ref, PATTERN (insn))
7327               && ! find_reg_note (insn, REG_LABEL, XEXP (new_label_ref, 0)))
7328             recorded_label_ref = 1;
7329         }
7330
7331       /* If INSN is now an unconditional jump, skip to the end of our
7332          basic block by pretending that we just did the last insn in the
7333          basic block.  If we are jumping to the end of our block, show
7334          that we can have one usage of TO.  */
7335
7336       if (any_uncondjump_p (insn))
7337         {
7338           if (to == 0)
7339             {
7340               free (qty_table + max_reg);
7341               return 0;
7342             }
7343
7344           if (JUMP_LABEL (insn) == to)
7345             to_usage = 1;
7346
7347           /* Maybe TO was deleted because the jump is unconditional.
7348              If so, there is nothing left in this basic block.  */
7349           /* ??? Perhaps it would be smarter to set TO
7350              to whatever follows this insn,
7351              and pretend the basic block had always ended here.  */
7352           if (INSN_DELETED_P (to))
7353             break;
7354
7355           insn = PREV_INSN (to);
7356         }
7357
7358       /* See if it is ok to keep on going past the label
7359          which used to end our basic block.  Remember that we incremented
7360          the count of that label, so we decrement it here.  If we made
7361          a jump unconditional, TO_USAGE will be one; in that case, we don't
7362          want to count the use in that jump.  */
7363
7364       if (to != 0 && NEXT_INSN (insn) == to
7365           && GET_CODE (to) == CODE_LABEL && --LABEL_NUSES (to) == to_usage)
7366         {
7367           struct cse_basic_block_data val;
7368           rtx prev;
7369
7370           insn = NEXT_INSN (to);
7371
7372           /* If TO was the last insn in the function, we are done.  */
7373           if (insn == 0)
7374             {
7375               free (qty_table + max_reg);
7376               return 0;
7377             }
7378
7379           /* If TO was preceded by a BARRIER we are done with this block
7380              because it has no continuation.  */
7381           prev = prev_nonnote_insn (to);
7382           if (prev && GET_CODE (prev) == BARRIER)
7383             {
7384               free (qty_table + max_reg);
7385               return insn;
7386             }
7387
7388           /* Find the end of the following block.  Note that we won't be
7389              following branches in this case.  */
7390           to_usage = 0;
7391           val.path_size = 0;
7392           cse_end_of_basic_block (insn, &val, 0, 0, 0);
7393
7394           /* If the tables we allocated have enough space left
7395              to handle all the SETs in the next basic block,
7396              continue through it.  Otherwise, return,
7397              and that block will be scanned individually.  */
7398           if (val.nsets * 2 + next_qty > max_qty)
7399             break;
7400
7401           cse_basic_block_start = val.low_cuid;
7402           cse_basic_block_end = val.high_cuid;
7403           to = val.last;
7404
7405           /* Prevent TO from being deleted if it is a label.  */
7406           if (to != 0 && GET_CODE (to) == CODE_LABEL)
7407             ++LABEL_NUSES (to);
7408
7409           /* Back up so we process the first insn in the extension.  */
7410           insn = PREV_INSN (insn);
7411         }
7412     }
7413
7414   if (next_qty > max_qty)
7415     abort ();
7416
7417   /* If we are running before loop.c, we stopped on a NOTE_INSN_LOOP_END, and
7418      the previous insn is the only insn that branches to the head of a loop,
7419      we can cse into the loop.  Don't do this if we changed the jump
7420      structure of a loop unless we aren't going to be following jumps.  */
7421
7422   if ((cse_jumps_altered == 0
7423        || (flag_cse_follow_jumps == 0 && flag_cse_skip_blocks == 0))
7424       && around_loop && to != 0
7425       && GET_CODE (to) == NOTE && NOTE_LINE_NUMBER (to) == NOTE_INSN_LOOP_END
7426       && GET_CODE (PREV_INSN (to)) == JUMP_INSN
7427       && JUMP_LABEL (PREV_INSN (to)) != 0
7428       && LABEL_NUSES (JUMP_LABEL (PREV_INSN (to))) == 1)
7429     cse_around_loop (JUMP_LABEL (PREV_INSN (to)));
7430
7431   free (qty_table + max_reg);
7432
7433   return to ? NEXT_INSN (to) : 0;
7434 }
7435 \f
7436 /* Count the number of times registers are used (not set) in X.
7437    COUNTS is an array in which we accumulate the count, INCR is how much
7438    we count each register usage.
7439
7440    Don't count a usage of DEST, which is the SET_DEST of a SET which
7441    contains X in its SET_SRC.  This is because such a SET does not
7442    modify the liveness of DEST.  */
7443
7444 static void
7445 count_reg_usage (x, counts, dest, incr)
7446      rtx x;
7447      int *counts;
7448      rtx dest;
7449      int incr;
7450 {
7451   enum rtx_code code;
7452   const char *fmt;
7453   int i, j;
7454
7455   if (x == 0)
7456     return;
7457
7458   switch (code = GET_CODE (x))
7459     {
7460     case REG:
7461       if (x != dest)
7462         counts[REGNO (x)] += incr;
7463       return;
7464
7465     case PC:
7466     case CC0:
7467     case CONST:
7468     case CONST_INT:
7469     case CONST_DOUBLE:
7470     case SYMBOL_REF:
7471     case LABEL_REF:
7472       return;
7473
7474     case CLOBBER:
7475       /* If we are clobbering a MEM, mark any registers inside the address
7476          as being used.  */
7477       if (GET_CODE (XEXP (x, 0)) == MEM)
7478         count_reg_usage (XEXP (XEXP (x, 0), 0), counts, NULL_RTX, incr);
7479       return;
7480
7481     case SET:
7482       /* Unless we are setting a REG, count everything in SET_DEST.  */
7483       if (GET_CODE (SET_DEST (x)) != REG)
7484         count_reg_usage (SET_DEST (x), counts, NULL_RTX, incr);
7485
7486       /* If SRC has side-effects, then we can't delete this insn, so the
7487          usage of SET_DEST inside SRC counts.
7488
7489          ??? Strictly-speaking, we might be preserving this insn
7490          because some other SET has side-effects, but that's hard
7491          to do and can't happen now.  */
7492       count_reg_usage (SET_SRC (x), counts,
7493                        side_effects_p (SET_SRC (x)) ? NULL_RTX : SET_DEST (x),
7494                        incr);
7495       return;
7496
7497     case CALL_INSN:
7498       count_reg_usage (CALL_INSN_FUNCTION_USAGE (x), counts, NULL_RTX, incr);
7499       /* Fall through.  */
7500
7501     case INSN:
7502     case JUMP_INSN:
7503       count_reg_usage (PATTERN (x), counts, NULL_RTX, incr);
7504
7505       /* Things used in a REG_EQUAL note aren't dead since loop may try to
7506          use them.  */
7507
7508       count_reg_usage (REG_NOTES (x), counts, NULL_RTX, incr);
7509       return;
7510
7511     case EXPR_LIST:
7512     case INSN_LIST:
7513       if (REG_NOTE_KIND (x) == REG_EQUAL
7514           || (REG_NOTE_KIND (x) != REG_NONNEG && GET_CODE (XEXP (x,0)) == USE))
7515         count_reg_usage (XEXP (x, 0), counts, NULL_RTX, incr);
7516       count_reg_usage (XEXP (x, 1), counts, NULL_RTX, incr);
7517       return;
7518
7519     default:
7520       break;
7521     }
7522
7523   fmt = GET_RTX_FORMAT (code);
7524   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
7525     {
7526       if (fmt[i] == 'e')
7527         count_reg_usage (XEXP (x, i), counts, dest, incr);
7528       else if (fmt[i] == 'E')
7529         for (j = XVECLEN (x, i) - 1; j >= 0; j--)
7530           count_reg_usage (XVECEXP (x, i, j), counts, dest, incr);
7531     }
7532 }
7533 \f
7534 /* Scan all the insns and delete any that are dead; i.e., they store a register
7535    that is never used or they copy a register to itself.
7536
7537    This is used to remove insns made obviously dead by cse, loop or other
7538    optimizations.  It improves the heuristics in loop since it won't try to
7539    move dead invariants out of loops or make givs for dead quantities.  The
7540    remaining passes of the compilation are also sped up.  */
7541
7542 void
7543 delete_trivially_dead_insns (insns, nreg)
7544      rtx insns;
7545      int nreg;
7546 {
7547   int *counts;
7548   rtx insn, prev;
7549 #ifdef HAVE_cc0
7550   rtx tem;
7551 #endif
7552   int i;
7553   int in_libcall = 0, dead_libcall = 0;
7554
7555   /* First count the number of times each register is used.  */
7556   counts = (int *) xcalloc (nreg, sizeof (int));
7557   for (insn = next_real_insn (insns); insn; insn = next_real_insn (insn))
7558     count_reg_usage (insn, counts, NULL_RTX, 1);
7559
7560   /* Go from the last insn to the first and delete insns that only set unused
7561      registers or copy a register to itself.  As we delete an insn, remove
7562      usage counts for registers it uses.
7563
7564      The first jump optimization pass may leave a real insn as the last
7565      insn in the function.   We must not skip that insn or we may end
7566      up deleting code that is not really dead.   */
7567   insn = get_last_insn ();
7568   if (! INSN_P (insn))
7569     insn = prev_real_insn (insn);
7570
7571   for (; insn; insn = prev)
7572     {
7573       int live_insn = 0;
7574       rtx note;
7575
7576       prev = prev_real_insn (insn);
7577
7578       /* Don't delete any insns that are part of a libcall block unless
7579          we can delete the whole libcall block.
7580
7581          Flow or loop might get confused if we did that.  Remember
7582          that we are scanning backwards.  */
7583       if (find_reg_note (insn, REG_RETVAL, NULL_RTX))
7584         {
7585           in_libcall = 1;
7586           live_insn = 1;
7587           dead_libcall = 0;
7588
7589           /* See if there's a REG_EQUAL note on this insn and try to
7590              replace the source with the REG_EQUAL expression.
7591
7592              We assume that insns with REG_RETVALs can only be reg->reg
7593              copies at this point.  */
7594           note = find_reg_note (insn, REG_EQUAL, NULL_RTX);
7595           if (note)
7596             {
7597               rtx set = single_set (insn);
7598               rtx new = simplify_rtx (XEXP (note, 0));
7599
7600               if (!new)
7601                 new = XEXP (note, 0);
7602
7603               if (set && validate_change (insn, &SET_SRC (set), new, 0))
7604                 {
7605                   remove_note (insn,
7606                                find_reg_note (insn, REG_RETVAL, NULL_RTX));
7607                   dead_libcall = 1;
7608                 }
7609             }
7610         }
7611       else if (in_libcall)
7612         live_insn = ! dead_libcall;
7613       else if (GET_CODE (PATTERN (insn)) == SET)
7614         {
7615           if (set_noop_p (PATTERN (insn)))
7616             ;
7617
7618 #ifdef HAVE_cc0
7619           else if (GET_CODE (SET_DEST (PATTERN (insn))) == CC0
7620                    && ! side_effects_p (SET_SRC (PATTERN (insn)))
7621                    && ((tem = next_nonnote_insn (insn)) == 0
7622                        || ! INSN_P (tem)
7623                        || ! reg_referenced_p (cc0_rtx, PATTERN (tem))))
7624             ;
7625 #endif
7626           else if (GET_CODE (SET_DEST (PATTERN (insn))) != REG
7627                    || REGNO (SET_DEST (PATTERN (insn))) < FIRST_PSEUDO_REGISTER
7628                    || counts[REGNO (SET_DEST (PATTERN (insn)))] != 0
7629                    || side_effects_p (SET_SRC (PATTERN (insn)))
7630                    /* An ADDRESSOF expression can turn into a use of the
7631                       internal arg pointer, so always consider the
7632                       internal arg pointer live.  If it is truly dead,
7633                       flow will delete the initializing insn.  */
7634                    || (SET_DEST (PATTERN (insn))
7635                        == current_function_internal_arg_pointer))
7636             live_insn = 1;
7637         }
7638       else if (GET_CODE (PATTERN (insn)) == PARALLEL)
7639         for (i = XVECLEN (PATTERN (insn), 0) - 1; i >= 0; i--)
7640           {
7641             rtx elt = XVECEXP (PATTERN (insn), 0, i);
7642
7643             if (GET_CODE (elt) == SET)
7644               {
7645                 if (set_noop_p (elt))
7646                   ;
7647
7648 #ifdef HAVE_cc0
7649                 else if (GET_CODE (SET_DEST (elt)) == CC0
7650                          && ! side_effects_p (SET_SRC (elt))
7651                          && ((tem = next_nonnote_insn (insn)) == 0
7652                              || ! INSN_P (tem)
7653                              || ! reg_referenced_p (cc0_rtx, PATTERN (tem))))
7654                   ;
7655 #endif
7656                 else if (GET_CODE (SET_DEST (elt)) != REG
7657                          || REGNO (SET_DEST (elt)) < FIRST_PSEUDO_REGISTER
7658                          || counts[REGNO (SET_DEST (elt))] != 0
7659                          || side_effects_p (SET_SRC (elt))
7660                          /* An ADDRESSOF expression can turn into a use of the
7661                             internal arg pointer, so always consider the
7662                             internal arg pointer live.  If it is truly dead,
7663                             flow will delete the initializing insn.  */
7664                          || (SET_DEST (elt)
7665                              == current_function_internal_arg_pointer))
7666                   live_insn = 1;
7667               }
7668             else if (GET_CODE (elt) != CLOBBER && GET_CODE (elt) != USE)
7669               live_insn = 1;
7670           }
7671       else
7672         live_insn = 1;
7673
7674       /* If this is a dead insn, delete it and show registers in it aren't
7675          being used.  */
7676
7677       if (! live_insn)
7678         {
7679           count_reg_usage (insn, counts, NULL_RTX, -1);
7680           delete_insn (insn);
7681         }
7682
7683       if (find_reg_note (insn, REG_LIBCALL, NULL_RTX))
7684         {
7685           in_libcall = 0;
7686           dead_libcall = 0;
7687         }
7688     }
7689
7690   /* Clean up.  */
7691   free (counts);
7692 }