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 
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 
588 /* Nonzero if X has the form (PLUS frame-pointer integer).  */
589 
590 static bool
fixed_base_plus_p(rtx x)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
dump_class(struct table_elt * classp)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
approx_reg_cost(const_rtx x)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
preferable(int cost_a,int regcost_a,int cost_b,int regcost_b)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
notreg_cost(rtx x,machine_mode mode,enum rtx_code outer,int opno)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 
716 /* Initialize CSE_REG_INFO_TABLE.  */
717 
718 static void
init_cse_reg_info(unsigned int nregs)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
get_cse_reg_info_1(unsigned int regno)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 *
get_cse_reg_info(unsigned int regno)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
new_basic_block(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
make_new_qty(unsigned int reg,machine_mode mode)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
make_regs_eqv(unsigned int new_reg,unsigned int old_reg)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
delete_reg_equiv(unsigned int reg)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
mention_regs(rtx x)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
insert_regs(rtx x,struct table_elt * classp,int modified)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 
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
compute_const_anchors(rtx cst,HOST_WIDE_INT * lower_base,HOST_WIDE_INT * lower_offs,HOST_WIDE_INT * upper_base,HOST_WIDE_INT * upper_offs)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   unsigned HOST_WIDE_INT n = UINTVAL (cst);
1173 
1174   *lower_base = n & ~(targetm.const_anchor - 1);
1175   if ((unsigned HOST_WIDE_INT) *lower_base == n)
1176     return false;
1177 
1178   *upper_base = ((n + (targetm.const_anchor - 1))
1179                      & ~(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
insert_const_anchor(HOST_WIDE_INT anchor,rtx reg,HOST_WIDE_INT offs,machine_mode mode)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_mode (anchor, mode);
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
insert_const_anchors(rtx reg,rtx cst,machine_mode mode)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
find_reg_offset_for_const(struct table_elt * anchor_elt,HOST_WIDE_INT offs,unsigned * old)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
try_const_anchors(rtx src_const,machine_mode mode)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 
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
remove_from_table(struct table_elt * elt,unsigned int hash)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
remove_pseudo_from_table(rtx x,unsigned int hash)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 *
lookup(rtx x,unsigned int hash,machine_mode mode)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 *
lookup_for_remove(rtx x,unsigned int hash,machine_mode mode)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
lookup_as_function(rtx x,enum rtx_code code)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 *
insert_with_costs(rtx x,struct table_elt * classp,unsigned int hash,machine_mode mode,int cost,int reg_cost)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 *
insert(rtx x,struct table_elt * classp,unsigned int hash,machine_mode mode)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 
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
merge_equiv_classes(struct table_elt * class1,struct table_elt * class2)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 
1764 /* Flush the entire hash table.  */
1765 
1766 static void
flush_hash_table(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 
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
check_dependence(const_rtx x,rtx exp,machine_mode mode,rtx addr)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
invalidate_reg(rtx x)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
invalidate(rtx x,machine_mode full_mode)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
invalidate_dest(rtx dest)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 
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
remove_invalid_refs(unsigned int regno)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
remove_invalid_subreg_refs(unsigned int regno,poly_uint64 offset,machine_mode mode)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 
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
rehash_using_reg(rtx x)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 
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
invalidate_for_call(rtx_insn * insn)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 
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
use_related_value(rtx x,struct table_elt * elt)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 
2188 
2189 /* Hash a string.  Just add its bytes up.  */
2190 static inline unsigned
hash_rtx_string(const char * ps)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
hash_rtx_cb(const_rtx x,machine_mode mode,int * do_not_record_p,int * hash_arg_in_memory_p,bool have_reg_qty,hash_rtx_callback_function cb)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
hash_rtx(const_rtx x,machine_mode mode,int * do_not_record_p,int * hash_arg_in_memory_p,bool have_reg_qty)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
canon_hash(rtx x,machine_mode mode)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
safe_hash(rtx x,machine_mode mode)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 
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
exp_equiv_p(const_rtx x,const_rtx y,int validate,bool for_gcse)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 
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
validate_canon_reg(rtx * xloc,rtx_insn * insn)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
canon_reg(rtx x,rtx_insn * insn)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 
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
find_comparison_args(enum rtx_code code,rtx * parg1,rtx * parg2,machine_mode * pmode1,machine_mode * pmode2)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 
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
fold_rtx(rtx x,rtx_insn * insn)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 
3748 /* Return a constant value currently equivalent to X.
3749    Return 0 if we don't know one.  */
3750 
3751 static rtx
equiv_constant(rtx x)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 
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
record_jump_equiv(rtx_insn * insn,bool taken)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
record_jump_cond_subreg(machine_mode mode,rtx op)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
record_jump_cond(enum rtx_code code,machine_mode mode,rtx op0,rtx op1,int reversed_nonequality)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 
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 
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
try_back_substitute_reg(rtx set,rtx_insn * insn)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
add_to_set(vec<struct set> * sets,rtx x)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
find_sets_in_insn(rtx_insn * insn,vec<struct set> * psets)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 
4329 /* Subroutine of canonicalize_insn.  X is an ASM_OPERANDS in INSN.  */
4330 
4331 static void
canon_asm_operands(rtx x,rtx_insn * insn)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
canonicalize_insn(rtx_insn * insn,vec<struct set> * psets)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 
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
cse_insn(rtx_insn * insn)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 
6095 /* Remove from the hash table all expressions that reference memory.  */
6096 
6097 static void
invalidate_memory(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
invalidate_from_clobbers(rtx_insn * insn)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 
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
invalidate_from_sets_and_clobbers(rtx_insn * insn)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 
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
cse_process_note_1(rtx x,const_rtx,void *)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
cse_process_note(rtx x)6255 cse_process_note (rtx x)
6256 {
6257   return simplify_replace_fn_rtx (x, NULL_RTX, cse_process_note_1, NULL);
6258 }
6259 
6260 
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
cse_find_path(basic_block first_bb,struct cse_basic_block_data * data,int follow_jumps)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 
6403 /* Dump the path in DATA to file F.  NSETS is the number of sets
6404    in the path.  */
6405 
6406 static void
cse_dump_path(struct cse_basic_block_data * data,int nsets,FILE * f)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 
6419 /* Return true if BB has exception handling successor edges.  */
6420 
6421 static bool
have_eh_succ_edges(basic_block bb)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 
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
cse_prescan_path(struct cse_basic_block_data * data)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 
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
check_for_label_ref(rtx_insn * insn)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
cse_extended_basic_block(struct cse_basic_block_data * ebb_data)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 
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
cse_main(rtx_insn * f ATTRIBUTE_UNUSED,int nregs)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 
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
count_reg_usage(rtx x,int * counts,rtx dest,int incr)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 
6857 /* Return true if X is a dead register.  */
6858 
6859 static inline int
is_dead_reg(const_rtx x,int * counts)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
set_live_p(rtx set,int * counts)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
insn_live_p(rtx_insn * insn,int * counts)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
count_stores(rtx x,const_rtx set ATTRIBUTE_UNUSED,void * data)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
is_dead_debug_insn(const_rtx pat,int * counts,rtx * replacements,bool * seen_repl)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
replace_dead_reg(rtx x,const_rtx old_rtx ATTRIBUTE_UNUSED,void * data)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
delete_trivially_dead_insns(rtx_insn * insns,int nreg)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
cse_change_cc_mode(subrtx_ptr_iterator::array_type & array,rtx * loc,rtx_insn * insn,rtx newreg)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
cse_change_cc_mode_insn(rtx_insn * insn,rtx newreg)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
cse_change_cc_mode_insns(rtx_insn * start,rtx_insn * end,rtx newreg)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
cse_cc_succs(basic_block bb,basic_block orig_bb,rtx cc_reg,rtx cc_src,bool can_change_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
cse_condition_code_reg(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 
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
rest_of_handle_cse(void)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:
pass_cse(gcc::context * ctxt)7569   pass_cse (gcc::context *ctxt)
7570     : rtl_opt_pass (pass_data_cse, ctxt)
7571   {}
7572 
7573   /* opt_pass methods: */
gate(function *)7574   virtual bool gate (function *) { return optimize > 0; }
execute(function *)7575   virtual unsigned int execute (function *) { return rest_of_handle_cse (); }
7576 
7577 }; // class pass_cse
7578 
7579 } // anon namespace
7580 
7581 rtl_opt_pass *
make_pass_cse(gcc::context * ctxt)7582 make_pass_cse (gcc::context *ctxt)
7583 {
7584   return new pass_cse (ctxt);
7585 }
7586 
7587 
7588 /* Run second CSE pass after loop optimizations.  */
7589 static unsigned int
rest_of_handle_cse2(void)7590 rest_of_handle_cse2 (void)
7591 {
7592   int tem;
7593 
7594   if (dump_file)
7595     dump_flow_info (dump_file, dump_flags);
7596 
7597   tem = cse_main (get_insns (), max_reg_num ());
7598 
7599   /* Run a pass to eliminate duplicated assignments to condition code
7600      registers.  We have to run this after bypass_jumps, because it
7601      makes it harder for that pass to determine whether a jump can be
7602      bypassed safely.  */
7603   cse_condition_code_reg ();
7604 
7605   delete_trivially_dead_insns (get_insns (), max_reg_num ());
7606 
7607   if (tem == 2)
7608     {
7609       timevar_push (TV_JUMP);
7610       rebuild_jump_labels (get_insns ());
7611       cse_cfg_altered |= cleanup_cfg (CLEANUP_CFG_CHANGED);
7612       timevar_pop (TV_JUMP);
7613     }
7614   else if (tem == 1 || cse_cfg_altered)
7615     cse_cfg_altered |= cleanup_cfg (0);
7616 
7617   cse_not_expected = 1;
7618   return 0;
7619 }
7620 
7621 
7622 namespace {
7623 
7624 const pass_data pass_data_cse2 =
7625 {
7626   RTL_PASS, /* type */
7627   "cse2", /* name */
7628   OPTGROUP_NONE, /* optinfo_flags */
7629   TV_CSE2, /* tv_id */
7630   0, /* properties_required */
7631   0, /* properties_provided */
7632   0, /* properties_destroyed */
7633   0, /* todo_flags_start */
7634   TODO_df_finish, /* todo_flags_finish */
7635 };
7636 
7637 class pass_cse2 : public rtl_opt_pass
7638 {
7639 public:
pass_cse2(gcc::context * ctxt)7640   pass_cse2 (gcc::context *ctxt)
7641     : rtl_opt_pass (pass_data_cse2, ctxt)
7642   {}
7643 
7644   /* opt_pass methods: */
gate(function *)7645   virtual bool gate (function *)
7646     {
7647       return optimize > 0 && flag_rerun_cse_after_loop;
7648     }
7649 
execute(function *)7650   virtual unsigned int execute (function *) { return rest_of_handle_cse2 (); }
7651 
7652 }; // class pass_cse2
7653 
7654 } // anon namespace
7655 
7656 rtl_opt_pass *
make_pass_cse2(gcc::context * ctxt)7657 make_pass_cse2 (gcc::context *ctxt)
7658 {
7659   return new pass_cse2 (ctxt);
7660 }
7661 
7662 /* Run second CSE pass after loop optimizations.  */
7663 static unsigned int
rest_of_handle_cse_after_global_opts(void)7664 rest_of_handle_cse_after_global_opts (void)
7665 {
7666   int save_cfj;
7667   int tem;
7668 
7669   /* We only want to do local CSE, so don't follow jumps.  */
7670   save_cfj = flag_cse_follow_jumps;
7671   flag_cse_follow_jumps = 0;
7672 
7673   rebuild_jump_labels (get_insns ());
7674   tem = cse_main (get_insns (), max_reg_num ());
7675   cse_cfg_altered |= purge_all_dead_edges ();
7676   delete_trivially_dead_insns (get_insns (), max_reg_num ());
7677 
7678   cse_not_expected = !flag_rerun_cse_after_loop;
7679 
7680   /* If cse altered any jumps, rerun jump opts to clean things up.  */
7681   if (tem == 2)
7682     {
7683       timevar_push (TV_JUMP);
7684       rebuild_jump_labels (get_insns ());
7685       cse_cfg_altered |= cleanup_cfg (CLEANUP_CFG_CHANGED);
7686       timevar_pop (TV_JUMP);
7687     }
7688   else if (tem == 1 || cse_cfg_altered)
7689     cse_cfg_altered |= cleanup_cfg (0);
7690 
7691   flag_cse_follow_jumps = save_cfj;
7692   return 0;
7693 }
7694 
7695 namespace {
7696 
7697 const pass_data pass_data_cse_after_global_opts =
7698 {
7699   RTL_PASS, /* type */
7700   "cse_local", /* name */
7701   OPTGROUP_NONE, /* optinfo_flags */
7702   TV_CSE, /* tv_id */
7703   0, /* properties_required */
7704   0, /* properties_provided */
7705   0, /* properties_destroyed */
7706   0, /* todo_flags_start */
7707   TODO_df_finish, /* todo_flags_finish */
7708 };
7709 
7710 class pass_cse_after_global_opts : public rtl_opt_pass
7711 {
7712 public:
pass_cse_after_global_opts(gcc::context * ctxt)7713   pass_cse_after_global_opts (gcc::context *ctxt)
7714     : rtl_opt_pass (pass_data_cse_after_global_opts, ctxt)
7715   {}
7716 
7717   /* opt_pass methods: */
gate(function *)7718   virtual bool gate (function *)
7719     {
7720       return optimize > 0 && flag_rerun_cse_after_global_opts;
7721     }
7722 
execute(function *)7723   virtual unsigned int execute (function *)
7724     {
7725       return rest_of_handle_cse_after_global_opts ();
7726     }
7727 
7728 }; // class pass_cse_after_global_opts
7729 
7730 } // anon namespace
7731 
7732 rtl_opt_pass *
make_pass_cse_after_global_opts(gcc::context * ctxt)7733 make_pass_cse_after_global_opts (gcc::context *ctxt)
7734 {
7735   return new pass_cse_after_global_opts (ctxt);
7736 }
7737