xref: /netbsd-src/external/gpl3/gcc/dist/gcc/cse.cc (revision b1e838363e3c6fc78a55519254d99869742dd33c)
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