Default to dwarf version 4 on hppa64-hpux
[official-gcc.git] / gcc / cse.c
blob330c1e90ce05b8f95b58f24576ec93e10ec55d89
1 /* Common subexpression elimination for GNU compiler.
2 Copyright (C) 1987-2021 Free Software Foundation, Inc.
4 This file is part of GCC.
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.
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.
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/>. */
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"
48 /* The basic idea of common subexpression elimination is to go
49 through the code, keeping a record of expressions that would
50 have the same value at the current scan point, and replacing
51 expressions encountered with the cheapest equivalent expression.
53 It is too complicated to keep track of the different possibilities
54 when control paths merge in this code; so, at each label, we forget all
55 that is known and start fresh. This can be described as processing each
56 extended basic block separately. We have a separate pass to perform
57 global CSE.
59 Note CSE can turn a conditional or computed jump into a nop or
60 an unconditional jump. When this occurs we arrange to run the jump
61 optimizer after CSE to delete the unreachable code.
63 We use two data structures to record the equivalent expressions:
64 a hash table for most expressions, and a vector of "quantity
65 numbers" to record equivalent (pseudo) registers.
67 The use of the special data structure for registers is desirable
68 because it is faster. It is possible because registers references
69 contain a fairly small number, the register number, taken from
70 a contiguously allocated series, and two register references are
71 identical if they have the same number. General expressions
72 do not have any such thing, so the only way to retrieve the
73 information recorded on an expression other than a register
74 is to keep it in a hash table.
76 Registers and "quantity numbers":
78 At the start of each basic block, all of the (hardware and pseudo)
79 registers used in the function are given distinct quantity
80 numbers to indicate their contents. During scan, when the code
81 copies one register into another, we copy the quantity number.
82 When a register is loaded in any other way, we allocate a new
83 quantity number to describe the value generated by this operation.
84 `REG_QTY (N)' records what quantity register N is currently thought
85 of as containing.
87 All real quantity numbers are greater than or equal to zero.
88 If register N has not been assigned a quantity, `REG_QTY (N)' will
89 equal -N - 1, which is always negative.
91 Quantity numbers below zero do not exist and none of the `qty_table'
92 entries should be referenced with a negative index.
94 We also maintain a bidirectional chain of registers for each
95 quantity number. The `qty_table` members `first_reg' and `last_reg',
96 and `reg_eqv_table' members `next' and `prev' hold these chains.
98 The first register in a chain is the one whose lifespan is least local.
99 Among equals, it is the one that was seen first.
100 We replace any equivalent register with that one.
102 If two registers have the same quantity number, it must be true that
103 REG expressions with qty_table `mode' must be in the hash table for both
104 registers and must be in the same class.
106 The converse is not true. Since hard registers may be referenced in
107 any mode, two REG expressions might be equivalent in the hash table
108 but not have the same quantity number if the quantity number of one
109 of the registers is not the same mode as those expressions.
111 Constants and quantity numbers
113 When a quantity has a known constant value, that value is stored
114 in the appropriate qty_table `const_rtx'. This is in addition to
115 putting the constant in the hash table as is usual for non-regs.
117 Whether a reg or a constant is preferred is determined by the configuration
118 macro CONST_COSTS and will often depend on the constant value. In any
119 event, expressions containing constants can be simplified, by fold_rtx.
121 When a quantity has a known nearly constant value (such as an address
122 of a stack slot), that value is stored in the appropriate qty_table
123 `const_rtx'.
125 Integer constants don't have a machine mode. However, cse
126 determines the intended machine mode from the destination
127 of the instruction that moves the constant. The machine mode
128 is recorded in the hash table along with the actual RTL
129 constant expression so that different modes are kept separate.
131 Other expressions:
133 To record known equivalences among expressions in general
134 we use a hash table called `table'. It has a fixed number of buckets
135 that contain chains of `struct table_elt' elements for expressions.
136 These chains connect the elements whose expressions have the same
137 hash codes.
139 Other chains through the same elements connect the elements which
140 currently have equivalent values.
142 Register references in an expression are canonicalized before hashing
143 the expression. This is done using `reg_qty' and qty_table `first_reg'.
144 The hash code of a register reference is computed using the quantity
145 number, not the register number.
147 When the value of an expression changes, it is necessary to remove from the
148 hash table not just that expression but all expressions whose values
149 could be different as a result.
151 1. If the value changing is in memory, except in special cases
152 ANYTHING referring to memory could be changed. That is because
153 nobody knows where a pointer does not point.
154 The function `invalidate_memory' removes what is necessary.
156 The special cases are when the address is constant or is
157 a constant plus a fixed register such as the frame pointer
158 or a static chain pointer. When such addresses are stored in,
159 we can tell exactly which other such addresses must be invalidated
160 due to overlap. `invalidate' does this.
161 All expressions that refer to non-constant
162 memory addresses are also invalidated. `invalidate_memory' does this.
164 2. If the value changing is a register, all expressions
165 containing references to that register, and only those,
166 must be removed.
168 Because searching the entire hash table for expressions that contain
169 a register is very slow, we try to figure out when it isn't necessary.
170 Precisely, this is necessary only when expressions have been
171 entered in the hash table using this register, and then the value has
172 changed, and then another expression wants to be added to refer to
173 the register's new value. This sequence of circumstances is rare
174 within any one basic block.
176 `REG_TICK' and `REG_IN_TABLE', accessors for members of
177 cse_reg_info, are used to detect this case. REG_TICK (i) is
178 incremented whenever a value is stored in register i.
179 REG_IN_TABLE (i) holds -1 if no references to register i have been
180 entered in the table; otherwise, it contains the value REG_TICK (i)
181 had when the references were entered. If we want to enter a
182 reference and REG_IN_TABLE (i) != REG_TICK (i), we must scan and
183 remove old references. Until we want to enter a new entry, the
184 mere fact that the two vectors don't match makes the entries be
185 ignored if anyone tries to match them.
187 Registers themselves are entered in the hash table as well as in
188 the equivalent-register chains. However, `REG_TICK' and
189 `REG_IN_TABLE' do not apply to expressions which are simple
190 register references. These expressions are removed from the table
191 immediately when they become invalid, and this can be done even if
192 we do not immediately search for all the expressions that refer to
193 the register.
195 A CLOBBER rtx in an instruction invalidates its operand for further
196 reuse. A CLOBBER or SET rtx whose operand is a MEM:BLK
197 invalidates everything that resides in memory.
199 Related expressions:
201 Constant expressions that differ only by an additive integer
202 are called related. When a constant expression is put in
203 the table, the related expression with no constant term
204 is also entered. These are made to point at each other
205 so that it is possible to find out if there exists any
206 register equivalent to an expression related to a given expression. */
208 /* Length of qty_table vector. We know in advance we will not need
209 a quantity number this big. */
211 static int max_qty;
213 /* Next quantity number to be allocated.
214 This is 1 + the largest number needed so far. */
216 static int next_qty;
218 /* Per-qty information tracking.
220 `first_reg' and `last_reg' track the head and tail of the
221 chain of registers which currently contain this quantity.
223 `mode' contains the machine mode of this quantity.
225 `const_rtx' holds the rtx of the constant value of this
226 quantity, if known. A summations of the frame/arg pointer
227 and a constant can also be entered here. When this holds
228 a known value, `const_insn' is the insn which stored the
229 constant value.
231 `comparison_{code,const,qty}' are used to track when a
232 comparison between a quantity and some constant or register has
233 been passed. In such a case, we know the results of the comparison
234 in case we see it again. These members record a comparison that
235 is known to be true. `comparison_code' holds the rtx code of such
236 a comparison, else it is set to UNKNOWN and the other two
237 comparison members are undefined. `comparison_const' holds
238 the constant being compared against, or zero if the comparison
239 is not against a constant. `comparison_qty' holds the quantity
240 being compared against when the result is known. If the comparison
241 is not with a register, `comparison_qty' is -1. */
243 struct qty_table_elem
245 rtx const_rtx;
246 rtx_insn *const_insn;
247 rtx comparison_const;
248 int comparison_qty;
249 unsigned int first_reg, last_reg;
250 /* The sizes of these fields should match the sizes of the
251 code and mode fields of struct rtx_def (see rtl.h). */
252 ENUM_BITFIELD(rtx_code) comparison_code : 16;
253 ENUM_BITFIELD(machine_mode) mode : 8;
256 /* The table of all qtys, indexed by qty number. */
257 static struct qty_table_elem *qty_table;
259 /* Insn being scanned. */
261 static rtx_insn *this_insn;
262 static bool optimize_this_for_speed_p;
264 /* Index by register number, gives the number of the next (or
265 previous) register in the chain of registers sharing the same
266 value.
268 Or -1 if this register is at the end of the chain.
270 If REG_QTY (N) == -N - 1, reg_eqv_table[N].next is undefined. */
272 /* Per-register equivalence chain. */
273 struct reg_eqv_elem
275 int next, prev;
278 /* The table of all register equivalence chains. */
279 static struct reg_eqv_elem *reg_eqv_table;
281 struct cse_reg_info
283 /* The timestamp at which this register is initialized. */
284 unsigned int timestamp;
286 /* The quantity number of the register's current contents. */
287 int reg_qty;
289 /* The number of times the register has been altered in the current
290 basic block. */
291 int reg_tick;
293 /* The REG_TICK value at which rtx's containing this register are
294 valid in the hash table. If this does not equal the current
295 reg_tick value, such expressions existing in the hash table are
296 invalid. */
297 int reg_in_table;
299 /* The SUBREG that was set when REG_TICK was last incremented. Set
300 to -1 if the last store was to the whole register, not a subreg. */
301 unsigned int subreg_ticked;
304 /* A table of cse_reg_info indexed by register numbers. */
305 static struct cse_reg_info *cse_reg_info_table;
307 /* The size of the above table. */
308 static unsigned int cse_reg_info_table_size;
310 /* The index of the first entry that has not been initialized. */
311 static unsigned int cse_reg_info_table_first_uninitialized;
313 /* The timestamp at the beginning of the current run of
314 cse_extended_basic_block. We increment this variable at the beginning of
315 the current run of cse_extended_basic_block. The timestamp field of a
316 cse_reg_info entry matches the value of this variable if and only
317 if the entry has been initialized during the current run of
318 cse_extended_basic_block. */
319 static unsigned int cse_reg_info_timestamp;
321 /* A HARD_REG_SET containing all the hard registers for which there is
322 currently a REG expression in the hash table. Note the difference
323 from the above variables, which indicate if the REG is mentioned in some
324 expression in the table. */
326 static HARD_REG_SET hard_regs_in_table;
328 /* True if CSE has altered the CFG. */
329 static bool cse_cfg_altered;
331 /* True if CSE has altered conditional jump insns in such a way
332 that jump optimization should be redone. */
333 static bool cse_jumps_altered;
335 /* True if we put a LABEL_REF into the hash table for an INSN
336 without a REG_LABEL_OPERAND, we have to rerun jump after CSE
337 to put in the note. */
338 static bool recorded_label_ref;
340 /* canon_hash stores 1 in do_not_record if it notices a reference to PC or
341 some other volatile subexpression. */
343 static int do_not_record;
345 /* canon_hash stores 1 in hash_arg_in_memory
346 if it notices a reference to memory within the expression being hashed. */
348 static int hash_arg_in_memory;
350 /* The hash table contains buckets which are chains of `struct table_elt's,
351 each recording one expression's information.
352 That expression is in the `exp' field.
354 The canon_exp field contains a canonical (from the point of view of
355 alias analysis) version of the `exp' field.
357 Those elements with the same hash code are chained in both directions
358 through the `next_same_hash' and `prev_same_hash' fields.
360 Each set of expressions with equivalent values
361 are on a two-way chain through the `next_same_value'
362 and `prev_same_value' fields, and all point with
363 the `first_same_value' field at the first element in
364 that chain. The chain is in order of increasing cost.
365 Each element's cost value is in its `cost' field.
367 The `in_memory' field is nonzero for elements that
368 involve any reference to memory. These elements are removed
369 whenever a write is done to an unidentified location in memory.
370 To be safe, we assume that a memory address is unidentified unless
371 the address is either a symbol constant or a constant plus
372 the frame pointer or argument pointer.
374 The `related_value' field is used to connect related expressions
375 (that differ by adding an integer).
376 The related expressions are chained in a circular fashion.
377 `related_value' is zero for expressions for which this
378 chain is not useful.
380 The `cost' field stores the cost of this element's expression.
381 The `regcost' field stores the value returned by approx_reg_cost for
382 this element's expression.
384 The `is_const' flag is set if the element is a constant (including
385 a fixed address).
387 The `flag' field is used as a temporary during some search routines.
389 The `mode' field is usually the same as GET_MODE (`exp'), but
390 if `exp' is a CONST_INT and has no machine mode then the `mode'
391 field is the mode it was being used as. Each constant is
392 recorded separately for each mode it is used with. */
394 struct table_elt
396 rtx exp;
397 rtx canon_exp;
398 struct table_elt *next_same_hash;
399 struct table_elt *prev_same_hash;
400 struct table_elt *next_same_value;
401 struct table_elt *prev_same_value;
402 struct table_elt *first_same_value;
403 struct table_elt *related_value;
404 int cost;
405 int regcost;
406 /* The size of this field should match the size
407 of the mode field of struct rtx_def (see rtl.h). */
408 ENUM_BITFIELD(machine_mode) mode : 8;
409 char in_memory;
410 char is_const;
411 char flag;
414 /* We don't want a lot of buckets, because we rarely have very many
415 things stored in the hash table, and a lot of buckets slows
416 down a lot of loops that happen frequently. */
417 #define HASH_SHIFT 5
418 #define HASH_SIZE (1 << HASH_SHIFT)
419 #define HASH_MASK (HASH_SIZE - 1)
421 /* Compute hash code of X in mode M. Special-case case where X is a pseudo
422 register (hard registers may require `do_not_record' to be set). */
424 #define HASH(X, M) \
425 ((REG_P (X) && REGNO (X) >= FIRST_PSEUDO_REGISTER \
426 ? (((unsigned) REG << 7) + (unsigned) REG_QTY (REGNO (X))) \
427 : canon_hash (X, M)) & HASH_MASK)
429 /* Like HASH, but without side-effects. */
430 #define SAFE_HASH(X, M) \
431 ((REG_P (X) && REGNO (X) >= FIRST_PSEUDO_REGISTER \
432 ? (((unsigned) REG << 7) + (unsigned) REG_QTY (REGNO (X))) \
433 : safe_hash (X, M)) & HASH_MASK)
435 /* Determine whether register number N is considered a fixed register for the
436 purpose of approximating register costs.
437 It is desirable to replace other regs with fixed regs, to reduce need for
438 non-fixed hard regs.
439 A reg wins if it is either the frame pointer or designated as fixed. */
440 #define FIXED_REGNO_P(N) \
441 ((N) == FRAME_POINTER_REGNUM || (N) == HARD_FRAME_POINTER_REGNUM \
442 || fixed_regs[N] || global_regs[N])
444 /* Compute cost of X, as stored in the `cost' field of a table_elt. Fixed
445 hard registers and pointers into the frame are the cheapest with a cost
446 of 0. Next come pseudos with a cost of one and other hard registers with
447 a cost of 2. Aside from these special cases, call `rtx_cost'. */
449 #define CHEAP_REGNO(N) \
450 (REGNO_PTR_FRAME_P (N) \
451 || (HARD_REGISTER_NUM_P (N) \
452 && FIXED_REGNO_P (N) && REGNO_REG_CLASS (N) != NO_REGS))
454 #define COST(X, MODE) \
455 (REG_P (X) ? 0 : notreg_cost (X, MODE, SET, 1))
456 #define COST_IN(X, MODE, OUTER, OPNO) \
457 (REG_P (X) ? 0 : notreg_cost (X, MODE, OUTER, OPNO))
459 /* Get the number of times this register has been updated in this
460 basic block. */
462 #define REG_TICK(N) (get_cse_reg_info (N)->reg_tick)
464 /* Get the point at which REG was recorded in the table. */
466 #define REG_IN_TABLE(N) (get_cse_reg_info (N)->reg_in_table)
468 /* Get the SUBREG set at the last increment to REG_TICK (-1 if not a
469 SUBREG). */
471 #define SUBREG_TICKED(N) (get_cse_reg_info (N)->subreg_ticked)
473 /* Get the quantity number for REG. */
475 #define REG_QTY(N) (get_cse_reg_info (N)->reg_qty)
477 /* Determine if the quantity number for register X represents a valid index
478 into the qty_table. */
480 #define REGNO_QTY_VALID_P(N) (REG_QTY (N) >= 0)
482 /* Compare table_elt X and Y and return true iff X is cheaper than Y. */
484 #define CHEAPER(X, Y) \
485 (preferable ((X)->cost, (X)->regcost, (Y)->cost, (Y)->regcost) < 0)
487 static struct table_elt *table[HASH_SIZE];
489 /* Chain of `struct table_elt's made so far for this function
490 but currently removed from the table. */
492 static struct table_elt *free_element_chain;
494 /* Set to the cost of a constant pool reference if one was found for a
495 symbolic constant. If this was found, it means we should try to
496 convert constants into constant pool entries if they don't fit in
497 the insn. */
499 static int constant_pool_entries_cost;
500 static int constant_pool_entries_regcost;
502 /* Trace a patch through the CFG. */
504 struct branch_path
506 /* The basic block for this path entry. */
507 basic_block bb;
510 /* This data describes a block that will be processed by
511 cse_extended_basic_block. */
513 struct cse_basic_block_data
515 /* Total number of SETs in block. */
516 int nsets;
517 /* Size of current branch path, if any. */
518 int path_size;
519 /* Current path, indicating which basic_blocks will be processed. */
520 struct branch_path *path;
524 /* Pointers to the live in/live out bitmaps for the boundaries of the
525 current EBB. */
526 static bitmap cse_ebb_live_in, cse_ebb_live_out;
528 /* A simple bitmap to track which basic blocks have been visited
529 already as part of an already processed extended basic block. */
530 static sbitmap cse_visited_basic_blocks;
532 static bool fixed_base_plus_p (rtx x);
533 static int notreg_cost (rtx, machine_mode, enum rtx_code, int);
534 static int preferable (int, int, int, int);
535 static void new_basic_block (void);
536 static void make_new_qty (unsigned int, machine_mode);
537 static void make_regs_eqv (unsigned int, unsigned int);
538 static void delete_reg_equiv (unsigned int);
539 static int mention_regs (rtx);
540 static int insert_regs (rtx, struct table_elt *, int);
541 static void remove_from_table (struct table_elt *, unsigned);
542 static void remove_pseudo_from_table (rtx, unsigned);
543 static struct table_elt *lookup (rtx, unsigned, machine_mode);
544 static struct table_elt *lookup_for_remove (rtx, unsigned, machine_mode);
545 static rtx lookup_as_function (rtx, enum rtx_code);
546 static struct table_elt *insert_with_costs (rtx, struct table_elt *, unsigned,
547 machine_mode, int, int);
548 static struct table_elt *insert (rtx, struct table_elt *, unsigned,
549 machine_mode);
550 static void merge_equiv_classes (struct table_elt *, struct table_elt *);
551 static void invalidate (rtx, machine_mode);
552 static void remove_invalid_refs (unsigned int);
553 static void remove_invalid_subreg_refs (unsigned int, poly_uint64,
554 machine_mode);
555 static void rehash_using_reg (rtx);
556 static void invalidate_memory (void);
557 static rtx use_related_value (rtx, struct table_elt *);
559 static inline unsigned canon_hash (rtx, machine_mode);
560 static inline unsigned safe_hash (rtx, machine_mode);
561 static inline unsigned hash_rtx_string (const char *);
563 static rtx canon_reg (rtx, rtx_insn *);
564 static enum rtx_code find_comparison_args (enum rtx_code, rtx *, rtx *,
565 machine_mode *,
566 machine_mode *);
567 static rtx fold_rtx (rtx, rtx_insn *);
568 static rtx equiv_constant (rtx);
569 static void record_jump_equiv (rtx_insn *, bool);
570 static void record_jump_cond (enum rtx_code, machine_mode, rtx, rtx,
571 int);
572 static void cse_insn (rtx_insn *);
573 static void cse_prescan_path (struct cse_basic_block_data *);
574 static void invalidate_from_clobbers (rtx_insn *);
575 static void invalidate_from_sets_and_clobbers (rtx_insn *);
576 static void cse_extended_basic_block (struct cse_basic_block_data *);
577 extern void dump_class (struct table_elt*);
578 static void get_cse_reg_info_1 (unsigned int regno);
579 static struct cse_reg_info * get_cse_reg_info (unsigned int regno);
581 static void flush_hash_table (void);
582 static bool insn_live_p (rtx_insn *, int *);
583 static bool set_live_p (rtx, int *);
584 static void cse_change_cc_mode_insn (rtx_insn *, rtx);
585 static void cse_change_cc_mode_insns (rtx_insn *, rtx_insn *, rtx);
586 static machine_mode cse_cc_succs (basic_block, basic_block, rtx, rtx,
587 bool);
590 #undef RTL_HOOKS_GEN_LOWPART
591 #define RTL_HOOKS_GEN_LOWPART gen_lowpart_if_possible
593 static const struct rtl_hooks cse_rtl_hooks = RTL_HOOKS_INITIALIZER;
595 /* Nonzero if X has the form (PLUS frame-pointer integer). */
597 static bool
598 fixed_base_plus_p (rtx x)
600 switch (GET_CODE (x))
602 case REG:
603 if (x == frame_pointer_rtx || x == hard_frame_pointer_rtx)
604 return true;
605 if (x == arg_pointer_rtx && fixed_regs[ARG_POINTER_REGNUM])
606 return true;
607 return false;
609 case PLUS:
610 if (!CONST_INT_P (XEXP (x, 1)))
611 return false;
612 return fixed_base_plus_p (XEXP (x, 0));
614 default:
615 return false;
619 /* Dump the expressions in the equivalence class indicated by CLASSP.
620 This function is used only for debugging. */
621 DEBUG_FUNCTION void
622 dump_class (struct table_elt *classp)
624 struct table_elt *elt;
626 fprintf (stderr, "Equivalence chain for ");
627 print_rtl (stderr, classp->exp);
628 fprintf (stderr, ": \n");
630 for (elt = classp->first_same_value; elt; elt = elt->next_same_value)
632 print_rtl (stderr, elt->exp);
633 fprintf (stderr, "\n");
637 /* Return an estimate of the cost of the registers used in an rtx.
638 This is mostly the number of different REG expressions in the rtx;
639 however for some exceptions like fixed registers we use a cost of
640 0. If any other hard register reference occurs, return MAX_COST. */
642 static int
643 approx_reg_cost (const_rtx x)
645 int cost = 0;
646 subrtx_iterator::array_type array;
647 FOR_EACH_SUBRTX (iter, array, x, NONCONST)
649 const_rtx x = *iter;
650 if (REG_P (x))
652 unsigned int regno = REGNO (x);
653 if (!CHEAP_REGNO (regno))
655 if (regno < FIRST_PSEUDO_REGISTER)
657 if (targetm.small_register_classes_for_mode_p (GET_MODE (x)))
658 return MAX_COST;
659 cost += 2;
661 else
662 cost += 1;
666 return cost;
669 /* Return a negative value if an rtx A, whose costs are given by COST_A
670 and REGCOST_A, is more desirable than an rtx B.
671 Return a positive value if A is less desirable, or 0 if the two are
672 equally good. */
673 static int
674 preferable (int cost_a, int regcost_a, int cost_b, int regcost_b)
676 /* First, get rid of cases involving expressions that are entirely
677 unwanted. */
678 if (cost_a != cost_b)
680 if (cost_a == MAX_COST)
681 return 1;
682 if (cost_b == MAX_COST)
683 return -1;
686 /* Avoid extending lifetimes of hardregs. */
687 if (regcost_a != regcost_b)
689 if (regcost_a == MAX_COST)
690 return 1;
691 if (regcost_b == MAX_COST)
692 return -1;
695 /* Normal operation costs take precedence. */
696 if (cost_a != cost_b)
697 return cost_a - cost_b;
698 /* Only if these are identical consider effects on register pressure. */
699 if (regcost_a != regcost_b)
700 return regcost_a - regcost_b;
701 return 0;
704 /* Internal function, to compute cost when X is not a register; called
705 from COST macro to keep it simple. */
707 static int
708 notreg_cost (rtx x, machine_mode mode, enum rtx_code outer, int opno)
710 scalar_int_mode int_mode, inner_mode;
711 return ((GET_CODE (x) == SUBREG
712 && REG_P (SUBREG_REG (x))
713 && is_int_mode (mode, &int_mode)
714 && is_int_mode (GET_MODE (SUBREG_REG (x)), &inner_mode)
715 && GET_MODE_SIZE (int_mode) < GET_MODE_SIZE (inner_mode)
716 && subreg_lowpart_p (x)
717 && TRULY_NOOP_TRUNCATION_MODES_P (int_mode, inner_mode))
719 : rtx_cost (x, mode, outer, opno, optimize_this_for_speed_p) * 2);
723 /* Initialize CSE_REG_INFO_TABLE. */
725 static void
726 init_cse_reg_info (unsigned int nregs)
728 /* Do we need to grow the table? */
729 if (nregs > cse_reg_info_table_size)
731 unsigned int new_size;
733 if (cse_reg_info_table_size < 2048)
735 /* Compute a new size that is a power of 2 and no smaller
736 than the large of NREGS and 64. */
737 new_size = (cse_reg_info_table_size
738 ? cse_reg_info_table_size : 64);
740 while (new_size < nregs)
741 new_size *= 2;
743 else
745 /* If we need a big table, allocate just enough to hold
746 NREGS registers. */
747 new_size = nregs;
750 /* Reallocate the table with NEW_SIZE entries. */
751 free (cse_reg_info_table);
752 cse_reg_info_table = XNEWVEC (struct cse_reg_info, new_size);
753 cse_reg_info_table_size = new_size;
754 cse_reg_info_table_first_uninitialized = 0;
757 /* Do we have all of the first NREGS entries initialized? */
758 if (cse_reg_info_table_first_uninitialized < nregs)
760 unsigned int old_timestamp = cse_reg_info_timestamp - 1;
761 unsigned int i;
763 /* Put the old timestamp on newly allocated entries so that they
764 will all be considered out of date. We do not touch those
765 entries beyond the first NREGS entries to be nice to the
766 virtual memory. */
767 for (i = cse_reg_info_table_first_uninitialized; i < nregs; i++)
768 cse_reg_info_table[i].timestamp = old_timestamp;
770 cse_reg_info_table_first_uninitialized = nregs;
774 /* Given REGNO, initialize the cse_reg_info entry for REGNO. */
776 static void
777 get_cse_reg_info_1 (unsigned int regno)
779 /* Set TIMESTAMP field to CSE_REG_INFO_TIMESTAMP so that this
780 entry will be considered to have been initialized. */
781 cse_reg_info_table[regno].timestamp = cse_reg_info_timestamp;
783 /* Initialize the rest of the entry. */
784 cse_reg_info_table[regno].reg_tick = 1;
785 cse_reg_info_table[regno].reg_in_table = -1;
786 cse_reg_info_table[regno].subreg_ticked = -1;
787 cse_reg_info_table[regno].reg_qty = -regno - 1;
790 /* Find a cse_reg_info entry for REGNO. */
792 static inline struct cse_reg_info *
793 get_cse_reg_info (unsigned int regno)
795 struct cse_reg_info *p = &cse_reg_info_table[regno];
797 /* If this entry has not been initialized, go ahead and initialize
798 it. */
799 if (p->timestamp != cse_reg_info_timestamp)
800 get_cse_reg_info_1 (regno);
802 return p;
805 /* Clear the hash table and initialize each register with its own quantity,
806 for a new basic block. */
808 static void
809 new_basic_block (void)
811 int i;
813 next_qty = 0;
815 /* Invalidate cse_reg_info_table. */
816 cse_reg_info_timestamp++;
818 /* Clear out hash table state for this pass. */
819 CLEAR_HARD_REG_SET (hard_regs_in_table);
821 /* The per-quantity values used to be initialized here, but it is
822 much faster to initialize each as it is made in `make_new_qty'. */
824 for (i = 0; i < HASH_SIZE; i++)
826 struct table_elt *first;
828 first = table[i];
829 if (first != NULL)
831 struct table_elt *last = first;
833 table[i] = NULL;
835 while (last->next_same_hash != NULL)
836 last = last->next_same_hash;
838 /* Now relink this hash entire chain into
839 the free element list. */
841 last->next_same_hash = free_element_chain;
842 free_element_chain = first;
847 /* Say that register REG contains a quantity in mode MODE not in any
848 register before and initialize that quantity. */
850 static void
851 make_new_qty (unsigned int reg, machine_mode mode)
853 int q;
854 struct qty_table_elem *ent;
855 struct reg_eqv_elem *eqv;
857 gcc_assert (next_qty < max_qty);
859 q = REG_QTY (reg) = next_qty++;
860 ent = &qty_table[q];
861 ent->first_reg = reg;
862 ent->last_reg = reg;
863 ent->mode = mode;
864 ent->const_rtx = ent->const_insn = NULL;
865 ent->comparison_code = UNKNOWN;
867 eqv = &reg_eqv_table[reg];
868 eqv->next = eqv->prev = -1;
871 /* Make reg NEW equivalent to reg OLD.
872 OLD is not changing; NEW is. */
874 static void
875 make_regs_eqv (unsigned int new_reg, unsigned int old_reg)
877 unsigned int lastr, firstr;
878 int q = REG_QTY (old_reg);
879 struct qty_table_elem *ent;
881 ent = &qty_table[q];
883 /* Nothing should become eqv until it has a "non-invalid" qty number. */
884 gcc_assert (REGNO_QTY_VALID_P (old_reg));
886 REG_QTY (new_reg) = q;
887 firstr = ent->first_reg;
888 lastr = ent->last_reg;
890 /* Prefer fixed hard registers to anything. Prefer pseudo regs to other
891 hard regs. Among pseudos, if NEW will live longer than any other reg
892 of the same qty, and that is beyond the current basic block,
893 make it the new canonical replacement for this qty. */
894 if (! (firstr < FIRST_PSEUDO_REGISTER && FIXED_REGNO_P (firstr))
895 /* Certain fixed registers might be of the class NO_REGS. This means
896 that not only can they not be allocated by the compiler, but
897 they cannot be used in substitutions or canonicalizations
898 either. */
899 && (new_reg >= FIRST_PSEUDO_REGISTER || REGNO_REG_CLASS (new_reg) != NO_REGS)
900 && ((new_reg < FIRST_PSEUDO_REGISTER && FIXED_REGNO_P (new_reg))
901 || (new_reg >= FIRST_PSEUDO_REGISTER
902 && (firstr < FIRST_PSEUDO_REGISTER
903 || (bitmap_bit_p (cse_ebb_live_out, new_reg)
904 && !bitmap_bit_p (cse_ebb_live_out, firstr))
905 || (bitmap_bit_p (cse_ebb_live_in, new_reg)
906 && !bitmap_bit_p (cse_ebb_live_in, firstr))))))
908 reg_eqv_table[firstr].prev = new_reg;
909 reg_eqv_table[new_reg].next = firstr;
910 reg_eqv_table[new_reg].prev = -1;
911 ent->first_reg = new_reg;
913 else
915 /* If NEW is a hard reg (known to be non-fixed), insert at end.
916 Otherwise, insert before any non-fixed hard regs that are at the
917 end. Registers of class NO_REGS cannot be used as an
918 equivalent for anything. */
919 while (lastr < FIRST_PSEUDO_REGISTER && reg_eqv_table[lastr].prev >= 0
920 && (REGNO_REG_CLASS (lastr) == NO_REGS || ! FIXED_REGNO_P (lastr))
921 && new_reg >= FIRST_PSEUDO_REGISTER)
922 lastr = reg_eqv_table[lastr].prev;
923 reg_eqv_table[new_reg].next = reg_eqv_table[lastr].next;
924 if (reg_eqv_table[lastr].next >= 0)
925 reg_eqv_table[reg_eqv_table[lastr].next].prev = new_reg;
926 else
927 qty_table[q].last_reg = new_reg;
928 reg_eqv_table[lastr].next = new_reg;
929 reg_eqv_table[new_reg].prev = lastr;
933 /* Remove REG from its equivalence class. */
935 static void
936 delete_reg_equiv (unsigned int reg)
938 struct qty_table_elem *ent;
939 int q = REG_QTY (reg);
940 int p, n;
942 /* If invalid, do nothing. */
943 if (! REGNO_QTY_VALID_P (reg))
944 return;
946 ent = &qty_table[q];
948 p = reg_eqv_table[reg].prev;
949 n = reg_eqv_table[reg].next;
951 if (n != -1)
952 reg_eqv_table[n].prev = p;
953 else
954 ent->last_reg = p;
955 if (p != -1)
956 reg_eqv_table[p].next = n;
957 else
958 ent->first_reg = n;
960 REG_QTY (reg) = -reg - 1;
963 /* Remove any invalid expressions from the hash table
964 that refer to any of the registers contained in expression X.
966 Make sure that newly inserted references to those registers
967 as subexpressions will be considered valid.
969 mention_regs is not called when a register itself
970 is being stored in the table.
972 Return 1 if we have done something that may have changed the hash code
973 of X. */
975 static int
976 mention_regs (rtx x)
978 enum rtx_code code;
979 int i, j;
980 const char *fmt;
981 int changed = 0;
983 if (x == 0)
984 return 0;
986 code = GET_CODE (x);
987 if (code == REG)
989 unsigned int regno = REGNO (x);
990 unsigned int endregno = END_REGNO (x);
991 unsigned int i;
993 for (i = regno; i < endregno; i++)
995 if (REG_IN_TABLE (i) >= 0 && REG_IN_TABLE (i) != REG_TICK (i))
996 remove_invalid_refs (i);
998 REG_IN_TABLE (i) = REG_TICK (i);
999 SUBREG_TICKED (i) = -1;
1002 return 0;
1005 /* If this is a SUBREG, we don't want to discard other SUBREGs of the same
1006 pseudo if they don't use overlapping words. We handle only pseudos
1007 here for simplicity. */
1008 if (code == SUBREG && REG_P (SUBREG_REG (x))
1009 && REGNO (SUBREG_REG (x)) >= FIRST_PSEUDO_REGISTER)
1011 unsigned int i = REGNO (SUBREG_REG (x));
1013 if (REG_IN_TABLE (i) >= 0 && REG_IN_TABLE (i) != REG_TICK (i))
1015 /* If REG_IN_TABLE (i) differs from REG_TICK (i) by one, and
1016 the last store to this register really stored into this
1017 subreg, then remove the memory of this subreg.
1018 Otherwise, remove any memory of the entire register and
1019 all its subregs from the table. */
1020 if (REG_TICK (i) - REG_IN_TABLE (i) > 1
1021 || SUBREG_TICKED (i) != REGNO (SUBREG_REG (x)))
1022 remove_invalid_refs (i);
1023 else
1024 remove_invalid_subreg_refs (i, SUBREG_BYTE (x), GET_MODE (x));
1027 REG_IN_TABLE (i) = REG_TICK (i);
1028 SUBREG_TICKED (i) = REGNO (SUBREG_REG (x));
1029 return 0;
1032 /* If X is a comparison or a COMPARE and either operand is a register
1033 that does not have a quantity, give it one. This is so that a later
1034 call to record_jump_equiv won't cause X to be assigned a different
1035 hash code and not found in the table after that call.
1037 It is not necessary to do this here, since rehash_using_reg can
1038 fix up the table later, but doing this here eliminates the need to
1039 call that expensive function in the most common case where the only
1040 use of the register is in the comparison. */
1042 if (code == COMPARE || COMPARISON_P (x))
1044 if (REG_P (XEXP (x, 0))
1045 && ! REGNO_QTY_VALID_P (REGNO (XEXP (x, 0))))
1046 if (insert_regs (XEXP (x, 0), NULL, 0))
1048 rehash_using_reg (XEXP (x, 0));
1049 changed = 1;
1052 if (REG_P (XEXP (x, 1))
1053 && ! REGNO_QTY_VALID_P (REGNO (XEXP (x, 1))))
1054 if (insert_regs (XEXP (x, 1), NULL, 0))
1056 rehash_using_reg (XEXP (x, 1));
1057 changed = 1;
1061 fmt = GET_RTX_FORMAT (code);
1062 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1063 if (fmt[i] == 'e')
1064 changed |= mention_regs (XEXP (x, i));
1065 else if (fmt[i] == 'E')
1066 for (j = 0; j < XVECLEN (x, i); j++)
1067 changed |= mention_regs (XVECEXP (x, i, j));
1069 return changed;
1072 /* Update the register quantities for inserting X into the hash table
1073 with a value equivalent to CLASSP.
1074 (If the class does not contain a REG, it is irrelevant.)
1075 If MODIFIED is nonzero, X is a destination; it is being modified.
1076 Note that delete_reg_equiv should be called on a register
1077 before insert_regs is done on that register with MODIFIED != 0.
1079 Nonzero value means that elements of reg_qty have changed
1080 so X's hash code may be different. */
1082 static int
1083 insert_regs (rtx x, struct table_elt *classp, int modified)
1085 if (REG_P (x))
1087 unsigned int regno = REGNO (x);
1088 int qty_valid;
1090 /* If REGNO is in the equivalence table already but is of the
1091 wrong mode for that equivalence, don't do anything here. */
1093 qty_valid = REGNO_QTY_VALID_P (regno);
1094 if (qty_valid)
1096 struct qty_table_elem *ent = &qty_table[REG_QTY (regno)];
1098 if (ent->mode != GET_MODE (x))
1099 return 0;
1102 if (modified || ! qty_valid)
1104 if (classp)
1105 for (classp = classp->first_same_value;
1106 classp != 0;
1107 classp = classp->next_same_value)
1108 if (REG_P (classp->exp)
1109 && GET_MODE (classp->exp) == GET_MODE (x))
1111 unsigned c_regno = REGNO (classp->exp);
1113 gcc_assert (REGNO_QTY_VALID_P (c_regno));
1115 /* Suppose that 5 is hard reg and 100 and 101 are
1116 pseudos. Consider
1118 (set (reg:si 100) (reg:si 5))
1119 (set (reg:si 5) (reg:si 100))
1120 (set (reg:di 101) (reg:di 5))
1122 We would now set REG_QTY (101) = REG_QTY (5), but the
1123 entry for 5 is in SImode. When we use this later in
1124 copy propagation, we get the register in wrong mode. */
1125 if (qty_table[REG_QTY (c_regno)].mode != GET_MODE (x))
1126 continue;
1128 make_regs_eqv (regno, c_regno);
1129 return 1;
1132 /* Mention_regs for a SUBREG checks if REG_TICK is exactly one larger
1133 than REG_IN_TABLE to find out if there was only a single preceding
1134 invalidation - for the SUBREG - or another one, which would be
1135 for the full register. However, if we find here that REG_TICK
1136 indicates that the register is invalid, it means that it has
1137 been invalidated in a separate operation. The SUBREG might be used
1138 now (then this is a recursive call), or we might use the full REG
1139 now and a SUBREG of it later. So bump up REG_TICK so that
1140 mention_regs will do the right thing. */
1141 if (! modified
1142 && REG_IN_TABLE (regno) >= 0
1143 && REG_TICK (regno) == REG_IN_TABLE (regno) + 1)
1144 REG_TICK (regno)++;
1145 make_new_qty (regno, GET_MODE (x));
1146 return 1;
1149 return 0;
1152 /* If X is a SUBREG, we will likely be inserting the inner register in the
1153 table. If that register doesn't have an assigned quantity number at
1154 this point but does later, the insertion that we will be doing now will
1155 not be accessible because its hash code will have changed. So assign
1156 a quantity number now. */
1158 else if (GET_CODE (x) == SUBREG && REG_P (SUBREG_REG (x))
1159 && ! REGNO_QTY_VALID_P (REGNO (SUBREG_REG (x))))
1161 insert_regs (SUBREG_REG (x), NULL, 0);
1162 mention_regs (x);
1163 return 1;
1165 else
1166 return mention_regs (x);
1170 /* Compute upper and lower anchors for CST. Also compute the offset of CST
1171 from these anchors/bases such that *_BASE + *_OFFS = CST. Return false iff
1172 CST is equal to an anchor. */
1174 static bool
1175 compute_const_anchors (rtx cst,
1176 HOST_WIDE_INT *lower_base, HOST_WIDE_INT *lower_offs,
1177 HOST_WIDE_INT *upper_base, HOST_WIDE_INT *upper_offs)
1179 HOST_WIDE_INT n = INTVAL (cst);
1181 *lower_base = n & ~(targetm.const_anchor - 1);
1182 if (*lower_base == n)
1183 return false;
1185 *upper_base =
1186 (n + (targetm.const_anchor - 1)) & ~(targetm.const_anchor - 1);
1187 *upper_offs = n - *upper_base;
1188 *lower_offs = n - *lower_base;
1189 return true;
1192 /* Insert the equivalence between ANCHOR and (REG + OFF) in mode MODE. */
1194 static void
1195 insert_const_anchor (HOST_WIDE_INT anchor, rtx reg, HOST_WIDE_INT offs,
1196 machine_mode mode)
1198 struct table_elt *elt;
1199 unsigned hash;
1200 rtx anchor_exp;
1201 rtx exp;
1203 anchor_exp = GEN_INT (anchor);
1204 hash = HASH (anchor_exp, mode);
1205 elt = lookup (anchor_exp, hash, mode);
1206 if (!elt)
1207 elt = insert (anchor_exp, NULL, hash, mode);
1209 exp = plus_constant (mode, reg, offs);
1210 /* REG has just been inserted and the hash codes recomputed. */
1211 mention_regs (exp);
1212 hash = HASH (exp, mode);
1214 /* Use the cost of the register rather than the whole expression. When
1215 looking up constant anchors we will further offset the corresponding
1216 expression therefore it does not make sense to prefer REGs over
1217 reg-immediate additions. Prefer instead the oldest expression. Also
1218 don't prefer pseudos over hard regs so that we derive constants in
1219 argument registers from other argument registers rather than from the
1220 original pseudo that was used to synthesize the constant. */
1221 insert_with_costs (exp, elt, hash, mode, COST (reg, mode), 1);
1224 /* The constant CST is equivalent to the register REG. Create
1225 equivalences between the two anchors of CST and the corresponding
1226 register-offset expressions using REG. */
1228 static void
1229 insert_const_anchors (rtx reg, rtx cst, machine_mode mode)
1231 HOST_WIDE_INT lower_base, lower_offs, upper_base, upper_offs;
1233 if (!compute_const_anchors (cst, &lower_base, &lower_offs,
1234 &upper_base, &upper_offs))
1235 return;
1237 /* Ignore anchors of value 0. Constants accessible from zero are
1238 simple. */
1239 if (lower_base != 0)
1240 insert_const_anchor (lower_base, reg, -lower_offs, mode);
1242 if (upper_base != 0)
1243 insert_const_anchor (upper_base, reg, -upper_offs, mode);
1246 /* We need to express ANCHOR_ELT->exp + OFFS. Walk the equivalence list of
1247 ANCHOR_ELT and see if offsetting any of the entries by OFFS would create a
1248 valid expression. Return the cheapest and oldest of such expressions. In
1249 *OLD, return how old the resulting expression is compared to the other
1250 equivalent expressions. */
1252 static rtx
1253 find_reg_offset_for_const (struct table_elt *anchor_elt, HOST_WIDE_INT offs,
1254 unsigned *old)
1256 struct table_elt *elt;
1257 unsigned idx;
1258 struct table_elt *match_elt;
1259 rtx match;
1261 /* Find the cheapest and *oldest* expression to maximize the chance of
1262 reusing the same pseudo. */
1264 match_elt = NULL;
1265 match = NULL_RTX;
1266 for (elt = anchor_elt->first_same_value, idx = 0;
1267 elt;
1268 elt = elt->next_same_value, idx++)
1270 if (match_elt && CHEAPER (match_elt, elt))
1271 return match;
1273 if (REG_P (elt->exp)
1274 || (GET_CODE (elt->exp) == PLUS
1275 && REG_P (XEXP (elt->exp, 0))
1276 && GET_CODE (XEXP (elt->exp, 1)) == CONST_INT))
1278 rtx x;
1280 /* Ignore expressions that are no longer valid. */
1281 if (!REG_P (elt->exp) && !exp_equiv_p (elt->exp, elt->exp, 1, false))
1282 continue;
1284 x = plus_constant (GET_MODE (elt->exp), elt->exp, offs);
1285 if (REG_P (x)
1286 || (GET_CODE (x) == PLUS
1287 && IN_RANGE (INTVAL (XEXP (x, 1)),
1288 -targetm.const_anchor,
1289 targetm.const_anchor - 1)))
1291 match = x;
1292 match_elt = elt;
1293 *old = idx;
1298 return match;
1301 /* Try to express the constant SRC_CONST using a register+offset expression
1302 derived from a constant anchor. Return it if successful or NULL_RTX,
1303 otherwise. */
1305 static rtx
1306 try_const_anchors (rtx src_const, machine_mode mode)
1308 struct table_elt *lower_elt, *upper_elt;
1309 HOST_WIDE_INT lower_base, lower_offs, upper_base, upper_offs;
1310 rtx lower_anchor_rtx, upper_anchor_rtx;
1311 rtx lower_exp = NULL_RTX, upper_exp = NULL_RTX;
1312 unsigned lower_old, upper_old;
1314 /* CONST_INT is used for CC modes, but we should leave those alone. */
1315 if (GET_MODE_CLASS (mode) == MODE_CC)
1316 return NULL_RTX;
1318 gcc_assert (SCALAR_INT_MODE_P (mode));
1319 if (!compute_const_anchors (src_const, &lower_base, &lower_offs,
1320 &upper_base, &upper_offs))
1321 return NULL_RTX;
1323 lower_anchor_rtx = GEN_INT (lower_base);
1324 upper_anchor_rtx = GEN_INT (upper_base);
1325 lower_elt = lookup (lower_anchor_rtx, HASH (lower_anchor_rtx, mode), mode);
1326 upper_elt = lookup (upper_anchor_rtx, HASH (upper_anchor_rtx, mode), mode);
1328 if (lower_elt)
1329 lower_exp = find_reg_offset_for_const (lower_elt, lower_offs, &lower_old);
1330 if (upper_elt)
1331 upper_exp = find_reg_offset_for_const (upper_elt, upper_offs, &upper_old);
1333 if (!lower_exp)
1334 return upper_exp;
1335 if (!upper_exp)
1336 return lower_exp;
1338 /* Return the older expression. */
1339 return (upper_old > lower_old ? upper_exp : lower_exp);
1342 /* Look in or update the hash table. */
1344 /* Remove table element ELT from use in the table.
1345 HASH is its hash code, made using the HASH macro.
1346 It's an argument because often that is known in advance
1347 and we save much time not recomputing it. */
1349 static void
1350 remove_from_table (struct table_elt *elt, unsigned int hash)
1352 if (elt == 0)
1353 return;
1355 /* Mark this element as removed. See cse_insn. */
1356 elt->first_same_value = 0;
1358 /* Remove the table element from its equivalence class. */
1361 struct table_elt *prev = elt->prev_same_value;
1362 struct table_elt *next = elt->next_same_value;
1364 if (next)
1365 next->prev_same_value = prev;
1367 if (prev)
1368 prev->next_same_value = next;
1369 else
1371 struct table_elt *newfirst = next;
1372 while (next)
1374 next->first_same_value = newfirst;
1375 next = next->next_same_value;
1380 /* Remove the table element from its hash bucket. */
1383 struct table_elt *prev = elt->prev_same_hash;
1384 struct table_elt *next = elt->next_same_hash;
1386 if (next)
1387 next->prev_same_hash = prev;
1389 if (prev)
1390 prev->next_same_hash = next;
1391 else if (table[hash] == elt)
1392 table[hash] = next;
1393 else
1395 /* This entry is not in the proper hash bucket. This can happen
1396 when two classes were merged by `merge_equiv_classes'. Search
1397 for the hash bucket that it heads. This happens only very
1398 rarely, so the cost is acceptable. */
1399 for (hash = 0; hash < HASH_SIZE; hash++)
1400 if (table[hash] == elt)
1401 table[hash] = next;
1405 /* Remove the table element from its related-value circular chain. */
1407 if (elt->related_value != 0 && elt->related_value != elt)
1409 struct table_elt *p = elt->related_value;
1411 while (p->related_value != elt)
1412 p = p->related_value;
1413 p->related_value = elt->related_value;
1414 if (p->related_value == p)
1415 p->related_value = 0;
1418 /* Now add it to the free element chain. */
1419 elt->next_same_hash = free_element_chain;
1420 free_element_chain = elt;
1423 /* Same as above, but X is a pseudo-register. */
1425 static void
1426 remove_pseudo_from_table (rtx x, unsigned int hash)
1428 struct table_elt *elt;
1430 /* Because a pseudo-register can be referenced in more than one
1431 mode, we might have to remove more than one table entry. */
1432 while ((elt = lookup_for_remove (x, hash, VOIDmode)))
1433 remove_from_table (elt, hash);
1436 /* Look up X in the hash table and return its table element,
1437 or 0 if X is not in the table.
1439 MODE is the machine-mode of X, or if X is an integer constant
1440 with VOIDmode then MODE is the mode with which X will be used.
1442 Here we are satisfied to find an expression whose tree structure
1443 looks like X. */
1445 static struct table_elt *
1446 lookup (rtx x, unsigned int hash, machine_mode mode)
1448 struct table_elt *p;
1450 for (p = table[hash]; p; p = p->next_same_hash)
1451 if (mode == p->mode && ((x == p->exp && REG_P (x))
1452 || exp_equiv_p (x, p->exp, !REG_P (x), false)))
1453 return p;
1455 return 0;
1458 /* Like `lookup' but don't care whether the table element uses invalid regs.
1459 Also ignore discrepancies in the machine mode of a register. */
1461 static struct table_elt *
1462 lookup_for_remove (rtx x, unsigned int hash, machine_mode mode)
1464 struct table_elt *p;
1466 if (REG_P (x))
1468 unsigned int regno = REGNO (x);
1470 /* Don't check the machine mode when comparing registers;
1471 invalidating (REG:SI 0) also invalidates (REG:DF 0). */
1472 for (p = table[hash]; p; p = p->next_same_hash)
1473 if (REG_P (p->exp)
1474 && REGNO (p->exp) == regno)
1475 return p;
1477 else
1479 for (p = table[hash]; p; p = p->next_same_hash)
1480 if (mode == p->mode
1481 && (x == p->exp || exp_equiv_p (x, p->exp, 0, false)))
1482 return p;
1485 return 0;
1488 /* Look for an expression equivalent to X and with code CODE.
1489 If one is found, return that expression. */
1491 static rtx
1492 lookup_as_function (rtx x, enum rtx_code code)
1494 struct table_elt *p
1495 = lookup (x, SAFE_HASH (x, VOIDmode), GET_MODE (x));
1497 if (p == 0)
1498 return 0;
1500 for (p = p->first_same_value; p; p = p->next_same_value)
1501 if (GET_CODE (p->exp) == code
1502 /* Make sure this is a valid entry in the table. */
1503 && exp_equiv_p (p->exp, p->exp, 1, false))
1504 return p->exp;
1506 return 0;
1509 /* Insert X in the hash table, assuming HASH is its hash code and
1510 CLASSP is an element of the class it should go in (or 0 if a new
1511 class should be made). COST is the code of X and reg_cost is the
1512 cost of registers in X. It is inserted at the proper position to
1513 keep the class in the order cheapest first.
1515 MODE is the machine-mode of X, or if X is an integer constant
1516 with VOIDmode then MODE is the mode with which X will be used.
1518 For elements of equal cheapness, the most recent one
1519 goes in front, except that the first element in the list
1520 remains first unless a cheaper element is added. The order of
1521 pseudo-registers does not matter, as canon_reg will be called to
1522 find the cheapest when a register is retrieved from the table.
1524 The in_memory field in the hash table element is set to 0.
1525 The caller must set it nonzero if appropriate.
1527 You should call insert_regs (X, CLASSP, MODIFY) before calling here,
1528 and if insert_regs returns a nonzero value
1529 you must then recompute its hash code before calling here.
1531 If necessary, update table showing constant values of quantities. */
1533 static struct table_elt *
1534 insert_with_costs (rtx x, struct table_elt *classp, unsigned int hash,
1535 machine_mode mode, int cost, int reg_cost)
1537 struct table_elt *elt;
1539 /* If X is a register and we haven't made a quantity for it,
1540 something is wrong. */
1541 gcc_assert (!REG_P (x) || REGNO_QTY_VALID_P (REGNO (x)));
1543 /* If X is a hard register, show it is being put in the table. */
1544 if (REG_P (x) && REGNO (x) < FIRST_PSEUDO_REGISTER)
1545 add_to_hard_reg_set (&hard_regs_in_table, GET_MODE (x), REGNO (x));
1547 /* Put an element for X into the right hash bucket. */
1549 elt = free_element_chain;
1550 if (elt)
1551 free_element_chain = elt->next_same_hash;
1552 else
1553 elt = XNEW (struct table_elt);
1555 elt->exp = x;
1556 elt->canon_exp = NULL_RTX;
1557 elt->cost = cost;
1558 elt->regcost = reg_cost;
1559 elt->next_same_value = 0;
1560 elt->prev_same_value = 0;
1561 elt->next_same_hash = table[hash];
1562 elt->prev_same_hash = 0;
1563 elt->related_value = 0;
1564 elt->in_memory = 0;
1565 elt->mode = mode;
1566 elt->is_const = (CONSTANT_P (x) || fixed_base_plus_p (x));
1568 if (table[hash])
1569 table[hash]->prev_same_hash = elt;
1570 table[hash] = elt;
1572 /* Put it into the proper value-class. */
1573 if (classp)
1575 classp = classp->first_same_value;
1576 if (CHEAPER (elt, classp))
1577 /* Insert at the head of the class. */
1579 struct table_elt *p;
1580 elt->next_same_value = classp;
1581 classp->prev_same_value = elt;
1582 elt->first_same_value = elt;
1584 for (p = classp; p; p = p->next_same_value)
1585 p->first_same_value = elt;
1587 else
1589 /* Insert not at head of the class. */
1590 /* Put it after the last element cheaper than X. */
1591 struct table_elt *p, *next;
1593 for (p = classp;
1594 (next = p->next_same_value) && CHEAPER (next, elt);
1595 p = next)
1598 /* Put it after P and before NEXT. */
1599 elt->next_same_value = next;
1600 if (next)
1601 next->prev_same_value = elt;
1603 elt->prev_same_value = p;
1604 p->next_same_value = elt;
1605 elt->first_same_value = classp;
1608 else
1609 elt->first_same_value = elt;
1611 /* If this is a constant being set equivalent to a register or a register
1612 being set equivalent to a constant, note the constant equivalence.
1614 If this is a constant, it cannot be equivalent to a different constant,
1615 and a constant is the only thing that can be cheaper than a register. So
1616 we know the register is the head of the class (before the constant was
1617 inserted).
1619 If this is a register that is not already known equivalent to a
1620 constant, we must check the entire class.
1622 If this is a register that is already known equivalent to an insn,
1623 update the qtys `const_insn' to show that `this_insn' is the latest
1624 insn making that quantity equivalent to the constant. */
1626 if (elt->is_const && classp && REG_P (classp->exp)
1627 && !REG_P (x))
1629 int exp_q = REG_QTY (REGNO (classp->exp));
1630 struct qty_table_elem *exp_ent = &qty_table[exp_q];
1632 exp_ent->const_rtx = gen_lowpart (exp_ent->mode, x);
1633 exp_ent->const_insn = this_insn;
1636 else if (REG_P (x)
1637 && classp
1638 && ! qty_table[REG_QTY (REGNO (x))].const_rtx
1639 && ! elt->is_const)
1641 struct table_elt *p;
1643 for (p = classp; p != 0; p = p->next_same_value)
1645 if (p->is_const && !REG_P (p->exp))
1647 int x_q = REG_QTY (REGNO (x));
1648 struct qty_table_elem *x_ent = &qty_table[x_q];
1650 x_ent->const_rtx
1651 = gen_lowpart (GET_MODE (x), p->exp);
1652 x_ent->const_insn = this_insn;
1653 break;
1658 else if (REG_P (x)
1659 && qty_table[REG_QTY (REGNO (x))].const_rtx
1660 && GET_MODE (x) == qty_table[REG_QTY (REGNO (x))].mode)
1661 qty_table[REG_QTY (REGNO (x))].const_insn = this_insn;
1663 /* If this is a constant with symbolic value,
1664 and it has a term with an explicit integer value,
1665 link it up with related expressions. */
1666 if (GET_CODE (x) == CONST)
1668 rtx subexp = get_related_value (x);
1669 unsigned subhash;
1670 struct table_elt *subelt, *subelt_prev;
1672 if (subexp != 0)
1674 /* Get the integer-free subexpression in the hash table. */
1675 subhash = SAFE_HASH (subexp, mode);
1676 subelt = lookup (subexp, subhash, mode);
1677 if (subelt == 0)
1678 subelt = insert (subexp, NULL, subhash, mode);
1679 /* Initialize SUBELT's circular chain if it has none. */
1680 if (subelt->related_value == 0)
1681 subelt->related_value = subelt;
1682 /* Find the element in the circular chain that precedes SUBELT. */
1683 subelt_prev = subelt;
1684 while (subelt_prev->related_value != subelt)
1685 subelt_prev = subelt_prev->related_value;
1686 /* Put new ELT into SUBELT's circular chain just before SUBELT.
1687 This way the element that follows SUBELT is the oldest one. */
1688 elt->related_value = subelt_prev->related_value;
1689 subelt_prev->related_value = elt;
1693 return elt;
1696 /* Wrap insert_with_costs by passing the default costs. */
1698 static struct table_elt *
1699 insert (rtx x, struct table_elt *classp, unsigned int hash,
1700 machine_mode mode)
1702 return insert_with_costs (x, classp, hash, mode,
1703 COST (x, mode), approx_reg_cost (x));
1707 /* Given two equivalence classes, CLASS1 and CLASS2, put all the entries from
1708 CLASS2 into CLASS1. This is done when we have reached an insn which makes
1709 the two classes equivalent.
1711 CLASS1 will be the surviving class; CLASS2 should not be used after this
1712 call.
1714 Any invalid entries in CLASS2 will not be copied. */
1716 static void
1717 merge_equiv_classes (struct table_elt *class1, struct table_elt *class2)
1719 struct table_elt *elt, *next, *new_elt;
1721 /* Ensure we start with the head of the classes. */
1722 class1 = class1->first_same_value;
1723 class2 = class2->first_same_value;
1725 /* If they were already equal, forget it. */
1726 if (class1 == class2)
1727 return;
1729 for (elt = class2; elt; elt = next)
1731 unsigned int hash;
1732 rtx exp = elt->exp;
1733 machine_mode mode = elt->mode;
1735 next = elt->next_same_value;
1737 /* Remove old entry, make a new one in CLASS1's class.
1738 Don't do this for invalid entries as we cannot find their
1739 hash code (it also isn't necessary). */
1740 if (REG_P (exp) || exp_equiv_p (exp, exp, 1, false))
1742 bool need_rehash = false;
1744 hash_arg_in_memory = 0;
1745 hash = HASH (exp, mode);
1747 if (REG_P (exp))
1749 need_rehash = REGNO_QTY_VALID_P (REGNO (exp));
1750 delete_reg_equiv (REGNO (exp));
1753 if (REG_P (exp) && REGNO (exp) >= FIRST_PSEUDO_REGISTER)
1754 remove_pseudo_from_table (exp, hash);
1755 else
1756 remove_from_table (elt, hash);
1758 if (insert_regs (exp, class1, 0) || need_rehash)
1760 rehash_using_reg (exp);
1761 hash = HASH (exp, mode);
1763 new_elt = insert (exp, class1, hash, mode);
1764 new_elt->in_memory = hash_arg_in_memory;
1765 if (GET_CODE (exp) == ASM_OPERANDS && elt->cost == MAX_COST)
1766 new_elt->cost = MAX_COST;
1771 /* Flush the entire hash table. */
1773 static void
1774 flush_hash_table (void)
1776 int i;
1777 struct table_elt *p;
1779 for (i = 0; i < HASH_SIZE; i++)
1780 for (p = table[i]; p; p = table[i])
1782 /* Note that invalidate can remove elements
1783 after P in the current hash chain. */
1784 if (REG_P (p->exp))
1785 invalidate (p->exp, VOIDmode);
1786 else
1787 remove_from_table (p, i);
1791 /* Check whether an anti dependence exists between X and EXP. MODE and
1792 ADDR are as for canon_anti_dependence. */
1794 static bool
1795 check_dependence (const_rtx x, rtx exp, machine_mode mode, rtx addr)
1797 subrtx_iterator::array_type array;
1798 FOR_EACH_SUBRTX (iter, array, x, NONCONST)
1800 const_rtx x = *iter;
1801 if (MEM_P (x) && canon_anti_dependence (x, true, exp, mode, addr))
1802 return true;
1804 return false;
1807 /* Remove from the hash table, or mark as invalid, all expressions whose
1808 values could be altered by storing in register X. */
1810 static void
1811 invalidate_reg (rtx x)
1813 gcc_assert (GET_CODE (x) == REG);
1815 /* If X is a register, dependencies on its contents are recorded
1816 through the qty number mechanism. Just change the qty number of
1817 the register, mark it as invalid for expressions that refer to it,
1818 and remove it itself. */
1819 unsigned int regno = REGNO (x);
1820 unsigned int hash = HASH (x, GET_MODE (x));
1822 /* Remove REGNO from any quantity list it might be on and indicate
1823 that its value might have changed. If it is a pseudo, remove its
1824 entry from the hash table.
1826 For a hard register, we do the first two actions above for any
1827 additional hard registers corresponding to X. Then, if any of these
1828 registers are in the table, we must remove any REG entries that
1829 overlap these registers. */
1831 delete_reg_equiv (regno);
1832 REG_TICK (regno)++;
1833 SUBREG_TICKED (regno) = -1;
1835 if (regno >= FIRST_PSEUDO_REGISTER)
1836 remove_pseudo_from_table (x, hash);
1837 else
1839 HOST_WIDE_INT in_table = TEST_HARD_REG_BIT (hard_regs_in_table, regno);
1840 unsigned int endregno = END_REGNO (x);
1841 unsigned int rn;
1842 struct table_elt *p, *next;
1844 CLEAR_HARD_REG_BIT (hard_regs_in_table, regno);
1846 for (rn = regno + 1; rn < endregno; rn++)
1848 in_table |= TEST_HARD_REG_BIT (hard_regs_in_table, rn);
1849 CLEAR_HARD_REG_BIT (hard_regs_in_table, rn);
1850 delete_reg_equiv (rn);
1851 REG_TICK (rn)++;
1852 SUBREG_TICKED (rn) = -1;
1855 if (in_table)
1856 for (hash = 0; hash < HASH_SIZE; hash++)
1857 for (p = table[hash]; p; p = next)
1859 next = p->next_same_hash;
1861 if (!REG_P (p->exp) || REGNO (p->exp) >= FIRST_PSEUDO_REGISTER)
1862 continue;
1864 unsigned int tregno = REGNO (p->exp);
1865 unsigned int tendregno = END_REGNO (p->exp);
1866 if (tendregno > regno && tregno < endregno)
1867 remove_from_table (p, hash);
1872 /* Remove from the hash table, or mark as invalid, all expressions whose
1873 values could be altered by storing in X. X is a register, a subreg, or
1874 a memory reference with nonvarying address (because, when a memory
1875 reference with a varying address is stored in, all memory references are
1876 removed by invalidate_memory so specific invalidation is superfluous).
1877 FULL_MODE, if not VOIDmode, indicates that this much should be
1878 invalidated instead of just the amount indicated by the mode of X. This
1879 is only used for bitfield stores into memory.
1881 A nonvarying address may be just a register or just a symbol reference,
1882 or it may be either of those plus a numeric offset. */
1884 static void
1885 invalidate (rtx x, machine_mode full_mode)
1887 int i;
1888 struct table_elt *p;
1889 rtx addr;
1891 switch (GET_CODE (x))
1893 case REG:
1894 invalidate_reg (x);
1895 return;
1897 case SUBREG:
1898 invalidate (SUBREG_REG (x), VOIDmode);
1899 return;
1901 case PARALLEL:
1902 for (i = XVECLEN (x, 0) - 1; i >= 0; --i)
1903 invalidate (XVECEXP (x, 0, i), VOIDmode);
1904 return;
1906 case EXPR_LIST:
1907 /* This is part of a disjoint return value; extract the location in
1908 question ignoring the offset. */
1909 invalidate (XEXP (x, 0), VOIDmode);
1910 return;
1912 case MEM:
1913 addr = canon_rtx (get_addr (XEXP (x, 0)));
1914 /* Calculate the canonical version of X here so that
1915 true_dependence doesn't generate new RTL for X on each call. */
1916 x = canon_rtx (x);
1918 /* Remove all hash table elements that refer to overlapping pieces of
1919 memory. */
1920 if (full_mode == VOIDmode)
1921 full_mode = GET_MODE (x);
1923 for (i = 0; i < HASH_SIZE; i++)
1925 struct table_elt *next;
1927 for (p = table[i]; p; p = next)
1929 next = p->next_same_hash;
1930 if (p->in_memory)
1932 /* Just canonicalize the expression once;
1933 otherwise each time we call invalidate
1934 true_dependence will canonicalize the
1935 expression again. */
1936 if (!p->canon_exp)
1937 p->canon_exp = canon_rtx (p->exp);
1938 if (check_dependence (p->canon_exp, x, full_mode, addr))
1939 remove_from_table (p, i);
1943 return;
1945 default:
1946 gcc_unreachable ();
1950 /* Invalidate DEST. Used when DEST is not going to be added
1951 into the hash table for some reason, e.g. do_not_record
1952 flagged on it. */
1954 static void
1955 invalidate_dest (rtx dest)
1957 if (REG_P (dest)
1958 || GET_CODE (dest) == SUBREG
1959 || MEM_P (dest))
1960 invalidate (dest, VOIDmode);
1961 else if (GET_CODE (dest) == STRICT_LOW_PART
1962 || GET_CODE (dest) == ZERO_EXTRACT)
1963 invalidate (XEXP (dest, 0), GET_MODE (dest));
1966 /* Remove all expressions that refer to register REGNO,
1967 since they are already invalid, and we are about to
1968 mark that register valid again and don't want the old
1969 expressions to reappear as valid. */
1971 static void
1972 remove_invalid_refs (unsigned int regno)
1974 unsigned int i;
1975 struct table_elt *p, *next;
1977 for (i = 0; i < HASH_SIZE; i++)
1978 for (p = table[i]; p; p = next)
1980 next = p->next_same_hash;
1981 if (!REG_P (p->exp) && refers_to_regno_p (regno, p->exp))
1982 remove_from_table (p, i);
1986 /* Likewise for a subreg with subreg_reg REGNO, subreg_byte OFFSET,
1987 and mode MODE. */
1988 static void
1989 remove_invalid_subreg_refs (unsigned int regno, poly_uint64 offset,
1990 machine_mode mode)
1992 unsigned int i;
1993 struct table_elt *p, *next;
1995 for (i = 0; i < HASH_SIZE; i++)
1996 for (p = table[i]; p; p = next)
1998 rtx exp = p->exp;
1999 next = p->next_same_hash;
2001 if (!REG_P (exp)
2002 && (GET_CODE (exp) != SUBREG
2003 || !REG_P (SUBREG_REG (exp))
2004 || REGNO (SUBREG_REG (exp)) != regno
2005 || ranges_maybe_overlap_p (SUBREG_BYTE (exp),
2006 GET_MODE_SIZE (GET_MODE (exp)),
2007 offset, GET_MODE_SIZE (mode)))
2008 && refers_to_regno_p (regno, p->exp))
2009 remove_from_table (p, i);
2013 /* Recompute the hash codes of any valid entries in the hash table that
2014 reference X, if X is a register, or SUBREG_REG (X) if X is a SUBREG.
2016 This is called when we make a jump equivalence. */
2018 static void
2019 rehash_using_reg (rtx x)
2021 unsigned int i;
2022 struct table_elt *p, *next;
2023 unsigned hash;
2025 if (GET_CODE (x) == SUBREG)
2026 x = SUBREG_REG (x);
2028 /* If X is not a register or if the register is known not to be in any
2029 valid entries in the table, we have no work to do. */
2031 if (!REG_P (x)
2032 || REG_IN_TABLE (REGNO (x)) < 0
2033 || REG_IN_TABLE (REGNO (x)) != REG_TICK (REGNO (x)))
2034 return;
2036 /* Scan all hash chains looking for valid entries that mention X.
2037 If we find one and it is in the wrong hash chain, move it. */
2039 for (i = 0; i < HASH_SIZE; i++)
2040 for (p = table[i]; p; p = next)
2042 next = p->next_same_hash;
2043 if (reg_mentioned_p (x, p->exp)
2044 && exp_equiv_p (p->exp, p->exp, 1, false)
2045 && i != (hash = SAFE_HASH (p->exp, p->mode)))
2047 if (p->next_same_hash)
2048 p->next_same_hash->prev_same_hash = p->prev_same_hash;
2050 if (p->prev_same_hash)
2051 p->prev_same_hash->next_same_hash = p->next_same_hash;
2052 else
2053 table[i] = p->next_same_hash;
2055 p->next_same_hash = table[hash];
2056 p->prev_same_hash = 0;
2057 if (table[hash])
2058 table[hash]->prev_same_hash = p;
2059 table[hash] = p;
2064 /* Remove from the hash table any expression that is a call-clobbered
2065 register in INSN. Also update their TICK values. */
2067 static void
2068 invalidate_for_call (rtx_insn *insn)
2070 unsigned int regno;
2071 unsigned hash;
2072 struct table_elt *p, *next;
2073 int in_table = 0;
2074 hard_reg_set_iterator hrsi;
2076 /* Go through all the hard registers. For each that might be clobbered
2077 in call insn INSN, remove the register from quantity chains and update
2078 reg_tick if defined. Also see if any of these registers is currently
2079 in the table.
2081 ??? We could be more precise for partially-clobbered registers,
2082 and only invalidate values that actually occupy the clobbered part
2083 of the registers. It doesn't seem worth the effort though, since
2084 we shouldn't see this situation much before RA. Whatever choice
2085 we make here has to be consistent with the table walk below,
2086 so any change to this test will require a change there too. */
2087 HARD_REG_SET callee_clobbers
2088 = insn_callee_abi (insn).full_and_partial_reg_clobbers ();
2089 EXECUTE_IF_SET_IN_HARD_REG_SET (callee_clobbers, 0, regno, hrsi)
2091 delete_reg_equiv (regno);
2092 if (REG_TICK (regno) >= 0)
2094 REG_TICK (regno)++;
2095 SUBREG_TICKED (regno) = -1;
2097 in_table |= (TEST_HARD_REG_BIT (hard_regs_in_table, regno) != 0);
2100 /* In the case where we have no call-clobbered hard registers in the
2101 table, we are done. Otherwise, scan the table and remove any
2102 entry that overlaps a call-clobbered register. */
2104 if (in_table)
2105 for (hash = 0; hash < HASH_SIZE; hash++)
2106 for (p = table[hash]; p; p = next)
2108 next = p->next_same_hash;
2110 if (!REG_P (p->exp)
2111 || REGNO (p->exp) >= FIRST_PSEUDO_REGISTER)
2112 continue;
2114 /* This must use the same test as above rather than the
2115 more accurate clobbers_reg_p. */
2116 if (overlaps_hard_reg_set_p (callee_clobbers, GET_MODE (p->exp),
2117 REGNO (p->exp)))
2118 remove_from_table (p, hash);
2122 /* Given an expression X of type CONST,
2123 and ELT which is its table entry (or 0 if it
2124 is not in the hash table),
2125 return an alternate expression for X as a register plus integer.
2126 If none can be found, return 0. */
2128 static rtx
2129 use_related_value (rtx x, struct table_elt *elt)
2131 struct table_elt *relt = 0;
2132 struct table_elt *p, *q;
2133 HOST_WIDE_INT offset;
2135 /* First, is there anything related known?
2136 If we have a table element, we can tell from that.
2137 Otherwise, must look it up. */
2139 if (elt != 0 && elt->related_value != 0)
2140 relt = elt;
2141 else if (elt == 0 && GET_CODE (x) == CONST)
2143 rtx subexp = get_related_value (x);
2144 if (subexp != 0)
2145 relt = lookup (subexp,
2146 SAFE_HASH (subexp, GET_MODE (subexp)),
2147 GET_MODE (subexp));
2150 if (relt == 0)
2151 return 0;
2153 /* Search all related table entries for one that has an
2154 equivalent register. */
2156 p = relt;
2157 while (1)
2159 /* This loop is strange in that it is executed in two different cases.
2160 The first is when X is already in the table. Then it is searching
2161 the RELATED_VALUE list of X's class (RELT). The second case is when
2162 X is not in the table. Then RELT points to a class for the related
2163 value.
2165 Ensure that, whatever case we are in, that we ignore classes that have
2166 the same value as X. */
2168 if (rtx_equal_p (x, p->exp))
2169 q = 0;
2170 else
2171 for (q = p->first_same_value; q; q = q->next_same_value)
2172 if (REG_P (q->exp))
2173 break;
2175 if (q)
2176 break;
2178 p = p->related_value;
2180 /* We went all the way around, so there is nothing to be found.
2181 Alternatively, perhaps RELT was in the table for some other reason
2182 and it has no related values recorded. */
2183 if (p == relt || p == 0)
2184 break;
2187 if (q == 0)
2188 return 0;
2190 offset = (get_integer_term (x) - get_integer_term (p->exp));
2191 /* Note: OFFSET may be 0 if P->xexp and X are related by commutativity. */
2192 return plus_constant (q->mode, q->exp, offset);
2196 /* Hash a string. Just add its bytes up. */
2197 static inline unsigned
2198 hash_rtx_string (const char *ps)
2200 unsigned hash = 0;
2201 const unsigned char *p = (const unsigned char *) ps;
2203 if (p)
2204 while (*p)
2205 hash += *p++;
2207 return hash;
2210 /* Same as hash_rtx, but call CB on each rtx if it is not NULL.
2211 When the callback returns true, we continue with the new rtx. */
2213 unsigned
2214 hash_rtx_cb (const_rtx x, machine_mode mode,
2215 int *do_not_record_p, int *hash_arg_in_memory_p,
2216 bool have_reg_qty, hash_rtx_callback_function cb)
2218 int i, j;
2219 unsigned hash = 0;
2220 enum rtx_code code;
2221 const char *fmt;
2222 machine_mode newmode;
2223 rtx newx;
2225 /* Used to turn recursion into iteration. We can't rely on GCC's
2226 tail-recursion elimination since we need to keep accumulating values
2227 in HASH. */
2228 repeat:
2229 if (x == 0)
2230 return hash;
2232 /* Invoke the callback first. */
2233 if (cb != NULL
2234 && ((*cb) (x, mode, &newx, &newmode)))
2236 hash += hash_rtx_cb (newx, newmode, do_not_record_p,
2237 hash_arg_in_memory_p, have_reg_qty, cb);
2238 return hash;
2241 code = GET_CODE (x);
2242 switch (code)
2244 case REG:
2246 unsigned int regno = REGNO (x);
2248 if (do_not_record_p && !reload_completed)
2250 /* On some machines, we can't record any non-fixed hard register,
2251 because extending its life will cause reload problems. We
2252 consider ap, fp, sp, gp to be fixed for this purpose.
2254 We also consider CCmode registers to be fixed for this purpose;
2255 failure to do so leads to failure to simplify 0<100 type of
2256 conditionals.
2258 On all machines, we can't record any global registers.
2259 Nor should we record any register that is in a small
2260 class, as defined by TARGET_CLASS_LIKELY_SPILLED_P. */
2261 bool record;
2263 if (regno >= FIRST_PSEUDO_REGISTER)
2264 record = true;
2265 else if (x == frame_pointer_rtx
2266 || x == hard_frame_pointer_rtx
2267 || x == arg_pointer_rtx
2268 || x == stack_pointer_rtx
2269 || x == pic_offset_table_rtx)
2270 record = true;
2271 else if (global_regs[regno])
2272 record = false;
2273 else if (fixed_regs[regno])
2274 record = true;
2275 else if (GET_MODE_CLASS (GET_MODE (x)) == MODE_CC)
2276 record = true;
2277 else if (targetm.small_register_classes_for_mode_p (GET_MODE (x)))
2278 record = false;
2279 else if (targetm.class_likely_spilled_p (REGNO_REG_CLASS (regno)))
2280 record = false;
2281 else
2282 record = true;
2284 if (!record)
2286 *do_not_record_p = 1;
2287 return 0;
2291 hash += ((unsigned int) REG << 7);
2292 hash += (have_reg_qty ? (unsigned) REG_QTY (regno) : regno);
2293 return hash;
2296 /* We handle SUBREG of a REG specially because the underlying
2297 reg changes its hash value with every value change; we don't
2298 want to have to forget unrelated subregs when one subreg changes. */
2299 case SUBREG:
2301 if (REG_P (SUBREG_REG (x)))
2303 hash += (((unsigned int) SUBREG << 7)
2304 + REGNO (SUBREG_REG (x))
2305 + (constant_lower_bound (SUBREG_BYTE (x))
2306 / UNITS_PER_WORD));
2307 return hash;
2309 break;
2312 case CONST_INT:
2313 hash += (((unsigned int) CONST_INT << 7) + (unsigned int) mode
2314 + (unsigned int) INTVAL (x));
2315 return hash;
2317 case CONST_WIDE_INT:
2318 for (i = 0; i < CONST_WIDE_INT_NUNITS (x); i++)
2319 hash += CONST_WIDE_INT_ELT (x, i);
2320 return hash;
2322 case CONST_POLY_INT:
2324 inchash::hash h;
2325 h.add_int (hash);
2326 for (unsigned int i = 0; i < NUM_POLY_INT_COEFFS; ++i)
2327 h.add_wide_int (CONST_POLY_INT_COEFFS (x)[i]);
2328 return h.end ();
2331 case CONST_DOUBLE:
2332 /* This is like the general case, except that it only counts
2333 the integers representing the constant. */
2334 hash += (unsigned int) code + (unsigned int) GET_MODE (x);
2335 if (TARGET_SUPPORTS_WIDE_INT == 0 && GET_MODE (x) == VOIDmode)
2336 hash += ((unsigned int) CONST_DOUBLE_LOW (x)
2337 + (unsigned int) CONST_DOUBLE_HIGH (x));
2338 else
2339 hash += real_hash (CONST_DOUBLE_REAL_VALUE (x));
2340 return hash;
2342 case CONST_FIXED:
2343 hash += (unsigned int) code + (unsigned int) GET_MODE (x);
2344 hash += fixed_hash (CONST_FIXED_VALUE (x));
2345 return hash;
2347 case CONST_VECTOR:
2349 int units;
2350 rtx elt;
2352 units = const_vector_encoded_nelts (x);
2354 for (i = 0; i < units; ++i)
2356 elt = CONST_VECTOR_ENCODED_ELT (x, i);
2357 hash += hash_rtx_cb (elt, GET_MODE (elt),
2358 do_not_record_p, hash_arg_in_memory_p,
2359 have_reg_qty, cb);
2362 return hash;
2365 /* Assume there is only one rtx object for any given label. */
2366 case LABEL_REF:
2367 /* We don't hash on the address of the CODE_LABEL to avoid bootstrap
2368 differences and differences between each stage's debugging dumps. */
2369 hash += (((unsigned int) LABEL_REF << 7)
2370 + CODE_LABEL_NUMBER (label_ref_label (x)));
2371 return hash;
2373 case SYMBOL_REF:
2375 /* Don't hash on the symbol's address to avoid bootstrap differences.
2376 Different hash values may cause expressions to be recorded in
2377 different orders and thus different registers to be used in the
2378 final assembler. This also avoids differences in the dump files
2379 between various stages. */
2380 unsigned int h = 0;
2381 const unsigned char *p = (const unsigned char *) XSTR (x, 0);
2383 while (*p)
2384 h += (h << 7) + *p++; /* ??? revisit */
2386 hash += ((unsigned int) SYMBOL_REF << 7) + h;
2387 return hash;
2390 case MEM:
2391 /* We don't record if marked volatile or if BLKmode since we don't
2392 know the size of the move. */
2393 if (do_not_record_p && (MEM_VOLATILE_P (x) || GET_MODE (x) == BLKmode))
2395 *do_not_record_p = 1;
2396 return 0;
2398 if (hash_arg_in_memory_p && !MEM_READONLY_P (x))
2399 *hash_arg_in_memory_p = 1;
2401 /* Now that we have already found this special case,
2402 might as well speed it up as much as possible. */
2403 hash += (unsigned) MEM;
2404 x = XEXP (x, 0);
2405 goto repeat;
2407 case USE:
2408 /* A USE that mentions non-volatile memory needs special
2409 handling since the MEM may be BLKmode which normally
2410 prevents an entry from being made. Pure calls are
2411 marked by a USE which mentions BLKmode memory.
2412 See calls.c:emit_call_1. */
2413 if (MEM_P (XEXP (x, 0))
2414 && ! MEM_VOLATILE_P (XEXP (x, 0)))
2416 hash += (unsigned) USE;
2417 x = XEXP (x, 0);
2419 if (hash_arg_in_memory_p && !MEM_READONLY_P (x))
2420 *hash_arg_in_memory_p = 1;
2422 /* Now that we have already found this special case,
2423 might as well speed it up as much as possible. */
2424 hash += (unsigned) MEM;
2425 x = XEXP (x, 0);
2426 goto repeat;
2428 break;
2430 case PRE_DEC:
2431 case PRE_INC:
2432 case POST_DEC:
2433 case POST_INC:
2434 case PRE_MODIFY:
2435 case POST_MODIFY:
2436 case PC:
2437 case CALL:
2438 case UNSPEC_VOLATILE:
2439 if (do_not_record_p) {
2440 *do_not_record_p = 1;
2441 return 0;
2443 else
2444 return hash;
2445 break;
2447 case ASM_OPERANDS:
2448 if (do_not_record_p && MEM_VOLATILE_P (x))
2450 *do_not_record_p = 1;
2451 return 0;
2453 else
2455 /* We don't want to take the filename and line into account. */
2456 hash += (unsigned) code + (unsigned) GET_MODE (x)
2457 + hash_rtx_string (ASM_OPERANDS_TEMPLATE (x))
2458 + hash_rtx_string (ASM_OPERANDS_OUTPUT_CONSTRAINT (x))
2459 + (unsigned) ASM_OPERANDS_OUTPUT_IDX (x);
2461 if (ASM_OPERANDS_INPUT_LENGTH (x))
2463 for (i = 1; i < ASM_OPERANDS_INPUT_LENGTH (x); i++)
2465 hash += (hash_rtx_cb (ASM_OPERANDS_INPUT (x, i),
2466 GET_MODE (ASM_OPERANDS_INPUT (x, i)),
2467 do_not_record_p, hash_arg_in_memory_p,
2468 have_reg_qty, cb)
2469 + hash_rtx_string
2470 (ASM_OPERANDS_INPUT_CONSTRAINT (x, i)));
2473 hash += hash_rtx_string (ASM_OPERANDS_INPUT_CONSTRAINT (x, 0));
2474 x = ASM_OPERANDS_INPUT (x, 0);
2475 mode = GET_MODE (x);
2476 goto repeat;
2479 return hash;
2481 break;
2483 default:
2484 break;
2487 i = GET_RTX_LENGTH (code) - 1;
2488 hash += (unsigned) code + (unsigned) GET_MODE (x);
2489 fmt = GET_RTX_FORMAT (code);
2490 for (; i >= 0; i--)
2492 switch (fmt[i])
2494 case 'e':
2495 /* If we are about to do the last recursive call
2496 needed at this level, change it into iteration.
2497 This function is called enough to be worth it. */
2498 if (i == 0)
2500 x = XEXP (x, i);
2501 goto repeat;
2504 hash += hash_rtx_cb (XEXP (x, i), VOIDmode, do_not_record_p,
2505 hash_arg_in_memory_p,
2506 have_reg_qty, cb);
2507 break;
2509 case 'E':
2510 for (j = 0; j < XVECLEN (x, i); j++)
2511 hash += hash_rtx_cb (XVECEXP (x, i, j), VOIDmode, do_not_record_p,
2512 hash_arg_in_memory_p,
2513 have_reg_qty, cb);
2514 break;
2516 case 's':
2517 hash += hash_rtx_string (XSTR (x, i));
2518 break;
2520 case 'i':
2521 hash += (unsigned int) XINT (x, i);
2522 break;
2524 case 'p':
2525 hash += constant_lower_bound (SUBREG_BYTE (x));
2526 break;
2528 case '0': case 't':
2529 /* Unused. */
2530 break;
2532 default:
2533 gcc_unreachable ();
2537 return hash;
2540 /* Hash an rtx. We are careful to make sure the value is never negative.
2541 Equivalent registers hash identically.
2542 MODE is used in hashing for CONST_INTs only;
2543 otherwise the mode of X is used.
2545 Store 1 in DO_NOT_RECORD_P if any subexpression is volatile.
2547 If HASH_ARG_IN_MEMORY_P is not NULL, store 1 in it if X contains
2548 a MEM rtx which does not have the MEM_READONLY_P flag set.
2550 Note that cse_insn knows that the hash code of a MEM expression
2551 is just (int) MEM plus the hash code of the address. */
2553 unsigned
2554 hash_rtx (const_rtx x, machine_mode mode, int *do_not_record_p,
2555 int *hash_arg_in_memory_p, bool have_reg_qty)
2557 return hash_rtx_cb (x, mode, do_not_record_p,
2558 hash_arg_in_memory_p, have_reg_qty, NULL);
2561 /* Hash an rtx X for cse via hash_rtx.
2562 Stores 1 in do_not_record if any subexpression is volatile.
2563 Stores 1 in hash_arg_in_memory if X contains a mem rtx which
2564 does not have the MEM_READONLY_P flag set. */
2566 static inline unsigned
2567 canon_hash (rtx x, machine_mode mode)
2569 return hash_rtx (x, mode, &do_not_record, &hash_arg_in_memory, true);
2572 /* Like canon_hash but with no side effects, i.e. do_not_record
2573 and hash_arg_in_memory are not changed. */
2575 static inline unsigned
2576 safe_hash (rtx x, machine_mode mode)
2578 int dummy_do_not_record;
2579 return hash_rtx (x, mode, &dummy_do_not_record, NULL, true);
2582 /* Return 1 iff X and Y would canonicalize into the same thing,
2583 without actually constructing the canonicalization of either one.
2584 If VALIDATE is nonzero,
2585 we assume X is an expression being processed from the rtl
2586 and Y was found in the hash table. We check register refs
2587 in Y for being marked as valid.
2589 If FOR_GCSE is true, we compare X and Y for equivalence for GCSE. */
2592 exp_equiv_p (const_rtx x, const_rtx y, int validate, bool for_gcse)
2594 int i, j;
2595 enum rtx_code code;
2596 const char *fmt;
2598 /* Note: it is incorrect to assume an expression is equivalent to itself
2599 if VALIDATE is nonzero. */
2600 if (x == y && !validate)
2601 return 1;
2603 if (x == 0 || y == 0)
2604 return x == y;
2606 code = GET_CODE (x);
2607 if (code != GET_CODE (y))
2608 return 0;
2610 /* (MULT:SI x y) and (MULT:HI x y) are NOT equivalent. */
2611 if (GET_MODE (x) != GET_MODE (y))
2612 return 0;
2614 /* MEMs referring to different address space are not equivalent. */
2615 if (code == MEM && MEM_ADDR_SPACE (x) != MEM_ADDR_SPACE (y))
2616 return 0;
2618 switch (code)
2620 case PC:
2621 CASE_CONST_UNIQUE:
2622 return x == y;
2624 case CONST_VECTOR:
2625 if (!same_vector_encodings_p (x, y))
2626 return false;
2627 break;
2629 case LABEL_REF:
2630 return label_ref_label (x) == label_ref_label (y);
2632 case SYMBOL_REF:
2633 return XSTR (x, 0) == XSTR (y, 0);
2635 case REG:
2636 if (for_gcse)
2637 return REGNO (x) == REGNO (y);
2638 else
2640 unsigned int regno = REGNO (y);
2641 unsigned int i;
2642 unsigned int endregno = END_REGNO (y);
2644 /* If the quantities are not the same, the expressions are not
2645 equivalent. If there are and we are not to validate, they
2646 are equivalent. Otherwise, ensure all regs are up-to-date. */
2648 if (REG_QTY (REGNO (x)) != REG_QTY (regno))
2649 return 0;
2651 if (! validate)
2652 return 1;
2654 for (i = regno; i < endregno; i++)
2655 if (REG_IN_TABLE (i) != REG_TICK (i))
2656 return 0;
2658 return 1;
2661 case MEM:
2662 if (for_gcse)
2664 /* A volatile mem should not be considered equivalent to any
2665 other. */
2666 if (MEM_VOLATILE_P (x) || MEM_VOLATILE_P (y))
2667 return 0;
2669 /* Can't merge two expressions in different alias sets, since we
2670 can decide that the expression is transparent in a block when
2671 it isn't, due to it being set with the different alias set.
2673 Also, can't merge two expressions with different MEM_ATTRS.
2674 They could e.g. be two different entities allocated into the
2675 same space on the stack (see e.g. PR25130). In that case, the
2676 MEM addresses can be the same, even though the two MEMs are
2677 absolutely not equivalent.
2679 But because really all MEM attributes should be the same for
2680 equivalent MEMs, we just use the invariant that MEMs that have
2681 the same attributes share the same mem_attrs data structure. */
2682 if (!mem_attrs_eq_p (MEM_ATTRS (x), MEM_ATTRS (y)))
2683 return 0;
2685 /* If we are handling exceptions, we cannot consider two expressions
2686 with different trapping status as equivalent, because simple_mem
2687 might accept one and reject the other. */
2688 if (cfun->can_throw_non_call_exceptions
2689 && (MEM_NOTRAP_P (x) != MEM_NOTRAP_P (y)))
2690 return 0;
2692 break;
2694 /* For commutative operations, check both orders. */
2695 case PLUS:
2696 case MULT:
2697 case AND:
2698 case IOR:
2699 case XOR:
2700 case NE:
2701 case EQ:
2702 return ((exp_equiv_p (XEXP (x, 0), XEXP (y, 0),
2703 validate, for_gcse)
2704 && exp_equiv_p (XEXP (x, 1), XEXP (y, 1),
2705 validate, for_gcse))
2706 || (exp_equiv_p (XEXP (x, 0), XEXP (y, 1),
2707 validate, for_gcse)
2708 && exp_equiv_p (XEXP (x, 1), XEXP (y, 0),
2709 validate, for_gcse)));
2711 case ASM_OPERANDS:
2712 /* We don't use the generic code below because we want to
2713 disregard filename and line numbers. */
2715 /* A volatile asm isn't equivalent to any other. */
2716 if (MEM_VOLATILE_P (x) || MEM_VOLATILE_P (y))
2717 return 0;
2719 if (GET_MODE (x) != GET_MODE (y)
2720 || strcmp (ASM_OPERANDS_TEMPLATE (x), ASM_OPERANDS_TEMPLATE (y))
2721 || strcmp (ASM_OPERANDS_OUTPUT_CONSTRAINT (x),
2722 ASM_OPERANDS_OUTPUT_CONSTRAINT (y))
2723 || ASM_OPERANDS_OUTPUT_IDX (x) != ASM_OPERANDS_OUTPUT_IDX (y)
2724 || ASM_OPERANDS_INPUT_LENGTH (x) != ASM_OPERANDS_INPUT_LENGTH (y))
2725 return 0;
2727 if (ASM_OPERANDS_INPUT_LENGTH (x))
2729 for (i = ASM_OPERANDS_INPUT_LENGTH (x) - 1; i >= 0; i--)
2730 if (! exp_equiv_p (ASM_OPERANDS_INPUT (x, i),
2731 ASM_OPERANDS_INPUT (y, i),
2732 validate, for_gcse)
2733 || strcmp (ASM_OPERANDS_INPUT_CONSTRAINT (x, i),
2734 ASM_OPERANDS_INPUT_CONSTRAINT (y, i)))
2735 return 0;
2738 return 1;
2740 default:
2741 break;
2744 /* Compare the elements. If any pair of corresponding elements
2745 fail to match, return 0 for the whole thing. */
2747 fmt = GET_RTX_FORMAT (code);
2748 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
2750 switch (fmt[i])
2752 case 'e':
2753 if (! exp_equiv_p (XEXP (x, i), XEXP (y, i),
2754 validate, for_gcse))
2755 return 0;
2756 break;
2758 case 'E':
2759 if (XVECLEN (x, i) != XVECLEN (y, i))
2760 return 0;
2761 for (j = 0; j < XVECLEN (x, i); j++)
2762 if (! exp_equiv_p (XVECEXP (x, i, j), XVECEXP (y, i, j),
2763 validate, for_gcse))
2764 return 0;
2765 break;
2767 case 's':
2768 if (strcmp (XSTR (x, i), XSTR (y, i)))
2769 return 0;
2770 break;
2772 case 'i':
2773 if (XINT (x, i) != XINT (y, i))
2774 return 0;
2775 break;
2777 case 'w':
2778 if (XWINT (x, i) != XWINT (y, i))
2779 return 0;
2780 break;
2782 case 'p':
2783 if (maybe_ne (SUBREG_BYTE (x), SUBREG_BYTE (y)))
2784 return 0;
2785 break;
2787 case '0':
2788 case 't':
2789 break;
2791 default:
2792 gcc_unreachable ();
2796 return 1;
2799 /* Subroutine of canon_reg. Pass *XLOC through canon_reg, and validate
2800 the result if necessary. INSN is as for canon_reg. */
2802 static void
2803 validate_canon_reg (rtx *xloc, rtx_insn *insn)
2805 if (*xloc)
2807 rtx new_rtx = canon_reg (*xloc, insn);
2809 /* If replacing pseudo with hard reg or vice versa, ensure the
2810 insn remains valid. Likewise if the insn has MATCH_DUPs. */
2811 gcc_assert (insn && new_rtx);
2812 validate_change (insn, xloc, new_rtx, 1);
2816 /* Canonicalize an expression:
2817 replace each register reference inside it
2818 with the "oldest" equivalent register.
2820 If INSN is nonzero validate_change is used to ensure that INSN remains valid
2821 after we make our substitution. The calls are made with IN_GROUP nonzero
2822 so apply_change_group must be called upon the outermost return from this
2823 function (unless INSN is zero). The result of apply_change_group can
2824 generally be discarded since the changes we are making are optional. */
2826 static rtx
2827 canon_reg (rtx x, rtx_insn *insn)
2829 int i;
2830 enum rtx_code code;
2831 const char *fmt;
2833 if (x == 0)
2834 return x;
2836 code = GET_CODE (x);
2837 switch (code)
2839 case PC:
2840 case CONST:
2841 CASE_CONST_ANY:
2842 case SYMBOL_REF:
2843 case LABEL_REF:
2844 case ADDR_VEC:
2845 case ADDR_DIFF_VEC:
2846 return x;
2848 case REG:
2850 int first;
2851 int q;
2852 struct qty_table_elem *ent;
2854 /* Never replace a hard reg, because hard regs can appear
2855 in more than one machine mode, and we must preserve the mode
2856 of each occurrence. Also, some hard regs appear in
2857 MEMs that are shared and mustn't be altered. Don't try to
2858 replace any reg that maps to a reg of class NO_REGS. */
2859 if (REGNO (x) < FIRST_PSEUDO_REGISTER
2860 || ! REGNO_QTY_VALID_P (REGNO (x)))
2861 return x;
2863 q = REG_QTY (REGNO (x));
2864 ent = &qty_table[q];
2865 first = ent->first_reg;
2866 return (first >= FIRST_PSEUDO_REGISTER ? regno_reg_rtx[first]
2867 : REGNO_REG_CLASS (first) == NO_REGS ? x
2868 : gen_rtx_REG (ent->mode, first));
2871 default:
2872 break;
2875 fmt = GET_RTX_FORMAT (code);
2876 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
2878 int j;
2880 if (fmt[i] == 'e')
2881 validate_canon_reg (&XEXP (x, i), insn);
2882 else if (fmt[i] == 'E')
2883 for (j = 0; j < XVECLEN (x, i); j++)
2884 validate_canon_reg (&XVECEXP (x, i, j), insn);
2887 return x;
2890 /* Given an operation (CODE, *PARG1, *PARG2), where code is a comparison
2891 operation (EQ, NE, GT, etc.), follow it back through the hash table and
2892 what values are being compared.
2894 *PARG1 and *PARG2 are updated to contain the rtx representing the values
2895 actually being compared. For example, if *PARG1 was (reg:CC CC_REG) and
2896 *PARG2 was (const_int 0), *PARG1 and *PARG2 will be set to the objects that
2897 were compared to produce (reg:CC CC_REG).
2899 The return value is the comparison operator and is either the code of
2900 A or the code corresponding to the inverse of the comparison. */
2902 static enum rtx_code
2903 find_comparison_args (enum rtx_code code, rtx *parg1, rtx *parg2,
2904 machine_mode *pmode1, machine_mode *pmode2)
2906 rtx arg1, arg2;
2907 hash_set<rtx> *visited = NULL;
2908 /* Set nonzero when we find something of interest. */
2909 rtx x = NULL;
2911 arg1 = *parg1, arg2 = *parg2;
2913 /* If ARG2 is const0_rtx, see what ARG1 is equivalent to. */
2915 while (arg2 == CONST0_RTX (GET_MODE (arg1)))
2917 int reverse_code = 0;
2918 struct table_elt *p = 0;
2920 /* Remember state from previous iteration. */
2921 if (x)
2923 if (!visited)
2924 visited = new hash_set<rtx>;
2925 visited->add (x);
2926 x = 0;
2929 /* If arg1 is a COMPARE, extract the comparison arguments from it. */
2931 if (GET_CODE (arg1) == COMPARE && arg2 == const0_rtx)
2932 x = arg1;
2934 /* If ARG1 is a comparison operator and CODE is testing for
2935 STORE_FLAG_VALUE, get the inner arguments. */
2937 else if (COMPARISON_P (arg1))
2939 #ifdef FLOAT_STORE_FLAG_VALUE
2940 REAL_VALUE_TYPE fsfv;
2941 #endif
2943 if (code == NE
2944 || (GET_MODE_CLASS (GET_MODE (arg1)) == MODE_INT
2945 && code == LT && STORE_FLAG_VALUE == -1)
2946 #ifdef FLOAT_STORE_FLAG_VALUE
2947 || (SCALAR_FLOAT_MODE_P (GET_MODE (arg1))
2948 && (fsfv = FLOAT_STORE_FLAG_VALUE (GET_MODE (arg1)),
2949 REAL_VALUE_NEGATIVE (fsfv)))
2950 #endif
2952 x = arg1;
2953 else if (code == EQ
2954 || (GET_MODE_CLASS (GET_MODE (arg1)) == MODE_INT
2955 && code == GE && STORE_FLAG_VALUE == -1)
2956 #ifdef FLOAT_STORE_FLAG_VALUE
2957 || (SCALAR_FLOAT_MODE_P (GET_MODE (arg1))
2958 && (fsfv = FLOAT_STORE_FLAG_VALUE (GET_MODE (arg1)),
2959 REAL_VALUE_NEGATIVE (fsfv)))
2960 #endif
2962 x = arg1, reverse_code = 1;
2965 /* ??? We could also check for
2967 (ne (and (eq (...) (const_int 1))) (const_int 0))
2969 and related forms, but let's wait until we see them occurring. */
2971 if (x == 0)
2972 /* Look up ARG1 in the hash table and see if it has an equivalence
2973 that lets us see what is being compared. */
2974 p = lookup (arg1, SAFE_HASH (arg1, GET_MODE (arg1)), GET_MODE (arg1));
2975 if (p)
2977 p = p->first_same_value;
2979 /* If what we compare is already known to be constant, that is as
2980 good as it gets.
2981 We need to break the loop in this case, because otherwise we
2982 can have an infinite loop when looking at a reg that is known
2983 to be a constant which is the same as a comparison of a reg
2984 against zero which appears later in the insn stream, which in
2985 turn is constant and the same as the comparison of the first reg
2986 against zero... */
2987 if (p->is_const)
2988 break;
2991 for (; p; p = p->next_same_value)
2993 machine_mode inner_mode = GET_MODE (p->exp);
2994 #ifdef FLOAT_STORE_FLAG_VALUE
2995 REAL_VALUE_TYPE fsfv;
2996 #endif
2998 /* If the entry isn't valid, skip it. */
2999 if (! exp_equiv_p (p->exp, p->exp, 1, false))
3000 continue;
3002 /* If it's a comparison we've used before, skip it. */
3003 if (visited && visited->contains (p->exp))
3004 continue;
3006 if (GET_CODE (p->exp) == COMPARE
3007 /* Another possibility is that this machine has a compare insn
3008 that includes the comparison code. In that case, ARG1 would
3009 be equivalent to a comparison operation that would set ARG1 to
3010 either STORE_FLAG_VALUE or zero. If this is an NE operation,
3011 ORIG_CODE is the actual comparison being done; if it is an EQ,
3012 we must reverse ORIG_CODE. On machine with a negative value
3013 for STORE_FLAG_VALUE, also look at LT and GE operations. */
3014 || ((code == NE
3015 || (code == LT
3016 && val_signbit_known_set_p (inner_mode,
3017 STORE_FLAG_VALUE))
3018 #ifdef FLOAT_STORE_FLAG_VALUE
3019 || (code == LT
3020 && SCALAR_FLOAT_MODE_P (inner_mode)
3021 && (fsfv = FLOAT_STORE_FLAG_VALUE (GET_MODE (arg1)),
3022 REAL_VALUE_NEGATIVE (fsfv)))
3023 #endif
3025 && COMPARISON_P (p->exp)))
3027 x = p->exp;
3028 break;
3030 else if ((code == EQ
3031 || (code == GE
3032 && val_signbit_known_set_p (inner_mode,
3033 STORE_FLAG_VALUE))
3034 #ifdef FLOAT_STORE_FLAG_VALUE
3035 || (code == GE
3036 && SCALAR_FLOAT_MODE_P (inner_mode)
3037 && (fsfv = FLOAT_STORE_FLAG_VALUE (GET_MODE (arg1)),
3038 REAL_VALUE_NEGATIVE (fsfv)))
3039 #endif
3041 && COMPARISON_P (p->exp))
3043 reverse_code = 1;
3044 x = p->exp;
3045 break;
3048 /* If this non-trapping address, e.g. fp + constant, the
3049 equivalent is a better operand since it may let us predict
3050 the value of the comparison. */
3051 else if (!rtx_addr_can_trap_p (p->exp))
3053 arg1 = p->exp;
3054 continue;
3058 /* If we didn't find a useful equivalence for ARG1, we are done.
3059 Otherwise, set up for the next iteration. */
3060 if (x == 0)
3061 break;
3063 /* If we need to reverse the comparison, make sure that is
3064 possible -- we can't necessarily infer the value of GE from LT
3065 with floating-point operands. */
3066 if (reverse_code)
3068 enum rtx_code reversed = reversed_comparison_code (x, NULL);
3069 if (reversed == UNKNOWN)
3070 break;
3071 else
3072 code = reversed;
3074 else if (COMPARISON_P (x))
3075 code = GET_CODE (x);
3076 arg1 = XEXP (x, 0), arg2 = XEXP (x, 1);
3079 /* Return our results. Return the modes from before fold_rtx
3080 because fold_rtx might produce const_int, and then it's too late. */
3081 *pmode1 = GET_MODE (arg1), *pmode2 = GET_MODE (arg2);
3082 *parg1 = fold_rtx (arg1, 0), *parg2 = fold_rtx (arg2, 0);
3084 if (visited)
3085 delete visited;
3086 return code;
3089 /* If X is a nontrivial arithmetic operation on an argument for which
3090 a constant value can be determined, return the result of operating
3091 on that value, as a constant. Otherwise, return X, possibly with
3092 one or more operands changed to a forward-propagated constant.
3094 If X is a register whose contents are known, we do NOT return
3095 those contents here; equiv_constant is called to perform that task.
3096 For SUBREGs and MEMs, we do that both here and in equiv_constant.
3098 INSN is the insn that we may be modifying. If it is 0, make a copy
3099 of X before modifying it. */
3101 static rtx
3102 fold_rtx (rtx x, rtx_insn *insn)
3104 enum rtx_code code;
3105 machine_mode mode;
3106 const char *fmt;
3107 int i;
3108 rtx new_rtx = 0;
3109 int changed = 0;
3110 poly_int64 xval;
3112 /* Operands of X. */
3113 /* Workaround -Wmaybe-uninitialized false positive during
3114 profiledbootstrap by initializing them. */
3115 rtx folded_arg0 = NULL_RTX;
3116 rtx folded_arg1 = NULL_RTX;
3118 /* Constant equivalents of first three operands of X;
3119 0 when no such equivalent is known. */
3120 rtx const_arg0;
3121 rtx const_arg1;
3122 rtx const_arg2;
3124 /* The mode of the first operand of X. We need this for sign and zero
3125 extends. */
3126 machine_mode mode_arg0;
3128 if (x == 0)
3129 return x;
3131 /* Try to perform some initial simplifications on X. */
3132 code = GET_CODE (x);
3133 switch (code)
3135 case MEM:
3136 case SUBREG:
3137 /* The first operand of a SIGN/ZERO_EXTRACT has a different meaning
3138 than it would in other contexts. Basically its mode does not
3139 signify the size of the object read. That information is carried
3140 by size operand. If we happen to have a MEM of the appropriate
3141 mode in our tables with a constant value we could simplify the
3142 extraction incorrectly if we allowed substitution of that value
3143 for the MEM. */
3144 case ZERO_EXTRACT:
3145 case SIGN_EXTRACT:
3146 if ((new_rtx = equiv_constant (x)) != NULL_RTX)
3147 return new_rtx;
3148 return x;
3150 case CONST:
3151 CASE_CONST_ANY:
3152 case SYMBOL_REF:
3153 case LABEL_REF:
3154 case REG:
3155 case PC:
3156 /* No use simplifying an EXPR_LIST
3157 since they are used only for lists of args
3158 in a function call's REG_EQUAL note. */
3159 case EXPR_LIST:
3160 return x;
3162 case ASM_OPERANDS:
3163 if (insn)
3165 for (i = ASM_OPERANDS_INPUT_LENGTH (x) - 1; i >= 0; i--)
3166 validate_change (insn, &ASM_OPERANDS_INPUT (x, i),
3167 fold_rtx (ASM_OPERANDS_INPUT (x, i), insn), 0);
3169 return x;
3171 case CALL:
3172 if (NO_FUNCTION_CSE && CONSTANT_P (XEXP (XEXP (x, 0), 0)))
3173 return x;
3174 break;
3175 case VEC_SELECT:
3177 rtx trueop0 = XEXP (x, 0);
3178 mode = GET_MODE (trueop0);
3179 rtx trueop1 = XEXP (x, 1);
3180 /* If we select a low-part subreg, return that. */
3181 if (vec_series_lowpart_p (GET_MODE (x), mode, trueop1))
3183 rtx new_rtx = lowpart_subreg (GET_MODE (x), trueop0, mode);
3184 if (new_rtx != NULL_RTX)
3185 return new_rtx;
3189 /* Anything else goes through the loop below. */
3190 default:
3191 break;
3194 mode = GET_MODE (x);
3195 const_arg0 = 0;
3196 const_arg1 = 0;
3197 const_arg2 = 0;
3198 mode_arg0 = VOIDmode;
3200 /* Try folding our operands.
3201 Then see which ones have constant values known. */
3203 fmt = GET_RTX_FORMAT (code);
3204 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
3205 if (fmt[i] == 'e')
3207 rtx folded_arg = XEXP (x, i), const_arg;
3208 machine_mode mode_arg = GET_MODE (folded_arg);
3210 switch (GET_CODE (folded_arg))
3212 case MEM:
3213 case REG:
3214 case SUBREG:
3215 const_arg = equiv_constant (folded_arg);
3216 break;
3218 case CONST:
3219 CASE_CONST_ANY:
3220 case SYMBOL_REF:
3221 case LABEL_REF:
3222 const_arg = folded_arg;
3223 break;
3225 default:
3226 folded_arg = fold_rtx (folded_arg, insn);
3227 const_arg = equiv_constant (folded_arg);
3228 break;
3231 /* For the first three operands, see if the operand
3232 is constant or equivalent to a constant. */
3233 switch (i)
3235 case 0:
3236 folded_arg0 = folded_arg;
3237 const_arg0 = const_arg;
3238 mode_arg0 = mode_arg;
3239 break;
3240 case 1:
3241 folded_arg1 = folded_arg;
3242 const_arg1 = const_arg;
3243 break;
3244 case 2:
3245 const_arg2 = const_arg;
3246 break;
3249 /* Pick the least expensive of the argument and an equivalent constant
3250 argument. */
3251 if (const_arg != 0
3252 && const_arg != folded_arg
3253 && (COST_IN (const_arg, mode_arg, code, i)
3254 <= COST_IN (folded_arg, mode_arg, code, i))
3256 /* It's not safe to substitute the operand of a conversion
3257 operator with a constant, as the conversion's identity
3258 depends upon the mode of its operand. This optimization
3259 is handled by the call to simplify_unary_operation. */
3260 && (GET_RTX_CLASS (code) != RTX_UNARY
3261 || GET_MODE (const_arg) == mode_arg0
3262 || (code != ZERO_EXTEND
3263 && code != SIGN_EXTEND
3264 && code != TRUNCATE
3265 && code != FLOAT_TRUNCATE
3266 && code != FLOAT_EXTEND
3267 && code != FLOAT
3268 && code != FIX
3269 && code != UNSIGNED_FLOAT
3270 && code != UNSIGNED_FIX)))
3271 folded_arg = const_arg;
3273 if (folded_arg == XEXP (x, i))
3274 continue;
3276 if (insn == NULL_RTX && !changed)
3277 x = copy_rtx (x);
3278 changed = 1;
3279 validate_unshare_change (insn, &XEXP (x, i), folded_arg, 1);
3282 if (changed)
3284 /* Canonicalize X if necessary, and keep const_argN and folded_argN
3285 consistent with the order in X. */
3286 if (canonicalize_change_group (insn, x))
3288 std::swap (const_arg0, const_arg1);
3289 std::swap (folded_arg0, folded_arg1);
3292 apply_change_group ();
3295 /* If X is an arithmetic operation, see if we can simplify it. */
3297 switch (GET_RTX_CLASS (code))
3299 case RTX_UNARY:
3301 /* We can't simplify extension ops unless we know the
3302 original mode. */
3303 if ((code == ZERO_EXTEND || code == SIGN_EXTEND)
3304 && mode_arg0 == VOIDmode)
3305 break;
3307 new_rtx = simplify_unary_operation (code, mode,
3308 const_arg0 ? const_arg0 : folded_arg0,
3309 mode_arg0);
3311 break;
3313 case RTX_COMPARE:
3314 case RTX_COMM_COMPARE:
3315 /* See what items are actually being compared and set FOLDED_ARG[01]
3316 to those values and CODE to the actual comparison code. If any are
3317 constant, set CONST_ARG0 and CONST_ARG1 appropriately. We needn't
3318 do anything if both operands are already known to be constant. */
3320 /* ??? Vector mode comparisons are not supported yet. */
3321 if (VECTOR_MODE_P (mode))
3322 break;
3324 if (const_arg0 == 0 || const_arg1 == 0)
3326 struct table_elt *p0, *p1;
3327 rtx true_rtx, false_rtx;
3328 machine_mode mode_arg1;
3330 if (SCALAR_FLOAT_MODE_P (mode))
3332 #ifdef FLOAT_STORE_FLAG_VALUE
3333 true_rtx = (const_double_from_real_value
3334 (FLOAT_STORE_FLAG_VALUE (mode), mode));
3335 #else
3336 true_rtx = NULL_RTX;
3337 #endif
3338 false_rtx = CONST0_RTX (mode);
3340 else
3342 true_rtx = const_true_rtx;
3343 false_rtx = const0_rtx;
3346 code = find_comparison_args (code, &folded_arg0, &folded_arg1,
3347 &mode_arg0, &mode_arg1);
3349 /* If the mode is VOIDmode or a MODE_CC mode, we don't know
3350 what kinds of things are being compared, so we can't do
3351 anything with this comparison. */
3353 if (mode_arg0 == VOIDmode || GET_MODE_CLASS (mode_arg0) == MODE_CC)
3354 break;
3356 const_arg0 = equiv_constant (folded_arg0);
3357 const_arg1 = equiv_constant (folded_arg1);
3359 /* If we do not now have two constants being compared, see
3360 if we can nevertheless deduce some things about the
3361 comparison. */
3362 if (const_arg0 == 0 || const_arg1 == 0)
3364 if (const_arg1 != NULL)
3366 rtx cheapest_simplification;
3367 int cheapest_cost;
3368 rtx simp_result;
3369 struct table_elt *p;
3371 /* See if we can find an equivalent of folded_arg0
3372 that gets us a cheaper expression, possibly a
3373 constant through simplifications. */
3374 p = lookup (folded_arg0, SAFE_HASH (folded_arg0, mode_arg0),
3375 mode_arg0);
3377 if (p != NULL)
3379 cheapest_simplification = x;
3380 cheapest_cost = COST (x, mode);
3382 for (p = p->first_same_value; p != NULL; p = p->next_same_value)
3384 int cost;
3386 /* If the entry isn't valid, skip it. */
3387 if (! exp_equiv_p (p->exp, p->exp, 1, false))
3388 continue;
3390 /* Try to simplify using this equivalence. */
3391 simp_result
3392 = simplify_relational_operation (code, mode,
3393 mode_arg0,
3394 p->exp,
3395 const_arg1);
3397 if (simp_result == NULL)
3398 continue;
3400 cost = COST (simp_result, mode);
3401 if (cost < cheapest_cost)
3403 cheapest_cost = cost;
3404 cheapest_simplification = simp_result;
3408 /* If we have a cheaper expression now, use that
3409 and try folding it further, from the top. */
3410 if (cheapest_simplification != x)
3411 return fold_rtx (copy_rtx (cheapest_simplification),
3412 insn);
3416 /* See if the two operands are the same. */
3418 if ((REG_P (folded_arg0)
3419 && REG_P (folded_arg1)
3420 && (REG_QTY (REGNO (folded_arg0))
3421 == REG_QTY (REGNO (folded_arg1))))
3422 || ((p0 = lookup (folded_arg0,
3423 SAFE_HASH (folded_arg0, mode_arg0),
3424 mode_arg0))
3425 && (p1 = lookup (folded_arg1,
3426 SAFE_HASH (folded_arg1, mode_arg0),
3427 mode_arg0))
3428 && p0->first_same_value == p1->first_same_value))
3429 folded_arg1 = folded_arg0;
3431 /* If FOLDED_ARG0 is a register, see if the comparison we are
3432 doing now is either the same as we did before or the reverse
3433 (we only check the reverse if not floating-point). */
3434 else if (REG_P (folded_arg0))
3436 int qty = REG_QTY (REGNO (folded_arg0));
3438 if (REGNO_QTY_VALID_P (REGNO (folded_arg0)))
3440 struct qty_table_elem *ent = &qty_table[qty];
3442 if ((comparison_dominates_p (ent->comparison_code, code)
3443 || (! FLOAT_MODE_P (mode_arg0)
3444 && comparison_dominates_p (ent->comparison_code,
3445 reverse_condition (code))))
3446 && (rtx_equal_p (ent->comparison_const, folded_arg1)
3447 || (const_arg1
3448 && rtx_equal_p (ent->comparison_const,
3449 const_arg1))
3450 || (REG_P (folded_arg1)
3451 && (REG_QTY (REGNO (folded_arg1)) == ent->comparison_qty))))
3453 if (comparison_dominates_p (ent->comparison_code, code))
3455 if (true_rtx)
3456 return true_rtx;
3457 else
3458 break;
3460 else
3461 return false_rtx;
3468 /* If we are comparing against zero, see if the first operand is
3469 equivalent to an IOR with a constant. If so, we may be able to
3470 determine the result of this comparison. */
3471 if (const_arg1 == const0_rtx && !const_arg0)
3473 rtx y = lookup_as_function (folded_arg0, IOR);
3474 rtx inner_const;
3476 if (y != 0
3477 && (inner_const = equiv_constant (XEXP (y, 1))) != 0
3478 && CONST_INT_P (inner_const)
3479 && INTVAL (inner_const) != 0)
3480 folded_arg0 = gen_rtx_IOR (mode_arg0, XEXP (y, 0), inner_const);
3484 rtx op0 = const_arg0 ? const_arg0 : copy_rtx (folded_arg0);
3485 rtx op1 = const_arg1 ? const_arg1 : copy_rtx (folded_arg1);
3486 new_rtx = simplify_relational_operation (code, mode, mode_arg0,
3487 op0, op1);
3489 break;
3491 case RTX_BIN_ARITH:
3492 case RTX_COMM_ARITH:
3493 switch (code)
3495 case PLUS:
3496 /* If the second operand is a LABEL_REF, see if the first is a MINUS
3497 with that LABEL_REF as its second operand. If so, the result is
3498 the first operand of that MINUS. This handles switches with an
3499 ADDR_DIFF_VEC table. */
3500 if (const_arg1 && GET_CODE (const_arg1) == LABEL_REF)
3502 rtx y
3503 = GET_CODE (folded_arg0) == MINUS ? folded_arg0
3504 : lookup_as_function (folded_arg0, MINUS);
3506 if (y != 0 && GET_CODE (XEXP (y, 1)) == LABEL_REF
3507 && label_ref_label (XEXP (y, 1)) == label_ref_label (const_arg1))
3508 return XEXP (y, 0);
3510 /* Now try for a CONST of a MINUS like the above. */
3511 if ((y = (GET_CODE (folded_arg0) == CONST ? folded_arg0
3512 : lookup_as_function (folded_arg0, CONST))) != 0
3513 && GET_CODE (XEXP (y, 0)) == MINUS
3514 && GET_CODE (XEXP (XEXP (y, 0), 1)) == LABEL_REF
3515 && label_ref_label (XEXP (XEXP (y, 0), 1)) == label_ref_label (const_arg1))
3516 return XEXP (XEXP (y, 0), 0);
3519 /* Likewise if the operands are in the other order. */
3520 if (const_arg0 && GET_CODE (const_arg0) == LABEL_REF)
3522 rtx y
3523 = GET_CODE (folded_arg1) == MINUS ? folded_arg1
3524 : lookup_as_function (folded_arg1, MINUS);
3526 if (y != 0 && GET_CODE (XEXP (y, 1)) == LABEL_REF
3527 && label_ref_label (XEXP (y, 1)) == label_ref_label (const_arg0))
3528 return XEXP (y, 0);
3530 /* Now try for a CONST of a MINUS like the above. */
3531 if ((y = (GET_CODE (folded_arg1) == CONST ? folded_arg1
3532 : lookup_as_function (folded_arg1, CONST))) != 0
3533 && GET_CODE (XEXP (y, 0)) == MINUS
3534 && GET_CODE (XEXP (XEXP (y, 0), 1)) == LABEL_REF
3535 && label_ref_label (XEXP (XEXP (y, 0), 1)) == label_ref_label (const_arg0))
3536 return XEXP (XEXP (y, 0), 0);
3539 /* If second operand is a register equivalent to a negative
3540 CONST_INT, see if we can find a register equivalent to the
3541 positive constant. Make a MINUS if so. Don't do this for
3542 a non-negative constant since we might then alternate between
3543 choosing positive and negative constants. Having the positive
3544 constant previously-used is the more common case. Be sure
3545 the resulting constant is non-negative; if const_arg1 were
3546 the smallest negative number this would overflow: depending
3547 on the mode, this would either just be the same value (and
3548 hence not save anything) or be incorrect. */
3549 if (const_arg1 != 0 && CONST_INT_P (const_arg1)
3550 && INTVAL (const_arg1) < 0
3551 /* This used to test
3553 -INTVAL (const_arg1) >= 0
3555 But The Sun V5.0 compilers mis-compiled that test. So
3556 instead we test for the problematic value in a more direct
3557 manner and hope the Sun compilers get it correct. */
3558 && INTVAL (const_arg1) !=
3559 (HOST_WIDE_INT_1 << (HOST_BITS_PER_WIDE_INT - 1))
3560 && REG_P (folded_arg1))
3562 rtx new_const = GEN_INT (-INTVAL (const_arg1));
3563 struct table_elt *p
3564 = lookup (new_const, SAFE_HASH (new_const, mode), mode);
3566 if (p)
3567 for (p = p->first_same_value; p; p = p->next_same_value)
3568 if (REG_P (p->exp))
3569 return simplify_gen_binary (MINUS, mode, folded_arg0,
3570 canon_reg (p->exp, NULL));
3572 goto from_plus;
3574 case MINUS:
3575 /* If we have (MINUS Y C), see if Y is known to be (PLUS Z C2).
3576 If so, produce (PLUS Z C2-C). */
3577 if (const_arg1 != 0 && poly_int_rtx_p (const_arg1, &xval))
3579 rtx y = lookup_as_function (XEXP (x, 0), PLUS);
3580 if (y && poly_int_rtx_p (XEXP (y, 1)))
3581 return fold_rtx (plus_constant (mode, copy_rtx (y), -xval),
3582 NULL);
3585 /* Fall through. */
3587 from_plus:
3588 case SMIN: case SMAX: case UMIN: case UMAX:
3589 case IOR: case AND: case XOR:
3590 case MULT:
3591 case ASHIFT: case LSHIFTRT: case ASHIFTRT:
3592 /* If we have (<op> <reg> <const_int>) for an associative OP and REG
3593 is known to be of similar form, we may be able to replace the
3594 operation with a combined operation. This may eliminate the
3595 intermediate operation if every use is simplified in this way.
3596 Note that the similar optimization done by combine.c only works
3597 if the intermediate operation's result has only one reference. */
3599 if (REG_P (folded_arg0)
3600 && const_arg1 && CONST_INT_P (const_arg1))
3602 int is_shift
3603 = (code == ASHIFT || code == ASHIFTRT || code == LSHIFTRT);
3604 rtx y, inner_const, new_const;
3605 rtx canon_const_arg1 = const_arg1;
3606 enum rtx_code associate_code;
3608 if (is_shift
3609 && (INTVAL (const_arg1) >= GET_MODE_UNIT_PRECISION (mode)
3610 || INTVAL (const_arg1) < 0))
3612 if (SHIFT_COUNT_TRUNCATED)
3613 canon_const_arg1 = gen_int_shift_amount
3614 (mode, (INTVAL (const_arg1)
3615 & (GET_MODE_UNIT_BITSIZE (mode) - 1)));
3616 else
3617 break;
3620 y = lookup_as_function (folded_arg0, code);
3621 if (y == 0)
3622 break;
3624 /* If we have compiled a statement like
3625 "if (x == (x & mask1))", and now are looking at
3626 "x & mask2", we will have a case where the first operand
3627 of Y is the same as our first operand. Unless we detect
3628 this case, an infinite loop will result. */
3629 if (XEXP (y, 0) == folded_arg0)
3630 break;
3632 inner_const = equiv_constant (fold_rtx (XEXP (y, 1), 0));
3633 if (!inner_const || !CONST_INT_P (inner_const))
3634 break;
3636 /* Don't associate these operations if they are a PLUS with the
3637 same constant and it is a power of two. These might be doable
3638 with a pre- or post-increment. Similarly for two subtracts of
3639 identical powers of two with post decrement. */
3641 if (code == PLUS && const_arg1 == inner_const
3642 && ((HAVE_PRE_INCREMENT
3643 && pow2p_hwi (INTVAL (const_arg1)))
3644 || (HAVE_POST_INCREMENT
3645 && pow2p_hwi (INTVAL (const_arg1)))
3646 || (HAVE_PRE_DECREMENT
3647 && pow2p_hwi (- INTVAL (const_arg1)))
3648 || (HAVE_POST_DECREMENT
3649 && pow2p_hwi (- INTVAL (const_arg1)))))
3650 break;
3652 /* ??? Vector mode shifts by scalar
3653 shift operand are not supported yet. */
3654 if (is_shift && VECTOR_MODE_P (mode))
3655 break;
3657 if (is_shift
3658 && (INTVAL (inner_const) >= GET_MODE_UNIT_PRECISION (mode)
3659 || INTVAL (inner_const) < 0))
3661 if (SHIFT_COUNT_TRUNCATED)
3662 inner_const = gen_int_shift_amount
3663 (mode, (INTVAL (inner_const)
3664 & (GET_MODE_UNIT_BITSIZE (mode) - 1)));
3665 else
3666 break;
3669 /* Compute the code used to compose the constants. For example,
3670 A-C1-C2 is A-(C1 + C2), so if CODE == MINUS, we want PLUS. */
3672 associate_code = (is_shift || code == MINUS ? PLUS : code);
3674 new_const = simplify_binary_operation (associate_code, mode,
3675 canon_const_arg1,
3676 inner_const);
3678 if (new_const == 0)
3679 break;
3681 /* If we are associating shift operations, don't let this
3682 produce a shift of the size of the object or larger.
3683 This could occur when we follow a sign-extend by a right
3684 shift on a machine that does a sign-extend as a pair
3685 of shifts. */
3687 if (is_shift
3688 && CONST_INT_P (new_const)
3689 && INTVAL (new_const) >= GET_MODE_UNIT_PRECISION (mode))
3691 /* As an exception, we can turn an ASHIFTRT of this
3692 form into a shift of the number of bits - 1. */
3693 if (code == ASHIFTRT)
3694 new_const = gen_int_shift_amount
3695 (mode, GET_MODE_UNIT_BITSIZE (mode) - 1);
3696 else if (!side_effects_p (XEXP (y, 0)))
3697 return CONST0_RTX (mode);
3698 else
3699 break;
3702 y = copy_rtx (XEXP (y, 0));
3704 /* If Y contains our first operand (the most common way this
3705 can happen is if Y is a MEM), we would do into an infinite
3706 loop if we tried to fold it. So don't in that case. */
3708 if (! reg_mentioned_p (folded_arg0, y))
3709 y = fold_rtx (y, insn);
3711 return simplify_gen_binary (code, mode, y, new_const);
3713 break;
3715 case DIV: case UDIV:
3716 /* ??? The associative optimization performed immediately above is
3717 also possible for DIV and UDIV using associate_code of MULT.
3718 However, we would need extra code to verify that the
3719 multiplication does not overflow, that is, there is no overflow
3720 in the calculation of new_const. */
3721 break;
3723 default:
3724 break;
3727 new_rtx = simplify_binary_operation (code, mode,
3728 const_arg0 ? const_arg0 : folded_arg0,
3729 const_arg1 ? const_arg1 : folded_arg1);
3730 break;
3732 case RTX_OBJ:
3733 /* (lo_sum (high X) X) is simply X. */
3734 if (code == LO_SUM && const_arg0 != 0
3735 && GET_CODE (const_arg0) == HIGH
3736 && rtx_equal_p (XEXP (const_arg0, 0), const_arg1))
3737 return const_arg1;
3738 break;
3740 case RTX_TERNARY:
3741 case RTX_BITFIELD_OPS:
3742 new_rtx = simplify_ternary_operation (code, mode, mode_arg0,
3743 const_arg0 ? const_arg0 : folded_arg0,
3744 const_arg1 ? const_arg1 : folded_arg1,
3745 const_arg2 ? const_arg2 : XEXP (x, 2));
3746 break;
3748 default:
3749 break;
3752 return new_rtx ? new_rtx : x;
3755 /* Return a constant value currently equivalent to X.
3756 Return 0 if we don't know one. */
3758 static rtx
3759 equiv_constant (rtx x)
3761 if (REG_P (x)
3762 && REGNO_QTY_VALID_P (REGNO (x)))
3764 int x_q = REG_QTY (REGNO (x));
3765 struct qty_table_elem *x_ent = &qty_table[x_q];
3767 if (x_ent->const_rtx)
3768 x = gen_lowpart (GET_MODE (x), x_ent->const_rtx);
3771 if (x == 0 || CONSTANT_P (x))
3772 return x;
3774 if (GET_CODE (x) == SUBREG)
3776 machine_mode mode = GET_MODE (x);
3777 machine_mode imode = GET_MODE (SUBREG_REG (x));
3778 rtx new_rtx;
3780 /* See if we previously assigned a constant value to this SUBREG. */
3781 if ((new_rtx = lookup_as_function (x, CONST_INT)) != 0
3782 || (new_rtx = lookup_as_function (x, CONST_WIDE_INT)) != 0
3783 || (NUM_POLY_INT_COEFFS > 1
3784 && (new_rtx = lookup_as_function (x, CONST_POLY_INT)) != 0)
3785 || (new_rtx = lookup_as_function (x, CONST_DOUBLE)) != 0
3786 || (new_rtx = lookup_as_function (x, CONST_FIXED)) != 0)
3787 return new_rtx;
3789 /* If we didn't and if doing so makes sense, see if we previously
3790 assigned a constant value to the enclosing word mode SUBREG. */
3791 if (known_lt (GET_MODE_SIZE (mode), UNITS_PER_WORD)
3792 && known_lt (UNITS_PER_WORD, GET_MODE_SIZE (imode)))
3794 poly_int64 byte = (SUBREG_BYTE (x)
3795 - subreg_lowpart_offset (mode, word_mode));
3796 if (known_ge (byte, 0) && multiple_p (byte, UNITS_PER_WORD))
3798 rtx y = gen_rtx_SUBREG (word_mode, SUBREG_REG (x), byte);
3799 new_rtx = lookup_as_function (y, CONST_INT);
3800 if (new_rtx)
3801 return gen_lowpart (mode, new_rtx);
3805 /* Otherwise see if we already have a constant for the inner REG,
3806 and if that is enough to calculate an equivalent constant for
3807 the subreg. Note that the upper bits of paradoxical subregs
3808 are undefined, so they cannot be said to equal anything. */
3809 if (REG_P (SUBREG_REG (x))
3810 && !paradoxical_subreg_p (x)
3811 && (new_rtx = equiv_constant (SUBREG_REG (x))) != 0)
3812 return simplify_subreg (mode, new_rtx, imode, SUBREG_BYTE (x));
3814 return 0;
3817 /* If X is a MEM, see if it is a constant-pool reference, or look it up in
3818 the hash table in case its value was seen before. */
3820 if (MEM_P (x))
3822 struct table_elt *elt;
3824 x = avoid_constant_pool_reference (x);
3825 if (CONSTANT_P (x))
3826 return x;
3828 elt = lookup (x, SAFE_HASH (x, GET_MODE (x)), GET_MODE (x));
3829 if (elt == 0)
3830 return 0;
3832 for (elt = elt->first_same_value; elt; elt = elt->next_same_value)
3833 if (elt->is_const && CONSTANT_P (elt->exp))
3834 return elt->exp;
3837 return 0;
3840 /* Given INSN, a jump insn, TAKEN indicates if we are following the
3841 "taken" branch.
3843 In certain cases, this can cause us to add an equivalence. For example,
3844 if we are following the taken case of
3845 if (i == 2)
3846 we can add the fact that `i' and '2' are now equivalent.
3848 In any case, we can record that this comparison was passed. If the same
3849 comparison is seen later, we will know its value. */
3851 static void
3852 record_jump_equiv (rtx_insn *insn, bool taken)
3854 int cond_known_true;
3855 rtx op0, op1;
3856 rtx set;
3857 machine_mode mode, mode0, mode1;
3858 int reversed_nonequality = 0;
3859 enum rtx_code code;
3861 /* Ensure this is the right kind of insn. */
3862 gcc_assert (any_condjump_p (insn));
3864 set = pc_set (insn);
3866 /* See if this jump condition is known true or false. */
3867 if (taken)
3868 cond_known_true = (XEXP (SET_SRC (set), 2) == pc_rtx);
3869 else
3870 cond_known_true = (XEXP (SET_SRC (set), 1) == pc_rtx);
3872 /* Get the type of comparison being done and the operands being compared.
3873 If we had to reverse a non-equality condition, record that fact so we
3874 know that it isn't valid for floating-point. */
3875 code = GET_CODE (XEXP (SET_SRC (set), 0));
3876 op0 = fold_rtx (XEXP (XEXP (SET_SRC (set), 0), 0), insn);
3877 op1 = fold_rtx (XEXP (XEXP (SET_SRC (set), 0), 1), insn);
3879 /* If fold_rtx returns NULL_RTX, there's nothing to record. */
3880 if (op0 == NULL_RTX || op1 == NULL_RTX)
3881 return;
3883 code = find_comparison_args (code, &op0, &op1, &mode0, &mode1);
3884 if (! cond_known_true)
3886 code = reversed_comparison_code_parts (code, op0, op1, insn);
3888 /* Don't remember if we can't find the inverse. */
3889 if (code == UNKNOWN)
3890 return;
3893 /* The mode is the mode of the non-constant. */
3894 mode = mode0;
3895 if (mode1 != VOIDmode)
3896 mode = mode1;
3898 record_jump_cond (code, mode, op0, op1, reversed_nonequality);
3901 /* Yet another form of subreg creation. In this case, we want something in
3902 MODE, and we should assume OP has MODE iff it is naturally modeless. */
3904 static rtx
3905 record_jump_cond_subreg (machine_mode mode, rtx op)
3907 machine_mode op_mode = GET_MODE (op);
3908 if (op_mode == mode || op_mode == VOIDmode)
3909 return op;
3910 return lowpart_subreg (mode, op, op_mode);
3913 /* We know that comparison CODE applied to OP0 and OP1 in MODE is true.
3914 REVERSED_NONEQUALITY is nonzero if CODE had to be swapped.
3915 Make any useful entries we can with that information. Called from
3916 above function and called recursively. */
3918 static void
3919 record_jump_cond (enum rtx_code code, machine_mode mode, rtx op0,
3920 rtx op1, int reversed_nonequality)
3922 unsigned op0_hash, op1_hash;
3923 int op0_in_memory, op1_in_memory;
3924 struct table_elt *op0_elt, *op1_elt;
3926 /* If OP0 and OP1 are known equal, and either is a paradoxical SUBREG,
3927 we know that they are also equal in the smaller mode (this is also
3928 true for all smaller modes whether or not there is a SUBREG, but
3929 is not worth testing for with no SUBREG). */
3931 /* Note that GET_MODE (op0) may not equal MODE. */
3932 if (code == EQ && paradoxical_subreg_p (op0))
3934 machine_mode inner_mode = GET_MODE (SUBREG_REG (op0));
3935 rtx tem = record_jump_cond_subreg (inner_mode, op1);
3936 if (tem)
3937 record_jump_cond (code, mode, SUBREG_REG (op0), tem,
3938 reversed_nonequality);
3941 if (code == EQ && paradoxical_subreg_p (op1))
3943 machine_mode inner_mode = GET_MODE (SUBREG_REG (op1));
3944 rtx tem = record_jump_cond_subreg (inner_mode, op0);
3945 if (tem)
3946 record_jump_cond (code, mode, SUBREG_REG (op1), tem,
3947 reversed_nonequality);
3950 /* Similarly, if this is an NE comparison, and either is a SUBREG
3951 making a smaller mode, we know the whole thing is also NE. */
3953 /* Note that GET_MODE (op0) may not equal MODE;
3954 if we test MODE instead, we can get an infinite recursion
3955 alternating between two modes each wider than MODE. */
3957 if (code == NE
3958 && partial_subreg_p (op0)
3959 && subreg_lowpart_p (op0))
3961 machine_mode inner_mode = GET_MODE (SUBREG_REG (op0));
3962 rtx tem = record_jump_cond_subreg (inner_mode, op1);
3963 if (tem)
3964 record_jump_cond (code, mode, SUBREG_REG (op0), tem,
3965 reversed_nonequality);
3968 if (code == NE
3969 && partial_subreg_p (op1)
3970 && subreg_lowpart_p (op1))
3972 machine_mode inner_mode = GET_MODE (SUBREG_REG (op1));
3973 rtx tem = record_jump_cond_subreg (inner_mode, op0);
3974 if (tem)
3975 record_jump_cond (code, mode, SUBREG_REG (op1), tem,
3976 reversed_nonequality);
3979 /* Hash both operands. */
3981 do_not_record = 0;
3982 hash_arg_in_memory = 0;
3983 op0_hash = HASH (op0, mode);
3984 op0_in_memory = hash_arg_in_memory;
3986 if (do_not_record)
3987 return;
3989 do_not_record = 0;
3990 hash_arg_in_memory = 0;
3991 op1_hash = HASH (op1, mode);
3992 op1_in_memory = hash_arg_in_memory;
3994 if (do_not_record)
3995 return;
3997 /* Look up both operands. */
3998 op0_elt = lookup (op0, op0_hash, mode);
3999 op1_elt = lookup (op1, op1_hash, mode);
4001 /* If both operands are already equivalent or if they are not in the
4002 table but are identical, do nothing. */
4003 if ((op0_elt != 0 && op1_elt != 0
4004 && op0_elt->first_same_value == op1_elt->first_same_value)
4005 || op0 == op1 || rtx_equal_p (op0, op1))
4006 return;
4008 /* If we aren't setting two things equal all we can do is save this
4009 comparison. Similarly if this is floating-point. In the latter
4010 case, OP1 might be zero and both -0.0 and 0.0 are equal to it.
4011 If we record the equality, we might inadvertently delete code
4012 whose intent was to change -0 to +0. */
4014 if (code != EQ || FLOAT_MODE_P (GET_MODE (op0)))
4016 struct qty_table_elem *ent;
4017 int qty;
4019 /* If we reversed a floating-point comparison, if OP0 is not a
4020 register, or if OP1 is neither a register or constant, we can't
4021 do anything. */
4023 if (!REG_P (op1))
4024 op1 = equiv_constant (op1);
4026 if ((reversed_nonequality && FLOAT_MODE_P (mode))
4027 || !REG_P (op0) || op1 == 0)
4028 return;
4030 /* Put OP0 in the hash table if it isn't already. This gives it a
4031 new quantity number. */
4032 if (op0_elt == 0)
4034 if (insert_regs (op0, NULL, 0))
4036 rehash_using_reg (op0);
4037 op0_hash = HASH (op0, mode);
4039 /* If OP0 is contained in OP1, this changes its hash code
4040 as well. Faster to rehash than to check, except
4041 for the simple case of a constant. */
4042 if (! CONSTANT_P (op1))
4043 op1_hash = HASH (op1,mode);
4046 op0_elt = insert (op0, NULL, op0_hash, mode);
4047 op0_elt->in_memory = op0_in_memory;
4050 qty = REG_QTY (REGNO (op0));
4051 ent = &qty_table[qty];
4053 ent->comparison_code = code;
4054 if (REG_P (op1))
4056 /* Look it up again--in case op0 and op1 are the same. */
4057 op1_elt = lookup (op1, op1_hash, mode);
4059 /* Put OP1 in the hash table so it gets a new quantity number. */
4060 if (op1_elt == 0)
4062 if (insert_regs (op1, NULL, 0))
4064 rehash_using_reg (op1);
4065 op1_hash = HASH (op1, mode);
4068 op1_elt = insert (op1, NULL, op1_hash, mode);
4069 op1_elt->in_memory = op1_in_memory;
4072 ent->comparison_const = NULL_RTX;
4073 ent->comparison_qty = REG_QTY (REGNO (op1));
4075 else
4077 ent->comparison_const = op1;
4078 ent->comparison_qty = -1;
4081 return;
4084 /* If either side is still missing an equivalence, make it now,
4085 then merge the equivalences. */
4087 if (op0_elt == 0)
4089 if (insert_regs (op0, NULL, 0))
4091 rehash_using_reg (op0);
4092 op0_hash = HASH (op0, mode);
4095 op0_elt = insert (op0, NULL, op0_hash, mode);
4096 op0_elt->in_memory = op0_in_memory;
4099 if (op1_elt == 0)
4101 if (insert_regs (op1, NULL, 0))
4103 rehash_using_reg (op1);
4104 op1_hash = HASH (op1, mode);
4107 op1_elt = insert (op1, NULL, op1_hash, mode);
4108 op1_elt->in_memory = op1_in_memory;
4111 merge_equiv_classes (op0_elt, op1_elt);
4114 /* CSE processing for one instruction.
4116 Most "true" common subexpressions are mostly optimized away in GIMPLE,
4117 but the few that "leak through" are cleaned up by cse_insn, and complex
4118 addressing modes are often formed here.
4120 The main function is cse_insn, and between here and that function
4121 a couple of helper functions is defined to keep the size of cse_insn
4122 within reasonable proportions.
4124 Data is shared between the main and helper functions via STRUCT SET,
4125 that contains all data related for every set in the instruction that
4126 is being processed.
4128 Note that cse_main processes all sets in the instruction. Most
4129 passes in GCC only process simple SET insns or single_set insns, but
4130 CSE processes insns with multiple sets as well. */
4132 /* Data on one SET contained in the instruction. */
4134 struct set
4136 /* The SET rtx itself. */
4137 rtx rtl;
4138 /* The SET_SRC of the rtx (the original value, if it is changing). */
4139 rtx src;
4140 /* The hash-table element for the SET_SRC of the SET. */
4141 struct table_elt *src_elt;
4142 /* Hash value for the SET_SRC. */
4143 unsigned src_hash;
4144 /* Hash value for the SET_DEST. */
4145 unsigned dest_hash;
4146 /* The SET_DEST, with SUBREG, etc., stripped. */
4147 rtx inner_dest;
4148 /* Nonzero if the SET_SRC is in memory. */
4149 char src_in_memory;
4150 /* Nonzero if the SET_SRC contains something
4151 whose value cannot be predicted and understood. */
4152 char src_volatile;
4153 /* Original machine mode, in case it becomes a CONST_INT.
4154 The size of this field should match the size of the mode
4155 field of struct rtx_def (see rtl.h). */
4156 ENUM_BITFIELD(machine_mode) mode : 8;
4157 /* Hash value of constant equivalent for SET_SRC. */
4158 unsigned src_const_hash;
4159 /* A constant equivalent for SET_SRC, if any. */
4160 rtx src_const;
4161 /* Table entry for constant equivalent for SET_SRC, if any. */
4162 struct table_elt *src_const_elt;
4163 /* Table entry for the destination address. */
4164 struct table_elt *dest_addr_elt;
4167 /* Special handling for (set REG0 REG1) where REG0 is the
4168 "cheapest", cheaper than REG1. After cse, REG1 will probably not
4169 be used in the sequel, so (if easily done) change this insn to
4170 (set REG1 REG0) and replace REG1 with REG0 in the previous insn
4171 that computed their value. Then REG1 will become a dead store
4172 and won't cloud the situation for later optimizations.
4174 Do not make this change if REG1 is a hard register, because it will
4175 then be used in the sequel and we may be changing a two-operand insn
4176 into a three-operand insn.
4178 This is the last transformation that cse_insn will try to do. */
4180 static void
4181 try_back_substitute_reg (rtx set, rtx_insn *insn)
4183 rtx dest = SET_DEST (set);
4184 rtx src = SET_SRC (set);
4186 if (REG_P (dest)
4187 && REG_P (src) && ! HARD_REGISTER_P (src)
4188 && REGNO_QTY_VALID_P (REGNO (src)))
4190 int src_q = REG_QTY (REGNO (src));
4191 struct qty_table_elem *src_ent = &qty_table[src_q];
4193 if (src_ent->first_reg == REGNO (dest))
4195 /* Scan for the previous nonnote insn, but stop at a basic
4196 block boundary. */
4197 rtx_insn *prev = insn;
4198 rtx_insn *bb_head = BB_HEAD (BLOCK_FOR_INSN (insn));
4201 prev = PREV_INSN (prev);
4203 while (prev != bb_head && (NOTE_P (prev) || DEBUG_INSN_P (prev)));
4205 /* Do not swap the registers around if the previous instruction
4206 attaches a REG_EQUIV note to REG1.
4208 ??? It's not entirely clear whether we can transfer a REG_EQUIV
4209 from the pseudo that originally shadowed an incoming argument
4210 to another register. Some uses of REG_EQUIV might rely on it
4211 being attached to REG1 rather than REG2.
4213 This section previously turned the REG_EQUIV into a REG_EQUAL
4214 note. We cannot do that because REG_EQUIV may provide an
4215 uninitialized stack slot when REG_PARM_STACK_SPACE is used. */
4216 if (NONJUMP_INSN_P (prev)
4217 && GET_CODE (PATTERN (prev)) == SET
4218 && SET_DEST (PATTERN (prev)) == src
4219 && ! find_reg_note (prev, REG_EQUIV, NULL_RTX))
4221 rtx note;
4223 validate_change (prev, &SET_DEST (PATTERN (prev)), dest, 1);
4224 validate_change (insn, &SET_DEST (set), src, 1);
4225 validate_change (insn, &SET_SRC (set), dest, 1);
4226 apply_change_group ();
4228 /* If INSN has a REG_EQUAL note, and this note mentions
4229 REG0, then we must delete it, because the value in
4230 REG0 has changed. If the note's value is REG1, we must
4231 also delete it because that is now this insn's dest. */
4232 note = find_reg_note (insn, REG_EQUAL, NULL_RTX);
4233 if (note != 0
4234 && (reg_mentioned_p (dest, XEXP (note, 0))
4235 || rtx_equal_p (src, XEXP (note, 0))))
4236 remove_note (insn, note);
4238 /* If INSN has a REG_ARGS_SIZE note, move it to PREV. */
4239 note = find_reg_note (insn, REG_ARGS_SIZE, NULL_RTX);
4240 if (note != 0)
4242 remove_note (insn, note);
4243 gcc_assert (!find_reg_note (prev, REG_ARGS_SIZE, NULL_RTX));
4244 set_unique_reg_note (prev, REG_ARGS_SIZE, XEXP (note, 0));
4251 /* Record all the SETs in this instruction into SETS_PTR,
4252 and return the number of recorded sets. */
4253 static int
4254 find_sets_in_insn (rtx_insn *insn, struct set **psets)
4256 struct set *sets = *psets;
4257 int n_sets = 0;
4258 rtx x = PATTERN (insn);
4260 if (GET_CODE (x) == SET)
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)
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)
4277 else
4278 sets[n_sets++].rtl = x;
4280 else if (GET_CODE (x) == PARALLEL)
4282 int i, lim = XVECLEN (x, 0);
4284 /* Go over the expressions of the PARALLEL in forward order, to
4285 put them in the same order in the SETS array. */
4286 for (i = 0; i < lim; i++)
4288 rtx y = XVECEXP (x, 0, i);
4289 if (GET_CODE (y) == SET)
4291 /* As above, we ignore unconditional jumps and call-insns and
4292 ignore the result of apply_change_group. */
4293 if (SET_DEST (y) == pc_rtx
4294 && GET_CODE (SET_SRC (y)) == LABEL_REF)
4296 else if (GET_CODE (SET_SRC (y)) == CALL)
4298 else
4299 sets[n_sets++].rtl = y;
4304 return n_sets;
4307 /* Subroutine of canonicalize_insn. X is an ASM_OPERANDS in INSN. */
4309 static void
4310 canon_asm_operands (rtx x, rtx_insn *insn)
4312 for (int i = ASM_OPERANDS_INPUT_LENGTH (x) - 1; i >= 0; i--)
4314 rtx input = ASM_OPERANDS_INPUT (x, i);
4315 if (!(REG_P (input) && HARD_REGISTER_P (input)))
4317 input = canon_reg (input, insn);
4318 validate_change (insn, &ASM_OPERANDS_INPUT (x, i), input, 1);
4323 /* Where possible, substitute every register reference in the N_SETS
4324 number of SETS in INSN with the canonical register.
4326 Register canonicalization propagatest the earliest register (i.e.
4327 one that is set before INSN) with the same value. This is a very
4328 useful, simple form of CSE, to clean up warts from expanding GIMPLE
4329 to RTL. For instance, a CONST for an address is usually expanded
4330 multiple times to loads into different registers, thus creating many
4331 subexpressions of the form:
4333 (set (reg1) (some_const))
4334 (set (mem (... reg1 ...) (thing)))
4335 (set (reg2) (some_const))
4336 (set (mem (... reg2 ...) (thing)))
4338 After canonicalizing, the code takes the following form:
4340 (set (reg1) (some_const))
4341 (set (mem (... reg1 ...) (thing)))
4342 (set (reg2) (some_const))
4343 (set (mem (... reg1 ...) (thing)))
4345 The set to reg2 is now trivially dead, and the memory reference (or
4346 address, or whatever) may be a candidate for further CSEing.
4348 In this function, the result of apply_change_group can be ignored;
4349 see canon_reg. */
4351 static void
4352 canonicalize_insn (rtx_insn *insn, struct set **psets, int n_sets)
4354 struct set *sets = *psets;
4355 rtx tem;
4356 rtx x = PATTERN (insn);
4357 int i;
4359 if (CALL_P (insn))
4361 for (tem = CALL_INSN_FUNCTION_USAGE (insn); tem; tem = XEXP (tem, 1))
4362 if (GET_CODE (XEXP (tem, 0)) != SET)
4363 XEXP (tem, 0) = canon_reg (XEXP (tem, 0), insn);
4366 if (GET_CODE (x) == SET && GET_CODE (SET_SRC (x)) == CALL)
4368 canon_reg (SET_SRC (x), insn);
4369 apply_change_group ();
4370 fold_rtx (SET_SRC (x), insn);
4372 else if (GET_CODE (x) == CLOBBER)
4374 /* If we clobber memory, canon the address.
4375 This does nothing when a register is clobbered
4376 because we have already invalidated the reg. */
4377 if (MEM_P (XEXP (x, 0)))
4378 canon_reg (XEXP (x, 0), insn);
4380 else if (GET_CODE (x) == USE
4381 && ! (REG_P (XEXP (x, 0))
4382 && REGNO (XEXP (x, 0)) < FIRST_PSEUDO_REGISTER))
4383 /* Canonicalize a USE of a pseudo register or memory location. */
4384 canon_reg (x, insn);
4385 else if (GET_CODE (x) == ASM_OPERANDS)
4386 canon_asm_operands (x, insn);
4387 else if (GET_CODE (x) == CALL)
4389 canon_reg (x, insn);
4390 apply_change_group ();
4391 fold_rtx (x, insn);
4393 else if (DEBUG_INSN_P (insn))
4394 canon_reg (PATTERN (insn), insn);
4395 else if (GET_CODE (x) == PARALLEL)
4397 for (i = XVECLEN (x, 0) - 1; i >= 0; i--)
4399 rtx y = XVECEXP (x, 0, i);
4400 if (GET_CODE (y) == SET && GET_CODE (SET_SRC (y)) == CALL)
4402 canon_reg (SET_SRC (y), insn);
4403 apply_change_group ();
4404 fold_rtx (SET_SRC (y), insn);
4406 else if (GET_CODE (y) == CLOBBER)
4408 if (MEM_P (XEXP (y, 0)))
4409 canon_reg (XEXP (y, 0), insn);
4411 else if (GET_CODE (y) == USE
4412 && ! (REG_P (XEXP (y, 0))
4413 && REGNO (XEXP (y, 0)) < FIRST_PSEUDO_REGISTER))
4414 canon_reg (y, insn);
4415 else if (GET_CODE (y) == ASM_OPERANDS)
4416 canon_asm_operands (y, insn);
4417 else if (GET_CODE (y) == CALL)
4419 canon_reg (y, insn);
4420 apply_change_group ();
4421 fold_rtx (y, insn);
4426 if (n_sets == 1 && REG_NOTES (insn) != 0
4427 && (tem = find_reg_note (insn, REG_EQUAL, NULL_RTX)) != 0)
4429 /* We potentially will process this insn many times. Therefore,
4430 drop the REG_EQUAL note if it is equal to the SET_SRC of the
4431 unique set in INSN.
4433 Do not do so if the REG_EQUAL note is for a STRICT_LOW_PART,
4434 because cse_insn handles those specially. */
4435 if (GET_CODE (SET_DEST (sets[0].rtl)) != STRICT_LOW_PART
4436 && rtx_equal_p (XEXP (tem, 0), SET_SRC (sets[0].rtl)))
4437 remove_note (insn, tem);
4438 else
4440 canon_reg (XEXP (tem, 0), insn);
4441 apply_change_group ();
4442 XEXP (tem, 0) = fold_rtx (XEXP (tem, 0), insn);
4443 df_notes_rescan (insn);
4447 /* Canonicalize sources and addresses of destinations.
4448 We do this in a separate pass to avoid problems when a MATCH_DUP is
4449 present in the insn pattern. In that case, we want to ensure that
4450 we don't break the duplicate nature of the pattern. So we will replace
4451 both operands at the same time. Otherwise, we would fail to find an
4452 equivalent substitution in the loop calling validate_change below.
4454 We used to suppress canonicalization of DEST if it appears in SRC,
4455 but we don't do this any more. */
4457 for (i = 0; i < n_sets; i++)
4459 rtx dest = SET_DEST (sets[i].rtl);
4460 rtx src = SET_SRC (sets[i].rtl);
4461 rtx new_rtx = canon_reg (src, insn);
4463 validate_change (insn, &SET_SRC (sets[i].rtl), new_rtx, 1);
4465 if (GET_CODE (dest) == ZERO_EXTRACT)
4467 validate_change (insn, &XEXP (dest, 1),
4468 canon_reg (XEXP (dest, 1), insn), 1);
4469 validate_change (insn, &XEXP (dest, 2),
4470 canon_reg (XEXP (dest, 2), insn), 1);
4473 while (GET_CODE (dest) == SUBREG
4474 || GET_CODE (dest) == ZERO_EXTRACT
4475 || GET_CODE (dest) == STRICT_LOW_PART)
4476 dest = XEXP (dest, 0);
4478 if (MEM_P (dest))
4479 canon_reg (dest, insn);
4482 /* Now that we have done all the replacements, we can apply the change
4483 group and see if they all work. Note that this will cause some
4484 canonicalizations that would have worked individually not to be applied
4485 because some other canonicalization didn't work, but this should not
4486 occur often.
4488 The result of apply_change_group can be ignored; see canon_reg. */
4490 apply_change_group ();
4493 /* Main function of CSE.
4494 First simplify sources and addresses of all assignments
4495 in the instruction, using previously-computed equivalents values.
4496 Then install the new sources and destinations in the table
4497 of available values. */
4499 static void
4500 cse_insn (rtx_insn *insn)
4502 rtx x = PATTERN (insn);
4503 int i;
4504 rtx tem;
4505 int n_sets = 0;
4507 rtx src_eqv = 0;
4508 struct table_elt *src_eqv_elt = 0;
4509 int src_eqv_volatile = 0;
4510 int src_eqv_in_memory = 0;
4511 unsigned src_eqv_hash = 0;
4513 struct set *sets = (struct set *) 0;
4515 if (GET_CODE (x) == SET)
4516 sets = XALLOCA (struct set);
4517 else if (GET_CODE (x) == PARALLEL)
4518 sets = XALLOCAVEC (struct set, XVECLEN (x, 0));
4520 this_insn = insn;
4522 /* Find all regs explicitly clobbered in this insn,
4523 to ensure they are not replaced with any other regs
4524 elsewhere in this insn. */
4525 invalidate_from_sets_and_clobbers (insn);
4527 /* Record all the SETs in this instruction. */
4528 n_sets = find_sets_in_insn (insn, &sets);
4530 /* Substitute the canonical register where possible. */
4531 canonicalize_insn (insn, &sets, n_sets);
4533 /* If this insn has a REG_EQUAL note, store the equivalent value in SRC_EQV,
4534 if different, or if the DEST is a STRICT_LOW_PART/ZERO_EXTRACT. The
4535 latter condition is necessary because SRC_EQV is handled specially for
4536 this case, and if it isn't set, then there will be no equivalence
4537 for the destination. */
4538 if (n_sets == 1 && REG_NOTES (insn) != 0
4539 && (tem = find_reg_note (insn, REG_EQUAL, NULL_RTX)) != 0)
4542 if (GET_CODE (SET_DEST (sets[0].rtl)) != ZERO_EXTRACT
4543 && (! rtx_equal_p (XEXP (tem, 0), SET_SRC (sets[0].rtl))
4544 || GET_CODE (SET_DEST (sets[0].rtl)) == STRICT_LOW_PART))
4545 src_eqv = copy_rtx (XEXP (tem, 0));
4546 /* If DEST is of the form ZERO_EXTACT, as in:
4547 (set (zero_extract:SI (reg:SI 119)
4548 (const_int 16 [0x10])
4549 (const_int 16 [0x10]))
4550 (const_int 51154 [0xc7d2]))
4551 REG_EQUAL note will specify the value of register (reg:SI 119) at this
4552 point. Note that this is different from SRC_EQV. We can however
4553 calculate SRC_EQV with the position and width of ZERO_EXTRACT. */
4554 else if (GET_CODE (SET_DEST (sets[0].rtl)) == ZERO_EXTRACT
4555 && CONST_INT_P (XEXP (tem, 0))
4556 && CONST_INT_P (XEXP (SET_DEST (sets[0].rtl), 1))
4557 && CONST_INT_P (XEXP (SET_DEST (sets[0].rtl), 2)))
4559 rtx dest_reg = XEXP (SET_DEST (sets[0].rtl), 0);
4560 /* This is the mode of XEXP (tem, 0) as well. */
4561 scalar_int_mode dest_mode
4562 = as_a <scalar_int_mode> (GET_MODE (dest_reg));
4563 rtx width = XEXP (SET_DEST (sets[0].rtl), 1);
4564 rtx pos = XEXP (SET_DEST (sets[0].rtl), 2);
4565 HOST_WIDE_INT val = INTVAL (XEXP (tem, 0));
4566 HOST_WIDE_INT mask;
4567 unsigned int shift;
4568 if (BITS_BIG_ENDIAN)
4569 shift = (GET_MODE_PRECISION (dest_mode)
4570 - INTVAL (pos) - INTVAL (width));
4571 else
4572 shift = INTVAL (pos);
4573 if (INTVAL (width) == HOST_BITS_PER_WIDE_INT)
4574 mask = HOST_WIDE_INT_M1;
4575 else
4576 mask = (HOST_WIDE_INT_1 << INTVAL (width)) - 1;
4577 val = (val >> shift) & mask;
4578 src_eqv = GEN_INT (val);
4582 /* Set sets[i].src_elt to the class each source belongs to.
4583 Detect assignments from or to volatile things
4584 and set set[i] to zero so they will be ignored
4585 in the rest of this function.
4587 Nothing in this loop changes the hash table or the register chains. */
4589 for (i = 0; i < n_sets; i++)
4591 bool repeat = false;
4592 bool noop_insn = false;
4593 rtx src, dest;
4594 rtx src_folded;
4595 struct table_elt *elt = 0, *p;
4596 machine_mode mode;
4597 rtx src_eqv_here;
4598 rtx src_const = 0;
4599 rtx src_related = 0;
4600 bool src_related_is_const_anchor = false;
4601 struct table_elt *src_const_elt = 0;
4602 int src_cost = MAX_COST;
4603 int src_eqv_cost = MAX_COST;
4604 int src_folded_cost = MAX_COST;
4605 int src_related_cost = MAX_COST;
4606 int src_elt_cost = MAX_COST;
4607 int src_regcost = MAX_COST;
4608 int src_eqv_regcost = MAX_COST;
4609 int src_folded_regcost = MAX_COST;
4610 int src_related_regcost = MAX_COST;
4611 int src_elt_regcost = MAX_COST;
4612 /* Set nonzero if we need to call force_const_mem on with the
4613 contents of src_folded before using it. */
4614 int src_folded_force_flag = 0;
4615 scalar_int_mode int_mode;
4617 dest = SET_DEST (sets[i].rtl);
4618 src = SET_SRC (sets[i].rtl);
4620 /* If SRC is a constant that has no machine mode,
4621 hash it with the destination's machine mode.
4622 This way we can keep different modes separate. */
4624 mode = GET_MODE (src) == VOIDmode ? GET_MODE (dest) : GET_MODE (src);
4625 sets[i].mode = mode;
4627 if (src_eqv)
4629 machine_mode eqvmode = mode;
4630 if (GET_CODE (dest) == STRICT_LOW_PART)
4631 eqvmode = GET_MODE (SUBREG_REG (XEXP (dest, 0)));
4632 do_not_record = 0;
4633 hash_arg_in_memory = 0;
4634 src_eqv_hash = HASH (src_eqv, eqvmode);
4636 /* Find the equivalence class for the equivalent expression. */
4638 if (!do_not_record)
4639 src_eqv_elt = lookup (src_eqv, src_eqv_hash, eqvmode);
4641 src_eqv_volatile = do_not_record;
4642 src_eqv_in_memory = hash_arg_in_memory;
4645 /* If this is a STRICT_LOW_PART assignment, src_eqv corresponds to the
4646 value of the INNER register, not the destination. So it is not
4647 a valid substitution for the source. But save it for later. */
4648 if (GET_CODE (dest) == STRICT_LOW_PART)
4649 src_eqv_here = 0;
4650 else
4651 src_eqv_here = src_eqv;
4653 /* Simplify and foldable subexpressions in SRC. Then get the fully-
4654 simplified result, which may not necessarily be valid. */
4655 src_folded = fold_rtx (src, NULL);
4657 #if 0
4658 /* ??? This caused bad code to be generated for the m68k port with -O2.
4659 Suppose src is (CONST_INT -1), and that after truncation src_folded
4660 is (CONST_INT 3). Suppose src_folded is then used for src_const.
4661 At the end we will add src and src_const to the same equivalence
4662 class. We now have 3 and -1 on the same equivalence class. This
4663 causes later instructions to be mis-optimized. */
4664 /* If storing a constant in a bitfield, pre-truncate the constant
4665 so we will be able to record it later. */
4666 if (GET_CODE (SET_DEST (sets[i].rtl)) == ZERO_EXTRACT)
4668 rtx width = XEXP (SET_DEST (sets[i].rtl), 1);
4670 if (CONST_INT_P (src)
4671 && CONST_INT_P (width)
4672 && INTVAL (width) < HOST_BITS_PER_WIDE_INT
4673 && (INTVAL (src) & ((HOST_WIDE_INT) (-1) << INTVAL (width))))
4674 src_folded
4675 = GEN_INT (INTVAL (src) & ((HOST_WIDE_INT_1
4676 << INTVAL (width)) - 1));
4678 #endif
4680 /* Compute SRC's hash code, and also notice if it
4681 should not be recorded at all. In that case,
4682 prevent any further processing of this assignment.
4684 We set DO_NOT_RECORD if the destination has a REG_UNUSED note.
4685 This avoids getting the source register into the tables, where it
4686 may be invalidated later (via REG_QTY), then trigger an ICE upon
4687 re-insertion.
4689 This is only a problem in multi-set insns. If it were a single
4690 set the dead copy would have been removed. If the RHS were anything
4691 but a simple REG, then we won't call insert_regs and thus there's
4692 no potential for triggering the ICE. */
4693 do_not_record = (REG_P (dest)
4694 && REG_P (src)
4695 && find_reg_note (insn, REG_UNUSED, dest));
4696 hash_arg_in_memory = 0;
4698 sets[i].src = src;
4699 sets[i].src_hash = HASH (src, mode);
4700 sets[i].src_volatile = do_not_record;
4701 sets[i].src_in_memory = hash_arg_in_memory;
4703 /* If SRC is a MEM, there is a REG_EQUIV note for SRC, and DEST is
4704 a pseudo, do not record SRC. Using SRC as a replacement for
4705 anything else will be incorrect in that situation. Note that
4706 this usually occurs only for stack slots, in which case all the
4707 RTL would be referring to SRC, so we don't lose any optimization
4708 opportunities by not having SRC in the hash table. */
4710 if (MEM_P (src)
4711 && find_reg_note (insn, REG_EQUIV, NULL_RTX) != 0
4712 && REG_P (dest)
4713 && REGNO (dest) >= FIRST_PSEUDO_REGISTER)
4714 sets[i].src_volatile = 1;
4716 else if (GET_CODE (src) == ASM_OPERANDS
4717 && GET_CODE (x) == PARALLEL)
4719 /* Do not record result of a non-volatile inline asm with
4720 more than one result. */
4721 if (n_sets > 1)
4722 sets[i].src_volatile = 1;
4724 int j, lim = XVECLEN (x, 0);
4725 for (j = 0; j < lim; j++)
4727 rtx y = XVECEXP (x, 0, j);
4728 /* And do not record result of a non-volatile inline asm
4729 with "memory" clobber. */
4730 if (GET_CODE (y) == CLOBBER && MEM_P (XEXP (y, 0)))
4732 sets[i].src_volatile = 1;
4733 break;
4738 #if 0
4739 /* It is no longer clear why we used to do this, but it doesn't
4740 appear to still be needed. So let's try without it since this
4741 code hurts cse'ing widened ops. */
4742 /* If source is a paradoxical subreg (such as QI treated as an SI),
4743 treat it as volatile. It may do the work of an SI in one context
4744 where the extra bits are not being used, but cannot replace an SI
4745 in general. */
4746 if (paradoxical_subreg_p (src))
4747 sets[i].src_volatile = 1;
4748 #endif
4750 /* Locate all possible equivalent forms for SRC. Try to replace
4751 SRC in the insn with each cheaper equivalent.
4753 We have the following types of equivalents: SRC itself, a folded
4754 version, a value given in a REG_EQUAL note, or a value related
4755 to a constant.
4757 Each of these equivalents may be part of an additional class
4758 of equivalents (if more than one is in the table, they must be in
4759 the same class; we check for this).
4761 If the source is volatile, we don't do any table lookups.
4763 We note any constant equivalent for possible later use in a
4764 REG_NOTE. */
4766 if (!sets[i].src_volatile)
4767 elt = lookup (src, sets[i].src_hash, mode);
4769 sets[i].src_elt = elt;
4771 if (elt && src_eqv_here && src_eqv_elt)
4773 if (elt->first_same_value != src_eqv_elt->first_same_value)
4775 /* The REG_EQUAL is indicating that two formerly distinct
4776 classes are now equivalent. So merge them. */
4777 merge_equiv_classes (elt, src_eqv_elt);
4778 src_eqv_hash = HASH (src_eqv, elt->mode);
4779 src_eqv_elt = lookup (src_eqv, src_eqv_hash, elt->mode);
4782 src_eqv_here = 0;
4785 else if (src_eqv_elt)
4786 elt = src_eqv_elt;
4788 /* Try to find a constant somewhere and record it in `src_const'.
4789 Record its table element, if any, in `src_const_elt'. Look in
4790 any known equivalences first. (If the constant is not in the
4791 table, also set `sets[i].src_const_hash'). */
4792 if (elt)
4793 for (p = elt->first_same_value; p; p = p->next_same_value)
4794 if (p->is_const)
4796 src_const = p->exp;
4797 src_const_elt = elt;
4798 break;
4801 if (src_const == 0
4802 && (CONSTANT_P (src_folded)
4803 /* Consider (minus (label_ref L1) (label_ref L2)) as
4804 "constant" here so we will record it. This allows us
4805 to fold switch statements when an ADDR_DIFF_VEC is used. */
4806 || (GET_CODE (src_folded) == MINUS
4807 && GET_CODE (XEXP (src_folded, 0)) == LABEL_REF
4808 && GET_CODE (XEXP (src_folded, 1)) == LABEL_REF)))
4809 src_const = src_folded, src_const_elt = elt;
4810 else if (src_const == 0 && src_eqv_here && CONSTANT_P (src_eqv_here))
4811 src_const = src_eqv_here, src_const_elt = src_eqv_elt;
4813 /* If we don't know if the constant is in the table, get its
4814 hash code and look it up. */
4815 if (src_const && src_const_elt == 0)
4817 sets[i].src_const_hash = HASH (src_const, mode);
4818 src_const_elt = lookup (src_const, sets[i].src_const_hash, mode);
4821 sets[i].src_const = src_const;
4822 sets[i].src_const_elt = src_const_elt;
4824 /* If the constant and our source are both in the table, mark them as
4825 equivalent. Otherwise, if a constant is in the table but the source
4826 isn't, set ELT to it. */
4827 if (src_const_elt && elt
4828 && src_const_elt->first_same_value != elt->first_same_value)
4829 merge_equiv_classes (elt, src_const_elt);
4830 else if (src_const_elt && elt == 0)
4831 elt = src_const_elt;
4833 /* See if there is a register linearly related to a constant
4834 equivalent of SRC. */
4835 if (src_const
4836 && (GET_CODE (src_const) == CONST
4837 || (src_const_elt && src_const_elt->related_value != 0)))
4839 src_related = use_related_value (src_const, src_const_elt);
4840 if (src_related)
4842 struct table_elt *src_related_elt
4843 = lookup (src_related, HASH (src_related, mode), mode);
4844 if (src_related_elt && elt)
4846 if (elt->first_same_value
4847 != src_related_elt->first_same_value)
4848 /* This can occur when we previously saw a CONST
4849 involving a SYMBOL_REF and then see the SYMBOL_REF
4850 twice. Merge the involved classes. */
4851 merge_equiv_classes (elt, src_related_elt);
4853 src_related = 0;
4854 src_related_elt = 0;
4856 else if (src_related_elt && elt == 0)
4857 elt = src_related_elt;
4861 /* See if we have a CONST_INT that is already in a register in a
4862 wider mode. */
4864 if (src_const && src_related == 0 && CONST_INT_P (src_const)
4865 && is_int_mode (mode, &int_mode)
4866 && GET_MODE_PRECISION (int_mode) < BITS_PER_WORD)
4868 opt_scalar_int_mode wider_mode_iter;
4869 FOR_EACH_WIDER_MODE (wider_mode_iter, int_mode)
4871 scalar_int_mode wider_mode = wider_mode_iter.require ();
4872 if (GET_MODE_PRECISION (wider_mode) > BITS_PER_WORD)
4873 break;
4875 struct table_elt *const_elt
4876 = lookup (src_const, HASH (src_const, wider_mode), wider_mode);
4878 if (const_elt == 0)
4879 continue;
4881 for (const_elt = const_elt->first_same_value;
4882 const_elt; const_elt = const_elt->next_same_value)
4883 if (REG_P (const_elt->exp))
4885 src_related = gen_lowpart (int_mode, const_elt->exp);
4886 break;
4889 if (src_related != 0)
4890 break;
4894 /* Another possibility is that we have an AND with a constant in
4895 a mode narrower than a word. If so, it might have been generated
4896 as part of an "if" which would narrow the AND. If we already
4897 have done the AND in a wider mode, we can use a SUBREG of that
4898 value. */
4900 if (flag_expensive_optimizations && ! src_related
4901 && is_a <scalar_int_mode> (mode, &int_mode)
4902 && GET_CODE (src) == AND && CONST_INT_P (XEXP (src, 1))
4903 && GET_MODE_SIZE (int_mode) < UNITS_PER_WORD)
4905 opt_scalar_int_mode tmode_iter;
4906 rtx new_and = gen_rtx_AND (VOIDmode, NULL_RTX, XEXP (src, 1));
4908 FOR_EACH_WIDER_MODE (tmode_iter, int_mode)
4910 scalar_int_mode tmode = tmode_iter.require ();
4911 if (GET_MODE_SIZE (tmode) > UNITS_PER_WORD)
4912 break;
4914 rtx inner = gen_lowpart (tmode, XEXP (src, 0));
4915 struct table_elt *larger_elt;
4917 if (inner)
4919 PUT_MODE (new_and, tmode);
4920 XEXP (new_and, 0) = inner;
4921 larger_elt = lookup (new_and, HASH (new_and, tmode), tmode);
4922 if (larger_elt == 0)
4923 continue;
4925 for (larger_elt = larger_elt->first_same_value;
4926 larger_elt; larger_elt = larger_elt->next_same_value)
4927 if (REG_P (larger_elt->exp))
4929 src_related
4930 = gen_lowpart (int_mode, larger_elt->exp);
4931 break;
4934 if (src_related)
4935 break;
4940 /* See if a MEM has already been loaded with a widening operation;
4941 if it has, we can use a subreg of that. Many CISC machines
4942 also have such operations, but this is only likely to be
4943 beneficial on these machines. */
4945 rtx_code extend_op;
4946 if (flag_expensive_optimizations && src_related == 0
4947 && MEM_P (src) && ! do_not_record
4948 && is_a <scalar_int_mode> (mode, &int_mode)
4949 && (extend_op = load_extend_op (int_mode)) != UNKNOWN)
4951 struct rtx_def memory_extend_buf;
4952 rtx memory_extend_rtx = &memory_extend_buf;
4954 /* Set what we are trying to extend and the operation it might
4955 have been extended with. */
4956 memset (memory_extend_rtx, 0, sizeof (*memory_extend_rtx));
4957 PUT_CODE (memory_extend_rtx, extend_op);
4958 XEXP (memory_extend_rtx, 0) = src;
4960 opt_scalar_int_mode tmode_iter;
4961 FOR_EACH_WIDER_MODE (tmode_iter, int_mode)
4963 struct table_elt *larger_elt;
4965 scalar_int_mode tmode = tmode_iter.require ();
4966 if (GET_MODE_SIZE (tmode) > UNITS_PER_WORD)
4967 break;
4969 PUT_MODE (memory_extend_rtx, tmode);
4970 larger_elt = lookup (memory_extend_rtx,
4971 HASH (memory_extend_rtx, tmode), tmode);
4972 if (larger_elt == 0)
4973 continue;
4975 for (larger_elt = larger_elt->first_same_value;
4976 larger_elt; larger_elt = larger_elt->next_same_value)
4977 if (REG_P (larger_elt->exp))
4979 src_related = gen_lowpart (int_mode, larger_elt->exp);
4980 break;
4983 if (src_related)
4984 break;
4988 /* Try to express the constant using a register+offset expression
4989 derived from a constant anchor. */
4991 if (targetm.const_anchor
4992 && !src_related
4993 && src_const
4994 && GET_CODE (src_const) == CONST_INT)
4996 src_related = try_const_anchors (src_const, mode);
4997 src_related_is_const_anchor = src_related != NULL_RTX;
5001 if (src == src_folded)
5002 src_folded = 0;
5004 /* At this point, ELT, if nonzero, points to a class of expressions
5005 equivalent to the source of this SET and SRC, SRC_EQV, SRC_FOLDED,
5006 and SRC_RELATED, if nonzero, each contain additional equivalent
5007 expressions. Prune these latter expressions by deleting expressions
5008 already in the equivalence class.
5010 Check for an equivalent identical to the destination. If found,
5011 this is the preferred equivalent since it will likely lead to
5012 elimination of the insn. Indicate this by placing it in
5013 `src_related'. */
5015 if (elt)
5016 elt = elt->first_same_value;
5017 for (p = elt; p; p = p->next_same_value)
5019 enum rtx_code code = GET_CODE (p->exp);
5021 /* If the expression is not valid, ignore it. Then we do not
5022 have to check for validity below. In most cases, we can use
5023 `rtx_equal_p', since canonicalization has already been done. */
5024 if (code != REG && ! exp_equiv_p (p->exp, p->exp, 1, false))
5025 continue;
5027 /* Also skip paradoxical subregs, unless that's what we're
5028 looking for. */
5029 if (paradoxical_subreg_p (p->exp)
5030 && ! (src != 0
5031 && GET_CODE (src) == SUBREG
5032 && GET_MODE (src) == GET_MODE (p->exp)
5033 && partial_subreg_p (GET_MODE (SUBREG_REG (src)),
5034 GET_MODE (SUBREG_REG (p->exp)))))
5035 continue;
5037 if (src && GET_CODE (src) == code && rtx_equal_p (src, p->exp))
5038 src = 0;
5039 else if (src_folded && GET_CODE (src_folded) == code
5040 && rtx_equal_p (src_folded, p->exp))
5041 src_folded = 0;
5042 else if (src_eqv_here && GET_CODE (src_eqv_here) == code
5043 && rtx_equal_p (src_eqv_here, p->exp))
5044 src_eqv_here = 0;
5045 else if (src_related && GET_CODE (src_related) == code
5046 && rtx_equal_p (src_related, p->exp))
5047 src_related = 0;
5049 /* This is the same as the destination of the insns, we want
5050 to prefer it. Copy it to src_related. The code below will
5051 then give it a negative cost. */
5052 if (GET_CODE (dest) == code && rtx_equal_p (p->exp, dest))
5053 src_related = p->exp;
5056 /* Find the cheapest valid equivalent, trying all the available
5057 possibilities. Prefer items not in the hash table to ones
5058 that are when they are equal cost. Note that we can never
5059 worsen an insn as the current contents will also succeed.
5060 If we find an equivalent identical to the destination, use it as best,
5061 since this insn will probably be eliminated in that case. */
5062 if (src)
5064 if (rtx_equal_p (src, dest))
5065 src_cost = src_regcost = -1;
5066 else
5068 src_cost = COST (src, mode);
5069 src_regcost = approx_reg_cost (src);
5073 if (src_eqv_here)
5075 if (rtx_equal_p (src_eqv_here, dest))
5076 src_eqv_cost = src_eqv_regcost = -1;
5077 else
5079 src_eqv_cost = COST (src_eqv_here, mode);
5080 src_eqv_regcost = approx_reg_cost (src_eqv_here);
5084 if (src_folded)
5086 if (rtx_equal_p (src_folded, dest))
5087 src_folded_cost = src_folded_regcost = -1;
5088 else
5090 src_folded_cost = COST (src_folded, mode);
5091 src_folded_regcost = approx_reg_cost (src_folded);
5095 if (src_related)
5097 if (rtx_equal_p (src_related, dest))
5098 src_related_cost = src_related_regcost = -1;
5099 else
5101 src_related_cost = COST (src_related, mode);
5102 src_related_regcost = approx_reg_cost (src_related);
5104 /* If a const-anchor is used to synthesize a constant that
5105 normally requires multiple instructions then slightly prefer
5106 it over the original sequence. These instructions are likely
5107 to become redundant now. We can't compare against the cost
5108 of src_eqv_here because, on MIPS for example, multi-insn
5109 constants have zero cost; they are assumed to be hoisted from
5110 loops. */
5111 if (src_related_is_const_anchor
5112 && src_related_cost == src_cost
5113 && src_eqv_here)
5114 src_related_cost--;
5118 /* If this was an indirect jump insn, a known label will really be
5119 cheaper even though it looks more expensive. */
5120 if (dest == pc_rtx && src_const && GET_CODE (src_const) == LABEL_REF)
5121 src_folded = src_const, src_folded_cost = src_folded_regcost = -1;
5123 /* Terminate loop when replacement made. This must terminate since
5124 the current contents will be tested and will always be valid. */
5125 while (1)
5127 rtx trial;
5129 /* Skip invalid entries. */
5130 while (elt && !REG_P (elt->exp)
5131 && ! exp_equiv_p (elt->exp, elt->exp, 1, false))
5132 elt = elt->next_same_value;
5134 /* A paradoxical subreg would be bad here: it'll be the right
5135 size, but later may be adjusted so that the upper bits aren't
5136 what we want. So reject it. */
5137 if (elt != 0
5138 && paradoxical_subreg_p (elt->exp)
5139 /* It is okay, though, if the rtx we're trying to match
5140 will ignore any of the bits we can't predict. */
5141 && ! (src != 0
5142 && GET_CODE (src) == SUBREG
5143 && GET_MODE (src) == GET_MODE (elt->exp)
5144 && partial_subreg_p (GET_MODE (SUBREG_REG (src)),
5145 GET_MODE (SUBREG_REG (elt->exp)))))
5147 elt = elt->next_same_value;
5148 continue;
5151 if (elt)
5153 src_elt_cost = elt->cost;
5154 src_elt_regcost = elt->regcost;
5157 /* Find cheapest and skip it for the next time. For items
5158 of equal cost, use this order:
5159 src_folded, src, src_eqv, src_related and hash table entry. */
5160 if (src_folded
5161 && preferable (src_folded_cost, src_folded_regcost,
5162 src_cost, src_regcost) <= 0
5163 && preferable (src_folded_cost, src_folded_regcost,
5164 src_eqv_cost, src_eqv_regcost) <= 0
5165 && preferable (src_folded_cost, src_folded_regcost,
5166 src_related_cost, src_related_regcost) <= 0
5167 && preferable (src_folded_cost, src_folded_regcost,
5168 src_elt_cost, src_elt_regcost) <= 0)
5170 trial = src_folded, src_folded_cost = MAX_COST;
5171 if (src_folded_force_flag)
5173 rtx forced = force_const_mem (mode, trial);
5174 if (forced)
5175 trial = forced;
5178 else if (src
5179 && preferable (src_cost, src_regcost,
5180 src_eqv_cost, src_eqv_regcost) <= 0
5181 && preferable (src_cost, src_regcost,
5182 src_related_cost, src_related_regcost) <= 0
5183 && preferable (src_cost, src_regcost,
5184 src_elt_cost, src_elt_regcost) <= 0)
5185 trial = src, src_cost = MAX_COST;
5186 else if (src_eqv_here
5187 && preferable (src_eqv_cost, src_eqv_regcost,
5188 src_related_cost, src_related_regcost) <= 0
5189 && preferable (src_eqv_cost, src_eqv_regcost,
5190 src_elt_cost, src_elt_regcost) <= 0)
5191 trial = src_eqv_here, src_eqv_cost = MAX_COST;
5192 else if (src_related
5193 && preferable (src_related_cost, src_related_regcost,
5194 src_elt_cost, src_elt_regcost) <= 0)
5195 trial = src_related, src_related_cost = MAX_COST;
5196 else
5198 trial = elt->exp;
5199 elt = elt->next_same_value;
5200 src_elt_cost = MAX_COST;
5203 /* Try to optimize
5204 (set (reg:M N) (const_int A))
5205 (set (reg:M2 O) (const_int B))
5206 (set (zero_extract:M2 (reg:M N) (const_int C) (const_int D))
5207 (reg:M2 O)). */
5208 if (GET_CODE (SET_DEST (sets[i].rtl)) == ZERO_EXTRACT
5209 && CONST_INT_P (trial)
5210 && CONST_INT_P (XEXP (SET_DEST (sets[i].rtl), 1))
5211 && CONST_INT_P (XEXP (SET_DEST (sets[i].rtl), 2))
5212 && REG_P (XEXP (SET_DEST (sets[i].rtl), 0))
5213 && (known_ge
5214 (GET_MODE_PRECISION (GET_MODE (SET_DEST (sets[i].rtl))),
5215 INTVAL (XEXP (SET_DEST (sets[i].rtl), 1))))
5216 && ((unsigned) INTVAL (XEXP (SET_DEST (sets[i].rtl), 1))
5217 + (unsigned) INTVAL (XEXP (SET_DEST (sets[i].rtl), 2))
5218 <= HOST_BITS_PER_WIDE_INT))
5220 rtx dest_reg = XEXP (SET_DEST (sets[i].rtl), 0);
5221 rtx width = XEXP (SET_DEST (sets[i].rtl), 1);
5222 rtx pos = XEXP (SET_DEST (sets[i].rtl), 2);
5223 unsigned int dest_hash = HASH (dest_reg, GET_MODE (dest_reg));
5224 struct table_elt *dest_elt
5225 = lookup (dest_reg, dest_hash, GET_MODE (dest_reg));
5226 rtx dest_cst = NULL;
5228 if (dest_elt)
5229 for (p = dest_elt->first_same_value; p; p = p->next_same_value)
5230 if (p->is_const && CONST_INT_P (p->exp))
5232 dest_cst = p->exp;
5233 break;
5235 if (dest_cst)
5237 HOST_WIDE_INT val = INTVAL (dest_cst);
5238 HOST_WIDE_INT mask;
5239 unsigned int shift;
5240 /* This is the mode of DEST_CST as well. */
5241 scalar_int_mode dest_mode
5242 = as_a <scalar_int_mode> (GET_MODE (dest_reg));
5243 if (BITS_BIG_ENDIAN)
5244 shift = GET_MODE_PRECISION (dest_mode)
5245 - INTVAL (pos) - INTVAL (width);
5246 else
5247 shift = INTVAL (pos);
5248 if (INTVAL (width) == HOST_BITS_PER_WIDE_INT)
5249 mask = HOST_WIDE_INT_M1;
5250 else
5251 mask = (HOST_WIDE_INT_1 << INTVAL (width)) - 1;
5252 val &= ~(mask << shift);
5253 val |= (INTVAL (trial) & mask) << shift;
5254 val = trunc_int_for_mode (val, dest_mode);
5255 validate_unshare_change (insn, &SET_DEST (sets[i].rtl),
5256 dest_reg, 1);
5257 validate_unshare_change (insn, &SET_SRC (sets[i].rtl),
5258 GEN_INT (val), 1);
5259 if (apply_change_group ())
5261 rtx note = find_reg_note (insn, REG_EQUAL, NULL_RTX);
5262 if (note)
5264 remove_note (insn, note);
5265 df_notes_rescan (insn);
5267 src_eqv = NULL_RTX;
5268 src_eqv_elt = NULL;
5269 src_eqv_volatile = 0;
5270 src_eqv_in_memory = 0;
5271 src_eqv_hash = 0;
5272 repeat = true;
5273 break;
5278 /* We don't normally have an insn matching (set (pc) (pc)), so
5279 check for this separately here. We will delete such an
5280 insn below.
5282 For other cases such as a table jump or conditional jump
5283 where we know the ultimate target, go ahead and replace the
5284 operand. While that may not make a valid insn, we will
5285 reemit the jump below (and also insert any necessary
5286 barriers). */
5287 if (n_sets == 1 && dest == pc_rtx
5288 && (trial == pc_rtx
5289 || (GET_CODE (trial) == LABEL_REF
5290 && ! condjump_p (insn))))
5292 /* Don't substitute non-local labels, this confuses CFG. */
5293 if (GET_CODE (trial) == LABEL_REF
5294 && LABEL_REF_NONLOCAL_P (trial))
5295 continue;
5297 SET_SRC (sets[i].rtl) = trial;
5298 cse_jumps_altered = true;
5299 break;
5302 /* Similarly, lots of targets don't allow no-op
5303 (set (mem x) (mem x)) moves. Even (set (reg x) (reg x))
5304 might be impossible for certain registers (like CC registers). */
5305 else if (n_sets == 1
5306 && !CALL_P (insn)
5307 && (MEM_P (trial) || REG_P (trial))
5308 && rtx_equal_p (trial, dest)
5309 && !side_effects_p (dest)
5310 && (cfun->can_delete_dead_exceptions
5311 || insn_nothrow_p (insn))
5312 /* We can only remove the later store if the earlier aliases
5313 at least all accesses the later one. */
5314 && (!MEM_P (trial)
5315 || ((MEM_ALIAS_SET (dest) == MEM_ALIAS_SET (trial)
5316 || alias_set_subset_of (MEM_ALIAS_SET (dest),
5317 MEM_ALIAS_SET (trial)))
5318 && (!MEM_EXPR (trial)
5319 || refs_same_for_tbaa_p (MEM_EXPR (trial),
5320 MEM_EXPR (dest))))))
5322 SET_SRC (sets[i].rtl) = trial;
5323 noop_insn = true;
5324 break;
5327 /* Reject certain invalid forms of CONST that we create. */
5328 else if (CONSTANT_P (trial)
5329 && GET_CODE (trial) == CONST
5330 /* Reject cases that will cause decode_rtx_const to
5331 die. On the alpha when simplifying a switch, we
5332 get (const (truncate (minus (label_ref)
5333 (label_ref)))). */
5334 && (GET_CODE (XEXP (trial, 0)) == TRUNCATE
5335 /* Likewise on IA-64, except without the
5336 truncate. */
5337 || (GET_CODE (XEXP (trial, 0)) == MINUS
5338 && GET_CODE (XEXP (XEXP (trial, 0), 0)) == LABEL_REF
5339 && GET_CODE (XEXP (XEXP (trial, 0), 1)) == LABEL_REF)))
5340 /* Do nothing for this case. */
5343 /* Do not replace anything with a MEM, except the replacement
5344 is a no-op. This allows this loop to terminate. */
5345 else if (MEM_P (trial) && !rtx_equal_p (trial, SET_SRC(sets[i].rtl)))
5346 /* Do nothing for this case. */
5349 /* Look for a substitution that makes a valid insn. */
5350 else if (validate_unshare_change (insn, &SET_SRC (sets[i].rtl),
5351 trial, 0))
5353 rtx new_rtx = canon_reg (SET_SRC (sets[i].rtl), insn);
5355 /* The result of apply_change_group can be ignored; see
5356 canon_reg. */
5358 validate_change (insn, &SET_SRC (sets[i].rtl), new_rtx, 1);
5359 apply_change_group ();
5361 break;
5364 /* If we previously found constant pool entries for
5365 constants and this is a constant, try making a
5366 pool entry. Put it in src_folded unless we already have done
5367 this since that is where it likely came from. */
5369 else if (constant_pool_entries_cost
5370 && CONSTANT_P (trial)
5371 && (src_folded == 0
5372 || (!MEM_P (src_folded)
5373 && ! src_folded_force_flag))
5374 && GET_MODE_CLASS (mode) != MODE_CC
5375 && mode != VOIDmode)
5377 src_folded_force_flag = 1;
5378 src_folded = trial;
5379 src_folded_cost = constant_pool_entries_cost;
5380 src_folded_regcost = constant_pool_entries_regcost;
5384 /* If we changed the insn too much, handle this set from scratch. */
5385 if (repeat)
5387 i--;
5388 continue;
5391 src = SET_SRC (sets[i].rtl);
5393 /* In general, it is good to have a SET with SET_SRC == SET_DEST.
5394 However, there is an important exception: If both are registers
5395 that are not the head of their equivalence class, replace SET_SRC
5396 with the head of the class. If we do not do this, we will have
5397 both registers live over a portion of the basic block. This way,
5398 their lifetimes will likely abut instead of overlapping. */
5399 if (REG_P (dest)
5400 && REGNO_QTY_VALID_P (REGNO (dest)))
5402 int dest_q = REG_QTY (REGNO (dest));
5403 struct qty_table_elem *dest_ent = &qty_table[dest_q];
5405 if (dest_ent->mode == GET_MODE (dest)
5406 && dest_ent->first_reg != REGNO (dest)
5407 && REG_P (src) && REGNO (src) == REGNO (dest)
5408 /* Don't do this if the original insn had a hard reg as
5409 SET_SRC or SET_DEST. */
5410 && (!REG_P (sets[i].src)
5411 || REGNO (sets[i].src) >= FIRST_PSEUDO_REGISTER)
5412 && (!REG_P (dest) || REGNO (dest) >= FIRST_PSEUDO_REGISTER))
5413 /* We can't call canon_reg here because it won't do anything if
5414 SRC is a hard register. */
5416 int src_q = REG_QTY (REGNO (src));
5417 struct qty_table_elem *src_ent = &qty_table[src_q];
5418 int first = src_ent->first_reg;
5419 rtx new_src
5420 = (first >= FIRST_PSEUDO_REGISTER
5421 ? regno_reg_rtx[first] : gen_rtx_REG (GET_MODE (src), first));
5423 /* We must use validate-change even for this, because this
5424 might be a special no-op instruction, suitable only to
5425 tag notes onto. */
5426 if (validate_change (insn, &SET_SRC (sets[i].rtl), new_src, 0))
5428 src = new_src;
5429 /* If we had a constant that is cheaper than what we are now
5430 setting SRC to, use that constant. We ignored it when we
5431 thought we could make this into a no-op. */
5432 if (src_const && COST (src_const, mode) < COST (src, mode)
5433 && validate_change (insn, &SET_SRC (sets[i].rtl),
5434 src_const, 0))
5435 src = src_const;
5440 /* If we made a change, recompute SRC values. */
5441 if (src != sets[i].src)
5443 do_not_record = 0;
5444 hash_arg_in_memory = 0;
5445 sets[i].src = src;
5446 sets[i].src_hash = HASH (src, mode);
5447 sets[i].src_volatile = do_not_record;
5448 sets[i].src_in_memory = hash_arg_in_memory;
5449 sets[i].src_elt = lookup (src, sets[i].src_hash, mode);
5452 /* If this is a single SET, we are setting a register, and we have an
5453 equivalent constant, we want to add a REG_EQUAL note if the constant
5454 is different from the source. We don't want to do it for a constant
5455 pseudo since verifying that this pseudo hasn't been eliminated is a
5456 pain; moreover such a note won't help anything.
5458 Avoid a REG_EQUAL note for (CONST (MINUS (LABEL_REF) (LABEL_REF)))
5459 which can be created for a reference to a compile time computable
5460 entry in a jump table. */
5461 if (n_sets == 1
5462 && REG_P (dest)
5463 && src_const
5464 && !REG_P (src_const)
5465 && !(GET_CODE (src_const) == SUBREG
5466 && REG_P (SUBREG_REG (src_const)))
5467 && !(GET_CODE (src_const) == CONST
5468 && GET_CODE (XEXP (src_const, 0)) == MINUS
5469 && GET_CODE (XEXP (XEXP (src_const, 0), 0)) == LABEL_REF
5470 && GET_CODE (XEXP (XEXP (src_const, 0), 1)) == LABEL_REF)
5471 && !rtx_equal_p (src, src_const))
5473 /* Make sure that the rtx is not shared. */
5474 src_const = copy_rtx (src_const);
5476 /* Record the actual constant value in a REG_EQUAL note,
5477 making a new one if one does not already exist. */
5478 set_unique_reg_note (insn, REG_EQUAL, src_const);
5479 df_notes_rescan (insn);
5482 /* Now deal with the destination. */
5483 do_not_record = 0;
5485 /* Look within any ZERO_EXTRACT to the MEM or REG within it. */
5486 while (GET_CODE (dest) == SUBREG
5487 || GET_CODE (dest) == ZERO_EXTRACT
5488 || GET_CODE (dest) == STRICT_LOW_PART)
5489 dest = XEXP (dest, 0);
5491 sets[i].inner_dest = dest;
5493 if (MEM_P (dest))
5495 #ifdef PUSH_ROUNDING
5496 /* Stack pushes invalidate the stack pointer. */
5497 rtx addr = XEXP (dest, 0);
5498 if (GET_RTX_CLASS (GET_CODE (addr)) == RTX_AUTOINC
5499 && XEXP (addr, 0) == stack_pointer_rtx)
5500 invalidate (stack_pointer_rtx, VOIDmode);
5501 #endif
5502 dest = fold_rtx (dest, insn);
5505 /* Compute the hash code of the destination now,
5506 before the effects of this instruction are recorded,
5507 since the register values used in the address computation
5508 are those before this instruction. */
5509 sets[i].dest_hash = HASH (dest, mode);
5511 /* Don't enter a bit-field in the hash table
5512 because the value in it after the store
5513 may not equal what was stored, due to truncation. */
5515 if (GET_CODE (SET_DEST (sets[i].rtl)) == ZERO_EXTRACT)
5517 rtx width = XEXP (SET_DEST (sets[i].rtl), 1);
5519 if (src_const != 0 && CONST_INT_P (src_const)
5520 && CONST_INT_P (width)
5521 && INTVAL (width) < HOST_BITS_PER_WIDE_INT
5522 && ! (INTVAL (src_const)
5523 & (HOST_WIDE_INT_M1U << INTVAL (width))))
5524 /* Exception: if the value is constant,
5525 and it won't be truncated, record it. */
5527 else
5529 /* This is chosen so that the destination will be invalidated
5530 but no new value will be recorded.
5531 We must invalidate because sometimes constant
5532 values can be recorded for bitfields. */
5533 sets[i].src_elt = 0;
5534 sets[i].src_volatile = 1;
5535 src_eqv = 0;
5536 src_eqv_elt = 0;
5540 /* If only one set in a JUMP_INSN and it is now a no-op, we can delete
5541 the insn. */
5542 else if (n_sets == 1 && dest == pc_rtx && src == pc_rtx)
5544 /* One less use of the label this insn used to jump to. */
5545 cse_cfg_altered |= delete_insn_and_edges (insn);
5546 cse_jumps_altered = true;
5547 /* No more processing for this set. */
5548 sets[i].rtl = 0;
5551 /* Similarly for no-op moves. */
5552 else if (noop_insn)
5554 if (cfun->can_throw_non_call_exceptions && can_throw_internal (insn))
5555 cse_cfg_altered = true;
5556 cse_cfg_altered |= delete_insn_and_edges (insn);
5557 /* No more processing for this set. */
5558 sets[i].rtl = 0;
5561 /* If this SET is now setting PC to a label, we know it used to
5562 be a conditional or computed branch. */
5563 else if (dest == pc_rtx && GET_CODE (src) == LABEL_REF
5564 && !LABEL_REF_NONLOCAL_P (src))
5566 /* We reemit the jump in as many cases as possible just in
5567 case the form of an unconditional jump is significantly
5568 different than a computed jump or conditional jump.
5570 If this insn has multiple sets, then reemitting the
5571 jump is nontrivial. So instead we just force rerecognition
5572 and hope for the best. */
5573 if (n_sets == 1)
5575 rtx_jump_insn *new_rtx;
5576 rtx note;
5578 rtx_insn *seq = targetm.gen_jump (XEXP (src, 0));
5579 new_rtx = emit_jump_insn_before (seq, insn);
5580 JUMP_LABEL (new_rtx) = XEXP (src, 0);
5581 LABEL_NUSES (XEXP (src, 0))++;
5583 /* Make sure to copy over REG_NON_LOCAL_GOTO. */
5584 note = find_reg_note (insn, REG_NON_LOCAL_GOTO, 0);
5585 if (note)
5587 XEXP (note, 1) = NULL_RTX;
5588 REG_NOTES (new_rtx) = note;
5591 cse_cfg_altered |= delete_insn_and_edges (insn);
5592 insn = new_rtx;
5594 else
5595 INSN_CODE (insn) = -1;
5597 /* Do not bother deleting any unreachable code, let jump do it. */
5598 cse_jumps_altered = true;
5599 sets[i].rtl = 0;
5602 /* If destination is volatile, invalidate it and then do no further
5603 processing for this assignment. */
5605 else if (do_not_record)
5607 invalidate_dest (dest);
5608 sets[i].rtl = 0;
5611 if (sets[i].rtl != 0 && dest != SET_DEST (sets[i].rtl))
5613 do_not_record = 0;
5614 sets[i].dest_hash = HASH (SET_DEST (sets[i].rtl), mode);
5615 if (do_not_record)
5617 invalidate_dest (SET_DEST (sets[i].rtl));
5618 sets[i].rtl = 0;
5623 /* Now enter all non-volatile source expressions in the hash table
5624 if they are not already present.
5625 Record their equivalence classes in src_elt.
5626 This way we can insert the corresponding destinations into
5627 the same classes even if the actual sources are no longer in them
5628 (having been invalidated). */
5630 if (src_eqv && src_eqv_elt == 0 && sets[0].rtl != 0 && ! src_eqv_volatile
5631 && ! rtx_equal_p (src_eqv, SET_DEST (sets[0].rtl)))
5633 struct table_elt *elt;
5634 struct table_elt *classp = sets[0].src_elt;
5635 rtx dest = SET_DEST (sets[0].rtl);
5636 machine_mode eqvmode = GET_MODE (dest);
5638 if (GET_CODE (dest) == STRICT_LOW_PART)
5640 eqvmode = GET_MODE (SUBREG_REG (XEXP (dest, 0)));
5641 classp = 0;
5643 if (insert_regs (src_eqv, classp, 0))
5645 rehash_using_reg (src_eqv);
5646 src_eqv_hash = HASH (src_eqv, eqvmode);
5648 elt = insert (src_eqv, classp, src_eqv_hash, eqvmode);
5649 elt->in_memory = src_eqv_in_memory;
5650 src_eqv_elt = elt;
5652 /* Check to see if src_eqv_elt is the same as a set source which
5653 does not yet have an elt, and if so set the elt of the set source
5654 to src_eqv_elt. */
5655 for (i = 0; i < n_sets; i++)
5656 if (sets[i].rtl && sets[i].src_elt == 0
5657 && rtx_equal_p (SET_SRC (sets[i].rtl), src_eqv))
5658 sets[i].src_elt = src_eqv_elt;
5661 for (i = 0; i < n_sets; i++)
5662 if (sets[i].rtl && ! sets[i].src_volatile
5663 && ! rtx_equal_p (SET_SRC (sets[i].rtl), SET_DEST (sets[i].rtl)))
5665 if (GET_CODE (SET_DEST (sets[i].rtl)) == STRICT_LOW_PART)
5667 /* REG_EQUAL in setting a STRICT_LOW_PART
5668 gives an equivalent for the entire destination register,
5669 not just for the subreg being stored in now.
5670 This is a more interesting equivalence, so we arrange later
5671 to treat the entire reg as the destination. */
5672 sets[i].src_elt = src_eqv_elt;
5673 sets[i].src_hash = src_eqv_hash;
5675 else
5677 /* Insert source and constant equivalent into hash table, if not
5678 already present. */
5679 struct table_elt *classp = src_eqv_elt;
5680 rtx src = sets[i].src;
5681 rtx dest = SET_DEST (sets[i].rtl);
5682 machine_mode mode
5683 = GET_MODE (src) == VOIDmode ? GET_MODE (dest) : GET_MODE (src);
5685 /* It's possible that we have a source value known to be
5686 constant but don't have a REG_EQUAL note on the insn.
5687 Lack of a note will mean src_eqv_elt will be NULL. This
5688 can happen where we've generated a SUBREG to access a
5689 CONST_INT that is already in a register in a wider mode.
5690 Ensure that the source expression is put in the proper
5691 constant class. */
5692 if (!classp)
5693 classp = sets[i].src_const_elt;
5695 if (sets[i].src_elt == 0)
5697 struct table_elt *elt;
5699 /* Note that these insert_regs calls cannot remove
5700 any of the src_elt's, because they would have failed to
5701 match if not still valid. */
5702 if (insert_regs (src, classp, 0))
5704 rehash_using_reg (src);
5705 sets[i].src_hash = HASH (src, mode);
5707 elt = insert (src, classp, sets[i].src_hash, mode);
5708 elt->in_memory = sets[i].src_in_memory;
5709 /* If inline asm has any clobbers, ensure we only reuse
5710 existing inline asms and never try to put the ASM_OPERANDS
5711 into an insn that isn't inline asm. */
5712 if (GET_CODE (src) == ASM_OPERANDS
5713 && GET_CODE (x) == PARALLEL)
5714 elt->cost = MAX_COST;
5715 sets[i].src_elt = classp = elt;
5717 if (sets[i].src_const && sets[i].src_const_elt == 0
5718 && src != sets[i].src_const
5719 && ! rtx_equal_p (sets[i].src_const, src))
5720 sets[i].src_elt = insert (sets[i].src_const, classp,
5721 sets[i].src_const_hash, mode);
5724 else if (sets[i].src_elt == 0)
5725 /* If we did not insert the source into the hash table (e.g., it was
5726 volatile), note the equivalence class for the REG_EQUAL value, if any,
5727 so that the destination goes into that class. */
5728 sets[i].src_elt = src_eqv_elt;
5730 /* Record destination addresses in the hash table. This allows us to
5731 check if they are invalidated by other sets. */
5732 for (i = 0; i < n_sets; i++)
5734 if (sets[i].rtl)
5736 rtx x = sets[i].inner_dest;
5737 struct table_elt *elt;
5738 machine_mode mode;
5739 unsigned hash;
5741 if (MEM_P (x))
5743 x = XEXP (x, 0);
5744 mode = GET_MODE (x);
5745 hash = HASH (x, mode);
5746 elt = lookup (x, hash, mode);
5747 if (!elt)
5749 if (insert_regs (x, NULL, 0))
5751 rtx dest = SET_DEST (sets[i].rtl);
5753 rehash_using_reg (x);
5754 hash = HASH (x, mode);
5755 sets[i].dest_hash = HASH (dest, GET_MODE (dest));
5757 elt = insert (x, NULL, hash, mode);
5760 sets[i].dest_addr_elt = elt;
5762 else
5763 sets[i].dest_addr_elt = NULL;
5767 invalidate_from_clobbers (insn);
5769 /* Some registers are invalidated by subroutine calls. Memory is
5770 invalidated by non-constant calls. */
5772 if (CALL_P (insn))
5774 if (!(RTL_CONST_OR_PURE_CALL_P (insn)))
5775 invalidate_memory ();
5776 else
5777 /* For const/pure calls, invalidate any argument slots, because
5778 those are owned by the callee. */
5779 for (tem = CALL_INSN_FUNCTION_USAGE (insn); tem; tem = XEXP (tem, 1))
5780 if (GET_CODE (XEXP (tem, 0)) == USE
5781 && MEM_P (XEXP (XEXP (tem, 0), 0)))
5782 invalidate (XEXP (XEXP (tem, 0), 0), VOIDmode);
5783 invalidate_for_call (insn);
5786 /* Now invalidate everything set by this instruction.
5787 If a SUBREG or other funny destination is being set,
5788 sets[i].rtl is still nonzero, so here we invalidate the reg
5789 a part of which is being set. */
5791 for (i = 0; i < n_sets; i++)
5792 if (sets[i].rtl)
5794 /* We can't use the inner dest, because the mode associated with
5795 a ZERO_EXTRACT is significant. */
5796 rtx dest = SET_DEST (sets[i].rtl);
5798 /* Needed for registers to remove the register from its
5799 previous quantity's chain.
5800 Needed for memory if this is a nonvarying address, unless
5801 we have just done an invalidate_memory that covers even those. */
5802 if (REG_P (dest) || GET_CODE (dest) == SUBREG)
5803 invalidate (dest, VOIDmode);
5804 else if (MEM_P (dest))
5805 invalidate (dest, VOIDmode);
5806 else if (GET_CODE (dest) == STRICT_LOW_PART
5807 || GET_CODE (dest) == ZERO_EXTRACT)
5808 invalidate (XEXP (dest, 0), GET_MODE (dest));
5811 /* Don't cse over a call to setjmp; on some machines (eg VAX)
5812 the regs restored by the longjmp come from a later time
5813 than the setjmp. */
5814 if (CALL_P (insn) && find_reg_note (insn, REG_SETJMP, NULL))
5816 flush_hash_table ();
5817 goto done;
5820 /* Make sure registers mentioned in destinations
5821 are safe for use in an expression to be inserted.
5822 This removes from the hash table
5823 any invalid entry that refers to one of these registers.
5825 We don't care about the return value from mention_regs because
5826 we are going to hash the SET_DEST values unconditionally. */
5828 for (i = 0; i < n_sets; i++)
5830 if (sets[i].rtl)
5832 rtx x = SET_DEST (sets[i].rtl);
5834 if (!REG_P (x))
5835 mention_regs (x);
5836 else
5838 /* We used to rely on all references to a register becoming
5839 inaccessible when a register changes to a new quantity,
5840 since that changes the hash code. However, that is not
5841 safe, since after HASH_SIZE new quantities we get a
5842 hash 'collision' of a register with its own invalid
5843 entries. And since SUBREGs have been changed not to
5844 change their hash code with the hash code of the register,
5845 it wouldn't work any longer at all. So we have to check
5846 for any invalid references lying around now.
5847 This code is similar to the REG case in mention_regs,
5848 but it knows that reg_tick has been incremented, and
5849 it leaves reg_in_table as -1 . */
5850 unsigned int regno = REGNO (x);
5851 unsigned int endregno = END_REGNO (x);
5852 unsigned int i;
5854 for (i = regno; i < endregno; i++)
5856 if (REG_IN_TABLE (i) >= 0)
5858 remove_invalid_refs (i);
5859 REG_IN_TABLE (i) = -1;
5866 /* We may have just removed some of the src_elt's from the hash table.
5867 So replace each one with the current head of the same class.
5868 Also check if destination addresses have been removed. */
5870 for (i = 0; i < n_sets; i++)
5871 if (sets[i].rtl)
5873 if (sets[i].dest_addr_elt
5874 && sets[i].dest_addr_elt->first_same_value == 0)
5876 /* The elt was removed, which means this destination is not
5877 valid after this instruction. */
5878 sets[i].rtl = NULL_RTX;
5880 else if (sets[i].src_elt && sets[i].src_elt->first_same_value == 0)
5881 /* If elt was removed, find current head of same class,
5882 or 0 if nothing remains of that class. */
5884 struct table_elt *elt = sets[i].src_elt;
5886 while (elt && elt->prev_same_value)
5887 elt = elt->prev_same_value;
5889 while (elt && elt->first_same_value == 0)
5890 elt = elt->next_same_value;
5891 sets[i].src_elt = elt ? elt->first_same_value : 0;
5895 /* Now insert the destinations into their equivalence classes. */
5897 for (i = 0; i < n_sets; i++)
5898 if (sets[i].rtl)
5900 rtx dest = SET_DEST (sets[i].rtl);
5901 struct table_elt *elt;
5903 /* Don't record value if we are not supposed to risk allocating
5904 floating-point values in registers that might be wider than
5905 memory. */
5906 if ((flag_float_store
5907 && MEM_P (dest)
5908 && FLOAT_MODE_P (GET_MODE (dest)))
5909 /* Don't record BLKmode values, because we don't know the
5910 size of it, and can't be sure that other BLKmode values
5911 have the same or smaller size. */
5912 || GET_MODE (dest) == BLKmode
5913 /* If we didn't put a REG_EQUAL value or a source into the hash
5914 table, there is no point is recording DEST. */
5915 || sets[i].src_elt == 0)
5916 continue;
5918 /* STRICT_LOW_PART isn't part of the value BEING set,
5919 and neither is the SUBREG inside it.
5920 Note that in this case SETS[I].SRC_ELT is really SRC_EQV_ELT. */
5921 if (GET_CODE (dest) == STRICT_LOW_PART)
5922 dest = SUBREG_REG (XEXP (dest, 0));
5924 if (REG_P (dest) || GET_CODE (dest) == SUBREG)
5925 /* Registers must also be inserted into chains for quantities. */
5926 if (insert_regs (dest, sets[i].src_elt, 1))
5928 /* If `insert_regs' changes something, the hash code must be
5929 recalculated. */
5930 rehash_using_reg (dest);
5931 sets[i].dest_hash = HASH (dest, GET_MODE (dest));
5934 /* If DEST is a paradoxical SUBREG, don't record DEST since the bits
5935 outside the mode of GET_MODE (SUBREG_REG (dest)) are undefined. */
5936 if (paradoxical_subreg_p (dest))
5937 continue;
5939 elt = insert (dest, sets[i].src_elt,
5940 sets[i].dest_hash, GET_MODE (dest));
5942 /* If this is a constant, insert the constant anchors with the
5943 equivalent register-offset expressions using register DEST. */
5944 if (targetm.const_anchor
5945 && REG_P (dest)
5946 && SCALAR_INT_MODE_P (GET_MODE (dest))
5947 && GET_CODE (sets[i].src_elt->exp) == CONST_INT)
5948 insert_const_anchors (dest, sets[i].src_elt->exp, GET_MODE (dest));
5950 elt->in_memory = (MEM_P (sets[i].inner_dest)
5951 && !MEM_READONLY_P (sets[i].inner_dest));
5953 /* If we have (set (subreg:m1 (reg:m2 foo) 0) (bar:m1)), M1 is no
5954 narrower than M2, and both M1 and M2 are the same number of words,
5955 we are also doing (set (reg:m2 foo) (subreg:m2 (bar:m1) 0)) so
5956 make that equivalence as well.
5958 However, BAR may have equivalences for which gen_lowpart
5959 will produce a simpler value than gen_lowpart applied to
5960 BAR (e.g., if BAR was ZERO_EXTENDed from M2), so we will scan all
5961 BAR's equivalences. If we don't get a simplified form, make
5962 the SUBREG. It will not be used in an equivalence, but will
5963 cause two similar assignments to be detected.
5965 Note the loop below will find SUBREG_REG (DEST) since we have
5966 already entered SRC and DEST of the SET in the table. */
5968 if (GET_CODE (dest) == SUBREG
5969 && (known_equal_after_align_down
5970 (GET_MODE_SIZE (GET_MODE (SUBREG_REG (dest))) - 1,
5971 GET_MODE_SIZE (GET_MODE (dest)) - 1,
5972 UNITS_PER_WORD))
5973 && !partial_subreg_p (dest)
5974 && sets[i].src_elt != 0)
5976 machine_mode new_mode = GET_MODE (SUBREG_REG (dest));
5977 struct table_elt *elt, *classp = 0;
5979 for (elt = sets[i].src_elt->first_same_value; elt;
5980 elt = elt->next_same_value)
5982 rtx new_src = 0;
5983 unsigned src_hash;
5984 struct table_elt *src_elt;
5986 /* Ignore invalid entries. */
5987 if (!REG_P (elt->exp)
5988 && ! exp_equiv_p (elt->exp, elt->exp, 1, false))
5989 continue;
5991 /* We may have already been playing subreg games. If the
5992 mode is already correct for the destination, use it. */
5993 if (GET_MODE (elt->exp) == new_mode)
5994 new_src = elt->exp;
5995 else
5997 poly_uint64 byte
5998 = subreg_lowpart_offset (new_mode, GET_MODE (dest));
5999 new_src = simplify_gen_subreg (new_mode, elt->exp,
6000 GET_MODE (dest), byte);
6003 /* The call to simplify_gen_subreg fails if the value
6004 is VOIDmode, yet we can't do any simplification, e.g.
6005 for EXPR_LISTs denoting function call results.
6006 It is invalid to construct a SUBREG with a VOIDmode
6007 SUBREG_REG, hence a zero new_src means we can't do
6008 this substitution. */
6009 if (! new_src)
6010 continue;
6012 src_hash = HASH (new_src, new_mode);
6013 src_elt = lookup (new_src, src_hash, new_mode);
6015 /* Put the new source in the hash table is if isn't
6016 already. */
6017 if (src_elt == 0)
6019 if (insert_regs (new_src, classp, 0))
6021 rehash_using_reg (new_src);
6022 src_hash = HASH (new_src, new_mode);
6024 src_elt = insert (new_src, classp, src_hash, new_mode);
6025 src_elt->in_memory = elt->in_memory;
6026 if (GET_CODE (new_src) == ASM_OPERANDS
6027 && elt->cost == MAX_COST)
6028 src_elt->cost = MAX_COST;
6030 else if (classp && classp != src_elt->first_same_value)
6031 /* Show that two things that we've seen before are
6032 actually the same. */
6033 merge_equiv_classes (src_elt, classp);
6035 classp = src_elt->first_same_value;
6036 /* Ignore invalid entries. */
6037 while (classp
6038 && !REG_P (classp->exp)
6039 && ! exp_equiv_p (classp->exp, classp->exp, 1, false))
6040 classp = classp->next_same_value;
6045 /* Special handling for (set REG0 REG1) where REG0 is the
6046 "cheapest", cheaper than REG1. After cse, REG1 will probably not
6047 be used in the sequel, so (if easily done) change this insn to
6048 (set REG1 REG0) and replace REG1 with REG0 in the previous insn
6049 that computed their value. Then REG1 will become a dead store
6050 and won't cloud the situation for later optimizations.
6052 Do not make this change if REG1 is a hard register, because it will
6053 then be used in the sequel and we may be changing a two-operand insn
6054 into a three-operand insn.
6056 Also do not do this if we are operating on a copy of INSN. */
6058 if (n_sets == 1 && sets[0].rtl)
6059 try_back_substitute_reg (sets[0].rtl, insn);
6061 done:;
6064 /* Remove from the hash table all expressions that reference memory. */
6066 static void
6067 invalidate_memory (void)
6069 int i;
6070 struct table_elt *p, *next;
6072 for (i = 0; i < HASH_SIZE; i++)
6073 for (p = table[i]; p; p = next)
6075 next = p->next_same_hash;
6076 if (p->in_memory)
6077 remove_from_table (p, i);
6081 /* Perform invalidation on the basis of everything about INSN,
6082 except for invalidating the actual places that are SET in it.
6083 This includes the places CLOBBERed, and anything that might
6084 alias with something that is SET or CLOBBERed. */
6086 static void
6087 invalidate_from_clobbers (rtx_insn *insn)
6089 rtx x = PATTERN (insn);
6091 if (GET_CODE (x) == CLOBBER)
6093 rtx ref = XEXP (x, 0);
6094 if (ref)
6096 if (REG_P (ref) || GET_CODE (ref) == SUBREG
6097 || MEM_P (ref))
6098 invalidate (ref, VOIDmode);
6099 else if (GET_CODE (ref) == STRICT_LOW_PART
6100 || GET_CODE (ref) == ZERO_EXTRACT)
6101 invalidate (XEXP (ref, 0), GET_MODE (ref));
6104 else if (GET_CODE (x) == PARALLEL)
6106 int i;
6107 for (i = XVECLEN (x, 0) - 1; i >= 0; i--)
6109 rtx y = XVECEXP (x, 0, i);
6110 if (GET_CODE (y) == CLOBBER)
6112 rtx ref = XEXP (y, 0);
6113 if (REG_P (ref) || GET_CODE (ref) == SUBREG
6114 || MEM_P (ref))
6115 invalidate (ref, VOIDmode);
6116 else if (GET_CODE (ref) == STRICT_LOW_PART
6117 || GET_CODE (ref) == ZERO_EXTRACT)
6118 invalidate (XEXP (ref, 0), GET_MODE (ref));
6124 /* Perform invalidation on the basis of everything about INSN.
6125 This includes the places CLOBBERed, and anything that might
6126 alias with something that is SET or CLOBBERed. */
6128 static void
6129 invalidate_from_sets_and_clobbers (rtx_insn *insn)
6131 rtx tem;
6132 rtx x = PATTERN (insn);
6134 if (CALL_P (insn))
6136 for (tem = CALL_INSN_FUNCTION_USAGE (insn); tem; tem = XEXP (tem, 1))
6138 rtx temx = XEXP (tem, 0);
6139 if (GET_CODE (temx) == CLOBBER)
6140 invalidate (SET_DEST (temx), VOIDmode);
6144 /* Ensure we invalidate the destination register of a CALL insn.
6145 This is necessary for machines where this register is a fixed_reg,
6146 because no other code would invalidate it. */
6147 if (GET_CODE (x) == SET && GET_CODE (SET_SRC (x)) == CALL)
6148 invalidate (SET_DEST (x), VOIDmode);
6150 else if (GET_CODE (x) == PARALLEL)
6152 int i;
6154 for (i = XVECLEN (x, 0) - 1; i >= 0; i--)
6156 rtx y = XVECEXP (x, 0, i);
6157 if (GET_CODE (y) == CLOBBER)
6159 rtx clobbered = XEXP (y, 0);
6161 if (REG_P (clobbered)
6162 || GET_CODE (clobbered) == SUBREG)
6163 invalidate (clobbered, VOIDmode);
6164 else if (GET_CODE (clobbered) == STRICT_LOW_PART
6165 || GET_CODE (clobbered) == ZERO_EXTRACT)
6166 invalidate (XEXP (clobbered, 0), GET_MODE (clobbered));
6168 else if (GET_CODE (y) == SET && GET_CODE (SET_SRC (y)) == CALL)
6169 invalidate (SET_DEST (y), VOIDmode);
6174 static rtx cse_process_note (rtx);
6176 /* A simplify_replace_fn_rtx callback for cse_process_note. Process X,
6177 part of the REG_NOTES of an insn. Replace any registers with either
6178 an equivalent constant or the canonical form of the register.
6179 Only replace addresses if the containing MEM remains valid.
6181 Return the replacement for X, or null if it should be simplified
6182 recursively. */
6184 static rtx
6185 cse_process_note_1 (rtx x, const_rtx, void *)
6187 if (MEM_P (x))
6189 validate_change (x, &XEXP (x, 0), cse_process_note (XEXP (x, 0)), false);
6190 return x;
6193 if (REG_P (x))
6195 int i = REG_QTY (REGNO (x));
6197 /* Return a constant or a constant register. */
6198 if (REGNO_QTY_VALID_P (REGNO (x)))
6200 struct qty_table_elem *ent = &qty_table[i];
6202 if (ent->const_rtx != NULL_RTX
6203 && (CONSTANT_P (ent->const_rtx)
6204 || REG_P (ent->const_rtx)))
6206 rtx new_rtx = gen_lowpart (GET_MODE (x), ent->const_rtx);
6207 if (new_rtx)
6208 return copy_rtx (new_rtx);
6212 /* Otherwise, canonicalize this register. */
6213 return canon_reg (x, NULL);
6216 return NULL_RTX;
6219 /* Process X, part of the REG_NOTES of an insn. Replace any registers in it
6220 with either an equivalent constant or the canonical form of the register.
6221 Only replace addresses if the containing MEM remains valid. */
6223 static rtx
6224 cse_process_note (rtx x)
6226 return simplify_replace_fn_rtx (x, NULL_RTX, cse_process_note_1, NULL);
6230 /* Find a path in the CFG, starting with FIRST_BB to perform CSE on.
6232 DATA is a pointer to a struct cse_basic_block_data, that is used to
6233 describe the path.
6234 It is filled with a queue of basic blocks, starting with FIRST_BB
6235 and following a trace through the CFG.
6237 If all paths starting at FIRST_BB have been followed, or no new path
6238 starting at FIRST_BB can be constructed, this function returns FALSE.
6239 Otherwise, DATA->path is filled and the function returns TRUE indicating
6240 that a path to follow was found.
6242 If FOLLOW_JUMPS is false, the maximum path length is 1 and the only
6243 block in the path will be FIRST_BB. */
6245 static bool
6246 cse_find_path (basic_block first_bb, struct cse_basic_block_data *data,
6247 int follow_jumps)
6249 basic_block bb;
6250 edge e;
6251 int path_size;
6253 bitmap_set_bit (cse_visited_basic_blocks, first_bb->index);
6255 /* See if there is a previous path. */
6256 path_size = data->path_size;
6258 /* There is a previous path. Make sure it started with FIRST_BB. */
6259 if (path_size)
6260 gcc_assert (data->path[0].bb == first_bb);
6262 /* There was only one basic block in the last path. Clear the path and
6263 return, so that paths starting at another basic block can be tried. */
6264 if (path_size == 1)
6266 path_size = 0;
6267 goto done;
6270 /* If the path was empty from the beginning, construct a new path. */
6271 if (path_size == 0)
6272 data->path[path_size++].bb = first_bb;
6273 else
6275 /* Otherwise, path_size must be equal to or greater than 2, because
6276 a previous path exists that is at least two basic blocks long.
6278 Update the previous branch path, if any. If the last branch was
6279 previously along the branch edge, take the fallthrough edge now. */
6280 while (path_size >= 2)
6282 basic_block last_bb_in_path, previous_bb_in_path;
6283 edge e;
6285 --path_size;
6286 last_bb_in_path = data->path[path_size].bb;
6287 previous_bb_in_path = data->path[path_size - 1].bb;
6289 /* If we previously followed a path along the branch edge, try
6290 the fallthru edge now. */
6291 if (EDGE_COUNT (previous_bb_in_path->succs) == 2
6292 && any_condjump_p (BB_END (previous_bb_in_path))
6293 && (e = find_edge (previous_bb_in_path, last_bb_in_path))
6294 && e == BRANCH_EDGE (previous_bb_in_path))
6296 bb = FALLTHRU_EDGE (previous_bb_in_path)->dest;
6297 if (bb != EXIT_BLOCK_PTR_FOR_FN (cfun)
6298 && single_pred_p (bb)
6299 /* We used to assert here that we would only see blocks
6300 that we have not visited yet. But we may end up
6301 visiting basic blocks twice if the CFG has changed
6302 in this run of cse_main, because when the CFG changes
6303 the topological sort of the CFG also changes. A basic
6304 blocks that previously had more than two predecessors
6305 may now have a single predecessor, and become part of
6306 a path that starts at another basic block.
6308 We still want to visit each basic block only once, so
6309 halt the path here if we have already visited BB. */
6310 && !bitmap_bit_p (cse_visited_basic_blocks, bb->index))
6312 bitmap_set_bit (cse_visited_basic_blocks, bb->index);
6313 data->path[path_size++].bb = bb;
6314 break;
6318 data->path[path_size].bb = NULL;
6321 /* If only one block remains in the path, bail. */
6322 if (path_size == 1)
6324 path_size = 0;
6325 goto done;
6329 /* Extend the path if possible. */
6330 if (follow_jumps)
6332 bb = data->path[path_size - 1].bb;
6333 while (bb && path_size < param_max_cse_path_length)
6335 if (single_succ_p (bb))
6336 e = single_succ_edge (bb);
6337 else if (EDGE_COUNT (bb->succs) == 2
6338 && any_condjump_p (BB_END (bb)))
6340 /* First try to follow the branch. If that doesn't lead
6341 to a useful path, follow the fallthru edge. */
6342 e = BRANCH_EDGE (bb);
6343 if (!single_pred_p (e->dest))
6344 e = FALLTHRU_EDGE (bb);
6346 else
6347 e = NULL;
6349 if (e
6350 && !((e->flags & EDGE_ABNORMAL_CALL) && cfun->has_nonlocal_label)
6351 && e->dest != EXIT_BLOCK_PTR_FOR_FN (cfun)
6352 && single_pred_p (e->dest)
6353 /* Avoid visiting basic blocks twice. The large comment
6354 above explains why this can happen. */
6355 && !bitmap_bit_p (cse_visited_basic_blocks, e->dest->index))
6357 basic_block bb2 = e->dest;
6358 bitmap_set_bit (cse_visited_basic_blocks, bb2->index);
6359 data->path[path_size++].bb = bb2;
6360 bb = bb2;
6362 else
6363 bb = NULL;
6367 done:
6368 data->path_size = path_size;
6369 return path_size != 0;
6372 /* Dump the path in DATA to file F. NSETS is the number of sets
6373 in the path. */
6375 static void
6376 cse_dump_path (struct cse_basic_block_data *data, int nsets, FILE *f)
6378 int path_entry;
6380 fprintf (f, ";; Following path with %d sets: ", nsets);
6381 for (path_entry = 0; path_entry < data->path_size; path_entry++)
6382 fprintf (f, "%d ", (data->path[path_entry].bb)->index);
6383 fputc ('\n', f);
6384 fflush (f);
6388 /* Return true if BB has exception handling successor edges. */
6390 static bool
6391 have_eh_succ_edges (basic_block bb)
6393 edge e;
6394 edge_iterator ei;
6396 FOR_EACH_EDGE (e, ei, bb->succs)
6397 if (e->flags & EDGE_EH)
6398 return true;
6400 return false;
6404 /* Scan to the end of the path described by DATA. Return an estimate of
6405 the total number of SETs of all insns in the path. */
6407 static void
6408 cse_prescan_path (struct cse_basic_block_data *data)
6410 int nsets = 0;
6411 int path_size = data->path_size;
6412 int path_entry;
6414 /* Scan to end of each basic block in the path. */
6415 for (path_entry = 0; path_entry < path_size; path_entry++)
6417 basic_block bb;
6418 rtx_insn *insn;
6420 bb = data->path[path_entry].bb;
6422 FOR_BB_INSNS (bb, insn)
6424 if (!INSN_P (insn))
6425 continue;
6427 /* A PARALLEL can have lots of SETs in it,
6428 especially if it is really an ASM_OPERANDS. */
6429 if (GET_CODE (PATTERN (insn)) == PARALLEL)
6430 nsets += XVECLEN (PATTERN (insn), 0);
6431 else
6432 nsets += 1;
6436 data->nsets = nsets;
6439 /* Return true if the pattern of INSN uses a LABEL_REF for which
6440 there isn't a REG_LABEL_OPERAND note. */
6442 static bool
6443 check_for_label_ref (rtx_insn *insn)
6445 /* If this insn uses a LABEL_REF and there isn't a REG_LABEL_OPERAND
6446 note for it, we must rerun jump since it needs to place the note. If
6447 this is a LABEL_REF for a CODE_LABEL that isn't in the insn chain,
6448 don't do this since no REG_LABEL_OPERAND will be added. */
6449 subrtx_iterator::array_type array;
6450 FOR_EACH_SUBRTX (iter, array, PATTERN (insn), ALL)
6452 const_rtx x = *iter;
6453 if (GET_CODE (x) == LABEL_REF
6454 && !LABEL_REF_NONLOCAL_P (x)
6455 && (!JUMP_P (insn)
6456 || !label_is_jump_target_p (label_ref_label (x), insn))
6457 && LABEL_P (label_ref_label (x))
6458 && INSN_UID (label_ref_label (x)) != 0
6459 && !find_reg_note (insn, REG_LABEL_OPERAND, label_ref_label (x)))
6460 return true;
6462 return false;
6465 /* Process a single extended basic block described by EBB_DATA. */
6467 static void
6468 cse_extended_basic_block (struct cse_basic_block_data *ebb_data)
6470 int path_size = ebb_data->path_size;
6471 int path_entry;
6472 int num_insns = 0;
6474 /* Allocate the space needed by qty_table. */
6475 qty_table = XNEWVEC (struct qty_table_elem, max_qty);
6477 new_basic_block ();
6478 cse_ebb_live_in = df_get_live_in (ebb_data->path[0].bb);
6479 cse_ebb_live_out = df_get_live_out (ebb_data->path[path_size - 1].bb);
6480 for (path_entry = 0; path_entry < path_size; path_entry++)
6482 basic_block bb;
6483 rtx_insn *insn;
6485 bb = ebb_data->path[path_entry].bb;
6487 /* Invalidate recorded information for eh regs if there is an EH
6488 edge pointing to that bb. */
6489 if (bb_has_eh_pred (bb))
6491 df_ref def;
6493 FOR_EACH_ARTIFICIAL_DEF (def, bb->index)
6494 if (DF_REF_FLAGS (def) & DF_REF_AT_TOP)
6495 invalidate (DF_REF_REG (def), GET_MODE (DF_REF_REG (def)));
6498 optimize_this_for_speed_p = optimize_bb_for_speed_p (bb);
6499 FOR_BB_INSNS (bb, insn)
6501 /* If we have processed 1,000 insns, flush the hash table to
6502 avoid extreme quadratic behavior. We must not include NOTEs
6503 in the count since there may be more of them when generating
6504 debugging information. If we clear the table at different
6505 times, code generated with -g -O might be different than code
6506 generated with -O but not -g.
6508 FIXME: This is a real kludge and needs to be done some other
6509 way. */
6510 if (NONDEBUG_INSN_P (insn)
6511 && num_insns++ > param_max_cse_insns)
6513 flush_hash_table ();
6514 num_insns = 0;
6517 if (INSN_P (insn))
6519 /* Process notes first so we have all notes in canonical forms
6520 when looking for duplicate operations. */
6521 bool changed = false;
6522 for (rtx note = REG_NOTES (insn); note; note = XEXP (note, 1))
6523 if (REG_NOTE_KIND (note) == REG_EQUAL)
6525 rtx newval = cse_process_note (XEXP (note, 0));
6526 if (newval != XEXP (note, 0))
6528 XEXP (note, 0) = newval;
6529 changed = true;
6532 if (changed)
6533 df_notes_rescan (insn);
6535 cse_insn (insn);
6537 /* If we haven't already found an insn where we added a LABEL_REF,
6538 check this one. */
6539 if (INSN_P (insn) && !recorded_label_ref
6540 && check_for_label_ref (insn))
6541 recorded_label_ref = true;
6545 /* With non-call exceptions, we are not always able to update
6546 the CFG properly inside cse_insn. So clean up possibly
6547 redundant EH edges here. */
6548 if (cfun->can_throw_non_call_exceptions && have_eh_succ_edges (bb))
6549 cse_cfg_altered |= purge_dead_edges (bb);
6551 /* If we changed a conditional jump, we may have terminated
6552 the path we are following. Check that by verifying that
6553 the edge we would take still exists. If the edge does
6554 not exist anymore, purge the remainder of the path.
6555 Note that this will cause us to return to the caller. */
6556 if (path_entry < path_size - 1)
6558 basic_block next_bb = ebb_data->path[path_entry + 1].bb;
6559 if (!find_edge (bb, next_bb))
6563 path_size--;
6565 /* If we truncate the path, we must also reset the
6566 visited bit on the remaining blocks in the path,
6567 or we will never visit them at all. */
6568 bitmap_clear_bit (cse_visited_basic_blocks,
6569 ebb_data->path[path_size].bb->index);
6570 ebb_data->path[path_size].bb = NULL;
6572 while (path_size - 1 != path_entry);
6573 ebb_data->path_size = path_size;
6577 /* If this is a conditional jump insn, record any known
6578 equivalences due to the condition being tested. */
6579 insn = BB_END (bb);
6580 if (path_entry < path_size - 1
6581 && EDGE_COUNT (bb->succs) == 2
6582 && JUMP_P (insn)
6583 && single_set (insn)
6584 && any_condjump_p (insn))
6586 basic_block next_bb = ebb_data->path[path_entry + 1].bb;
6587 bool taken = (next_bb == BRANCH_EDGE (bb)->dest);
6588 record_jump_equiv (insn, taken);
6592 gcc_assert (next_qty <= max_qty);
6594 free (qty_table);
6598 /* Perform cse on the instructions of a function.
6599 F is the first instruction.
6600 NREGS is one plus the highest pseudo-reg number used in the instruction.
6602 Return 2 if jump optimizations should be redone due to simplifications
6603 in conditional jump instructions.
6604 Return 1 if the CFG should be cleaned up because it has been modified.
6605 Return 0 otherwise. */
6607 static int
6608 cse_main (rtx_insn *f ATTRIBUTE_UNUSED, int nregs)
6610 struct cse_basic_block_data ebb_data;
6611 basic_block bb;
6612 int *rc_order = XNEWVEC (int, last_basic_block_for_fn (cfun));
6613 int i, n_blocks;
6615 /* CSE doesn't use dominane info but can invalidate it in different ways.
6616 For simplicity free dominance info here. */
6617 free_dominance_info (CDI_DOMINATORS);
6619 df_set_flags (DF_LR_RUN_DCE);
6620 df_note_add_problem ();
6621 df_analyze ();
6622 df_set_flags (DF_DEFER_INSN_RESCAN);
6624 reg_scan (get_insns (), max_reg_num ());
6625 init_cse_reg_info (nregs);
6627 ebb_data.path = XNEWVEC (struct branch_path,
6628 param_max_cse_path_length);
6630 cse_cfg_altered = false;
6631 cse_jumps_altered = false;
6632 recorded_label_ref = false;
6633 constant_pool_entries_cost = 0;
6634 constant_pool_entries_regcost = 0;
6635 ebb_data.path_size = 0;
6636 ebb_data.nsets = 0;
6637 rtl_hooks = cse_rtl_hooks;
6639 init_recog ();
6640 init_alias_analysis ();
6642 reg_eqv_table = XNEWVEC (struct reg_eqv_elem, nregs);
6644 /* Set up the table of already visited basic blocks. */
6645 cse_visited_basic_blocks = sbitmap_alloc (last_basic_block_for_fn (cfun));
6646 bitmap_clear (cse_visited_basic_blocks);
6648 /* Loop over basic blocks in reverse completion order (RPO),
6649 excluding the ENTRY and EXIT blocks. */
6650 n_blocks = pre_and_rev_post_order_compute (NULL, rc_order, false);
6651 i = 0;
6652 while (i < n_blocks)
6654 /* Find the first block in the RPO queue that we have not yet
6655 processed before. */
6658 bb = BASIC_BLOCK_FOR_FN (cfun, rc_order[i++]);
6660 while (bitmap_bit_p (cse_visited_basic_blocks, bb->index)
6661 && i < n_blocks);
6663 /* Find all paths starting with BB, and process them. */
6664 while (cse_find_path (bb, &ebb_data, flag_cse_follow_jumps))
6666 /* Pre-scan the path. */
6667 cse_prescan_path (&ebb_data);
6669 /* If this basic block has no sets, skip it. */
6670 if (ebb_data.nsets == 0)
6671 continue;
6673 /* Get a reasonable estimate for the maximum number of qty's
6674 needed for this path. For this, we take the number of sets
6675 and multiply that by MAX_RECOG_OPERANDS. */
6676 max_qty = ebb_data.nsets * MAX_RECOG_OPERANDS;
6678 /* Dump the path we're about to process. */
6679 if (dump_file)
6680 cse_dump_path (&ebb_data, ebb_data.nsets, dump_file);
6682 cse_extended_basic_block (&ebb_data);
6686 /* Clean up. */
6687 end_alias_analysis ();
6688 free (reg_eqv_table);
6689 free (ebb_data.path);
6690 sbitmap_free (cse_visited_basic_blocks);
6691 free (rc_order);
6692 rtl_hooks = general_rtl_hooks;
6694 if (cse_jumps_altered || recorded_label_ref)
6695 return 2;
6696 else if (cse_cfg_altered)
6697 return 1;
6698 else
6699 return 0;
6702 /* Count the number of times registers are used (not set) in X.
6703 COUNTS is an array in which we accumulate the count, INCR is how much
6704 we count each register usage.
6706 Don't count a usage of DEST, which is the SET_DEST of a SET which
6707 contains X in its SET_SRC. This is because such a SET does not
6708 modify the liveness of DEST.
6709 DEST is set to pc_rtx for a trapping insn, or for an insn with side effects.
6710 We must then count uses of a SET_DEST regardless, because the insn can't be
6711 deleted here. */
6713 static void
6714 count_reg_usage (rtx x, int *counts, rtx dest, int incr)
6716 enum rtx_code code;
6717 rtx note;
6718 const char *fmt;
6719 int i, j;
6721 if (x == 0)
6722 return;
6724 switch (code = GET_CODE (x))
6726 case REG:
6727 if (x != dest)
6728 counts[REGNO (x)] += incr;
6729 return;
6731 case PC:
6732 case CONST:
6733 CASE_CONST_ANY:
6734 case SYMBOL_REF:
6735 case LABEL_REF:
6736 return;
6738 case CLOBBER:
6739 /* If we are clobbering a MEM, mark any registers inside the address
6740 as being used. */
6741 if (MEM_P (XEXP (x, 0)))
6742 count_reg_usage (XEXP (XEXP (x, 0), 0), counts, NULL_RTX, incr);
6743 return;
6745 case SET:
6746 /* Unless we are setting a REG, count everything in SET_DEST. */
6747 if (!REG_P (SET_DEST (x)))
6748 count_reg_usage (SET_DEST (x), counts, NULL_RTX, incr);
6749 count_reg_usage (SET_SRC (x), counts,
6750 dest ? dest : SET_DEST (x),
6751 incr);
6752 return;
6754 case DEBUG_INSN:
6755 return;
6757 case CALL_INSN:
6758 case INSN:
6759 case JUMP_INSN:
6760 /* We expect dest to be NULL_RTX here. If the insn may throw,
6761 or if it cannot be deleted due to side-effects, mark this fact
6762 by setting DEST to pc_rtx. */
6763 if ((!cfun->can_delete_dead_exceptions && !insn_nothrow_p (x))
6764 || side_effects_p (PATTERN (x)))
6765 dest = pc_rtx;
6766 if (code == CALL_INSN)
6767 count_reg_usage (CALL_INSN_FUNCTION_USAGE (x), counts, dest, incr);
6768 count_reg_usage (PATTERN (x), counts, dest, incr);
6770 /* Things used in a REG_EQUAL note aren't dead since loop may try to
6771 use them. */
6773 note = find_reg_equal_equiv_note (x);
6774 if (note)
6776 rtx eqv = XEXP (note, 0);
6778 if (GET_CODE (eqv) == EXPR_LIST)
6779 /* This REG_EQUAL note describes the result of a function call.
6780 Process all the arguments. */
6783 count_reg_usage (XEXP (eqv, 0), counts, dest, incr);
6784 eqv = XEXP (eqv, 1);
6786 while (eqv && GET_CODE (eqv) == EXPR_LIST);
6787 else
6788 count_reg_usage (eqv, counts, dest, incr);
6790 return;
6792 case EXPR_LIST:
6793 if (REG_NOTE_KIND (x) == REG_EQUAL
6794 || (REG_NOTE_KIND (x) != REG_NONNEG && GET_CODE (XEXP (x,0)) == USE)
6795 /* FUNCTION_USAGE expression lists may include (CLOBBER (mem /u)),
6796 involving registers in the address. */
6797 || GET_CODE (XEXP (x, 0)) == CLOBBER)
6798 count_reg_usage (XEXP (x, 0), counts, NULL_RTX, incr);
6800 count_reg_usage (XEXP (x, 1), counts, NULL_RTX, incr);
6801 return;
6803 case ASM_OPERANDS:
6804 /* Iterate over just the inputs, not the constraints as well. */
6805 for (i = ASM_OPERANDS_INPUT_LENGTH (x) - 1; i >= 0; i--)
6806 count_reg_usage (ASM_OPERANDS_INPUT (x, i), counts, dest, incr);
6807 return;
6809 case INSN_LIST:
6810 case INT_LIST:
6811 gcc_unreachable ();
6813 default:
6814 break;
6817 fmt = GET_RTX_FORMAT (code);
6818 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
6820 if (fmt[i] == 'e')
6821 count_reg_usage (XEXP (x, i), counts, dest, incr);
6822 else if (fmt[i] == 'E')
6823 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
6824 count_reg_usage (XVECEXP (x, i, j), counts, dest, incr);
6828 /* Return true if X is a dead register. */
6830 static inline int
6831 is_dead_reg (const_rtx x, int *counts)
6833 return (REG_P (x)
6834 && REGNO (x) >= FIRST_PSEUDO_REGISTER
6835 && counts[REGNO (x)] == 0);
6838 /* Return true if set is live. */
6839 static bool
6840 set_live_p (rtx set, int *counts)
6842 if (set_noop_p (set))
6843 return false;
6845 if (!is_dead_reg (SET_DEST (set), counts)
6846 || side_effects_p (SET_SRC (set)))
6847 return true;
6849 return false;
6852 /* Return true if insn is live. */
6854 static bool
6855 insn_live_p (rtx_insn *insn, int *counts)
6857 int i;
6858 if (!cfun->can_delete_dead_exceptions && !insn_nothrow_p (insn))
6859 return true;
6860 else if (GET_CODE (PATTERN (insn)) == SET)
6861 return set_live_p (PATTERN (insn), counts);
6862 else if (GET_CODE (PATTERN (insn)) == PARALLEL)
6864 for (i = XVECLEN (PATTERN (insn), 0) - 1; i >= 0; i--)
6866 rtx elt = XVECEXP (PATTERN (insn), 0, i);
6868 if (GET_CODE (elt) == SET)
6870 if (set_live_p (elt, counts))
6871 return true;
6873 else if (GET_CODE (elt) != CLOBBER && GET_CODE (elt) != USE)
6874 return true;
6876 return false;
6878 else if (DEBUG_INSN_P (insn))
6880 rtx_insn *next;
6882 if (DEBUG_MARKER_INSN_P (insn))
6883 return true;
6885 for (next = NEXT_INSN (insn); next; next = NEXT_INSN (next))
6886 if (NOTE_P (next))
6887 continue;
6888 else if (!DEBUG_INSN_P (next))
6889 return true;
6890 /* If we find an inspection point, such as a debug begin stmt,
6891 we want to keep the earlier debug insn. */
6892 else if (DEBUG_MARKER_INSN_P (next))
6893 return true;
6894 else if (INSN_VAR_LOCATION_DECL (insn) == INSN_VAR_LOCATION_DECL (next))
6895 return false;
6897 return true;
6899 else
6900 return true;
6903 /* Count the number of stores into pseudo. Callback for note_stores. */
6905 static void
6906 count_stores (rtx x, const_rtx set ATTRIBUTE_UNUSED, void *data)
6908 int *counts = (int *) data;
6909 if (REG_P (x) && REGNO (x) >= FIRST_PSEUDO_REGISTER)
6910 counts[REGNO (x)]++;
6913 /* Return if DEBUG_INSN pattern PAT needs to be reset because some dead
6914 pseudo doesn't have a replacement. COUNTS[X] is zero if register X
6915 is dead and REPLACEMENTS[X] is null if it has no replacemenet.
6916 Set *SEEN_REPL to true if we see a dead register that does have
6917 a replacement. */
6919 static bool
6920 is_dead_debug_insn (const_rtx pat, int *counts, rtx *replacements,
6921 bool *seen_repl)
6923 subrtx_iterator::array_type array;
6924 FOR_EACH_SUBRTX (iter, array, pat, NONCONST)
6926 const_rtx x = *iter;
6927 if (is_dead_reg (x, counts))
6929 if (replacements && replacements[REGNO (x)] != NULL_RTX)
6930 *seen_repl = true;
6931 else
6932 return true;
6935 return false;
6938 /* Replace a dead pseudo in a DEBUG_INSN with replacement DEBUG_EXPR.
6939 Callback for simplify_replace_fn_rtx. */
6941 static rtx
6942 replace_dead_reg (rtx x, const_rtx old_rtx ATTRIBUTE_UNUSED, void *data)
6944 rtx *replacements = (rtx *) data;
6946 if (REG_P (x)
6947 && REGNO (x) >= FIRST_PSEUDO_REGISTER
6948 && replacements[REGNO (x)] != NULL_RTX)
6950 if (GET_MODE (x) == GET_MODE (replacements[REGNO (x)]))
6951 return replacements[REGNO (x)];
6952 return lowpart_subreg (GET_MODE (x), replacements[REGNO (x)],
6953 GET_MODE (replacements[REGNO (x)]));
6955 return NULL_RTX;
6958 /* Scan all the insns and delete any that are dead; i.e., they store a register
6959 that is never used or they copy a register to itself.
6961 This is used to remove insns made obviously dead by cse, loop or other
6962 optimizations. It improves the heuristics in loop since it won't try to
6963 move dead invariants out of loops or make givs for dead quantities. The
6964 remaining passes of the compilation are also sped up. */
6967 delete_trivially_dead_insns (rtx_insn *insns, int nreg)
6969 int *counts;
6970 rtx_insn *insn, *prev;
6971 rtx *replacements = NULL;
6972 int ndead = 0;
6974 timevar_push (TV_DELETE_TRIVIALLY_DEAD);
6975 /* First count the number of times each register is used. */
6976 if (MAY_HAVE_DEBUG_BIND_INSNS)
6978 counts = XCNEWVEC (int, nreg * 3);
6979 for (insn = insns; insn; insn = NEXT_INSN (insn))
6980 if (DEBUG_BIND_INSN_P (insn))
6981 count_reg_usage (INSN_VAR_LOCATION_LOC (insn), counts + nreg,
6982 NULL_RTX, 1);
6983 else if (INSN_P (insn))
6985 count_reg_usage (insn, counts, NULL_RTX, 1);
6986 note_stores (insn, count_stores, counts + nreg * 2);
6988 /* If there can be debug insns, COUNTS are 3 consecutive arrays.
6989 First one counts how many times each pseudo is used outside
6990 of debug insns, second counts how many times each pseudo is
6991 used in debug insns and third counts how many times a pseudo
6992 is stored. */
6994 else
6996 counts = XCNEWVEC (int, nreg);
6997 for (insn = insns; insn; insn = NEXT_INSN (insn))
6998 if (INSN_P (insn))
6999 count_reg_usage (insn, counts, NULL_RTX, 1);
7000 /* If no debug insns can be present, COUNTS is just an array
7001 which counts how many times each pseudo is used. */
7003 /* Pseudo PIC register should be considered as used due to possible
7004 new usages generated. */
7005 if (!reload_completed
7006 && pic_offset_table_rtx
7007 && REGNO (pic_offset_table_rtx) >= FIRST_PSEUDO_REGISTER)
7008 counts[REGNO (pic_offset_table_rtx)]++;
7009 /* Go from the last insn to the first and delete insns that only set unused
7010 registers or copy a register to itself. As we delete an insn, remove
7011 usage counts for registers it uses.
7013 The first jump optimization pass may leave a real insn as the last
7014 insn in the function. We must not skip that insn or we may end
7015 up deleting code that is not really dead.
7017 If some otherwise unused register is only used in DEBUG_INSNs,
7018 try to create a DEBUG_EXPR temporary and emit a DEBUG_INSN before
7019 the setter. Then go through DEBUG_INSNs and if a DEBUG_EXPR
7020 has been created for the unused register, replace it with
7021 the DEBUG_EXPR, otherwise reset the DEBUG_INSN. */
7022 for (insn = get_last_insn (); insn; insn = prev)
7024 int live_insn = 0;
7026 prev = PREV_INSN (insn);
7027 if (!INSN_P (insn))
7028 continue;
7030 live_insn = insn_live_p (insn, counts);
7032 /* If this is a dead insn, delete it and show registers in it aren't
7033 being used. */
7035 if (! live_insn && dbg_cnt (delete_trivial_dead))
7037 if (DEBUG_INSN_P (insn))
7039 if (DEBUG_BIND_INSN_P (insn))
7040 count_reg_usage (INSN_VAR_LOCATION_LOC (insn), counts + nreg,
7041 NULL_RTX, -1);
7043 else
7045 rtx set;
7046 if (MAY_HAVE_DEBUG_BIND_INSNS
7047 && (set = single_set (insn)) != NULL_RTX
7048 && is_dead_reg (SET_DEST (set), counts)
7049 /* Used at least once in some DEBUG_INSN. */
7050 && counts[REGNO (SET_DEST (set)) + nreg] > 0
7051 /* And set exactly once. */
7052 && counts[REGNO (SET_DEST (set)) + nreg * 2] == 1
7053 && !side_effects_p (SET_SRC (set))
7054 && asm_noperands (PATTERN (insn)) < 0)
7056 rtx dval, bind_var_loc;
7057 rtx_insn *bind;
7059 /* Create DEBUG_EXPR (and DEBUG_EXPR_DECL). */
7060 dval = make_debug_expr_from_rtl (SET_DEST (set));
7062 /* Emit a debug bind insn before the insn in which
7063 reg dies. */
7064 bind_var_loc =
7065 gen_rtx_VAR_LOCATION (GET_MODE (SET_DEST (set)),
7066 DEBUG_EXPR_TREE_DECL (dval),
7067 SET_SRC (set),
7068 VAR_INIT_STATUS_INITIALIZED);
7069 count_reg_usage (bind_var_loc, counts + nreg, NULL_RTX, 1);
7071 bind = emit_debug_insn_before (bind_var_loc, insn);
7072 df_insn_rescan (bind);
7074 if (replacements == NULL)
7075 replacements = XCNEWVEC (rtx, nreg);
7076 replacements[REGNO (SET_DEST (set))] = dval;
7079 count_reg_usage (insn, counts, NULL_RTX, -1);
7080 ndead++;
7082 cse_cfg_altered |= delete_insn_and_edges (insn);
7086 if (MAY_HAVE_DEBUG_BIND_INSNS)
7088 for (insn = get_last_insn (); insn; insn = PREV_INSN (insn))
7089 if (DEBUG_BIND_INSN_P (insn))
7091 /* If this debug insn references a dead register that wasn't replaced
7092 with an DEBUG_EXPR, reset the DEBUG_INSN. */
7093 bool seen_repl = false;
7094 if (is_dead_debug_insn (INSN_VAR_LOCATION_LOC (insn),
7095 counts, replacements, &seen_repl))
7097 INSN_VAR_LOCATION_LOC (insn) = gen_rtx_UNKNOWN_VAR_LOC ();
7098 df_insn_rescan (insn);
7100 else if (seen_repl)
7102 INSN_VAR_LOCATION_LOC (insn)
7103 = simplify_replace_fn_rtx (INSN_VAR_LOCATION_LOC (insn),
7104 NULL_RTX, replace_dead_reg,
7105 replacements);
7106 df_insn_rescan (insn);
7109 free (replacements);
7112 if (dump_file && ndead)
7113 fprintf (dump_file, "Deleted %i trivially dead insns\n",
7114 ndead);
7115 /* Clean up. */
7116 free (counts);
7117 timevar_pop (TV_DELETE_TRIVIALLY_DEAD);
7118 return ndead;
7121 /* If LOC contains references to NEWREG in a different mode, change them
7122 to use NEWREG instead. */
7124 static void
7125 cse_change_cc_mode (subrtx_ptr_iterator::array_type &array,
7126 rtx *loc, rtx_insn *insn, rtx newreg)
7128 FOR_EACH_SUBRTX_PTR (iter, array, loc, NONCONST)
7130 rtx *loc = *iter;
7131 rtx x = *loc;
7132 if (x
7133 && REG_P (x)
7134 && REGNO (x) == REGNO (newreg)
7135 && GET_MODE (x) != GET_MODE (newreg))
7137 validate_change (insn, loc, newreg, 1);
7138 iter.skip_subrtxes ();
7143 /* Change the mode of any reference to the register REGNO (NEWREG) to
7144 GET_MODE (NEWREG) in INSN. */
7146 static void
7147 cse_change_cc_mode_insn (rtx_insn *insn, rtx newreg)
7149 int success;
7151 if (!INSN_P (insn))
7152 return;
7154 subrtx_ptr_iterator::array_type array;
7155 cse_change_cc_mode (array, &PATTERN (insn), insn, newreg);
7156 cse_change_cc_mode (array, &REG_NOTES (insn), insn, newreg);
7158 /* If the following assertion was triggered, there is most probably
7159 something wrong with the cc_modes_compatible back end function.
7160 CC modes only can be considered compatible if the insn - with the mode
7161 replaced by any of the compatible modes - can still be recognized. */
7162 success = apply_change_group ();
7163 gcc_assert (success);
7166 /* Change the mode of any reference to the register REGNO (NEWREG) to
7167 GET_MODE (NEWREG), starting at START. Stop before END. Stop at
7168 any instruction which modifies NEWREG. */
7170 static void
7171 cse_change_cc_mode_insns (rtx_insn *start, rtx_insn *end, rtx newreg)
7173 rtx_insn *insn;
7175 for (insn = start; insn != end; insn = NEXT_INSN (insn))
7177 if (! INSN_P (insn))
7178 continue;
7180 if (reg_set_p (newreg, insn))
7181 return;
7183 cse_change_cc_mode_insn (insn, newreg);
7187 /* BB is a basic block which finishes with CC_REG as a condition code
7188 register which is set to CC_SRC. Look through the successors of BB
7189 to find blocks which have a single predecessor (i.e., this one),
7190 and look through those blocks for an assignment to CC_REG which is
7191 equivalent to CC_SRC. CAN_CHANGE_MODE indicates whether we are
7192 permitted to change the mode of CC_SRC to a compatible mode. This
7193 returns VOIDmode if no equivalent assignments were found.
7194 Otherwise it returns the mode which CC_SRC should wind up with.
7195 ORIG_BB should be the same as BB in the outermost cse_cc_succs call,
7196 but is passed unmodified down to recursive calls in order to prevent
7197 endless recursion.
7199 The main complexity in this function is handling the mode issues.
7200 We may have more than one duplicate which we can eliminate, and we
7201 try to find a mode which will work for multiple duplicates. */
7203 static machine_mode
7204 cse_cc_succs (basic_block bb, basic_block orig_bb, rtx cc_reg, rtx cc_src,
7205 bool can_change_mode)
7207 bool found_equiv;
7208 machine_mode mode;
7209 unsigned int insn_count;
7210 edge e;
7211 rtx_insn *insns[2];
7212 machine_mode modes[2];
7213 rtx_insn *last_insns[2];
7214 unsigned int i;
7215 rtx newreg;
7216 edge_iterator ei;
7218 /* We expect to have two successors. Look at both before picking
7219 the final mode for the comparison. If we have more successors
7220 (i.e., some sort of table jump, although that seems unlikely),
7221 then we require all beyond the first two to use the same
7222 mode. */
7224 found_equiv = false;
7225 mode = GET_MODE (cc_src);
7226 insn_count = 0;
7227 FOR_EACH_EDGE (e, ei, bb->succs)
7229 rtx_insn *insn;
7230 rtx_insn *end;
7232 if (e->flags & EDGE_COMPLEX)
7233 continue;
7235 if (EDGE_COUNT (e->dest->preds) != 1
7236 || e->dest == EXIT_BLOCK_PTR_FOR_FN (cfun)
7237 /* Avoid endless recursion on unreachable blocks. */
7238 || e->dest == orig_bb)
7239 continue;
7241 end = NEXT_INSN (BB_END (e->dest));
7242 for (insn = BB_HEAD (e->dest); insn != end; insn = NEXT_INSN (insn))
7244 rtx set;
7246 if (! INSN_P (insn))
7247 continue;
7249 /* If CC_SRC is modified, we have to stop looking for
7250 something which uses it. */
7251 if (modified_in_p (cc_src, insn))
7252 break;
7254 /* Check whether INSN sets CC_REG to CC_SRC. */
7255 set = single_set (insn);
7256 if (set
7257 && REG_P (SET_DEST (set))
7258 && REGNO (SET_DEST (set)) == REGNO (cc_reg))
7260 bool found;
7261 machine_mode set_mode;
7262 machine_mode comp_mode;
7264 found = false;
7265 set_mode = GET_MODE (SET_SRC (set));
7266 comp_mode = set_mode;
7267 if (rtx_equal_p (cc_src, SET_SRC (set)))
7268 found = true;
7269 else if (GET_CODE (cc_src) == COMPARE
7270 && GET_CODE (SET_SRC (set)) == COMPARE
7271 && mode != set_mode
7272 && rtx_equal_p (XEXP (cc_src, 0),
7273 XEXP (SET_SRC (set), 0))
7274 && rtx_equal_p (XEXP (cc_src, 1),
7275 XEXP (SET_SRC (set), 1)))
7278 comp_mode = targetm.cc_modes_compatible (mode, set_mode);
7279 if (comp_mode != VOIDmode
7280 && (can_change_mode || comp_mode == mode))
7281 found = true;
7284 if (found)
7286 found_equiv = true;
7287 if (insn_count < ARRAY_SIZE (insns))
7289 insns[insn_count] = insn;
7290 modes[insn_count] = set_mode;
7291 last_insns[insn_count] = end;
7292 ++insn_count;
7294 if (mode != comp_mode)
7296 gcc_assert (can_change_mode);
7297 mode = comp_mode;
7299 /* The modified insn will be re-recognized later. */
7300 PUT_MODE (cc_src, mode);
7303 else
7305 if (set_mode != mode)
7307 /* We found a matching expression in the
7308 wrong mode, but we don't have room to
7309 store it in the array. Punt. This case
7310 should be rare. */
7311 break;
7313 /* INSN sets CC_REG to a value equal to CC_SRC
7314 with the right mode. We can simply delete
7315 it. */
7316 delete_insn (insn);
7319 /* We found an instruction to delete. Keep looking,
7320 in the hopes of finding a three-way jump. */
7321 continue;
7324 /* We found an instruction which sets the condition
7325 code, so don't look any farther. */
7326 break;
7329 /* If INSN sets CC_REG in some other way, don't look any
7330 farther. */
7331 if (reg_set_p (cc_reg, insn))
7332 break;
7335 /* If we fell off the bottom of the block, we can keep looking
7336 through successors. We pass CAN_CHANGE_MODE as false because
7337 we aren't prepared to handle compatibility between the
7338 further blocks and this block. */
7339 if (insn == end)
7341 machine_mode submode;
7343 submode = cse_cc_succs (e->dest, orig_bb, cc_reg, cc_src, false);
7344 if (submode != VOIDmode)
7346 gcc_assert (submode == mode);
7347 found_equiv = true;
7348 can_change_mode = false;
7353 if (! found_equiv)
7354 return VOIDmode;
7356 /* Now INSN_COUNT is the number of instructions we found which set
7357 CC_REG to a value equivalent to CC_SRC. The instructions are in
7358 INSNS. The modes used by those instructions are in MODES. */
7360 newreg = NULL_RTX;
7361 for (i = 0; i < insn_count; ++i)
7363 if (modes[i] != mode)
7365 /* We need to change the mode of CC_REG in INSNS[i] and
7366 subsequent instructions. */
7367 if (! newreg)
7369 if (GET_MODE (cc_reg) == mode)
7370 newreg = cc_reg;
7371 else
7372 newreg = gen_rtx_REG (mode, REGNO (cc_reg));
7374 cse_change_cc_mode_insns (NEXT_INSN (insns[i]), last_insns[i],
7375 newreg);
7378 cse_cfg_altered |= delete_insn_and_edges (insns[i]);
7381 return mode;
7384 /* If we have a fixed condition code register (or two), walk through
7385 the instructions and try to eliminate duplicate assignments. */
7387 static void
7388 cse_condition_code_reg (void)
7390 unsigned int cc_regno_1;
7391 unsigned int cc_regno_2;
7392 rtx cc_reg_1;
7393 rtx cc_reg_2;
7394 basic_block bb;
7396 if (! targetm.fixed_condition_code_regs (&cc_regno_1, &cc_regno_2))
7397 return;
7399 cc_reg_1 = gen_rtx_REG (CCmode, cc_regno_1);
7400 if (cc_regno_2 != INVALID_REGNUM)
7401 cc_reg_2 = gen_rtx_REG (CCmode, cc_regno_2);
7402 else
7403 cc_reg_2 = NULL_RTX;
7405 FOR_EACH_BB_FN (bb, cfun)
7407 rtx_insn *last_insn;
7408 rtx cc_reg;
7409 rtx_insn *insn;
7410 rtx_insn *cc_src_insn;
7411 rtx cc_src;
7412 machine_mode mode;
7413 machine_mode orig_mode;
7415 /* Look for blocks which end with a conditional jump based on a
7416 condition code register. Then look for the instruction which
7417 sets the condition code register. Then look through the
7418 successor blocks for instructions which set the condition
7419 code register to the same value. There are other possible
7420 uses of the condition code register, but these are by far the
7421 most common and the ones which we are most likely to be able
7422 to optimize. */
7424 last_insn = BB_END (bb);
7425 if (!JUMP_P (last_insn))
7426 continue;
7428 if (reg_referenced_p (cc_reg_1, PATTERN (last_insn)))
7429 cc_reg = cc_reg_1;
7430 else if (cc_reg_2 && reg_referenced_p (cc_reg_2, PATTERN (last_insn)))
7431 cc_reg = cc_reg_2;
7432 else
7433 continue;
7435 cc_src_insn = NULL;
7436 cc_src = NULL_RTX;
7437 for (insn = PREV_INSN (last_insn);
7438 insn && insn != PREV_INSN (BB_HEAD (bb));
7439 insn = PREV_INSN (insn))
7441 rtx set;
7443 if (! INSN_P (insn))
7444 continue;
7445 set = single_set (insn);
7446 if (set
7447 && REG_P (SET_DEST (set))
7448 && REGNO (SET_DEST (set)) == REGNO (cc_reg))
7450 cc_src_insn = insn;
7451 cc_src = SET_SRC (set);
7452 break;
7454 else if (reg_set_p (cc_reg, insn))
7455 break;
7458 if (! cc_src_insn)
7459 continue;
7461 if (modified_between_p (cc_src, cc_src_insn, NEXT_INSN (last_insn)))
7462 continue;
7464 /* Now CC_REG is a condition code register used for a
7465 conditional jump at the end of the block, and CC_SRC, in
7466 CC_SRC_INSN, is the value to which that condition code
7467 register is set, and CC_SRC is still meaningful at the end of
7468 the basic block. */
7470 orig_mode = GET_MODE (cc_src);
7471 mode = cse_cc_succs (bb, bb, cc_reg, cc_src, true);
7472 if (mode != VOIDmode)
7474 gcc_assert (mode == GET_MODE (cc_src));
7475 if (mode != orig_mode)
7477 rtx newreg = gen_rtx_REG (mode, REGNO (cc_reg));
7479 cse_change_cc_mode_insn (cc_src_insn, newreg);
7481 /* Do the same in the following insns that use the
7482 current value of CC_REG within BB. */
7483 cse_change_cc_mode_insns (NEXT_INSN (cc_src_insn),
7484 NEXT_INSN (last_insn),
7485 newreg);
7492 /* Perform common subexpression elimination. Nonzero value from
7493 `cse_main' means that jumps were simplified and some code may now
7494 be unreachable, so do jump optimization again. */
7495 static unsigned int
7496 rest_of_handle_cse (void)
7498 int tem;
7500 if (dump_file)
7501 dump_flow_info (dump_file, dump_flags);
7503 tem = cse_main (get_insns (), max_reg_num ());
7505 /* If we are not running more CSE passes, then we are no longer
7506 expecting CSE to be run. But always rerun it in a cheap mode. */
7507 cse_not_expected = !flag_rerun_cse_after_loop && !flag_gcse;
7509 if (tem == 2)
7511 timevar_push (TV_JUMP);
7512 rebuild_jump_labels (get_insns ());
7513 cse_cfg_altered |= cleanup_cfg (CLEANUP_CFG_CHANGED);
7514 timevar_pop (TV_JUMP);
7516 else if (tem == 1 || optimize > 1)
7517 cse_cfg_altered |= cleanup_cfg (0);
7519 return 0;
7522 namespace {
7524 const pass_data pass_data_cse =
7526 RTL_PASS, /* type */
7527 "cse1", /* name */
7528 OPTGROUP_NONE, /* optinfo_flags */
7529 TV_CSE, /* tv_id */
7530 0, /* properties_required */
7531 0, /* properties_provided */
7532 0, /* properties_destroyed */
7533 0, /* todo_flags_start */
7534 TODO_df_finish, /* todo_flags_finish */
7537 class pass_cse : public rtl_opt_pass
7539 public:
7540 pass_cse (gcc::context *ctxt)
7541 : rtl_opt_pass (pass_data_cse, ctxt)
7544 /* opt_pass methods: */
7545 virtual bool gate (function *) { return optimize > 0; }
7546 virtual unsigned int execute (function *) { return rest_of_handle_cse (); }
7548 }; // class pass_cse
7550 } // anon namespace
7552 rtl_opt_pass *
7553 make_pass_cse (gcc::context *ctxt)
7555 return new pass_cse (ctxt);
7559 /* Run second CSE pass after loop optimizations. */
7560 static unsigned int
7561 rest_of_handle_cse2 (void)
7563 int tem;
7565 if (dump_file)
7566 dump_flow_info (dump_file, dump_flags);
7568 tem = cse_main (get_insns (), max_reg_num ());
7570 /* Run a pass to eliminate duplicated assignments to condition code
7571 registers. We have to run this after bypass_jumps, because it
7572 makes it harder for that pass to determine whether a jump can be
7573 bypassed safely. */
7574 cse_condition_code_reg ();
7576 delete_trivially_dead_insns (get_insns (), max_reg_num ());
7578 if (tem == 2)
7580 timevar_push (TV_JUMP);
7581 rebuild_jump_labels (get_insns ());
7582 cse_cfg_altered |= cleanup_cfg (CLEANUP_CFG_CHANGED);
7583 timevar_pop (TV_JUMP);
7585 else if (tem == 1 || cse_cfg_altered)
7586 cse_cfg_altered |= cleanup_cfg (0);
7588 cse_not_expected = 1;
7589 return 0;
7593 namespace {
7595 const pass_data pass_data_cse2 =
7597 RTL_PASS, /* type */
7598 "cse2", /* name */
7599 OPTGROUP_NONE, /* optinfo_flags */
7600 TV_CSE2, /* tv_id */
7601 0, /* properties_required */
7602 0, /* properties_provided */
7603 0, /* properties_destroyed */
7604 0, /* todo_flags_start */
7605 TODO_df_finish, /* todo_flags_finish */
7608 class pass_cse2 : public rtl_opt_pass
7610 public:
7611 pass_cse2 (gcc::context *ctxt)
7612 : rtl_opt_pass (pass_data_cse2, ctxt)
7615 /* opt_pass methods: */
7616 virtual bool gate (function *)
7618 return optimize > 0 && flag_rerun_cse_after_loop;
7621 virtual unsigned int execute (function *) { return rest_of_handle_cse2 (); }
7623 }; // class pass_cse2
7625 } // anon namespace
7627 rtl_opt_pass *
7628 make_pass_cse2 (gcc::context *ctxt)
7630 return new pass_cse2 (ctxt);
7633 /* Run second CSE pass after loop optimizations. */
7634 static unsigned int
7635 rest_of_handle_cse_after_global_opts (void)
7637 int save_cfj;
7638 int tem;
7640 /* We only want to do local CSE, so don't follow jumps. */
7641 save_cfj = flag_cse_follow_jumps;
7642 flag_cse_follow_jumps = 0;
7644 rebuild_jump_labels (get_insns ());
7645 tem = cse_main (get_insns (), max_reg_num ());
7646 cse_cfg_altered |= purge_all_dead_edges ();
7647 delete_trivially_dead_insns (get_insns (), max_reg_num ());
7649 cse_not_expected = !flag_rerun_cse_after_loop;
7651 /* If cse altered any jumps, rerun jump opts to clean things up. */
7652 if (tem == 2)
7654 timevar_push (TV_JUMP);
7655 rebuild_jump_labels (get_insns ());
7656 cse_cfg_altered |= cleanup_cfg (CLEANUP_CFG_CHANGED);
7657 timevar_pop (TV_JUMP);
7659 else if (tem == 1 || cse_cfg_altered)
7660 cse_cfg_altered |= cleanup_cfg (0);
7662 flag_cse_follow_jumps = save_cfj;
7663 return 0;
7666 namespace {
7668 const pass_data pass_data_cse_after_global_opts =
7670 RTL_PASS, /* type */
7671 "cse_local", /* name */
7672 OPTGROUP_NONE, /* optinfo_flags */
7673 TV_CSE, /* tv_id */
7674 0, /* properties_required */
7675 0, /* properties_provided */
7676 0, /* properties_destroyed */
7677 0, /* todo_flags_start */
7678 TODO_df_finish, /* todo_flags_finish */
7681 class pass_cse_after_global_opts : public rtl_opt_pass
7683 public:
7684 pass_cse_after_global_opts (gcc::context *ctxt)
7685 : rtl_opt_pass (pass_data_cse_after_global_opts, ctxt)
7688 /* opt_pass methods: */
7689 virtual bool gate (function *)
7691 return optimize > 0 && flag_rerun_cse_after_global_opts;
7694 virtual unsigned int execute (function *)
7696 return rest_of_handle_cse_after_global_opts ();
7699 }; // class pass_cse_after_global_opts
7701 } // anon namespace
7703 rtl_opt_pass *
7704 make_pass_cse_after_global_opts (gcc::context *ctxt)
7706 return new pass_cse_after_global_opts (ctxt);