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