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