2015-05-05 Yvan Roux <yvan.roux@linaro.org>
[official-gcc.git] / gcc / cse.c
blob15eb33e0936d084c1e366d6c4ebfac8a4e91e3f3
1 /* Common subexpression elimination for GNU compiler.
2 Copyright (C) 1987-2015 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 "tm.h"
24 #include "rtl.h"
25 #include "tm_p.h"
26 #include "hard-reg-set.h"
27 #include "regs.h"
28 #include "predict.h"
29 #include "vec.h"
30 #include "hashtab.h"
31 #include "hash-set.h"
32 #include "machmode.h"
33 #include "input.h"
34 #include "function.h"
35 #include "dominance.h"
36 #include "cfg.h"
37 #include "cfgrtl.h"
38 #include "cfganal.h"
39 #include "cfgcleanup.h"
40 #include "basic-block.h"
41 #include "flags.h"
42 #include "insn-config.h"
43 #include "recog.h"
44 #include "symtab.h"
45 #include "statistics.h"
46 #include "double-int.h"
47 #include "real.h"
48 #include "fixed-value.h"
49 #include "alias.h"
50 #include "wide-int.h"
51 #include "inchash.h"
52 #include "tree.h"
53 #include "expmed.h"
54 #include "dojump.h"
55 #include "explow.h"
56 #include "calls.h"
57 #include "emit-rtl.h"
58 #include "varasm.h"
59 #include "stmt.h"
60 #include "expr.h"
61 #include "diagnostic-core.h"
62 #include "toplev.h"
63 #include "ggc.h"
64 #include "except.h"
65 #include "target.h"
66 #include "params.h"
67 #include "rtlhooks-def.h"
68 #include "tree-pass.h"
69 #include "df.h"
70 #include "dbgcnt.h"
71 #include "rtl-iter.h"
73 /* The basic idea of common subexpression elimination is to go
74 through the code, keeping a record of expressions that would
75 have the same value at the current scan point, and replacing
76 expressions encountered with the cheapest equivalent expression.
78 It is too complicated to keep track of the different possibilities
79 when control paths merge in this code; so, at each label, we forget all
80 that is known and start fresh. This can be described as processing each
81 extended basic block separately. We have a separate pass to perform
82 global CSE.
84 Note CSE can turn a conditional or computed jump into a nop or
85 an unconditional jump. When this occurs we arrange to run the jump
86 optimizer after CSE to delete the unreachable code.
88 We use two data structures to record the equivalent expressions:
89 a hash table for most expressions, and a vector of "quantity
90 numbers" to record equivalent (pseudo) registers.
92 The use of the special data structure for registers is desirable
93 because it is faster. It is possible because registers references
94 contain a fairly small number, the register number, taken from
95 a contiguously allocated series, and two register references are
96 identical if they have the same number. General expressions
97 do not have any such thing, so the only way to retrieve the
98 information recorded on an expression other than a register
99 is to keep it in a hash table.
101 Registers and "quantity numbers":
103 At the start of each basic block, all of the (hardware and pseudo)
104 registers used in the function are given distinct quantity
105 numbers to indicate their contents. During scan, when the code
106 copies one register into another, we copy the quantity number.
107 When a register is loaded in any other way, we allocate a new
108 quantity number to describe the value generated by this operation.
109 `REG_QTY (N)' records what quantity register N is currently thought
110 of as containing.
112 All real quantity numbers are greater than or equal to zero.
113 If register N has not been assigned a quantity, `REG_QTY (N)' will
114 equal -N - 1, which is always negative.
116 Quantity numbers below zero do not exist and none of the `qty_table'
117 entries should be referenced with a negative index.
119 We also maintain a bidirectional chain of registers for each
120 quantity number. The `qty_table` members `first_reg' and `last_reg',
121 and `reg_eqv_table' members `next' and `prev' hold these chains.
123 The first register in a chain is the one whose lifespan is least local.
124 Among equals, it is the one that was seen first.
125 We replace any equivalent register with that one.
127 If two registers have the same quantity number, it must be true that
128 REG expressions with qty_table `mode' must be in the hash table for both
129 registers and must be in the same class.
131 The converse is not true. Since hard registers may be referenced in
132 any mode, two REG expressions might be equivalent in the hash table
133 but not have the same quantity number if the quantity number of one
134 of the registers is not the same mode as those expressions.
136 Constants and quantity numbers
138 When a quantity has a known constant value, that value is stored
139 in the appropriate qty_table `const_rtx'. This is in addition to
140 putting the constant in the hash table as is usual for non-regs.
142 Whether a reg or a constant is preferred is determined by the configuration
143 macro CONST_COSTS and will often depend on the constant value. In any
144 event, expressions containing constants can be simplified, by fold_rtx.
146 When a quantity has a known nearly constant value (such as an address
147 of a stack slot), that value is stored in the appropriate qty_table
148 `const_rtx'.
150 Integer constants don't have a machine mode. However, cse
151 determines the intended machine mode from the destination
152 of the instruction that moves the constant. The machine mode
153 is recorded in the hash table along with the actual RTL
154 constant expression so that different modes are kept separate.
156 Other expressions:
158 To record known equivalences among expressions in general
159 we use a hash table called `table'. It has a fixed number of buckets
160 that contain chains of `struct table_elt' elements for expressions.
161 These chains connect the elements whose expressions have the same
162 hash codes.
164 Other chains through the same elements connect the elements which
165 currently have equivalent values.
167 Register references in an expression are canonicalized before hashing
168 the expression. This is done using `reg_qty' and qty_table `first_reg'.
169 The hash code of a register reference is computed using the quantity
170 number, not the register number.
172 When the value of an expression changes, it is necessary to remove from the
173 hash table not just that expression but all expressions whose values
174 could be different as a result.
176 1. If the value changing is in memory, except in special cases
177 ANYTHING referring to memory could be changed. That is because
178 nobody knows where a pointer does not point.
179 The function `invalidate_memory' removes what is necessary.
181 The special cases are when the address is constant or is
182 a constant plus a fixed register such as the frame pointer
183 or a static chain pointer. When such addresses are stored in,
184 we can tell exactly which other such addresses must be invalidated
185 due to overlap. `invalidate' does this.
186 All expressions that refer to non-constant
187 memory addresses are also invalidated. `invalidate_memory' does this.
189 2. If the value changing is a register, all expressions
190 containing references to that register, and only those,
191 must be removed.
193 Because searching the entire hash table for expressions that contain
194 a register is very slow, we try to figure out when it isn't necessary.
195 Precisely, this is necessary only when expressions have been
196 entered in the hash table using this register, and then the value has
197 changed, and then another expression wants to be added to refer to
198 the register's new value. This sequence of circumstances is rare
199 within any one basic block.
201 `REG_TICK' and `REG_IN_TABLE', accessors for members of
202 cse_reg_info, are used to detect this case. REG_TICK (i) is
203 incremented whenever a value is stored in register i.
204 REG_IN_TABLE (i) holds -1 if no references to register i have been
205 entered in the table; otherwise, it contains the value REG_TICK (i)
206 had when the references were entered. If we want to enter a
207 reference and REG_IN_TABLE (i) != REG_TICK (i), we must scan and
208 remove old references. Until we want to enter a new entry, the
209 mere fact that the two vectors don't match makes the entries be
210 ignored if anyone tries to match them.
212 Registers themselves are entered in the hash table as well as in
213 the equivalent-register chains. However, `REG_TICK' and
214 `REG_IN_TABLE' do not apply to expressions which are simple
215 register references. These expressions are removed from the table
216 immediately when they become invalid, and this can be done even if
217 we do not immediately search for all the expressions that refer to
218 the register.
220 A CLOBBER rtx in an instruction invalidates its operand for further
221 reuse. A CLOBBER or SET rtx whose operand is a MEM:BLK
222 invalidates everything that resides in memory.
224 Related expressions:
226 Constant expressions that differ only by an additive integer
227 are called related. When a constant expression is put in
228 the table, the related expression with no constant term
229 is also entered. These are made to point at each other
230 so that it is possible to find out if there exists any
231 register equivalent to an expression related to a given expression. */
233 /* Length of qty_table vector. We know in advance we will not need
234 a quantity number this big. */
236 static int max_qty;
238 /* Next quantity number to be allocated.
239 This is 1 + the largest number needed so far. */
241 static int next_qty;
243 /* Per-qty information tracking.
245 `first_reg' and `last_reg' track the head and tail of the
246 chain of registers which currently contain this quantity.
248 `mode' contains the machine mode of this quantity.
250 `const_rtx' holds the rtx of the constant value of this
251 quantity, if known. A summations of the frame/arg pointer
252 and a constant can also be entered here. When this holds
253 a known value, `const_insn' is the insn which stored the
254 constant value.
256 `comparison_{code,const,qty}' are used to track when a
257 comparison between a quantity and some constant or register has
258 been passed. In such a case, we know the results of the comparison
259 in case we see it again. These members record a comparison that
260 is known to be true. `comparison_code' holds the rtx code of such
261 a comparison, else it is set to UNKNOWN and the other two
262 comparison members are undefined. `comparison_const' holds
263 the constant being compared against, or zero if the comparison
264 is not against a constant. `comparison_qty' holds the quantity
265 being compared against when the result is known. If the comparison
266 is not with a register, `comparison_qty' is -1. */
268 struct qty_table_elem
270 rtx const_rtx;
271 rtx_insn *const_insn;
272 rtx comparison_const;
273 int comparison_qty;
274 unsigned int first_reg, last_reg;
275 /* The sizes of these fields should match the sizes of the
276 code and mode fields of struct rtx_def (see rtl.h). */
277 ENUM_BITFIELD(rtx_code) comparison_code : 16;
278 ENUM_BITFIELD(machine_mode) mode : 8;
281 /* The table of all qtys, indexed by qty number. */
282 static struct qty_table_elem *qty_table;
284 /* For machines that have a CC0, we do not record its value in the hash
285 table since its use is guaranteed to be the insn immediately following
286 its definition and any other insn is presumed to invalidate it.
288 Instead, we store below the current and last value assigned to CC0.
289 If it should happen to be a constant, it is stored in preference
290 to the actual assigned value. In case it is a constant, we store
291 the mode in which the constant should be interpreted. */
293 static rtx this_insn_cc0, prev_insn_cc0;
294 static machine_mode this_insn_cc0_mode, prev_insn_cc0_mode;
296 /* Insn being scanned. */
298 static rtx_insn *this_insn;
299 static bool optimize_this_for_speed_p;
301 /* Index by register number, gives the number of the next (or
302 previous) register in the chain of registers sharing the same
303 value.
305 Or -1 if this register is at the end of the chain.
307 If REG_QTY (N) == -N - 1, reg_eqv_table[N].next is undefined. */
309 /* Per-register equivalence chain. */
310 struct reg_eqv_elem
312 int next, prev;
315 /* The table of all register equivalence chains. */
316 static struct reg_eqv_elem *reg_eqv_table;
318 struct cse_reg_info
320 /* The timestamp at which this register is initialized. */
321 unsigned int timestamp;
323 /* The quantity number of the register's current contents. */
324 int reg_qty;
326 /* The number of times the register has been altered in the current
327 basic block. */
328 int reg_tick;
330 /* The REG_TICK value at which rtx's containing this register are
331 valid in the hash table. If this does not equal the current
332 reg_tick value, such expressions existing in the hash table are
333 invalid. */
334 int reg_in_table;
336 /* The SUBREG that was set when REG_TICK was last incremented. Set
337 to -1 if the last store was to the whole register, not a subreg. */
338 unsigned int subreg_ticked;
341 /* A table of cse_reg_info indexed by register numbers. */
342 static struct cse_reg_info *cse_reg_info_table;
344 /* The size of the above table. */
345 static unsigned int cse_reg_info_table_size;
347 /* The index of the first entry that has not been initialized. */
348 static unsigned int cse_reg_info_table_first_uninitialized;
350 /* The timestamp at the beginning of the current run of
351 cse_extended_basic_block. We increment this variable at the beginning of
352 the current run of cse_extended_basic_block. The timestamp field of a
353 cse_reg_info entry matches the value of this variable if and only
354 if the entry has been initialized during the current run of
355 cse_extended_basic_block. */
356 static unsigned int cse_reg_info_timestamp;
358 /* A HARD_REG_SET containing all the hard registers for which there is
359 currently a REG expression in the hash table. Note the difference
360 from the above variables, which indicate if the REG is mentioned in some
361 expression in the table. */
363 static HARD_REG_SET hard_regs_in_table;
365 /* True if CSE has altered the CFG. */
366 static bool cse_cfg_altered;
368 /* True if CSE has altered conditional jump insns in such a way
369 that jump optimization should be redone. */
370 static bool cse_jumps_altered;
372 /* True if we put a LABEL_REF into the hash table for an INSN
373 without a REG_LABEL_OPERAND, we have to rerun jump after CSE
374 to put in the note. */
375 static bool recorded_label_ref;
377 /* canon_hash stores 1 in do_not_record
378 if it notices a reference to CC0, PC, or some other volatile
379 subexpression. */
381 static int do_not_record;
383 /* canon_hash stores 1 in hash_arg_in_memory
384 if it notices a reference to memory within the expression being hashed. */
386 static int hash_arg_in_memory;
388 /* The hash table contains buckets which are chains of `struct table_elt's,
389 each recording one expression's information.
390 That expression is in the `exp' field.
392 The canon_exp field contains a canonical (from the point of view of
393 alias analysis) version of the `exp' field.
395 Those elements with the same hash code are chained in both directions
396 through the `next_same_hash' and `prev_same_hash' fields.
398 Each set of expressions with equivalent values
399 are on a two-way chain through the `next_same_value'
400 and `prev_same_value' fields, and all point with
401 the `first_same_value' field at the first element in
402 that chain. The chain is in order of increasing cost.
403 Each element's cost value is in its `cost' field.
405 The `in_memory' field is nonzero for elements that
406 involve any reference to memory. These elements are removed
407 whenever a write is done to an unidentified location in memory.
408 To be safe, we assume that a memory address is unidentified unless
409 the address is either a symbol constant or a constant plus
410 the frame pointer or argument pointer.
412 The `related_value' field is used to connect related expressions
413 (that differ by adding an integer).
414 The related expressions are chained in a circular fashion.
415 `related_value' is zero for expressions for which this
416 chain is not useful.
418 The `cost' field stores the cost of this element's expression.
419 The `regcost' field stores the value returned by approx_reg_cost for
420 this element's expression.
422 The `is_const' flag is set if the element is a constant (including
423 a fixed address).
425 The `flag' field is used as a temporary during some search routines.
427 The `mode' field is usually the same as GET_MODE (`exp'), but
428 if `exp' is a CONST_INT and has no machine mode then the `mode'
429 field is the mode it was being used as. Each constant is
430 recorded separately for each mode it is used with. */
432 struct table_elt
434 rtx exp;
435 rtx canon_exp;
436 struct table_elt *next_same_hash;
437 struct table_elt *prev_same_hash;
438 struct table_elt *next_same_value;
439 struct table_elt *prev_same_value;
440 struct table_elt *first_same_value;
441 struct table_elt *related_value;
442 int cost;
443 int regcost;
444 /* The size of this field should match the size
445 of the mode field of struct rtx_def (see rtl.h). */
446 ENUM_BITFIELD(machine_mode) mode : 8;
447 char in_memory;
448 char is_const;
449 char flag;
452 /* We don't want a lot of buckets, because we rarely have very many
453 things stored in the hash table, and a lot of buckets slows
454 down a lot of loops that happen frequently. */
455 #define HASH_SHIFT 5
456 #define HASH_SIZE (1 << HASH_SHIFT)
457 #define HASH_MASK (HASH_SIZE - 1)
459 /* Compute hash code of X in mode M. Special-case case where X is a pseudo
460 register (hard registers may require `do_not_record' to be set). */
462 #define HASH(X, M) \
463 ((REG_P (X) && REGNO (X) >= FIRST_PSEUDO_REGISTER \
464 ? (((unsigned) REG << 7) + (unsigned) REG_QTY (REGNO (X))) \
465 : canon_hash (X, M)) & HASH_MASK)
467 /* Like HASH, but without side-effects. */
468 #define SAFE_HASH(X, M) \
469 ((REG_P (X) && REGNO (X) >= FIRST_PSEUDO_REGISTER \
470 ? (((unsigned) REG << 7) + (unsigned) REG_QTY (REGNO (X))) \
471 : safe_hash (X, M)) & HASH_MASK)
473 /* Determine whether register number N is considered a fixed register for the
474 purpose of approximating register costs.
475 It is desirable to replace other regs with fixed regs, to reduce need for
476 non-fixed hard regs.
477 A reg wins if it is either the frame pointer or designated as fixed. */
478 #define FIXED_REGNO_P(N) \
479 ((N) == FRAME_POINTER_REGNUM || (N) == HARD_FRAME_POINTER_REGNUM \
480 || fixed_regs[N] || global_regs[N])
482 /* Compute cost of X, as stored in the `cost' field of a table_elt. Fixed
483 hard registers and pointers into the frame are the cheapest with a cost
484 of 0. Next come pseudos with a cost of one and other hard registers with
485 a cost of 2. Aside from these special cases, call `rtx_cost'. */
487 #define CHEAP_REGNO(N) \
488 (REGNO_PTR_FRAME_P (N) \
489 || (HARD_REGISTER_NUM_P (N) \
490 && FIXED_REGNO_P (N) && REGNO_REG_CLASS (N) != NO_REGS))
492 #define COST(X) (REG_P (X) ? 0 : notreg_cost (X, SET, 1))
493 #define COST_IN(X, OUTER, OPNO) (REG_P (X) ? 0 : notreg_cost (X, OUTER, OPNO))
495 /* Get the number of times this register has been updated in this
496 basic block. */
498 #define REG_TICK(N) (get_cse_reg_info (N)->reg_tick)
500 /* Get the point at which REG was recorded in the table. */
502 #define REG_IN_TABLE(N) (get_cse_reg_info (N)->reg_in_table)
504 /* Get the SUBREG set at the last increment to REG_TICK (-1 if not a
505 SUBREG). */
507 #define SUBREG_TICKED(N) (get_cse_reg_info (N)->subreg_ticked)
509 /* Get the quantity number for REG. */
511 #define REG_QTY(N) (get_cse_reg_info (N)->reg_qty)
513 /* Determine if the quantity number for register X represents a valid index
514 into the qty_table. */
516 #define REGNO_QTY_VALID_P(N) (REG_QTY (N) >= 0)
518 /* Compare table_elt X and Y and return true iff X is cheaper than Y. */
520 #define CHEAPER(X, Y) \
521 (preferable ((X)->cost, (X)->regcost, (Y)->cost, (Y)->regcost) < 0)
523 static struct table_elt *table[HASH_SIZE];
525 /* Chain of `struct table_elt's made so far for this function
526 but currently removed from the table. */
528 static struct table_elt *free_element_chain;
530 /* Set to the cost of a constant pool reference if one was found for a
531 symbolic constant. If this was found, it means we should try to
532 convert constants into constant pool entries if they don't fit in
533 the insn. */
535 static int constant_pool_entries_cost;
536 static int constant_pool_entries_regcost;
538 /* Trace a patch through the CFG. */
540 struct branch_path
542 /* The basic block for this path entry. */
543 basic_block bb;
546 /* This data describes a block that will be processed by
547 cse_extended_basic_block. */
549 struct cse_basic_block_data
551 /* Total number of SETs in block. */
552 int nsets;
553 /* Size of current branch path, if any. */
554 int path_size;
555 /* Current path, indicating which basic_blocks will be processed. */
556 struct branch_path *path;
560 /* Pointers to the live in/live out bitmaps for the boundaries of the
561 current EBB. */
562 static bitmap cse_ebb_live_in, cse_ebb_live_out;
564 /* A simple bitmap to track which basic blocks have been visited
565 already as part of an already processed extended basic block. */
566 static sbitmap cse_visited_basic_blocks;
568 static bool fixed_base_plus_p (rtx x);
569 static int notreg_cost (rtx, enum rtx_code, int);
570 static int preferable (int, int, int, int);
571 static void new_basic_block (void);
572 static void make_new_qty (unsigned int, machine_mode);
573 static void make_regs_eqv (unsigned int, unsigned int);
574 static void delete_reg_equiv (unsigned int);
575 static int mention_regs (rtx);
576 static int insert_regs (rtx, struct table_elt *, int);
577 static void remove_from_table (struct table_elt *, unsigned);
578 static void remove_pseudo_from_table (rtx, unsigned);
579 static struct table_elt *lookup (rtx, unsigned, machine_mode);
580 static struct table_elt *lookup_for_remove (rtx, unsigned, machine_mode);
581 static rtx lookup_as_function (rtx, enum rtx_code);
582 static struct table_elt *insert_with_costs (rtx, struct table_elt *, unsigned,
583 machine_mode, int, int);
584 static struct table_elt *insert (rtx, struct table_elt *, unsigned,
585 machine_mode);
586 static void merge_equiv_classes (struct table_elt *, struct table_elt *);
587 static void invalidate (rtx, machine_mode);
588 static void remove_invalid_refs (unsigned int);
589 static void remove_invalid_subreg_refs (unsigned int, unsigned int,
590 machine_mode);
591 static void rehash_using_reg (rtx);
592 static void invalidate_memory (void);
593 static void invalidate_for_call (void);
594 static rtx use_related_value (rtx, struct table_elt *);
596 static inline unsigned canon_hash (rtx, machine_mode);
597 static inline unsigned safe_hash (rtx, machine_mode);
598 static inline unsigned hash_rtx_string (const char *);
600 static rtx canon_reg (rtx, rtx_insn *);
601 static enum rtx_code find_comparison_args (enum rtx_code, rtx *, rtx *,
602 machine_mode *,
603 machine_mode *);
604 static rtx fold_rtx (rtx, rtx_insn *);
605 static rtx equiv_constant (rtx);
606 static void record_jump_equiv (rtx_insn *, bool);
607 static void record_jump_cond (enum rtx_code, machine_mode, rtx, rtx,
608 int);
609 static void cse_insn (rtx_insn *);
610 static void cse_prescan_path (struct cse_basic_block_data *);
611 static void invalidate_from_clobbers (rtx_insn *);
612 static void invalidate_from_sets_and_clobbers (rtx_insn *);
613 static rtx cse_process_notes (rtx, rtx, bool *);
614 static void cse_extended_basic_block (struct cse_basic_block_data *);
615 extern void dump_class (struct table_elt*);
616 static void get_cse_reg_info_1 (unsigned int regno);
617 static struct cse_reg_info * get_cse_reg_info (unsigned int regno);
619 static void flush_hash_table (void);
620 static bool insn_live_p (rtx_insn *, int *);
621 static bool set_live_p (rtx, rtx_insn *, int *);
622 static void cse_change_cc_mode_insn (rtx_insn *, rtx);
623 static void cse_change_cc_mode_insns (rtx_insn *, rtx_insn *, rtx);
624 static machine_mode cse_cc_succs (basic_block, basic_block, rtx, rtx,
625 bool);
628 #undef RTL_HOOKS_GEN_LOWPART
629 #define RTL_HOOKS_GEN_LOWPART gen_lowpart_if_possible
631 static const struct rtl_hooks cse_rtl_hooks = RTL_HOOKS_INITIALIZER;
633 /* Nonzero if X has the form (PLUS frame-pointer integer). */
635 static bool
636 fixed_base_plus_p (rtx x)
638 switch (GET_CODE (x))
640 case REG:
641 if (x == frame_pointer_rtx || x == hard_frame_pointer_rtx)
642 return true;
643 if (x == arg_pointer_rtx && fixed_regs[ARG_POINTER_REGNUM])
644 return true;
645 return false;
647 case PLUS:
648 if (!CONST_INT_P (XEXP (x, 1)))
649 return false;
650 return fixed_base_plus_p (XEXP (x, 0));
652 default:
653 return false;
657 /* Dump the expressions in the equivalence class indicated by CLASSP.
658 This function is used only for debugging. */
659 DEBUG_FUNCTION void
660 dump_class (struct table_elt *classp)
662 struct table_elt *elt;
664 fprintf (stderr, "Equivalence chain for ");
665 print_rtl (stderr, classp->exp);
666 fprintf (stderr, ": \n");
668 for (elt = classp->first_same_value; elt; elt = elt->next_same_value)
670 print_rtl (stderr, elt->exp);
671 fprintf (stderr, "\n");
675 /* Return an estimate of the cost of the registers used in an rtx.
676 This is mostly the number of different REG expressions in the rtx;
677 however for some exceptions like fixed registers we use a cost of
678 0. If any other hard register reference occurs, return MAX_COST. */
680 static int
681 approx_reg_cost (const_rtx x)
683 int cost = 0;
684 subrtx_iterator::array_type array;
685 FOR_EACH_SUBRTX (iter, array, x, NONCONST)
687 const_rtx x = *iter;
688 if (REG_P (x))
690 unsigned int regno = REGNO (x);
691 if (!CHEAP_REGNO (regno))
693 if (regno < FIRST_PSEUDO_REGISTER)
695 if (targetm.small_register_classes_for_mode_p (GET_MODE (x)))
696 return MAX_COST;
697 cost += 2;
699 else
700 cost += 1;
704 return cost;
707 /* Return a negative value if an rtx A, whose costs are given by COST_A
708 and REGCOST_A, is more desirable than an rtx B.
709 Return a positive value if A is less desirable, or 0 if the two are
710 equally good. */
711 static int
712 preferable (int cost_a, int regcost_a, int cost_b, int regcost_b)
714 /* First, get rid of cases involving expressions that are entirely
715 unwanted. */
716 if (cost_a != cost_b)
718 if (cost_a == MAX_COST)
719 return 1;
720 if (cost_b == MAX_COST)
721 return -1;
724 /* Avoid extending lifetimes of hardregs. */
725 if (regcost_a != regcost_b)
727 if (regcost_a == MAX_COST)
728 return 1;
729 if (regcost_b == MAX_COST)
730 return -1;
733 /* Normal operation costs take precedence. */
734 if (cost_a != cost_b)
735 return cost_a - cost_b;
736 /* Only if these are identical consider effects on register pressure. */
737 if (regcost_a != regcost_b)
738 return regcost_a - regcost_b;
739 return 0;
742 /* Internal function, to compute cost when X is not a register; called
743 from COST macro to keep it simple. */
745 static int
746 notreg_cost (rtx x, enum rtx_code outer, int opno)
748 return ((GET_CODE (x) == SUBREG
749 && REG_P (SUBREG_REG (x))
750 && GET_MODE_CLASS (GET_MODE (x)) == MODE_INT
751 && GET_MODE_CLASS (GET_MODE (SUBREG_REG (x))) == MODE_INT
752 && (GET_MODE_SIZE (GET_MODE (x))
753 < GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))))
754 && subreg_lowpart_p (x)
755 && TRULY_NOOP_TRUNCATION_MODES_P (GET_MODE (x),
756 GET_MODE (SUBREG_REG (x))))
758 : rtx_cost (x, outer, opno, optimize_this_for_speed_p) * 2);
762 /* Initialize CSE_REG_INFO_TABLE. */
764 static void
765 init_cse_reg_info (unsigned int nregs)
767 /* Do we need to grow the table? */
768 if (nregs > cse_reg_info_table_size)
770 unsigned int new_size;
772 if (cse_reg_info_table_size < 2048)
774 /* Compute a new size that is a power of 2 and no smaller
775 than the large of NREGS and 64. */
776 new_size = (cse_reg_info_table_size
777 ? cse_reg_info_table_size : 64);
779 while (new_size < nregs)
780 new_size *= 2;
782 else
784 /* If we need a big table, allocate just enough to hold
785 NREGS registers. */
786 new_size = nregs;
789 /* Reallocate the table with NEW_SIZE entries. */
790 free (cse_reg_info_table);
791 cse_reg_info_table = XNEWVEC (struct cse_reg_info, new_size);
792 cse_reg_info_table_size = new_size;
793 cse_reg_info_table_first_uninitialized = 0;
796 /* Do we have all of the first NREGS entries initialized? */
797 if (cse_reg_info_table_first_uninitialized < nregs)
799 unsigned int old_timestamp = cse_reg_info_timestamp - 1;
800 unsigned int i;
802 /* Put the old timestamp on newly allocated entries so that they
803 will all be considered out of date. We do not touch those
804 entries beyond the first NREGS entries to be nice to the
805 virtual memory. */
806 for (i = cse_reg_info_table_first_uninitialized; i < nregs; i++)
807 cse_reg_info_table[i].timestamp = old_timestamp;
809 cse_reg_info_table_first_uninitialized = nregs;
813 /* Given REGNO, initialize the cse_reg_info entry for REGNO. */
815 static void
816 get_cse_reg_info_1 (unsigned int regno)
818 /* Set TIMESTAMP field to CSE_REG_INFO_TIMESTAMP so that this
819 entry will be considered to have been initialized. */
820 cse_reg_info_table[regno].timestamp = cse_reg_info_timestamp;
822 /* Initialize the rest of the entry. */
823 cse_reg_info_table[regno].reg_tick = 1;
824 cse_reg_info_table[regno].reg_in_table = -1;
825 cse_reg_info_table[regno].subreg_ticked = -1;
826 cse_reg_info_table[regno].reg_qty = -regno - 1;
829 /* Find a cse_reg_info entry for REGNO. */
831 static inline struct cse_reg_info *
832 get_cse_reg_info (unsigned int regno)
834 struct cse_reg_info *p = &cse_reg_info_table[regno];
836 /* If this entry has not been initialized, go ahead and initialize
837 it. */
838 if (p->timestamp != cse_reg_info_timestamp)
839 get_cse_reg_info_1 (regno);
841 return p;
844 /* Clear the hash table and initialize each register with its own quantity,
845 for a new basic block. */
847 static void
848 new_basic_block (void)
850 int i;
852 next_qty = 0;
854 /* Invalidate cse_reg_info_table. */
855 cse_reg_info_timestamp++;
857 /* Clear out hash table state for this pass. */
858 CLEAR_HARD_REG_SET (hard_regs_in_table);
860 /* The per-quantity values used to be initialized here, but it is
861 much faster to initialize each as it is made in `make_new_qty'. */
863 for (i = 0; i < HASH_SIZE; i++)
865 struct table_elt *first;
867 first = table[i];
868 if (first != NULL)
870 struct table_elt *last = first;
872 table[i] = NULL;
874 while (last->next_same_hash != NULL)
875 last = last->next_same_hash;
877 /* Now relink this hash entire chain into
878 the free element list. */
880 last->next_same_hash = free_element_chain;
881 free_element_chain = first;
885 prev_insn_cc0 = 0;
888 /* Say that register REG contains a quantity in mode MODE not in any
889 register before and initialize that quantity. */
891 static void
892 make_new_qty (unsigned int reg, machine_mode mode)
894 int q;
895 struct qty_table_elem *ent;
896 struct reg_eqv_elem *eqv;
898 gcc_assert (next_qty < max_qty);
900 q = REG_QTY (reg) = next_qty++;
901 ent = &qty_table[q];
902 ent->first_reg = reg;
903 ent->last_reg = reg;
904 ent->mode = mode;
905 ent->const_rtx = ent->const_insn = NULL;
906 ent->comparison_code = UNKNOWN;
908 eqv = &reg_eqv_table[reg];
909 eqv->next = eqv->prev = -1;
912 /* Make reg NEW equivalent to reg OLD.
913 OLD is not changing; NEW is. */
915 static void
916 make_regs_eqv (unsigned int new_reg, unsigned int old_reg)
918 unsigned int lastr, firstr;
919 int q = REG_QTY (old_reg);
920 struct qty_table_elem *ent;
922 ent = &qty_table[q];
924 /* Nothing should become eqv until it has a "non-invalid" qty number. */
925 gcc_assert (REGNO_QTY_VALID_P (old_reg));
927 REG_QTY (new_reg) = q;
928 firstr = ent->first_reg;
929 lastr = ent->last_reg;
931 /* Prefer fixed hard registers to anything. Prefer pseudo regs to other
932 hard regs. Among pseudos, if NEW will live longer than any other reg
933 of the same qty, and that is beyond the current basic block,
934 make it the new canonical replacement for this qty. */
935 if (! (firstr < FIRST_PSEUDO_REGISTER && FIXED_REGNO_P (firstr))
936 /* Certain fixed registers might be of the class NO_REGS. This means
937 that not only can they not be allocated by the compiler, but
938 they cannot be used in substitutions or canonicalizations
939 either. */
940 && (new_reg >= FIRST_PSEUDO_REGISTER || REGNO_REG_CLASS (new_reg) != NO_REGS)
941 && ((new_reg < FIRST_PSEUDO_REGISTER && FIXED_REGNO_P (new_reg))
942 || (new_reg >= FIRST_PSEUDO_REGISTER
943 && (firstr < FIRST_PSEUDO_REGISTER
944 || (bitmap_bit_p (cse_ebb_live_out, new_reg)
945 && !bitmap_bit_p (cse_ebb_live_out, firstr))
946 || (bitmap_bit_p (cse_ebb_live_in, new_reg)
947 && !bitmap_bit_p (cse_ebb_live_in, firstr))))))
949 reg_eqv_table[firstr].prev = new_reg;
950 reg_eqv_table[new_reg].next = firstr;
951 reg_eqv_table[new_reg].prev = -1;
952 ent->first_reg = new_reg;
954 else
956 /* If NEW is a hard reg (known to be non-fixed), insert at end.
957 Otherwise, insert before any non-fixed hard regs that are at the
958 end. Registers of class NO_REGS cannot be used as an
959 equivalent for anything. */
960 while (lastr < FIRST_PSEUDO_REGISTER && reg_eqv_table[lastr].prev >= 0
961 && (REGNO_REG_CLASS (lastr) == NO_REGS || ! FIXED_REGNO_P (lastr))
962 && new_reg >= FIRST_PSEUDO_REGISTER)
963 lastr = reg_eqv_table[lastr].prev;
964 reg_eqv_table[new_reg].next = reg_eqv_table[lastr].next;
965 if (reg_eqv_table[lastr].next >= 0)
966 reg_eqv_table[reg_eqv_table[lastr].next].prev = new_reg;
967 else
968 qty_table[q].last_reg = new_reg;
969 reg_eqv_table[lastr].next = new_reg;
970 reg_eqv_table[new_reg].prev = lastr;
974 /* Remove REG from its equivalence class. */
976 static void
977 delete_reg_equiv (unsigned int reg)
979 struct qty_table_elem *ent;
980 int q = REG_QTY (reg);
981 int p, n;
983 /* If invalid, do nothing. */
984 if (! REGNO_QTY_VALID_P (reg))
985 return;
987 ent = &qty_table[q];
989 p = reg_eqv_table[reg].prev;
990 n = reg_eqv_table[reg].next;
992 if (n != -1)
993 reg_eqv_table[n].prev = p;
994 else
995 ent->last_reg = p;
996 if (p != -1)
997 reg_eqv_table[p].next = n;
998 else
999 ent->first_reg = n;
1001 REG_QTY (reg) = -reg - 1;
1004 /* Remove any invalid expressions from the hash table
1005 that refer to any of the registers contained in expression X.
1007 Make sure that newly inserted references to those registers
1008 as subexpressions will be considered valid.
1010 mention_regs is not called when a register itself
1011 is being stored in the table.
1013 Return 1 if we have done something that may have changed the hash code
1014 of X. */
1016 static int
1017 mention_regs (rtx x)
1019 enum rtx_code code;
1020 int i, j;
1021 const char *fmt;
1022 int changed = 0;
1024 if (x == 0)
1025 return 0;
1027 code = GET_CODE (x);
1028 if (code == REG)
1030 unsigned int regno = REGNO (x);
1031 unsigned int endregno = END_REGNO (x);
1032 unsigned int i;
1034 for (i = regno; i < endregno; i++)
1036 if (REG_IN_TABLE (i) >= 0 && REG_IN_TABLE (i) != REG_TICK (i))
1037 remove_invalid_refs (i);
1039 REG_IN_TABLE (i) = REG_TICK (i);
1040 SUBREG_TICKED (i) = -1;
1043 return 0;
1046 /* If this is a SUBREG, we don't want to discard other SUBREGs of the same
1047 pseudo if they don't use overlapping words. We handle only pseudos
1048 here for simplicity. */
1049 if (code == SUBREG && REG_P (SUBREG_REG (x))
1050 && REGNO (SUBREG_REG (x)) >= FIRST_PSEUDO_REGISTER)
1052 unsigned int i = REGNO (SUBREG_REG (x));
1054 if (REG_IN_TABLE (i) >= 0 && REG_IN_TABLE (i) != REG_TICK (i))
1056 /* If REG_IN_TABLE (i) differs from REG_TICK (i) by one, and
1057 the last store to this register really stored into this
1058 subreg, then remove the memory of this subreg.
1059 Otherwise, remove any memory of the entire register and
1060 all its subregs from the table. */
1061 if (REG_TICK (i) - REG_IN_TABLE (i) > 1
1062 || SUBREG_TICKED (i) != REGNO (SUBREG_REG (x)))
1063 remove_invalid_refs (i);
1064 else
1065 remove_invalid_subreg_refs (i, SUBREG_BYTE (x), GET_MODE (x));
1068 REG_IN_TABLE (i) = REG_TICK (i);
1069 SUBREG_TICKED (i) = REGNO (SUBREG_REG (x));
1070 return 0;
1073 /* If X is a comparison or a COMPARE and either operand is a register
1074 that does not have a quantity, give it one. This is so that a later
1075 call to record_jump_equiv won't cause X to be assigned a different
1076 hash code and not found in the table after that call.
1078 It is not necessary to do this here, since rehash_using_reg can
1079 fix up the table later, but doing this here eliminates the need to
1080 call that expensive function in the most common case where the only
1081 use of the register is in the comparison. */
1083 if (code == COMPARE || COMPARISON_P (x))
1085 if (REG_P (XEXP (x, 0))
1086 && ! REGNO_QTY_VALID_P (REGNO (XEXP (x, 0))))
1087 if (insert_regs (XEXP (x, 0), NULL, 0))
1089 rehash_using_reg (XEXP (x, 0));
1090 changed = 1;
1093 if (REG_P (XEXP (x, 1))
1094 && ! REGNO_QTY_VALID_P (REGNO (XEXP (x, 1))))
1095 if (insert_regs (XEXP (x, 1), NULL, 0))
1097 rehash_using_reg (XEXP (x, 1));
1098 changed = 1;
1102 fmt = GET_RTX_FORMAT (code);
1103 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1104 if (fmt[i] == 'e')
1105 changed |= mention_regs (XEXP (x, i));
1106 else if (fmt[i] == 'E')
1107 for (j = 0; j < XVECLEN (x, i); j++)
1108 changed |= mention_regs (XVECEXP (x, i, j));
1110 return changed;
1113 /* Update the register quantities for inserting X into the hash table
1114 with a value equivalent to CLASSP.
1115 (If the class does not contain a REG, it is irrelevant.)
1116 If MODIFIED is nonzero, X is a destination; it is being modified.
1117 Note that delete_reg_equiv should be called on a register
1118 before insert_regs is done on that register with MODIFIED != 0.
1120 Nonzero value means that elements of reg_qty have changed
1121 so X's hash code may be different. */
1123 static int
1124 insert_regs (rtx x, struct table_elt *classp, int modified)
1126 if (REG_P (x))
1128 unsigned int regno = REGNO (x);
1129 int qty_valid;
1131 /* If REGNO is in the equivalence table already but is of the
1132 wrong mode for that equivalence, don't do anything here. */
1134 qty_valid = REGNO_QTY_VALID_P (regno);
1135 if (qty_valid)
1137 struct qty_table_elem *ent = &qty_table[REG_QTY (regno)];
1139 if (ent->mode != GET_MODE (x))
1140 return 0;
1143 if (modified || ! qty_valid)
1145 if (classp)
1146 for (classp = classp->first_same_value;
1147 classp != 0;
1148 classp = classp->next_same_value)
1149 if (REG_P (classp->exp)
1150 && GET_MODE (classp->exp) == GET_MODE (x))
1152 unsigned c_regno = REGNO (classp->exp);
1154 gcc_assert (REGNO_QTY_VALID_P (c_regno));
1156 /* Suppose that 5 is hard reg and 100 and 101 are
1157 pseudos. Consider
1159 (set (reg:si 100) (reg:si 5))
1160 (set (reg:si 5) (reg:si 100))
1161 (set (reg:di 101) (reg:di 5))
1163 We would now set REG_QTY (101) = REG_QTY (5), but the
1164 entry for 5 is in SImode. When we use this later in
1165 copy propagation, we get the register in wrong mode. */
1166 if (qty_table[REG_QTY (c_regno)].mode != GET_MODE (x))
1167 continue;
1169 make_regs_eqv (regno, c_regno);
1170 return 1;
1173 /* Mention_regs for a SUBREG checks if REG_TICK is exactly one larger
1174 than REG_IN_TABLE to find out if there was only a single preceding
1175 invalidation - for the SUBREG - or another one, which would be
1176 for the full register. However, if we find here that REG_TICK
1177 indicates that the register is invalid, it means that it has
1178 been invalidated in a separate operation. The SUBREG might be used
1179 now (then this is a recursive call), or we might use the full REG
1180 now and a SUBREG of it later. So bump up REG_TICK so that
1181 mention_regs will do the right thing. */
1182 if (! modified
1183 && REG_IN_TABLE (regno) >= 0
1184 && REG_TICK (regno) == REG_IN_TABLE (regno) + 1)
1185 REG_TICK (regno)++;
1186 make_new_qty (regno, GET_MODE (x));
1187 return 1;
1190 return 0;
1193 /* If X is a SUBREG, we will likely be inserting the inner register in the
1194 table. If that register doesn't have an assigned quantity number at
1195 this point but does later, the insertion that we will be doing now will
1196 not be accessible because its hash code will have changed. So assign
1197 a quantity number now. */
1199 else if (GET_CODE (x) == SUBREG && REG_P (SUBREG_REG (x))
1200 && ! REGNO_QTY_VALID_P (REGNO (SUBREG_REG (x))))
1202 insert_regs (SUBREG_REG (x), NULL, 0);
1203 mention_regs (x);
1204 return 1;
1206 else
1207 return mention_regs (x);
1211 /* Compute upper and lower anchors for CST. Also compute the offset of CST
1212 from these anchors/bases such that *_BASE + *_OFFS = CST. Return false iff
1213 CST is equal to an anchor. */
1215 static bool
1216 compute_const_anchors (rtx cst,
1217 HOST_WIDE_INT *lower_base, HOST_WIDE_INT *lower_offs,
1218 HOST_WIDE_INT *upper_base, HOST_WIDE_INT *upper_offs)
1220 HOST_WIDE_INT n = INTVAL (cst);
1222 *lower_base = n & ~(targetm.const_anchor - 1);
1223 if (*lower_base == n)
1224 return false;
1226 *upper_base =
1227 (n + (targetm.const_anchor - 1)) & ~(targetm.const_anchor - 1);
1228 *upper_offs = n - *upper_base;
1229 *lower_offs = n - *lower_base;
1230 return true;
1233 /* Insert the equivalence between ANCHOR and (REG + OFF) in mode MODE. */
1235 static void
1236 insert_const_anchor (HOST_WIDE_INT anchor, rtx reg, HOST_WIDE_INT offs,
1237 machine_mode mode)
1239 struct table_elt *elt;
1240 unsigned hash;
1241 rtx anchor_exp;
1242 rtx exp;
1244 anchor_exp = GEN_INT (anchor);
1245 hash = HASH (anchor_exp, mode);
1246 elt = lookup (anchor_exp, hash, mode);
1247 if (!elt)
1248 elt = insert (anchor_exp, NULL, hash, mode);
1250 exp = plus_constant (mode, reg, offs);
1251 /* REG has just been inserted and the hash codes recomputed. */
1252 mention_regs (exp);
1253 hash = HASH (exp, mode);
1255 /* Use the cost of the register rather than the whole expression. When
1256 looking up constant anchors we will further offset the corresponding
1257 expression therefore it does not make sense to prefer REGs over
1258 reg-immediate additions. Prefer instead the oldest expression. Also
1259 don't prefer pseudos over hard regs so that we derive constants in
1260 argument registers from other argument registers rather than from the
1261 original pseudo that was used to synthesize the constant. */
1262 insert_with_costs (exp, elt, hash, mode, COST (reg), 1);
1265 /* The constant CST is equivalent to the register REG. Create
1266 equivalences between the two anchors of CST and the corresponding
1267 register-offset expressions using REG. */
1269 static void
1270 insert_const_anchors (rtx reg, rtx cst, machine_mode mode)
1272 HOST_WIDE_INT lower_base, lower_offs, upper_base, upper_offs;
1274 if (!compute_const_anchors (cst, &lower_base, &lower_offs,
1275 &upper_base, &upper_offs))
1276 return;
1278 /* Ignore anchors of value 0. Constants accessible from zero are
1279 simple. */
1280 if (lower_base != 0)
1281 insert_const_anchor (lower_base, reg, -lower_offs, mode);
1283 if (upper_base != 0)
1284 insert_const_anchor (upper_base, reg, -upper_offs, mode);
1287 /* We need to express ANCHOR_ELT->exp + OFFS. Walk the equivalence list of
1288 ANCHOR_ELT and see if offsetting any of the entries by OFFS would create a
1289 valid expression. Return the cheapest and oldest of such expressions. In
1290 *OLD, return how old the resulting expression is compared to the other
1291 equivalent expressions. */
1293 static rtx
1294 find_reg_offset_for_const (struct table_elt *anchor_elt, HOST_WIDE_INT offs,
1295 unsigned *old)
1297 struct table_elt *elt;
1298 unsigned idx;
1299 struct table_elt *match_elt;
1300 rtx match;
1302 /* Find the cheapest and *oldest* expression to maximize the chance of
1303 reusing the same pseudo. */
1305 match_elt = NULL;
1306 match = NULL_RTX;
1307 for (elt = anchor_elt->first_same_value, idx = 0;
1308 elt;
1309 elt = elt->next_same_value, idx++)
1311 if (match_elt && CHEAPER (match_elt, elt))
1312 return match;
1314 if (REG_P (elt->exp)
1315 || (GET_CODE (elt->exp) == PLUS
1316 && REG_P (XEXP (elt->exp, 0))
1317 && GET_CODE (XEXP (elt->exp, 1)) == CONST_INT))
1319 rtx x;
1321 /* Ignore expressions that are no longer valid. */
1322 if (!REG_P (elt->exp) && !exp_equiv_p (elt->exp, elt->exp, 1, false))
1323 continue;
1325 x = plus_constant (GET_MODE (elt->exp), elt->exp, offs);
1326 if (REG_P (x)
1327 || (GET_CODE (x) == PLUS
1328 && IN_RANGE (INTVAL (XEXP (x, 1)),
1329 -targetm.const_anchor,
1330 targetm.const_anchor - 1)))
1332 match = x;
1333 match_elt = elt;
1334 *old = idx;
1339 return match;
1342 /* Try to express the constant SRC_CONST using a register+offset expression
1343 derived from a constant anchor. Return it if successful or NULL_RTX,
1344 otherwise. */
1346 static rtx
1347 try_const_anchors (rtx src_const, machine_mode mode)
1349 struct table_elt *lower_elt, *upper_elt;
1350 HOST_WIDE_INT lower_base, lower_offs, upper_base, upper_offs;
1351 rtx lower_anchor_rtx, upper_anchor_rtx;
1352 rtx lower_exp = NULL_RTX, upper_exp = NULL_RTX;
1353 unsigned lower_old, upper_old;
1355 /* CONST_INT is used for CC modes, but we should leave those alone. */
1356 if (GET_MODE_CLASS (mode) == MODE_CC)
1357 return NULL_RTX;
1359 gcc_assert (SCALAR_INT_MODE_P (mode));
1360 if (!compute_const_anchors (src_const, &lower_base, &lower_offs,
1361 &upper_base, &upper_offs))
1362 return NULL_RTX;
1364 lower_anchor_rtx = GEN_INT (lower_base);
1365 upper_anchor_rtx = GEN_INT (upper_base);
1366 lower_elt = lookup (lower_anchor_rtx, HASH (lower_anchor_rtx, mode), mode);
1367 upper_elt = lookup (upper_anchor_rtx, HASH (upper_anchor_rtx, mode), mode);
1369 if (lower_elt)
1370 lower_exp = find_reg_offset_for_const (lower_elt, lower_offs, &lower_old);
1371 if (upper_elt)
1372 upper_exp = find_reg_offset_for_const (upper_elt, upper_offs, &upper_old);
1374 if (!lower_exp)
1375 return upper_exp;
1376 if (!upper_exp)
1377 return lower_exp;
1379 /* Return the older expression. */
1380 return (upper_old > lower_old ? upper_exp : lower_exp);
1383 /* Look in or update the hash table. */
1385 /* Remove table element ELT from use in the table.
1386 HASH is its hash code, made using the HASH macro.
1387 It's an argument because often that is known in advance
1388 and we save much time not recomputing it. */
1390 static void
1391 remove_from_table (struct table_elt *elt, unsigned int hash)
1393 if (elt == 0)
1394 return;
1396 /* Mark this element as removed. See cse_insn. */
1397 elt->first_same_value = 0;
1399 /* Remove the table element from its equivalence class. */
1402 struct table_elt *prev = elt->prev_same_value;
1403 struct table_elt *next = elt->next_same_value;
1405 if (next)
1406 next->prev_same_value = prev;
1408 if (prev)
1409 prev->next_same_value = next;
1410 else
1412 struct table_elt *newfirst = next;
1413 while (next)
1415 next->first_same_value = newfirst;
1416 next = next->next_same_value;
1421 /* Remove the table element from its hash bucket. */
1424 struct table_elt *prev = elt->prev_same_hash;
1425 struct table_elt *next = elt->next_same_hash;
1427 if (next)
1428 next->prev_same_hash = prev;
1430 if (prev)
1431 prev->next_same_hash = next;
1432 else if (table[hash] == elt)
1433 table[hash] = next;
1434 else
1436 /* This entry is not in the proper hash bucket. This can happen
1437 when two classes were merged by `merge_equiv_classes'. Search
1438 for the hash bucket that it heads. This happens only very
1439 rarely, so the cost is acceptable. */
1440 for (hash = 0; hash < HASH_SIZE; hash++)
1441 if (table[hash] == elt)
1442 table[hash] = next;
1446 /* Remove the table element from its related-value circular chain. */
1448 if (elt->related_value != 0 && elt->related_value != elt)
1450 struct table_elt *p = elt->related_value;
1452 while (p->related_value != elt)
1453 p = p->related_value;
1454 p->related_value = elt->related_value;
1455 if (p->related_value == p)
1456 p->related_value = 0;
1459 /* Now add it to the free element chain. */
1460 elt->next_same_hash = free_element_chain;
1461 free_element_chain = elt;
1464 /* Same as above, but X is a pseudo-register. */
1466 static void
1467 remove_pseudo_from_table (rtx x, unsigned int hash)
1469 struct table_elt *elt;
1471 /* Because a pseudo-register can be referenced in more than one
1472 mode, we might have to remove more than one table entry. */
1473 while ((elt = lookup_for_remove (x, hash, VOIDmode)))
1474 remove_from_table (elt, hash);
1477 /* Look up X in the hash table and return its table element,
1478 or 0 if X is not in the table.
1480 MODE is the machine-mode of X, or if X is an integer constant
1481 with VOIDmode then MODE is the mode with which X will be used.
1483 Here we are satisfied to find an expression whose tree structure
1484 looks like X. */
1486 static struct table_elt *
1487 lookup (rtx x, unsigned int hash, machine_mode mode)
1489 struct table_elt *p;
1491 for (p = table[hash]; p; p = p->next_same_hash)
1492 if (mode == p->mode && ((x == p->exp && REG_P (x))
1493 || exp_equiv_p (x, p->exp, !REG_P (x), false)))
1494 return p;
1496 return 0;
1499 /* Like `lookup' but don't care whether the table element uses invalid regs.
1500 Also ignore discrepancies in the machine mode of a register. */
1502 static struct table_elt *
1503 lookup_for_remove (rtx x, unsigned int hash, machine_mode mode)
1505 struct table_elt *p;
1507 if (REG_P (x))
1509 unsigned int regno = REGNO (x);
1511 /* Don't check the machine mode when comparing registers;
1512 invalidating (REG:SI 0) also invalidates (REG:DF 0). */
1513 for (p = table[hash]; p; p = p->next_same_hash)
1514 if (REG_P (p->exp)
1515 && REGNO (p->exp) == regno)
1516 return p;
1518 else
1520 for (p = table[hash]; p; p = p->next_same_hash)
1521 if (mode == p->mode
1522 && (x == p->exp || exp_equiv_p (x, p->exp, 0, false)))
1523 return p;
1526 return 0;
1529 /* Look for an expression equivalent to X and with code CODE.
1530 If one is found, return that expression. */
1532 static rtx
1533 lookup_as_function (rtx x, enum rtx_code code)
1535 struct table_elt *p
1536 = lookup (x, SAFE_HASH (x, VOIDmode), GET_MODE (x));
1538 if (p == 0)
1539 return 0;
1541 for (p = p->first_same_value; p; p = p->next_same_value)
1542 if (GET_CODE (p->exp) == code
1543 /* Make sure this is a valid entry in the table. */
1544 && exp_equiv_p (p->exp, p->exp, 1, false))
1545 return p->exp;
1547 return 0;
1550 /* Insert X in the hash table, assuming HASH is its hash code and
1551 CLASSP is an element of the class it should go in (or 0 if a new
1552 class should be made). COST is the code of X and reg_cost is the
1553 cost of registers in X. It is inserted at the proper position to
1554 keep the class in the order cheapest first.
1556 MODE is the machine-mode of X, or if X is an integer constant
1557 with VOIDmode then MODE is the mode with which X will be used.
1559 For elements of equal cheapness, the most recent one
1560 goes in front, except that the first element in the list
1561 remains first unless a cheaper element is added. The order of
1562 pseudo-registers does not matter, as canon_reg will be called to
1563 find the cheapest when a register is retrieved from the table.
1565 The in_memory field in the hash table element is set to 0.
1566 The caller must set it nonzero if appropriate.
1568 You should call insert_regs (X, CLASSP, MODIFY) before calling here,
1569 and if insert_regs returns a nonzero value
1570 you must then recompute its hash code before calling here.
1572 If necessary, update table showing constant values of quantities. */
1574 static struct table_elt *
1575 insert_with_costs (rtx x, struct table_elt *classp, unsigned int hash,
1576 machine_mode mode, int cost, int reg_cost)
1578 struct table_elt *elt;
1580 /* If X is a register and we haven't made a quantity for it,
1581 something is wrong. */
1582 gcc_assert (!REG_P (x) || REGNO_QTY_VALID_P (REGNO (x)));
1584 /* If X is a hard register, show it is being put in the table. */
1585 if (REG_P (x) && REGNO (x) < FIRST_PSEUDO_REGISTER)
1586 add_to_hard_reg_set (&hard_regs_in_table, GET_MODE (x), REGNO (x));
1588 /* Put an element for X into the right hash bucket. */
1590 elt = free_element_chain;
1591 if (elt)
1592 free_element_chain = elt->next_same_hash;
1593 else
1594 elt = XNEW (struct table_elt);
1596 elt->exp = x;
1597 elt->canon_exp = NULL_RTX;
1598 elt->cost = cost;
1599 elt->regcost = reg_cost;
1600 elt->next_same_value = 0;
1601 elt->prev_same_value = 0;
1602 elt->next_same_hash = table[hash];
1603 elt->prev_same_hash = 0;
1604 elt->related_value = 0;
1605 elt->in_memory = 0;
1606 elt->mode = mode;
1607 elt->is_const = (CONSTANT_P (x) || fixed_base_plus_p (x));
1609 if (table[hash])
1610 table[hash]->prev_same_hash = elt;
1611 table[hash] = elt;
1613 /* Put it into the proper value-class. */
1614 if (classp)
1616 classp = classp->first_same_value;
1617 if (CHEAPER (elt, classp))
1618 /* Insert at the head of the class. */
1620 struct table_elt *p;
1621 elt->next_same_value = classp;
1622 classp->prev_same_value = elt;
1623 elt->first_same_value = elt;
1625 for (p = classp; p; p = p->next_same_value)
1626 p->first_same_value = elt;
1628 else
1630 /* Insert not at head of the class. */
1631 /* Put it after the last element cheaper than X. */
1632 struct table_elt *p, *next;
1634 for (p = classp;
1635 (next = p->next_same_value) && CHEAPER (next, elt);
1636 p = next)
1639 /* Put it after P and before NEXT. */
1640 elt->next_same_value = next;
1641 if (next)
1642 next->prev_same_value = elt;
1644 elt->prev_same_value = p;
1645 p->next_same_value = elt;
1646 elt->first_same_value = classp;
1649 else
1650 elt->first_same_value = elt;
1652 /* If this is a constant being set equivalent to a register or a register
1653 being set equivalent to a constant, note the constant equivalence.
1655 If this is a constant, it cannot be equivalent to a different constant,
1656 and a constant is the only thing that can be cheaper than a register. So
1657 we know the register is the head of the class (before the constant was
1658 inserted).
1660 If this is a register that is not already known equivalent to a
1661 constant, we must check the entire class.
1663 If this is a register that is already known equivalent to an insn,
1664 update the qtys `const_insn' to show that `this_insn' is the latest
1665 insn making that quantity equivalent to the constant. */
1667 if (elt->is_const && classp && REG_P (classp->exp)
1668 && !REG_P (x))
1670 int exp_q = REG_QTY (REGNO (classp->exp));
1671 struct qty_table_elem *exp_ent = &qty_table[exp_q];
1673 exp_ent->const_rtx = gen_lowpart (exp_ent->mode, x);
1674 exp_ent->const_insn = this_insn;
1677 else if (REG_P (x)
1678 && classp
1679 && ! qty_table[REG_QTY (REGNO (x))].const_rtx
1680 && ! elt->is_const)
1682 struct table_elt *p;
1684 for (p = classp; p != 0; p = p->next_same_value)
1686 if (p->is_const && !REG_P (p->exp))
1688 int x_q = REG_QTY (REGNO (x));
1689 struct qty_table_elem *x_ent = &qty_table[x_q];
1691 x_ent->const_rtx
1692 = gen_lowpart (GET_MODE (x), p->exp);
1693 x_ent->const_insn = this_insn;
1694 break;
1699 else if (REG_P (x)
1700 && qty_table[REG_QTY (REGNO (x))].const_rtx
1701 && GET_MODE (x) == qty_table[REG_QTY (REGNO (x))].mode)
1702 qty_table[REG_QTY (REGNO (x))].const_insn = this_insn;
1704 /* If this is a constant with symbolic value,
1705 and it has a term with an explicit integer value,
1706 link it up with related expressions. */
1707 if (GET_CODE (x) == CONST)
1709 rtx subexp = get_related_value (x);
1710 unsigned subhash;
1711 struct table_elt *subelt, *subelt_prev;
1713 if (subexp != 0)
1715 /* Get the integer-free subexpression in the hash table. */
1716 subhash = SAFE_HASH (subexp, mode);
1717 subelt = lookup (subexp, subhash, mode);
1718 if (subelt == 0)
1719 subelt = insert (subexp, NULL, subhash, mode);
1720 /* Initialize SUBELT's circular chain if it has none. */
1721 if (subelt->related_value == 0)
1722 subelt->related_value = subelt;
1723 /* Find the element in the circular chain that precedes SUBELT. */
1724 subelt_prev = subelt;
1725 while (subelt_prev->related_value != subelt)
1726 subelt_prev = subelt_prev->related_value;
1727 /* Put new ELT into SUBELT's circular chain just before SUBELT.
1728 This way the element that follows SUBELT is the oldest one. */
1729 elt->related_value = subelt_prev->related_value;
1730 subelt_prev->related_value = elt;
1734 return elt;
1737 /* Wrap insert_with_costs by passing the default costs. */
1739 static struct table_elt *
1740 insert (rtx x, struct table_elt *classp, unsigned int hash,
1741 machine_mode mode)
1743 return
1744 insert_with_costs (x, classp, hash, mode, COST (x), approx_reg_cost (x));
1748 /* Given two equivalence classes, CLASS1 and CLASS2, put all the entries from
1749 CLASS2 into CLASS1. This is done when we have reached an insn which makes
1750 the two classes equivalent.
1752 CLASS1 will be the surviving class; CLASS2 should not be used after this
1753 call.
1755 Any invalid entries in CLASS2 will not be copied. */
1757 static void
1758 merge_equiv_classes (struct table_elt *class1, struct table_elt *class2)
1760 struct table_elt *elt, *next, *new_elt;
1762 /* Ensure we start with the head of the classes. */
1763 class1 = class1->first_same_value;
1764 class2 = class2->first_same_value;
1766 /* If they were already equal, forget it. */
1767 if (class1 == class2)
1768 return;
1770 for (elt = class2; elt; elt = next)
1772 unsigned int hash;
1773 rtx exp = elt->exp;
1774 machine_mode mode = elt->mode;
1776 next = elt->next_same_value;
1778 /* Remove old entry, make a new one in CLASS1's class.
1779 Don't do this for invalid entries as we cannot find their
1780 hash code (it also isn't necessary). */
1781 if (REG_P (exp) || exp_equiv_p (exp, exp, 1, false))
1783 bool need_rehash = false;
1785 hash_arg_in_memory = 0;
1786 hash = HASH (exp, mode);
1788 if (REG_P (exp))
1790 need_rehash = REGNO_QTY_VALID_P (REGNO (exp));
1791 delete_reg_equiv (REGNO (exp));
1794 if (REG_P (exp) && REGNO (exp) >= FIRST_PSEUDO_REGISTER)
1795 remove_pseudo_from_table (exp, hash);
1796 else
1797 remove_from_table (elt, hash);
1799 if (insert_regs (exp, class1, 0) || need_rehash)
1801 rehash_using_reg (exp);
1802 hash = HASH (exp, mode);
1804 new_elt = insert (exp, class1, hash, mode);
1805 new_elt->in_memory = hash_arg_in_memory;
1806 if (GET_CODE (exp) == ASM_OPERANDS && elt->cost == MAX_COST)
1807 new_elt->cost = MAX_COST;
1812 /* Flush the entire hash table. */
1814 static void
1815 flush_hash_table (void)
1817 int i;
1818 struct table_elt *p;
1820 for (i = 0; i < HASH_SIZE; i++)
1821 for (p = table[i]; p; p = table[i])
1823 /* Note that invalidate can remove elements
1824 after P in the current hash chain. */
1825 if (REG_P (p->exp))
1826 invalidate (p->exp, VOIDmode);
1827 else
1828 remove_from_table (p, i);
1832 /* Check whether an anti dependence exists between X and EXP. MODE and
1833 ADDR are as for canon_anti_dependence. */
1835 static bool
1836 check_dependence (const_rtx x, rtx exp, machine_mode mode, rtx addr)
1838 subrtx_iterator::array_type array;
1839 FOR_EACH_SUBRTX (iter, array, x, NONCONST)
1841 const_rtx x = *iter;
1842 if (MEM_P (x) && canon_anti_dependence (x, true, exp, mode, addr))
1843 return true;
1845 return false;
1848 /* Remove from the hash table, or mark as invalid, all expressions whose
1849 values could be altered by storing in X. X is a register, a subreg, or
1850 a memory reference with nonvarying address (because, when a memory
1851 reference with a varying address is stored in, all memory references are
1852 removed by invalidate_memory so specific invalidation is superfluous).
1853 FULL_MODE, if not VOIDmode, indicates that this much should be
1854 invalidated instead of just the amount indicated by the mode of X. This
1855 is only used for bitfield stores into memory.
1857 A nonvarying address may be just a register or just a symbol reference,
1858 or it may be either of those plus a numeric offset. */
1860 static void
1861 invalidate (rtx x, machine_mode full_mode)
1863 int i;
1864 struct table_elt *p;
1865 rtx addr;
1867 switch (GET_CODE (x))
1869 case REG:
1871 /* If X is a register, dependencies on its contents are recorded
1872 through the qty number mechanism. Just change the qty number of
1873 the register, mark it as invalid for expressions that refer to it,
1874 and remove it itself. */
1875 unsigned int regno = REGNO (x);
1876 unsigned int hash = HASH (x, GET_MODE (x));
1878 /* Remove REGNO from any quantity list it might be on and indicate
1879 that its value might have changed. If it is a pseudo, remove its
1880 entry from the hash table.
1882 For a hard register, we do the first two actions above for any
1883 additional hard registers corresponding to X. Then, if any of these
1884 registers are in the table, we must remove any REG entries that
1885 overlap these registers. */
1887 delete_reg_equiv (regno);
1888 REG_TICK (regno)++;
1889 SUBREG_TICKED (regno) = -1;
1891 if (regno >= FIRST_PSEUDO_REGISTER)
1892 remove_pseudo_from_table (x, hash);
1893 else
1895 HOST_WIDE_INT in_table
1896 = TEST_HARD_REG_BIT (hard_regs_in_table, regno);
1897 unsigned int endregno = END_HARD_REGNO (x);
1898 unsigned int tregno, tendregno, rn;
1899 struct table_elt *p, *next;
1901 CLEAR_HARD_REG_BIT (hard_regs_in_table, regno);
1903 for (rn = regno + 1; rn < endregno; rn++)
1905 in_table |= TEST_HARD_REG_BIT (hard_regs_in_table, rn);
1906 CLEAR_HARD_REG_BIT (hard_regs_in_table, rn);
1907 delete_reg_equiv (rn);
1908 REG_TICK (rn)++;
1909 SUBREG_TICKED (rn) = -1;
1912 if (in_table)
1913 for (hash = 0; hash < HASH_SIZE; hash++)
1914 for (p = table[hash]; p; p = next)
1916 next = p->next_same_hash;
1918 if (!REG_P (p->exp)
1919 || REGNO (p->exp) >= FIRST_PSEUDO_REGISTER)
1920 continue;
1922 tregno = REGNO (p->exp);
1923 tendregno = END_HARD_REGNO (p->exp);
1924 if (tendregno > regno && tregno < endregno)
1925 remove_from_table (p, hash);
1929 return;
1931 case SUBREG:
1932 invalidate (SUBREG_REG (x), VOIDmode);
1933 return;
1935 case PARALLEL:
1936 for (i = XVECLEN (x, 0) - 1; i >= 0; --i)
1937 invalidate (XVECEXP (x, 0, i), VOIDmode);
1938 return;
1940 case EXPR_LIST:
1941 /* This is part of a disjoint return value; extract the location in
1942 question ignoring the offset. */
1943 invalidate (XEXP (x, 0), VOIDmode);
1944 return;
1946 case MEM:
1947 addr = canon_rtx (get_addr (XEXP (x, 0)));
1948 /* Calculate the canonical version of X here so that
1949 true_dependence doesn't generate new RTL for X on each call. */
1950 x = canon_rtx (x);
1952 /* Remove all hash table elements that refer to overlapping pieces of
1953 memory. */
1954 if (full_mode == VOIDmode)
1955 full_mode = GET_MODE (x);
1957 for (i = 0; i < HASH_SIZE; i++)
1959 struct table_elt *next;
1961 for (p = table[i]; p; p = next)
1963 next = p->next_same_hash;
1964 if (p->in_memory)
1966 /* Just canonicalize the expression once;
1967 otherwise each time we call invalidate
1968 true_dependence will canonicalize the
1969 expression again. */
1970 if (!p->canon_exp)
1971 p->canon_exp = canon_rtx (p->exp);
1972 if (check_dependence (p->canon_exp, x, full_mode, addr))
1973 remove_from_table (p, i);
1977 return;
1979 default:
1980 gcc_unreachable ();
1984 /* Invalidate DEST. Used when DEST is not going to be added
1985 into the hash table for some reason, e.g. do_not_record
1986 flagged on it. */
1988 static void
1989 invalidate_dest (rtx dest)
1991 if (REG_P (dest)
1992 || GET_CODE (dest) == SUBREG
1993 || MEM_P (dest))
1994 invalidate (dest, VOIDmode);
1995 else if (GET_CODE (dest) == STRICT_LOW_PART
1996 || GET_CODE (dest) == ZERO_EXTRACT)
1997 invalidate (XEXP (dest, 0), GET_MODE (dest));
2000 /* Remove all expressions that refer to register REGNO,
2001 since they are already invalid, and we are about to
2002 mark that register valid again and don't want the old
2003 expressions to reappear as valid. */
2005 static void
2006 remove_invalid_refs (unsigned int regno)
2008 unsigned int i;
2009 struct table_elt *p, *next;
2011 for (i = 0; i < HASH_SIZE; i++)
2012 for (p = table[i]; p; p = next)
2014 next = p->next_same_hash;
2015 if (!REG_P (p->exp) && refers_to_regno_p (regno, p->exp))
2016 remove_from_table (p, i);
2020 /* Likewise for a subreg with subreg_reg REGNO, subreg_byte OFFSET,
2021 and mode MODE. */
2022 static void
2023 remove_invalid_subreg_refs (unsigned int regno, unsigned int offset,
2024 machine_mode mode)
2026 unsigned int i;
2027 struct table_elt *p, *next;
2028 unsigned int end = offset + (GET_MODE_SIZE (mode) - 1);
2030 for (i = 0; i < HASH_SIZE; i++)
2031 for (p = table[i]; p; p = next)
2033 rtx exp = p->exp;
2034 next = p->next_same_hash;
2036 if (!REG_P (exp)
2037 && (GET_CODE (exp) != SUBREG
2038 || !REG_P (SUBREG_REG (exp))
2039 || REGNO (SUBREG_REG (exp)) != regno
2040 || (((SUBREG_BYTE (exp)
2041 + (GET_MODE_SIZE (GET_MODE (exp)) - 1)) >= offset)
2042 && SUBREG_BYTE (exp) <= end))
2043 && refers_to_regno_p (regno, p->exp))
2044 remove_from_table (p, i);
2048 /* Recompute the hash codes of any valid entries in the hash table that
2049 reference X, if X is a register, or SUBREG_REG (X) if X is a SUBREG.
2051 This is called when we make a jump equivalence. */
2053 static void
2054 rehash_using_reg (rtx x)
2056 unsigned int i;
2057 struct table_elt *p, *next;
2058 unsigned hash;
2060 if (GET_CODE (x) == SUBREG)
2061 x = SUBREG_REG (x);
2063 /* If X is not a register or if the register is known not to be in any
2064 valid entries in the table, we have no work to do. */
2066 if (!REG_P (x)
2067 || REG_IN_TABLE (REGNO (x)) < 0
2068 || REG_IN_TABLE (REGNO (x)) != REG_TICK (REGNO (x)))
2069 return;
2071 /* Scan all hash chains looking for valid entries that mention X.
2072 If we find one and it is in the wrong hash chain, move it. */
2074 for (i = 0; i < HASH_SIZE; i++)
2075 for (p = table[i]; p; p = next)
2077 next = p->next_same_hash;
2078 if (reg_mentioned_p (x, p->exp)
2079 && exp_equiv_p (p->exp, p->exp, 1, false)
2080 && i != (hash = SAFE_HASH (p->exp, p->mode)))
2082 if (p->next_same_hash)
2083 p->next_same_hash->prev_same_hash = p->prev_same_hash;
2085 if (p->prev_same_hash)
2086 p->prev_same_hash->next_same_hash = p->next_same_hash;
2087 else
2088 table[i] = p->next_same_hash;
2090 p->next_same_hash = table[hash];
2091 p->prev_same_hash = 0;
2092 if (table[hash])
2093 table[hash]->prev_same_hash = p;
2094 table[hash] = p;
2099 /* Remove from the hash table any expression that is a call-clobbered
2100 register. Also update their TICK values. */
2102 static void
2103 invalidate_for_call (void)
2105 unsigned int regno, endregno;
2106 unsigned int i;
2107 unsigned hash;
2108 struct table_elt *p, *next;
2109 int in_table = 0;
2110 hard_reg_set_iterator hrsi;
2112 /* Go through all the hard registers. For each that is clobbered in
2113 a CALL_INSN, remove the register from quantity chains and update
2114 reg_tick if defined. Also see if any of these registers is currently
2115 in the table. */
2116 EXECUTE_IF_SET_IN_HARD_REG_SET (regs_invalidated_by_call, 0, regno, hrsi)
2118 delete_reg_equiv (regno);
2119 if (REG_TICK (regno) >= 0)
2121 REG_TICK (regno)++;
2122 SUBREG_TICKED (regno) = -1;
2124 in_table |= (TEST_HARD_REG_BIT (hard_regs_in_table, regno) != 0);
2127 /* In the case where we have no call-clobbered hard registers in the
2128 table, we are done. Otherwise, scan the table and remove any
2129 entry that overlaps a call-clobbered register. */
2131 if (in_table)
2132 for (hash = 0; hash < HASH_SIZE; hash++)
2133 for (p = table[hash]; p; p = next)
2135 next = p->next_same_hash;
2137 if (!REG_P (p->exp)
2138 || REGNO (p->exp) >= FIRST_PSEUDO_REGISTER)
2139 continue;
2141 regno = REGNO (p->exp);
2142 endregno = END_HARD_REGNO (p->exp);
2144 for (i = regno; i < endregno; i++)
2145 if (TEST_HARD_REG_BIT (regs_invalidated_by_call, i))
2147 remove_from_table (p, hash);
2148 break;
2153 /* Given an expression X of type CONST,
2154 and ELT which is its table entry (or 0 if it
2155 is not in the hash table),
2156 return an alternate expression for X as a register plus integer.
2157 If none can be found, return 0. */
2159 static rtx
2160 use_related_value (rtx x, struct table_elt *elt)
2162 struct table_elt *relt = 0;
2163 struct table_elt *p, *q;
2164 HOST_WIDE_INT offset;
2166 /* First, is there anything related known?
2167 If we have a table element, we can tell from that.
2168 Otherwise, must look it up. */
2170 if (elt != 0 && elt->related_value != 0)
2171 relt = elt;
2172 else if (elt == 0 && GET_CODE (x) == CONST)
2174 rtx subexp = get_related_value (x);
2175 if (subexp != 0)
2176 relt = lookup (subexp,
2177 SAFE_HASH (subexp, GET_MODE (subexp)),
2178 GET_MODE (subexp));
2181 if (relt == 0)
2182 return 0;
2184 /* Search all related table entries for one that has an
2185 equivalent register. */
2187 p = relt;
2188 while (1)
2190 /* This loop is strange in that it is executed in two different cases.
2191 The first is when X is already in the table. Then it is searching
2192 the RELATED_VALUE list of X's class (RELT). The second case is when
2193 X is not in the table. Then RELT points to a class for the related
2194 value.
2196 Ensure that, whatever case we are in, that we ignore classes that have
2197 the same value as X. */
2199 if (rtx_equal_p (x, p->exp))
2200 q = 0;
2201 else
2202 for (q = p->first_same_value; q; q = q->next_same_value)
2203 if (REG_P (q->exp))
2204 break;
2206 if (q)
2207 break;
2209 p = p->related_value;
2211 /* We went all the way around, so there is nothing to be found.
2212 Alternatively, perhaps RELT was in the table for some other reason
2213 and it has no related values recorded. */
2214 if (p == relt || p == 0)
2215 break;
2218 if (q == 0)
2219 return 0;
2221 offset = (get_integer_term (x) - get_integer_term (p->exp));
2222 /* Note: OFFSET may be 0 if P->xexp and X are related by commutativity. */
2223 return plus_constant (q->mode, q->exp, offset);
2227 /* Hash a string. Just add its bytes up. */
2228 static inline unsigned
2229 hash_rtx_string (const char *ps)
2231 unsigned hash = 0;
2232 const unsigned char *p = (const unsigned char *) ps;
2234 if (p)
2235 while (*p)
2236 hash += *p++;
2238 return hash;
2241 /* Same as hash_rtx, but call CB on each rtx if it is not NULL.
2242 When the callback returns true, we continue with the new rtx. */
2244 unsigned
2245 hash_rtx_cb (const_rtx x, machine_mode mode,
2246 int *do_not_record_p, int *hash_arg_in_memory_p,
2247 bool have_reg_qty, hash_rtx_callback_function cb)
2249 int i, j;
2250 unsigned hash = 0;
2251 enum rtx_code code;
2252 const char *fmt;
2253 machine_mode newmode;
2254 rtx newx;
2256 /* Used to turn recursion into iteration. We can't rely on GCC's
2257 tail-recursion elimination since we need to keep accumulating values
2258 in HASH. */
2259 repeat:
2260 if (x == 0)
2261 return hash;
2263 /* Invoke the callback first. */
2264 if (cb != NULL
2265 && ((*cb) (x, mode, &newx, &newmode)))
2267 hash += hash_rtx_cb (newx, newmode, do_not_record_p,
2268 hash_arg_in_memory_p, have_reg_qty, cb);
2269 return hash;
2272 code = GET_CODE (x);
2273 switch (code)
2275 case REG:
2277 unsigned int regno = REGNO (x);
2279 if (do_not_record_p && !reload_completed)
2281 /* On some machines, we can't record any non-fixed hard register,
2282 because extending its life will cause reload problems. We
2283 consider ap, fp, sp, gp to be fixed for this purpose.
2285 We also consider CCmode registers to be fixed for this purpose;
2286 failure to do so leads to failure to simplify 0<100 type of
2287 conditionals.
2289 On all machines, we can't record any global registers.
2290 Nor should we record any register that is in a small
2291 class, as defined by TARGET_CLASS_LIKELY_SPILLED_P. */
2292 bool record;
2294 if (regno >= FIRST_PSEUDO_REGISTER)
2295 record = true;
2296 else if (x == frame_pointer_rtx
2297 || x == hard_frame_pointer_rtx
2298 || x == arg_pointer_rtx
2299 || x == stack_pointer_rtx
2300 || x == pic_offset_table_rtx)
2301 record = true;
2302 else if (global_regs[regno])
2303 record = false;
2304 else if (fixed_regs[regno])
2305 record = true;
2306 else if (GET_MODE_CLASS (GET_MODE (x)) == MODE_CC)
2307 record = true;
2308 else if (targetm.small_register_classes_for_mode_p (GET_MODE (x)))
2309 record = false;
2310 else if (targetm.class_likely_spilled_p (REGNO_REG_CLASS (regno)))
2311 record = false;
2312 else
2313 record = true;
2315 if (!record)
2317 *do_not_record_p = 1;
2318 return 0;
2322 hash += ((unsigned int) REG << 7);
2323 hash += (have_reg_qty ? (unsigned) REG_QTY (regno) : regno);
2324 return hash;
2327 /* We handle SUBREG of a REG specially because the underlying
2328 reg changes its hash value with every value change; we don't
2329 want to have to forget unrelated subregs when one subreg changes. */
2330 case SUBREG:
2332 if (REG_P (SUBREG_REG (x)))
2334 hash += (((unsigned int) SUBREG << 7)
2335 + REGNO (SUBREG_REG (x))
2336 + (SUBREG_BYTE (x) / UNITS_PER_WORD));
2337 return hash;
2339 break;
2342 case CONST_INT:
2343 hash += (((unsigned int) CONST_INT << 7) + (unsigned int) mode
2344 + (unsigned int) INTVAL (x));
2345 return hash;
2347 case CONST_WIDE_INT:
2348 for (i = 0; i < CONST_WIDE_INT_NUNITS (x); i++)
2349 hash += CONST_WIDE_INT_ELT (x, i);
2350 return hash;
2352 case CONST_DOUBLE:
2353 /* This is like the general case, except that it only counts
2354 the integers representing the constant. */
2355 hash += (unsigned int) code + (unsigned int) GET_MODE (x);
2356 if (TARGET_SUPPORTS_WIDE_INT == 0 && GET_MODE (x) == VOIDmode)
2357 hash += ((unsigned int) CONST_DOUBLE_LOW (x)
2358 + (unsigned int) CONST_DOUBLE_HIGH (x));
2359 else
2360 hash += real_hash (CONST_DOUBLE_REAL_VALUE (x));
2361 return hash;
2363 case CONST_FIXED:
2364 hash += (unsigned int) code + (unsigned int) GET_MODE (x);
2365 hash += fixed_hash (CONST_FIXED_VALUE (x));
2366 return hash;
2368 case CONST_VECTOR:
2370 int units;
2371 rtx elt;
2373 units = CONST_VECTOR_NUNITS (x);
2375 for (i = 0; i < units; ++i)
2377 elt = CONST_VECTOR_ELT (x, i);
2378 hash += hash_rtx_cb (elt, GET_MODE (elt),
2379 do_not_record_p, hash_arg_in_memory_p,
2380 have_reg_qty, cb);
2383 return hash;
2386 /* Assume there is only one rtx object for any given label. */
2387 case LABEL_REF:
2388 /* We don't hash on the address of the CODE_LABEL to avoid bootstrap
2389 differences and differences between each stage's debugging dumps. */
2390 hash += (((unsigned int) LABEL_REF << 7)
2391 + CODE_LABEL_NUMBER (LABEL_REF_LABEL (x)));
2392 return hash;
2394 case SYMBOL_REF:
2396 /* Don't hash on the symbol's address to avoid bootstrap differences.
2397 Different hash values may cause expressions to be recorded in
2398 different orders and thus different registers to be used in the
2399 final assembler. This also avoids differences in the dump files
2400 between various stages. */
2401 unsigned int h = 0;
2402 const unsigned char *p = (const unsigned char *) XSTR (x, 0);
2404 while (*p)
2405 h += (h << 7) + *p++; /* ??? revisit */
2407 hash += ((unsigned int) SYMBOL_REF << 7) + h;
2408 return hash;
2411 case MEM:
2412 /* We don't record if marked volatile or if BLKmode since we don't
2413 know the size of the move. */
2414 if (do_not_record_p && (MEM_VOLATILE_P (x) || GET_MODE (x) == BLKmode))
2416 *do_not_record_p = 1;
2417 return 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 case USE:
2429 /* A USE that mentions non-volatile memory needs special
2430 handling since the MEM may be BLKmode which normally
2431 prevents an entry from being made. Pure calls are
2432 marked by a USE which mentions BLKmode memory.
2433 See calls.c:emit_call_1. */
2434 if (MEM_P (XEXP (x, 0))
2435 && ! MEM_VOLATILE_P (XEXP (x, 0)))
2437 hash += (unsigned) USE;
2438 x = XEXP (x, 0);
2440 if (hash_arg_in_memory_p && !MEM_READONLY_P (x))
2441 *hash_arg_in_memory_p = 1;
2443 /* Now that we have already found this special case,
2444 might as well speed it up as much as possible. */
2445 hash += (unsigned) MEM;
2446 x = XEXP (x, 0);
2447 goto repeat;
2449 break;
2451 case PRE_DEC:
2452 case PRE_INC:
2453 case POST_DEC:
2454 case POST_INC:
2455 case PRE_MODIFY:
2456 case POST_MODIFY:
2457 case PC:
2458 case CC0:
2459 case CALL:
2460 case UNSPEC_VOLATILE:
2461 if (do_not_record_p) {
2462 *do_not_record_p = 1;
2463 return 0;
2465 else
2466 return hash;
2467 break;
2469 case ASM_OPERANDS:
2470 if (do_not_record_p && MEM_VOLATILE_P (x))
2472 *do_not_record_p = 1;
2473 return 0;
2475 else
2477 /* We don't want to take the filename and line into account. */
2478 hash += (unsigned) code + (unsigned) GET_MODE (x)
2479 + hash_rtx_string (ASM_OPERANDS_TEMPLATE (x))
2480 + hash_rtx_string (ASM_OPERANDS_OUTPUT_CONSTRAINT (x))
2481 + (unsigned) ASM_OPERANDS_OUTPUT_IDX (x);
2483 if (ASM_OPERANDS_INPUT_LENGTH (x))
2485 for (i = 1; i < ASM_OPERANDS_INPUT_LENGTH (x); i++)
2487 hash += (hash_rtx_cb (ASM_OPERANDS_INPUT (x, i),
2488 GET_MODE (ASM_OPERANDS_INPUT (x, i)),
2489 do_not_record_p, hash_arg_in_memory_p,
2490 have_reg_qty, cb)
2491 + hash_rtx_string
2492 (ASM_OPERANDS_INPUT_CONSTRAINT (x, i)));
2495 hash += hash_rtx_string (ASM_OPERANDS_INPUT_CONSTRAINT (x, 0));
2496 x = ASM_OPERANDS_INPUT (x, 0);
2497 mode = GET_MODE (x);
2498 goto repeat;
2501 return hash;
2503 break;
2505 default:
2506 break;
2509 i = GET_RTX_LENGTH (code) - 1;
2510 hash += (unsigned) code + (unsigned) GET_MODE (x);
2511 fmt = GET_RTX_FORMAT (code);
2512 for (; i >= 0; i--)
2514 switch (fmt[i])
2516 case 'e':
2517 /* If we are about to do the last recursive call
2518 needed at this level, change it into iteration.
2519 This function is called enough to be worth it. */
2520 if (i == 0)
2522 x = XEXP (x, i);
2523 goto repeat;
2526 hash += hash_rtx_cb (XEXP (x, i), VOIDmode, do_not_record_p,
2527 hash_arg_in_memory_p,
2528 have_reg_qty, cb);
2529 break;
2531 case 'E':
2532 for (j = 0; j < XVECLEN (x, i); j++)
2533 hash += hash_rtx_cb (XVECEXP (x, i, j), VOIDmode, do_not_record_p,
2534 hash_arg_in_memory_p,
2535 have_reg_qty, cb);
2536 break;
2538 case 's':
2539 hash += hash_rtx_string (XSTR (x, i));
2540 break;
2542 case 'i':
2543 hash += (unsigned int) XINT (x, i);
2544 break;
2546 case '0': case 't':
2547 /* Unused. */
2548 break;
2550 default:
2551 gcc_unreachable ();
2555 return hash;
2558 /* Hash an rtx. We are careful to make sure the value is never negative.
2559 Equivalent registers hash identically.
2560 MODE is used in hashing for CONST_INTs only;
2561 otherwise the mode of X is used.
2563 Store 1 in DO_NOT_RECORD_P if any subexpression is volatile.
2565 If HASH_ARG_IN_MEMORY_P is not NULL, store 1 in it if X contains
2566 a MEM rtx which does not have the MEM_READONLY_P flag set.
2568 Note that cse_insn knows that the hash code of a MEM expression
2569 is just (int) MEM plus the hash code of the address. */
2571 unsigned
2572 hash_rtx (const_rtx x, machine_mode mode, int *do_not_record_p,
2573 int *hash_arg_in_memory_p, bool have_reg_qty)
2575 return hash_rtx_cb (x, mode, do_not_record_p,
2576 hash_arg_in_memory_p, have_reg_qty, NULL);
2579 /* Hash an rtx X for cse via hash_rtx.
2580 Stores 1 in do_not_record if any subexpression is volatile.
2581 Stores 1 in hash_arg_in_memory if X contains a mem rtx which
2582 does not have the MEM_READONLY_P flag set. */
2584 static inline unsigned
2585 canon_hash (rtx x, machine_mode mode)
2587 return hash_rtx (x, mode, &do_not_record, &hash_arg_in_memory, true);
2590 /* Like canon_hash but with no side effects, i.e. do_not_record
2591 and hash_arg_in_memory are not changed. */
2593 static inline unsigned
2594 safe_hash (rtx x, machine_mode mode)
2596 int dummy_do_not_record;
2597 return hash_rtx (x, mode, &dummy_do_not_record, NULL, true);
2600 /* Return 1 iff X and Y would canonicalize into the same thing,
2601 without actually constructing the canonicalization of either one.
2602 If VALIDATE is nonzero,
2603 we assume X is an expression being processed from the rtl
2604 and Y was found in the hash table. We check register refs
2605 in Y for being marked as valid.
2607 If FOR_GCSE is true, we compare X and Y for equivalence for GCSE. */
2610 exp_equiv_p (const_rtx x, const_rtx y, int validate, bool for_gcse)
2612 int i, j;
2613 enum rtx_code code;
2614 const char *fmt;
2616 /* Note: it is incorrect to assume an expression is equivalent to itself
2617 if VALIDATE is nonzero. */
2618 if (x == y && !validate)
2619 return 1;
2621 if (x == 0 || y == 0)
2622 return x == y;
2624 code = GET_CODE (x);
2625 if (code != GET_CODE (y))
2626 return 0;
2628 /* (MULT:SI x y) and (MULT:HI x y) are NOT equivalent. */
2629 if (GET_MODE (x) != GET_MODE (y))
2630 return 0;
2632 /* MEMs referring to different address space are not equivalent. */
2633 if (code == MEM && MEM_ADDR_SPACE (x) != MEM_ADDR_SPACE (y))
2634 return 0;
2636 switch (code)
2638 case PC:
2639 case CC0:
2640 CASE_CONST_UNIQUE:
2641 return x == y;
2643 case LABEL_REF:
2644 return LABEL_REF_LABEL (x) == LABEL_REF_LABEL (y);
2646 case SYMBOL_REF:
2647 return XSTR (x, 0) == XSTR (y, 0);
2649 case REG:
2650 if (for_gcse)
2651 return REGNO (x) == REGNO (y);
2652 else
2654 unsigned int regno = REGNO (y);
2655 unsigned int i;
2656 unsigned int endregno = END_REGNO (y);
2658 /* If the quantities are not the same, the expressions are not
2659 equivalent. If there are and we are not to validate, they
2660 are equivalent. Otherwise, ensure all regs are up-to-date. */
2662 if (REG_QTY (REGNO (x)) != REG_QTY (regno))
2663 return 0;
2665 if (! validate)
2666 return 1;
2668 for (i = regno; i < endregno; i++)
2669 if (REG_IN_TABLE (i) != REG_TICK (i))
2670 return 0;
2672 return 1;
2675 case MEM:
2676 if (for_gcse)
2678 /* A volatile mem should not be considered equivalent to any
2679 other. */
2680 if (MEM_VOLATILE_P (x) || MEM_VOLATILE_P (y))
2681 return 0;
2683 /* Can't merge two expressions in different alias sets, since we
2684 can decide that the expression is transparent in a block when
2685 it isn't, due to it being set with the different alias set.
2687 Also, can't merge two expressions with different MEM_ATTRS.
2688 They could e.g. be two different entities allocated into the
2689 same space on the stack (see e.g. PR25130). In that case, the
2690 MEM addresses can be the same, even though the two MEMs are
2691 absolutely not equivalent.
2693 But because really all MEM attributes should be the same for
2694 equivalent MEMs, we just use the invariant that MEMs that have
2695 the same attributes share the same mem_attrs data structure. */
2696 if (!mem_attrs_eq_p (MEM_ATTRS (x), MEM_ATTRS (y)))
2697 return 0;
2699 /* If we are handling exceptions, we cannot consider two expressions
2700 with different trapping status as equivalent, because simple_mem
2701 might accept one and reject the other. */
2702 if (cfun->can_throw_non_call_exceptions
2703 && (MEM_NOTRAP_P (x) != MEM_NOTRAP_P (y)))
2704 return 0;
2706 break;
2708 /* For commutative operations, check both orders. */
2709 case PLUS:
2710 case MULT:
2711 case AND:
2712 case IOR:
2713 case XOR:
2714 case NE:
2715 case EQ:
2716 return ((exp_equiv_p (XEXP (x, 0), XEXP (y, 0),
2717 validate, for_gcse)
2718 && exp_equiv_p (XEXP (x, 1), XEXP (y, 1),
2719 validate, for_gcse))
2720 || (exp_equiv_p (XEXP (x, 0), XEXP (y, 1),
2721 validate, for_gcse)
2722 && exp_equiv_p (XEXP (x, 1), XEXP (y, 0),
2723 validate, for_gcse)));
2725 case ASM_OPERANDS:
2726 /* We don't use the generic code below because we want to
2727 disregard filename and line numbers. */
2729 /* A volatile asm isn't equivalent to any other. */
2730 if (MEM_VOLATILE_P (x) || MEM_VOLATILE_P (y))
2731 return 0;
2733 if (GET_MODE (x) != GET_MODE (y)
2734 || strcmp (ASM_OPERANDS_TEMPLATE (x), ASM_OPERANDS_TEMPLATE (y))
2735 || strcmp (ASM_OPERANDS_OUTPUT_CONSTRAINT (x),
2736 ASM_OPERANDS_OUTPUT_CONSTRAINT (y))
2737 || ASM_OPERANDS_OUTPUT_IDX (x) != ASM_OPERANDS_OUTPUT_IDX (y)
2738 || ASM_OPERANDS_INPUT_LENGTH (x) != ASM_OPERANDS_INPUT_LENGTH (y))
2739 return 0;
2741 if (ASM_OPERANDS_INPUT_LENGTH (x))
2743 for (i = ASM_OPERANDS_INPUT_LENGTH (x) - 1; i >= 0; i--)
2744 if (! exp_equiv_p (ASM_OPERANDS_INPUT (x, i),
2745 ASM_OPERANDS_INPUT (y, i),
2746 validate, for_gcse)
2747 || strcmp (ASM_OPERANDS_INPUT_CONSTRAINT (x, i),
2748 ASM_OPERANDS_INPUT_CONSTRAINT (y, i)))
2749 return 0;
2752 return 1;
2754 default:
2755 break;
2758 /* Compare the elements. If any pair of corresponding elements
2759 fail to match, return 0 for the whole thing. */
2761 fmt = GET_RTX_FORMAT (code);
2762 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
2764 switch (fmt[i])
2766 case 'e':
2767 if (! exp_equiv_p (XEXP (x, i), XEXP (y, i),
2768 validate, for_gcse))
2769 return 0;
2770 break;
2772 case 'E':
2773 if (XVECLEN (x, i) != XVECLEN (y, i))
2774 return 0;
2775 for (j = 0; j < XVECLEN (x, i); j++)
2776 if (! exp_equiv_p (XVECEXP (x, i, j), XVECEXP (y, i, j),
2777 validate, for_gcse))
2778 return 0;
2779 break;
2781 case 's':
2782 if (strcmp (XSTR (x, i), XSTR (y, i)))
2783 return 0;
2784 break;
2786 case 'i':
2787 if (XINT (x, i) != XINT (y, i))
2788 return 0;
2789 break;
2791 case 'w':
2792 if (XWINT (x, i) != XWINT (y, i))
2793 return 0;
2794 break;
2796 case '0':
2797 case 't':
2798 break;
2800 default:
2801 gcc_unreachable ();
2805 return 1;
2808 /* Subroutine of canon_reg. Pass *XLOC through canon_reg, and validate
2809 the result if necessary. INSN is as for canon_reg. */
2811 static void
2812 validate_canon_reg (rtx *xloc, rtx_insn *insn)
2814 if (*xloc)
2816 rtx new_rtx = canon_reg (*xloc, insn);
2818 /* If replacing pseudo with hard reg or vice versa, ensure the
2819 insn remains valid. Likewise if the insn has MATCH_DUPs. */
2820 gcc_assert (insn && new_rtx);
2821 validate_change (insn, xloc, new_rtx, 1);
2825 /* Canonicalize an expression:
2826 replace each register reference inside it
2827 with the "oldest" equivalent register.
2829 If INSN is nonzero validate_change is used to ensure that INSN remains valid
2830 after we make our substitution. The calls are made with IN_GROUP nonzero
2831 so apply_change_group must be called upon the outermost return from this
2832 function (unless INSN is zero). The result of apply_change_group can
2833 generally be discarded since the changes we are making are optional. */
2835 static rtx
2836 canon_reg (rtx x, rtx_insn *insn)
2838 int i;
2839 enum rtx_code code;
2840 const char *fmt;
2842 if (x == 0)
2843 return x;
2845 code = GET_CODE (x);
2846 switch (code)
2848 case PC:
2849 case CC0:
2850 case CONST:
2851 CASE_CONST_ANY:
2852 case SYMBOL_REF:
2853 case LABEL_REF:
2854 case ADDR_VEC:
2855 case ADDR_DIFF_VEC:
2856 return x;
2858 case REG:
2860 int first;
2861 int q;
2862 struct qty_table_elem *ent;
2864 /* Never replace a hard reg, because hard regs can appear
2865 in more than one machine mode, and we must preserve the mode
2866 of each occurrence. Also, some hard regs appear in
2867 MEMs that are shared and mustn't be altered. Don't try to
2868 replace any reg that maps to a reg of class NO_REGS. */
2869 if (REGNO (x) < FIRST_PSEUDO_REGISTER
2870 || ! REGNO_QTY_VALID_P (REGNO (x)))
2871 return x;
2873 q = REG_QTY (REGNO (x));
2874 ent = &qty_table[q];
2875 first = ent->first_reg;
2876 return (first >= FIRST_PSEUDO_REGISTER ? regno_reg_rtx[first]
2877 : REGNO_REG_CLASS (first) == NO_REGS ? x
2878 : gen_rtx_REG (ent->mode, first));
2881 default:
2882 break;
2885 fmt = GET_RTX_FORMAT (code);
2886 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
2888 int j;
2890 if (fmt[i] == 'e')
2891 validate_canon_reg (&XEXP (x, i), insn);
2892 else if (fmt[i] == 'E')
2893 for (j = 0; j < XVECLEN (x, i); j++)
2894 validate_canon_reg (&XVECEXP (x, i, j), insn);
2897 return x;
2900 /* Given an operation (CODE, *PARG1, *PARG2), where code is a comparison
2901 operation (EQ, NE, GT, etc.), follow it back through the hash table and
2902 what values are being compared.
2904 *PARG1 and *PARG2 are updated to contain the rtx representing the values
2905 actually being compared. For example, if *PARG1 was (cc0) and *PARG2
2906 was (const_int 0), *PARG1 and *PARG2 will be set to the objects that were
2907 compared to produce cc0.
2909 The return value is the comparison operator and is either the code of
2910 A or the code corresponding to the inverse of the comparison. */
2912 static enum rtx_code
2913 find_comparison_args (enum rtx_code code, rtx *parg1, rtx *parg2,
2914 machine_mode *pmode1, machine_mode *pmode2)
2916 rtx arg1, arg2;
2917 hash_set<rtx> *visited = NULL;
2918 /* Set nonzero when we find something of interest. */
2919 rtx x = NULL;
2921 arg1 = *parg1, arg2 = *parg2;
2923 /* If ARG2 is const0_rtx, see what ARG1 is equivalent to. */
2925 while (arg2 == CONST0_RTX (GET_MODE (arg1)))
2927 int reverse_code = 0;
2928 struct table_elt *p = 0;
2930 /* Remember state from previous iteration. */
2931 if (x)
2933 if (!visited)
2934 visited = new hash_set<rtx>;
2935 visited->add (x);
2936 x = 0;
2939 /* If arg1 is a COMPARE, extract the comparison arguments from it.
2940 On machines with CC0, this is the only case that can occur, since
2941 fold_rtx will return the COMPARE or item being compared with zero
2942 when given CC0. */
2944 if (GET_CODE (arg1) == COMPARE && arg2 == const0_rtx)
2945 x = arg1;
2947 /* If ARG1 is a comparison operator and CODE is testing for
2948 STORE_FLAG_VALUE, get the inner arguments. */
2950 else if (COMPARISON_P (arg1))
2952 #ifdef FLOAT_STORE_FLAG_VALUE
2953 REAL_VALUE_TYPE fsfv;
2954 #endif
2956 if (code == NE
2957 || (GET_MODE_CLASS (GET_MODE (arg1)) == MODE_INT
2958 && code == LT && STORE_FLAG_VALUE == -1)
2959 #ifdef FLOAT_STORE_FLAG_VALUE
2960 || (SCALAR_FLOAT_MODE_P (GET_MODE (arg1))
2961 && (fsfv = FLOAT_STORE_FLAG_VALUE (GET_MODE (arg1)),
2962 REAL_VALUE_NEGATIVE (fsfv)))
2963 #endif
2965 x = arg1;
2966 else if (code == EQ
2967 || (GET_MODE_CLASS (GET_MODE (arg1)) == MODE_INT
2968 && code == GE && STORE_FLAG_VALUE == -1)
2969 #ifdef FLOAT_STORE_FLAG_VALUE
2970 || (SCALAR_FLOAT_MODE_P (GET_MODE (arg1))
2971 && (fsfv = FLOAT_STORE_FLAG_VALUE (GET_MODE (arg1)),
2972 REAL_VALUE_NEGATIVE (fsfv)))
2973 #endif
2975 x = arg1, reverse_code = 1;
2978 /* ??? We could also check for
2980 (ne (and (eq (...) (const_int 1))) (const_int 0))
2982 and related forms, but let's wait until we see them occurring. */
2984 if (x == 0)
2985 /* Look up ARG1 in the hash table and see if it has an equivalence
2986 that lets us see what is being compared. */
2987 p = lookup (arg1, SAFE_HASH (arg1, GET_MODE (arg1)), GET_MODE (arg1));
2988 if (p)
2990 p = p->first_same_value;
2992 /* If what we compare is already known to be constant, that is as
2993 good as it gets.
2994 We need to break the loop in this case, because otherwise we
2995 can have an infinite loop when looking at a reg that is known
2996 to be a constant which is the same as a comparison of a reg
2997 against zero which appears later in the insn stream, which in
2998 turn is constant and the same as the comparison of the first reg
2999 against zero... */
3000 if (p->is_const)
3001 break;
3004 for (; p; p = p->next_same_value)
3006 machine_mode inner_mode = GET_MODE (p->exp);
3007 #ifdef FLOAT_STORE_FLAG_VALUE
3008 REAL_VALUE_TYPE fsfv;
3009 #endif
3011 /* If the entry isn't valid, skip it. */
3012 if (! exp_equiv_p (p->exp, p->exp, 1, false))
3013 continue;
3015 /* If it's a comparison we've used before, skip it. */
3016 if (visited && visited->contains (p->exp))
3017 continue;
3019 if (GET_CODE (p->exp) == COMPARE
3020 /* Another possibility is that this machine has a compare insn
3021 that includes the comparison code. In that case, ARG1 would
3022 be equivalent to a comparison operation that would set ARG1 to
3023 either STORE_FLAG_VALUE or zero. If this is an NE operation,
3024 ORIG_CODE is the actual comparison being done; if it is an EQ,
3025 we must reverse ORIG_CODE. On machine with a negative value
3026 for STORE_FLAG_VALUE, also look at LT and GE operations. */
3027 || ((code == NE
3028 || (code == LT
3029 && val_signbit_known_set_p (inner_mode,
3030 STORE_FLAG_VALUE))
3031 #ifdef FLOAT_STORE_FLAG_VALUE
3032 || (code == LT
3033 && SCALAR_FLOAT_MODE_P (inner_mode)
3034 && (fsfv = FLOAT_STORE_FLAG_VALUE (GET_MODE (arg1)),
3035 REAL_VALUE_NEGATIVE (fsfv)))
3036 #endif
3038 && COMPARISON_P (p->exp)))
3040 x = p->exp;
3041 break;
3043 else if ((code == EQ
3044 || (code == GE
3045 && val_signbit_known_set_p (inner_mode,
3046 STORE_FLAG_VALUE))
3047 #ifdef FLOAT_STORE_FLAG_VALUE
3048 || (code == GE
3049 && SCALAR_FLOAT_MODE_P (inner_mode)
3050 && (fsfv = FLOAT_STORE_FLAG_VALUE (GET_MODE (arg1)),
3051 REAL_VALUE_NEGATIVE (fsfv)))
3052 #endif
3054 && COMPARISON_P (p->exp))
3056 reverse_code = 1;
3057 x = p->exp;
3058 break;
3061 /* If this non-trapping address, e.g. fp + constant, the
3062 equivalent is a better operand since it may let us predict
3063 the value of the comparison. */
3064 else if (!rtx_addr_can_trap_p (p->exp))
3066 arg1 = p->exp;
3067 continue;
3071 /* If we didn't find a useful equivalence for ARG1, we are done.
3072 Otherwise, set up for the next iteration. */
3073 if (x == 0)
3074 break;
3076 /* If we need to reverse the comparison, make sure that that is
3077 possible -- we can't necessarily infer the value of GE from LT
3078 with floating-point operands. */
3079 if (reverse_code)
3081 enum rtx_code reversed = reversed_comparison_code (x, NULL_RTX);
3082 if (reversed == UNKNOWN)
3083 break;
3084 else
3085 code = reversed;
3087 else if (COMPARISON_P (x))
3088 code = GET_CODE (x);
3089 arg1 = XEXP (x, 0), arg2 = XEXP (x, 1);
3092 /* Return our results. Return the modes from before fold_rtx
3093 because fold_rtx might produce const_int, and then it's too late. */
3094 *pmode1 = GET_MODE (arg1), *pmode2 = GET_MODE (arg2);
3095 *parg1 = fold_rtx (arg1, 0), *parg2 = fold_rtx (arg2, 0);
3097 if (visited)
3098 delete visited;
3099 return code;
3102 /* If X is a nontrivial arithmetic operation on an argument for which
3103 a constant value can be determined, return the result of operating
3104 on that value, as a constant. Otherwise, return X, possibly with
3105 one or more operands changed to a forward-propagated constant.
3107 If X is a register whose contents are known, we do NOT return
3108 those contents here; equiv_constant is called to perform that task.
3109 For SUBREGs and MEMs, we do that both here and in equiv_constant.
3111 INSN is the insn that we may be modifying. If it is 0, make a copy
3112 of X before modifying it. */
3114 static rtx
3115 fold_rtx (rtx x, rtx_insn *insn)
3117 enum rtx_code code;
3118 machine_mode mode;
3119 const char *fmt;
3120 int i;
3121 rtx new_rtx = 0;
3122 int changed = 0;
3124 /* Operands of X. */
3125 /* Workaround -Wmaybe-uninitialized false positive during
3126 profiledbootstrap by initializing them. */
3127 rtx folded_arg0 = NULL_RTX;
3128 rtx folded_arg1 = NULL_RTX;
3130 /* Constant equivalents of first three operands of X;
3131 0 when no such equivalent is known. */
3132 rtx const_arg0;
3133 rtx const_arg1;
3134 rtx const_arg2;
3136 /* The mode of the first operand of X. We need this for sign and zero
3137 extends. */
3138 machine_mode mode_arg0;
3140 if (x == 0)
3141 return x;
3143 /* Try to perform some initial simplifications on X. */
3144 code = GET_CODE (x);
3145 switch (code)
3147 case MEM:
3148 case SUBREG:
3149 /* The first operand of a SIGN/ZERO_EXTRACT has a different meaning
3150 than it would in other contexts. Basically its mode does not
3151 signify the size of the object read. That information is carried
3152 by size operand. If we happen to have a MEM of the appropriate
3153 mode in our tables with a constant value we could simplify the
3154 extraction incorrectly if we allowed substitution of that value
3155 for the MEM. */
3156 case ZERO_EXTRACT:
3157 case SIGN_EXTRACT:
3158 if ((new_rtx = equiv_constant (x)) != NULL_RTX)
3159 return new_rtx;
3160 return x;
3162 case CONST:
3163 CASE_CONST_ANY:
3164 case SYMBOL_REF:
3165 case LABEL_REF:
3166 case REG:
3167 case PC:
3168 /* No use simplifying an EXPR_LIST
3169 since they are used only for lists of args
3170 in a function call's REG_EQUAL note. */
3171 case EXPR_LIST:
3172 return x;
3174 case CC0:
3175 return prev_insn_cc0;
3177 case ASM_OPERANDS:
3178 if (insn)
3180 for (i = ASM_OPERANDS_INPUT_LENGTH (x) - 1; i >= 0; i--)
3181 validate_change (insn, &ASM_OPERANDS_INPUT (x, i),
3182 fold_rtx (ASM_OPERANDS_INPUT (x, i), insn), 0);
3184 return x;
3186 case CALL:
3187 if (NO_FUNCTION_CSE && CONSTANT_P (XEXP (XEXP (x, 0), 0)))
3188 return x;
3189 break;
3191 /* Anything else goes through the loop below. */
3192 default:
3193 break;
3196 mode = GET_MODE (x);
3197 const_arg0 = 0;
3198 const_arg1 = 0;
3199 const_arg2 = 0;
3200 mode_arg0 = VOIDmode;
3202 /* Try folding our operands.
3203 Then see which ones have constant values known. */
3205 fmt = GET_RTX_FORMAT (code);
3206 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
3207 if (fmt[i] == 'e')
3209 rtx folded_arg = XEXP (x, i), const_arg;
3210 machine_mode mode_arg = GET_MODE (folded_arg);
3212 switch (GET_CODE (folded_arg))
3214 case MEM:
3215 case REG:
3216 case SUBREG:
3217 const_arg = equiv_constant (folded_arg);
3218 break;
3220 case CONST:
3221 CASE_CONST_ANY:
3222 case SYMBOL_REF:
3223 case LABEL_REF:
3224 const_arg = folded_arg;
3225 break;
3227 case CC0:
3228 /* The cc0-user and cc0-setter may be in different blocks if
3229 the cc0-setter potentially traps. In that case PREV_INSN_CC0
3230 will have been cleared as we exited the block with the
3231 setter.
3233 While we could potentially track cc0 in this case, it just
3234 doesn't seem to be worth it given that cc0 targets are not
3235 terribly common or important these days and trapping math
3236 is rarely used. The combination of those two conditions
3237 necessary to trip this situation is exceedingly rare in the
3238 real world. */
3239 if (!prev_insn_cc0)
3241 const_arg = NULL_RTX;
3243 else
3245 folded_arg = prev_insn_cc0;
3246 mode_arg = prev_insn_cc0_mode;
3247 const_arg = equiv_constant (folded_arg);
3249 break;
3251 default:
3252 folded_arg = fold_rtx (folded_arg, insn);
3253 const_arg = equiv_constant (folded_arg);
3254 break;
3257 /* For the first three operands, see if the operand
3258 is constant or equivalent to a constant. */
3259 switch (i)
3261 case 0:
3262 folded_arg0 = folded_arg;
3263 const_arg0 = const_arg;
3264 mode_arg0 = mode_arg;
3265 break;
3266 case 1:
3267 folded_arg1 = folded_arg;
3268 const_arg1 = const_arg;
3269 break;
3270 case 2:
3271 const_arg2 = const_arg;
3272 break;
3275 /* Pick the least expensive of the argument and an equivalent constant
3276 argument. */
3277 if (const_arg != 0
3278 && const_arg != folded_arg
3279 && COST_IN (const_arg, code, i) <= COST_IN (folded_arg, code, i)
3281 /* It's not safe to substitute the operand of a conversion
3282 operator with a constant, as the conversion's identity
3283 depends upon the mode of its operand. This optimization
3284 is handled by the call to simplify_unary_operation. */
3285 && (GET_RTX_CLASS (code) != RTX_UNARY
3286 || GET_MODE (const_arg) == mode_arg0
3287 || (code != ZERO_EXTEND
3288 && code != SIGN_EXTEND
3289 && code != TRUNCATE
3290 && code != FLOAT_TRUNCATE
3291 && code != FLOAT_EXTEND
3292 && code != FLOAT
3293 && code != FIX
3294 && code != UNSIGNED_FLOAT
3295 && code != UNSIGNED_FIX)))
3296 folded_arg = const_arg;
3298 if (folded_arg == XEXP (x, i))
3299 continue;
3301 if (insn == NULL_RTX && !changed)
3302 x = copy_rtx (x);
3303 changed = 1;
3304 validate_unshare_change (insn, &XEXP (x, i), folded_arg, 1);
3307 if (changed)
3309 /* Canonicalize X if necessary, and keep const_argN and folded_argN
3310 consistent with the order in X. */
3311 if (canonicalize_change_group (insn, x))
3313 rtx tem;
3314 tem = const_arg0, const_arg0 = const_arg1, const_arg1 = tem;
3315 tem = folded_arg0, folded_arg0 = folded_arg1, folded_arg1 = tem;
3318 apply_change_group ();
3321 /* If X is an arithmetic operation, see if we can simplify it. */
3323 switch (GET_RTX_CLASS (code))
3325 case RTX_UNARY:
3327 /* We can't simplify extension ops unless we know the
3328 original mode. */
3329 if ((code == ZERO_EXTEND || code == SIGN_EXTEND)
3330 && mode_arg0 == VOIDmode)
3331 break;
3333 new_rtx = simplify_unary_operation (code, mode,
3334 const_arg0 ? const_arg0 : folded_arg0,
3335 mode_arg0);
3337 break;
3339 case RTX_COMPARE:
3340 case RTX_COMM_COMPARE:
3341 /* See what items are actually being compared and set FOLDED_ARG[01]
3342 to those values and CODE to the actual comparison code. If any are
3343 constant, set CONST_ARG0 and CONST_ARG1 appropriately. We needn't
3344 do anything if both operands are already known to be constant. */
3346 /* ??? Vector mode comparisons are not supported yet. */
3347 if (VECTOR_MODE_P (mode))
3348 break;
3350 if (const_arg0 == 0 || const_arg1 == 0)
3352 struct table_elt *p0, *p1;
3353 rtx true_rtx, false_rtx;
3354 machine_mode mode_arg1;
3356 if (SCALAR_FLOAT_MODE_P (mode))
3358 #ifdef FLOAT_STORE_FLAG_VALUE
3359 true_rtx = (CONST_DOUBLE_FROM_REAL_VALUE
3360 (FLOAT_STORE_FLAG_VALUE (mode), mode));
3361 #else
3362 true_rtx = NULL_RTX;
3363 #endif
3364 false_rtx = CONST0_RTX (mode);
3366 else
3368 true_rtx = const_true_rtx;
3369 false_rtx = const0_rtx;
3372 code = find_comparison_args (code, &folded_arg0, &folded_arg1,
3373 &mode_arg0, &mode_arg1);
3375 /* If the mode is VOIDmode or a MODE_CC mode, we don't know
3376 what kinds of things are being compared, so we can't do
3377 anything with this comparison. */
3379 if (mode_arg0 == VOIDmode || GET_MODE_CLASS (mode_arg0) == MODE_CC)
3380 break;
3382 const_arg0 = equiv_constant (folded_arg0);
3383 const_arg1 = equiv_constant (folded_arg1);
3385 /* If we do not now have two constants being compared, see
3386 if we can nevertheless deduce some things about the
3387 comparison. */
3388 if (const_arg0 == 0 || const_arg1 == 0)
3390 if (const_arg1 != NULL)
3392 rtx cheapest_simplification;
3393 int cheapest_cost;
3394 rtx simp_result;
3395 struct table_elt *p;
3397 /* See if we can find an equivalent of folded_arg0
3398 that gets us a cheaper expression, possibly a
3399 constant through simplifications. */
3400 p = lookup (folded_arg0, SAFE_HASH (folded_arg0, mode_arg0),
3401 mode_arg0);
3403 if (p != NULL)
3405 cheapest_simplification = x;
3406 cheapest_cost = COST (x);
3408 for (p = p->first_same_value; p != NULL; p = p->next_same_value)
3410 int cost;
3412 /* If the entry isn't valid, skip it. */
3413 if (! exp_equiv_p (p->exp, p->exp, 1, false))
3414 continue;
3416 /* Try to simplify using this equivalence. */
3417 simp_result
3418 = simplify_relational_operation (code, mode,
3419 mode_arg0,
3420 p->exp,
3421 const_arg1);
3423 if (simp_result == NULL)
3424 continue;
3426 cost = COST (simp_result);
3427 if (cost < cheapest_cost)
3429 cheapest_cost = cost;
3430 cheapest_simplification = simp_result;
3434 /* If we have a cheaper expression now, use that
3435 and try folding it further, from the top. */
3436 if (cheapest_simplification != x)
3437 return fold_rtx (copy_rtx (cheapest_simplification),
3438 insn);
3442 /* See if the two operands are the same. */
3444 if ((REG_P (folded_arg0)
3445 && REG_P (folded_arg1)
3446 && (REG_QTY (REGNO (folded_arg0))
3447 == REG_QTY (REGNO (folded_arg1))))
3448 || ((p0 = lookup (folded_arg0,
3449 SAFE_HASH (folded_arg0, mode_arg0),
3450 mode_arg0))
3451 && (p1 = lookup (folded_arg1,
3452 SAFE_HASH (folded_arg1, mode_arg0),
3453 mode_arg0))
3454 && p0->first_same_value == p1->first_same_value))
3455 folded_arg1 = folded_arg0;
3457 /* If FOLDED_ARG0 is a register, see if the comparison we are
3458 doing now is either the same as we did before or the reverse
3459 (we only check the reverse if not floating-point). */
3460 else if (REG_P (folded_arg0))
3462 int qty = REG_QTY (REGNO (folded_arg0));
3464 if (REGNO_QTY_VALID_P (REGNO (folded_arg0)))
3466 struct qty_table_elem *ent = &qty_table[qty];
3468 if ((comparison_dominates_p (ent->comparison_code, code)
3469 || (! FLOAT_MODE_P (mode_arg0)
3470 && comparison_dominates_p (ent->comparison_code,
3471 reverse_condition (code))))
3472 && (rtx_equal_p (ent->comparison_const, folded_arg1)
3473 || (const_arg1
3474 && rtx_equal_p (ent->comparison_const,
3475 const_arg1))
3476 || (REG_P (folded_arg1)
3477 && (REG_QTY (REGNO (folded_arg1)) == ent->comparison_qty))))
3479 if (comparison_dominates_p (ent->comparison_code, code))
3481 if (true_rtx)
3482 return true_rtx;
3483 else
3484 break;
3486 else
3487 return false_rtx;
3494 /* If we are comparing against zero, see if the first operand is
3495 equivalent to an IOR with a constant. If so, we may be able to
3496 determine the result of this comparison. */
3497 if (const_arg1 == const0_rtx && !const_arg0)
3499 rtx y = lookup_as_function (folded_arg0, IOR);
3500 rtx inner_const;
3502 if (y != 0
3503 && (inner_const = equiv_constant (XEXP (y, 1))) != 0
3504 && CONST_INT_P (inner_const)
3505 && INTVAL (inner_const) != 0)
3506 folded_arg0 = gen_rtx_IOR (mode_arg0, XEXP (y, 0), inner_const);
3510 rtx op0 = const_arg0 ? const_arg0 : copy_rtx (folded_arg0);
3511 rtx op1 = const_arg1 ? const_arg1 : copy_rtx (folded_arg1);
3512 new_rtx = simplify_relational_operation (code, mode, mode_arg0,
3513 op0, op1);
3515 break;
3517 case RTX_BIN_ARITH:
3518 case RTX_COMM_ARITH:
3519 switch (code)
3521 case PLUS:
3522 /* If the second operand is a LABEL_REF, see if the first is a MINUS
3523 with that LABEL_REF as its second operand. If so, the result is
3524 the first operand of that MINUS. This handles switches with an
3525 ADDR_DIFF_VEC table. */
3526 if (const_arg1 && GET_CODE (const_arg1) == LABEL_REF)
3528 rtx y
3529 = GET_CODE (folded_arg0) == MINUS ? folded_arg0
3530 : lookup_as_function (folded_arg0, MINUS);
3532 if (y != 0 && GET_CODE (XEXP (y, 1)) == LABEL_REF
3533 && LABEL_REF_LABEL (XEXP (y, 1)) == LABEL_REF_LABEL (const_arg1))
3534 return XEXP (y, 0);
3536 /* Now try for a CONST of a MINUS like the above. */
3537 if ((y = (GET_CODE (folded_arg0) == CONST ? folded_arg0
3538 : lookup_as_function (folded_arg0, CONST))) != 0
3539 && GET_CODE (XEXP (y, 0)) == MINUS
3540 && GET_CODE (XEXP (XEXP (y, 0), 1)) == LABEL_REF
3541 && LABEL_REF_LABEL (XEXP (XEXP (y, 0), 1)) == LABEL_REF_LABEL (const_arg1))
3542 return XEXP (XEXP (y, 0), 0);
3545 /* Likewise if the operands are in the other order. */
3546 if (const_arg0 && GET_CODE (const_arg0) == LABEL_REF)
3548 rtx y
3549 = GET_CODE (folded_arg1) == MINUS ? folded_arg1
3550 : lookup_as_function (folded_arg1, MINUS);
3552 if (y != 0 && GET_CODE (XEXP (y, 1)) == LABEL_REF
3553 && LABEL_REF_LABEL (XEXP (y, 1)) == LABEL_REF_LABEL (const_arg0))
3554 return XEXP (y, 0);
3556 /* Now try for a CONST of a MINUS like the above. */
3557 if ((y = (GET_CODE (folded_arg1) == CONST ? folded_arg1
3558 : lookup_as_function (folded_arg1, CONST))) != 0
3559 && GET_CODE (XEXP (y, 0)) == MINUS
3560 && GET_CODE (XEXP (XEXP (y, 0), 1)) == LABEL_REF
3561 && LABEL_REF_LABEL (XEXP (XEXP (y, 0), 1)) == LABEL_REF_LABEL (const_arg0))
3562 return XEXP (XEXP (y, 0), 0);
3565 /* If second operand is a register equivalent to a negative
3566 CONST_INT, see if we can find a register equivalent to the
3567 positive constant. Make a MINUS if so. Don't do this for
3568 a non-negative constant since we might then alternate between
3569 choosing positive and negative constants. Having the positive
3570 constant previously-used is the more common case. Be sure
3571 the resulting constant is non-negative; if const_arg1 were
3572 the smallest negative number this would overflow: depending
3573 on the mode, this would either just be the same value (and
3574 hence not save anything) or be incorrect. */
3575 if (const_arg1 != 0 && CONST_INT_P (const_arg1)
3576 && INTVAL (const_arg1) < 0
3577 /* This used to test
3579 -INTVAL (const_arg1) >= 0
3581 But The Sun V5.0 compilers mis-compiled that test. So
3582 instead we test for the problematic value in a more direct
3583 manner and hope the Sun compilers get it correct. */
3584 && INTVAL (const_arg1) !=
3585 ((HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT - 1))
3586 && REG_P (folded_arg1))
3588 rtx new_const = GEN_INT (-INTVAL (const_arg1));
3589 struct table_elt *p
3590 = lookup (new_const, SAFE_HASH (new_const, mode), mode);
3592 if (p)
3593 for (p = p->first_same_value; p; p = p->next_same_value)
3594 if (REG_P (p->exp))
3595 return simplify_gen_binary (MINUS, mode, folded_arg0,
3596 canon_reg (p->exp, NULL));
3598 goto from_plus;
3600 case MINUS:
3601 /* If we have (MINUS Y C), see if Y is known to be (PLUS Z C2).
3602 If so, produce (PLUS Z C2-C). */
3603 if (const_arg1 != 0 && CONST_INT_P (const_arg1))
3605 rtx y = lookup_as_function (XEXP (x, 0), PLUS);
3606 if (y && CONST_INT_P (XEXP (y, 1)))
3607 return fold_rtx (plus_constant (mode, copy_rtx (y),
3608 -INTVAL (const_arg1)),
3609 NULL);
3612 /* Fall through. */
3614 from_plus:
3615 case SMIN: case SMAX: case UMIN: case UMAX:
3616 case IOR: case AND: case XOR:
3617 case MULT:
3618 case ASHIFT: case LSHIFTRT: case ASHIFTRT:
3619 /* If we have (<op> <reg> <const_int>) for an associative OP and REG
3620 is known to be of similar form, we may be able to replace the
3621 operation with a combined operation. This may eliminate the
3622 intermediate operation if every use is simplified in this way.
3623 Note that the similar optimization done by combine.c only works
3624 if the intermediate operation's result has only one reference. */
3626 if (REG_P (folded_arg0)
3627 && const_arg1 && CONST_INT_P (const_arg1))
3629 int is_shift
3630 = (code == ASHIFT || code == ASHIFTRT || code == LSHIFTRT);
3631 rtx y, inner_const, new_const;
3632 rtx canon_const_arg1 = const_arg1;
3633 enum rtx_code associate_code;
3635 if (is_shift
3636 && (INTVAL (const_arg1) >= GET_MODE_PRECISION (mode)
3637 || INTVAL (const_arg1) < 0))
3639 if (SHIFT_COUNT_TRUNCATED)
3640 canon_const_arg1 = GEN_INT (INTVAL (const_arg1)
3641 & (GET_MODE_BITSIZE (mode)
3642 - 1));
3643 else
3644 break;
3647 y = lookup_as_function (folded_arg0, code);
3648 if (y == 0)
3649 break;
3651 /* If we have compiled a statement like
3652 "if (x == (x & mask1))", and now are looking at
3653 "x & mask2", we will have a case where the first operand
3654 of Y is the same as our first operand. Unless we detect
3655 this case, an infinite loop will result. */
3656 if (XEXP (y, 0) == folded_arg0)
3657 break;
3659 inner_const = equiv_constant (fold_rtx (XEXP (y, 1), 0));
3660 if (!inner_const || !CONST_INT_P (inner_const))
3661 break;
3663 /* Don't associate these operations if they are a PLUS with the
3664 same constant and it is a power of two. These might be doable
3665 with a pre- or post-increment. Similarly for two subtracts of
3666 identical powers of two with post decrement. */
3668 if (code == PLUS && const_arg1 == inner_const
3669 && ((HAVE_PRE_INCREMENT
3670 && exact_log2 (INTVAL (const_arg1)) >= 0)
3671 || (HAVE_POST_INCREMENT
3672 && exact_log2 (INTVAL (const_arg1)) >= 0)
3673 || (HAVE_PRE_DECREMENT
3674 && exact_log2 (- INTVAL (const_arg1)) >= 0)
3675 || (HAVE_POST_DECREMENT
3676 && exact_log2 (- INTVAL (const_arg1)) >= 0)))
3677 break;
3679 /* ??? Vector mode shifts by scalar
3680 shift operand are not supported yet. */
3681 if (is_shift && VECTOR_MODE_P (mode))
3682 break;
3684 if (is_shift
3685 && (INTVAL (inner_const) >= GET_MODE_PRECISION (mode)
3686 || INTVAL (inner_const) < 0))
3688 if (SHIFT_COUNT_TRUNCATED)
3689 inner_const = GEN_INT (INTVAL (inner_const)
3690 & (GET_MODE_BITSIZE (mode) - 1));
3691 else
3692 break;
3695 /* Compute the code used to compose the constants. For example,
3696 A-C1-C2 is A-(C1 + C2), so if CODE == MINUS, we want PLUS. */
3698 associate_code = (is_shift || code == MINUS ? PLUS : code);
3700 new_const = simplify_binary_operation (associate_code, mode,
3701 canon_const_arg1,
3702 inner_const);
3704 if (new_const == 0)
3705 break;
3707 /* If we are associating shift operations, don't let this
3708 produce a shift of the size of the object or larger.
3709 This could occur when we follow a sign-extend by a right
3710 shift on a machine that does a sign-extend as a pair
3711 of shifts. */
3713 if (is_shift
3714 && CONST_INT_P (new_const)
3715 && INTVAL (new_const) >= GET_MODE_PRECISION (mode))
3717 /* As an exception, we can turn an ASHIFTRT of this
3718 form into a shift of the number of bits - 1. */
3719 if (code == ASHIFTRT)
3720 new_const = GEN_INT (GET_MODE_BITSIZE (mode) - 1);
3721 else if (!side_effects_p (XEXP (y, 0)))
3722 return CONST0_RTX (mode);
3723 else
3724 break;
3727 y = copy_rtx (XEXP (y, 0));
3729 /* If Y contains our first operand (the most common way this
3730 can happen is if Y is a MEM), we would do into an infinite
3731 loop if we tried to fold it. So don't in that case. */
3733 if (! reg_mentioned_p (folded_arg0, y))
3734 y = fold_rtx (y, insn);
3736 return simplify_gen_binary (code, mode, y, new_const);
3738 break;
3740 case DIV: case UDIV:
3741 /* ??? The associative optimization performed immediately above is
3742 also possible for DIV and UDIV using associate_code of MULT.
3743 However, we would need extra code to verify that the
3744 multiplication does not overflow, that is, there is no overflow
3745 in the calculation of new_const. */
3746 break;
3748 default:
3749 break;
3752 new_rtx = simplify_binary_operation (code, mode,
3753 const_arg0 ? const_arg0 : folded_arg0,
3754 const_arg1 ? const_arg1 : folded_arg1);
3755 break;
3757 case RTX_OBJ:
3758 /* (lo_sum (high X) X) is simply X. */
3759 if (code == LO_SUM && const_arg0 != 0
3760 && GET_CODE (const_arg0) == HIGH
3761 && rtx_equal_p (XEXP (const_arg0, 0), const_arg1))
3762 return const_arg1;
3763 break;
3765 case RTX_TERNARY:
3766 case RTX_BITFIELD_OPS:
3767 new_rtx = simplify_ternary_operation (code, mode, mode_arg0,
3768 const_arg0 ? const_arg0 : folded_arg0,
3769 const_arg1 ? const_arg1 : folded_arg1,
3770 const_arg2 ? const_arg2 : XEXP (x, 2));
3771 break;
3773 default:
3774 break;
3777 return new_rtx ? new_rtx : x;
3780 /* Return a constant value currently equivalent to X.
3781 Return 0 if we don't know one. */
3783 static rtx
3784 equiv_constant (rtx x)
3786 if (REG_P (x)
3787 && REGNO_QTY_VALID_P (REGNO (x)))
3789 int x_q = REG_QTY (REGNO (x));
3790 struct qty_table_elem *x_ent = &qty_table[x_q];
3792 if (x_ent->const_rtx)
3793 x = gen_lowpart (GET_MODE (x), x_ent->const_rtx);
3796 if (x == 0 || CONSTANT_P (x))
3797 return x;
3799 if (GET_CODE (x) == SUBREG)
3801 machine_mode mode = GET_MODE (x);
3802 machine_mode imode = GET_MODE (SUBREG_REG (x));
3803 rtx new_rtx;
3805 /* See if we previously assigned a constant value to this SUBREG. */
3806 if ((new_rtx = lookup_as_function (x, CONST_INT)) != 0
3807 || (new_rtx = lookup_as_function (x, CONST_WIDE_INT)) != 0
3808 || (new_rtx = lookup_as_function (x, CONST_DOUBLE)) != 0
3809 || (new_rtx = lookup_as_function (x, CONST_FIXED)) != 0)
3810 return new_rtx;
3812 /* If we didn't and if doing so makes sense, see if we previously
3813 assigned a constant value to the enclosing word mode SUBREG. */
3814 if (GET_MODE_SIZE (mode) < GET_MODE_SIZE (word_mode)
3815 && GET_MODE_SIZE (word_mode) < GET_MODE_SIZE (imode))
3817 int byte = SUBREG_BYTE (x) - subreg_lowpart_offset (mode, word_mode);
3818 if (byte >= 0 && (byte % UNITS_PER_WORD) == 0)
3820 rtx y = gen_rtx_SUBREG (word_mode, SUBREG_REG (x), byte);
3821 new_rtx = lookup_as_function (y, CONST_INT);
3822 if (new_rtx)
3823 return gen_lowpart (mode, new_rtx);
3827 /* Otherwise see if we already have a constant for the inner REG,
3828 and if that is enough to calculate an equivalent constant for
3829 the subreg. Note that the upper bits of paradoxical subregs
3830 are undefined, so they cannot be said to equal anything. */
3831 if (REG_P (SUBREG_REG (x))
3832 && GET_MODE_SIZE (mode) <= GET_MODE_SIZE (imode)
3833 && (new_rtx = equiv_constant (SUBREG_REG (x))) != 0)
3834 return simplify_subreg (mode, new_rtx, imode, SUBREG_BYTE (x));
3836 return 0;
3839 /* If X is a MEM, see if it is a constant-pool reference, or look it up in
3840 the hash table in case its value was seen before. */
3842 if (MEM_P (x))
3844 struct table_elt *elt;
3846 x = avoid_constant_pool_reference (x);
3847 if (CONSTANT_P (x))
3848 return x;
3850 elt = lookup (x, SAFE_HASH (x, GET_MODE (x)), GET_MODE (x));
3851 if (elt == 0)
3852 return 0;
3854 for (elt = elt->first_same_value; elt; elt = elt->next_same_value)
3855 if (elt->is_const && CONSTANT_P (elt->exp))
3856 return elt->exp;
3859 return 0;
3862 /* Given INSN, a jump insn, TAKEN indicates if we are following the
3863 "taken" branch.
3865 In certain cases, this can cause us to add an equivalence. For example,
3866 if we are following the taken case of
3867 if (i == 2)
3868 we can add the fact that `i' and '2' are now equivalent.
3870 In any case, we can record that this comparison was passed. If the same
3871 comparison is seen later, we will know its value. */
3873 static void
3874 record_jump_equiv (rtx_insn *insn, bool taken)
3876 int cond_known_true;
3877 rtx op0, op1;
3878 rtx set;
3879 machine_mode mode, mode0, mode1;
3880 int reversed_nonequality = 0;
3881 enum rtx_code code;
3883 /* Ensure this is the right kind of insn. */
3884 gcc_assert (any_condjump_p (insn));
3886 set = pc_set (insn);
3888 /* See if this jump condition is known true or false. */
3889 if (taken)
3890 cond_known_true = (XEXP (SET_SRC (set), 2) == pc_rtx);
3891 else
3892 cond_known_true = (XEXP (SET_SRC (set), 1) == pc_rtx);
3894 /* Get the type of comparison being done and the operands being compared.
3895 If we had to reverse a non-equality condition, record that fact so we
3896 know that it isn't valid for floating-point. */
3897 code = GET_CODE (XEXP (SET_SRC (set), 0));
3898 op0 = fold_rtx (XEXP (XEXP (SET_SRC (set), 0), 0), insn);
3899 op1 = fold_rtx (XEXP (XEXP (SET_SRC (set), 0), 1), insn);
3901 code = find_comparison_args (code, &op0, &op1, &mode0, &mode1);
3902 if (! cond_known_true)
3904 code = reversed_comparison_code_parts (code, op0, op1, insn);
3906 /* Don't remember if we can't find the inverse. */
3907 if (code == UNKNOWN)
3908 return;
3911 /* The mode is the mode of the non-constant. */
3912 mode = mode0;
3913 if (mode1 != VOIDmode)
3914 mode = mode1;
3916 record_jump_cond (code, mode, op0, op1, reversed_nonequality);
3919 /* Yet another form of subreg creation. In this case, we want something in
3920 MODE, and we should assume OP has MODE iff it is naturally modeless. */
3922 static rtx
3923 record_jump_cond_subreg (machine_mode mode, rtx op)
3925 machine_mode op_mode = GET_MODE (op);
3926 if (op_mode == mode || op_mode == VOIDmode)
3927 return op;
3928 return lowpart_subreg (mode, op, op_mode);
3931 /* We know that comparison CODE applied to OP0 and OP1 in MODE is true.
3932 REVERSED_NONEQUALITY is nonzero if CODE had to be swapped.
3933 Make any useful entries we can with that information. Called from
3934 above function and called recursively. */
3936 static void
3937 record_jump_cond (enum rtx_code code, machine_mode mode, rtx op0,
3938 rtx op1, int reversed_nonequality)
3940 unsigned op0_hash, op1_hash;
3941 int op0_in_memory, op1_in_memory;
3942 struct table_elt *op0_elt, *op1_elt;
3944 /* If OP0 and OP1 are known equal, and either is a paradoxical SUBREG,
3945 we know that they are also equal in the smaller mode (this is also
3946 true for all smaller modes whether or not there is a SUBREG, but
3947 is not worth testing for with no SUBREG). */
3949 /* Note that GET_MODE (op0) may not equal MODE. */
3950 if (code == EQ && paradoxical_subreg_p (op0))
3952 machine_mode inner_mode = GET_MODE (SUBREG_REG (op0));
3953 rtx tem = record_jump_cond_subreg (inner_mode, op1);
3954 if (tem)
3955 record_jump_cond (code, mode, SUBREG_REG (op0), tem,
3956 reversed_nonequality);
3959 if (code == EQ && paradoxical_subreg_p (op1))
3961 machine_mode inner_mode = GET_MODE (SUBREG_REG (op1));
3962 rtx tem = record_jump_cond_subreg (inner_mode, op0);
3963 if (tem)
3964 record_jump_cond (code, mode, SUBREG_REG (op1), tem,
3965 reversed_nonequality);
3968 /* Similarly, if this is an NE comparison, and either is a SUBREG
3969 making a smaller mode, we know the whole thing is also NE. */
3971 /* Note that GET_MODE (op0) may not equal MODE;
3972 if we test MODE instead, we can get an infinite recursion
3973 alternating between two modes each wider than MODE. */
3975 if (code == NE && GET_CODE (op0) == SUBREG
3976 && subreg_lowpart_p (op0)
3977 && (GET_MODE_SIZE (GET_MODE (op0))
3978 < GET_MODE_SIZE (GET_MODE (SUBREG_REG (op0)))))
3980 machine_mode inner_mode = GET_MODE (SUBREG_REG (op0));
3981 rtx tem = record_jump_cond_subreg (inner_mode, op1);
3982 if (tem)
3983 record_jump_cond (code, mode, SUBREG_REG (op0), tem,
3984 reversed_nonequality);
3987 if (code == NE && GET_CODE (op1) == SUBREG
3988 && subreg_lowpart_p (op1)
3989 && (GET_MODE_SIZE (GET_MODE (op1))
3990 < GET_MODE_SIZE (GET_MODE (SUBREG_REG (op1)))))
3992 machine_mode inner_mode = GET_MODE (SUBREG_REG (op1));
3993 rtx tem = record_jump_cond_subreg (inner_mode, op0);
3994 if (tem)
3995 record_jump_cond (code, mode, SUBREG_REG (op1), tem,
3996 reversed_nonequality);
3999 /* Hash both operands. */
4001 do_not_record = 0;
4002 hash_arg_in_memory = 0;
4003 op0_hash = HASH (op0, mode);
4004 op0_in_memory = hash_arg_in_memory;
4006 if (do_not_record)
4007 return;
4009 do_not_record = 0;
4010 hash_arg_in_memory = 0;
4011 op1_hash = HASH (op1, mode);
4012 op1_in_memory = hash_arg_in_memory;
4014 if (do_not_record)
4015 return;
4017 /* Look up both operands. */
4018 op0_elt = lookup (op0, op0_hash, mode);
4019 op1_elt = lookup (op1, op1_hash, mode);
4021 /* If both operands are already equivalent or if they are not in the
4022 table but are identical, do nothing. */
4023 if ((op0_elt != 0 && op1_elt != 0
4024 && op0_elt->first_same_value == op1_elt->first_same_value)
4025 || op0 == op1 || rtx_equal_p (op0, op1))
4026 return;
4028 /* If we aren't setting two things equal all we can do is save this
4029 comparison. Similarly if this is floating-point. In the latter
4030 case, OP1 might be zero and both -0.0 and 0.0 are equal to it.
4031 If we record the equality, we might inadvertently delete code
4032 whose intent was to change -0 to +0. */
4034 if (code != EQ || FLOAT_MODE_P (GET_MODE (op0)))
4036 struct qty_table_elem *ent;
4037 int qty;
4039 /* If we reversed a floating-point comparison, if OP0 is not a
4040 register, or if OP1 is neither a register or constant, we can't
4041 do anything. */
4043 if (!REG_P (op1))
4044 op1 = equiv_constant (op1);
4046 if ((reversed_nonequality && FLOAT_MODE_P (mode))
4047 || !REG_P (op0) || op1 == 0)
4048 return;
4050 /* Put OP0 in the hash table if it isn't already. This gives it a
4051 new quantity number. */
4052 if (op0_elt == 0)
4054 if (insert_regs (op0, NULL, 0))
4056 rehash_using_reg (op0);
4057 op0_hash = HASH (op0, mode);
4059 /* If OP0 is contained in OP1, this changes its hash code
4060 as well. Faster to rehash than to check, except
4061 for the simple case of a constant. */
4062 if (! CONSTANT_P (op1))
4063 op1_hash = HASH (op1,mode);
4066 op0_elt = insert (op0, NULL, op0_hash, mode);
4067 op0_elt->in_memory = op0_in_memory;
4070 qty = REG_QTY (REGNO (op0));
4071 ent = &qty_table[qty];
4073 ent->comparison_code = code;
4074 if (REG_P (op1))
4076 /* Look it up again--in case op0 and op1 are the same. */
4077 op1_elt = lookup (op1, op1_hash, mode);
4079 /* Put OP1 in the hash table so it gets a new quantity number. */
4080 if (op1_elt == 0)
4082 if (insert_regs (op1, NULL, 0))
4084 rehash_using_reg (op1);
4085 op1_hash = HASH (op1, mode);
4088 op1_elt = insert (op1, NULL, op1_hash, mode);
4089 op1_elt->in_memory = op1_in_memory;
4092 ent->comparison_const = NULL_RTX;
4093 ent->comparison_qty = REG_QTY (REGNO (op1));
4095 else
4097 ent->comparison_const = op1;
4098 ent->comparison_qty = -1;
4101 return;
4104 /* If either side is still missing an equivalence, make it now,
4105 then merge the equivalences. */
4107 if (op0_elt == 0)
4109 if (insert_regs (op0, NULL, 0))
4111 rehash_using_reg (op0);
4112 op0_hash = HASH (op0, mode);
4115 op0_elt = insert (op0, NULL, op0_hash, mode);
4116 op0_elt->in_memory = op0_in_memory;
4119 if (op1_elt == 0)
4121 if (insert_regs (op1, NULL, 0))
4123 rehash_using_reg (op1);
4124 op1_hash = HASH (op1, mode);
4127 op1_elt = insert (op1, NULL, op1_hash, mode);
4128 op1_elt->in_memory = op1_in_memory;
4131 merge_equiv_classes (op0_elt, op1_elt);
4134 /* CSE processing for one instruction.
4136 Most "true" common subexpressions are mostly optimized away in GIMPLE,
4137 but the few that "leak through" are cleaned up by cse_insn, and complex
4138 addressing modes are often formed here.
4140 The main function is cse_insn, and between here and that function
4141 a couple of helper functions is defined to keep the size of cse_insn
4142 within reasonable proportions.
4144 Data is shared between the main and helper functions via STRUCT SET,
4145 that contains all data related for every set in the instruction that
4146 is being processed.
4148 Note that cse_main processes all sets in the instruction. Most
4149 passes in GCC only process simple SET insns or single_set insns, but
4150 CSE processes insns with multiple sets as well. */
4152 /* Data on one SET contained in the instruction. */
4154 struct set
4156 /* The SET rtx itself. */
4157 rtx rtl;
4158 /* The SET_SRC of the rtx (the original value, if it is changing). */
4159 rtx src;
4160 /* The hash-table element for the SET_SRC of the SET. */
4161 struct table_elt *src_elt;
4162 /* Hash value for the SET_SRC. */
4163 unsigned src_hash;
4164 /* Hash value for the SET_DEST. */
4165 unsigned dest_hash;
4166 /* The SET_DEST, with SUBREG, etc., stripped. */
4167 rtx inner_dest;
4168 /* Nonzero if the SET_SRC is in memory. */
4169 char src_in_memory;
4170 /* Nonzero if the SET_SRC contains something
4171 whose value cannot be predicted and understood. */
4172 char src_volatile;
4173 /* Original machine mode, in case it becomes a CONST_INT.
4174 The size of this field should match the size of the mode
4175 field of struct rtx_def (see rtl.h). */
4176 ENUM_BITFIELD(machine_mode) mode : 8;
4177 /* A constant equivalent for SET_SRC, if any. */
4178 rtx src_const;
4179 /* Hash value of constant equivalent for SET_SRC. */
4180 unsigned src_const_hash;
4181 /* Table entry for constant equivalent for SET_SRC, if any. */
4182 struct table_elt *src_const_elt;
4183 /* Table entry for the destination address. */
4184 struct table_elt *dest_addr_elt;
4187 /* Special handling for (set REG0 REG1) where REG0 is the
4188 "cheapest", cheaper than REG1. After cse, REG1 will probably not
4189 be used in the sequel, so (if easily done) change this insn to
4190 (set REG1 REG0) and replace REG1 with REG0 in the previous insn
4191 that computed their value. Then REG1 will become a dead store
4192 and won't cloud the situation for later optimizations.
4194 Do not make this change if REG1 is a hard register, because it will
4195 then be used in the sequel and we may be changing a two-operand insn
4196 into a three-operand insn.
4198 This is the last transformation that cse_insn will try to do. */
4200 static void
4201 try_back_substitute_reg (rtx set, rtx_insn *insn)
4203 rtx dest = SET_DEST (set);
4204 rtx src = SET_SRC (set);
4206 if (REG_P (dest)
4207 && REG_P (src) && ! HARD_REGISTER_P (src)
4208 && REGNO_QTY_VALID_P (REGNO (src)))
4210 int src_q = REG_QTY (REGNO (src));
4211 struct qty_table_elem *src_ent = &qty_table[src_q];
4213 if (src_ent->first_reg == REGNO (dest))
4215 /* Scan for the previous nonnote insn, but stop at a basic
4216 block boundary. */
4217 rtx_insn *prev = insn;
4218 rtx_insn *bb_head = BB_HEAD (BLOCK_FOR_INSN (insn));
4221 prev = PREV_INSN (prev);
4223 while (prev != bb_head && (NOTE_P (prev) || DEBUG_INSN_P (prev)));
4225 /* Do not swap the registers around if the previous instruction
4226 attaches a REG_EQUIV note to REG1.
4228 ??? It's not entirely clear whether we can transfer a REG_EQUIV
4229 from the pseudo that originally shadowed an incoming argument
4230 to another register. Some uses of REG_EQUIV might rely on it
4231 being attached to REG1 rather than REG2.
4233 This section previously turned the REG_EQUIV into a REG_EQUAL
4234 note. We cannot do that because REG_EQUIV may provide an
4235 uninitialized stack slot when REG_PARM_STACK_SPACE is used. */
4236 if (NONJUMP_INSN_P (prev)
4237 && GET_CODE (PATTERN (prev)) == SET
4238 && SET_DEST (PATTERN (prev)) == src
4239 && ! find_reg_note (prev, REG_EQUIV, NULL_RTX))
4241 rtx note;
4243 validate_change (prev, &SET_DEST (PATTERN (prev)), dest, 1);
4244 validate_change (insn, &SET_DEST (set), src, 1);
4245 validate_change (insn, &SET_SRC (set), dest, 1);
4246 apply_change_group ();
4248 /* If INSN has a REG_EQUAL note, and this note mentions
4249 REG0, then we must delete it, because the value in
4250 REG0 has changed. If the note's value is REG1, we must
4251 also delete it because that is now this insn's dest. */
4252 note = find_reg_note (insn, REG_EQUAL, NULL_RTX);
4253 if (note != 0
4254 && (reg_mentioned_p (dest, XEXP (note, 0))
4255 || rtx_equal_p (src, XEXP (note, 0))))
4256 remove_note (insn, note);
4262 /* Record all the SETs in this instruction into SETS_PTR,
4263 and return the number of recorded sets. */
4264 static int
4265 find_sets_in_insn (rtx_insn *insn, struct set **psets)
4267 struct set *sets = *psets;
4268 int n_sets = 0;
4269 rtx x = PATTERN (insn);
4271 if (GET_CODE (x) == SET)
4273 /* Ignore SETs that are unconditional jumps.
4274 They never need cse processing, so this does not hurt.
4275 The reason is not efficiency but rather
4276 so that we can test at the end for instructions
4277 that have been simplified to unconditional jumps
4278 and not be misled by unchanged instructions
4279 that were unconditional jumps to begin with. */
4280 if (SET_DEST (x) == pc_rtx
4281 && GET_CODE (SET_SRC (x)) == LABEL_REF)
4283 /* Don't count call-insns, (set (reg 0) (call ...)), as a set.
4284 The hard function value register is used only once, to copy to
4285 someplace else, so it isn't worth cse'ing. */
4286 else if (GET_CODE (SET_SRC (x)) == CALL)
4288 else
4289 sets[n_sets++].rtl = x;
4291 else if (GET_CODE (x) == PARALLEL)
4293 int i, lim = XVECLEN (x, 0);
4295 /* Go over the expressions of the PARALLEL in forward order, to
4296 put them in the same order in the SETS array. */
4297 for (i = 0; i < lim; i++)
4299 rtx y = XVECEXP (x, 0, i);
4300 if (GET_CODE (y) == SET)
4302 /* As above, we ignore unconditional jumps and call-insns and
4303 ignore the result of apply_change_group. */
4304 if (SET_DEST (y) == pc_rtx
4305 && GET_CODE (SET_SRC (y)) == LABEL_REF)
4307 else if (GET_CODE (SET_SRC (y)) == CALL)
4309 else
4310 sets[n_sets++].rtl = y;
4315 return n_sets;
4318 /* Where possible, substitute every register reference in the N_SETS
4319 number of SETS in INSN with the the canonical register.
4321 Register canonicalization propagatest the earliest register (i.e.
4322 one that is set before INSN) with the same value. This is a very
4323 useful, simple form of CSE, to clean up warts from expanding GIMPLE
4324 to RTL. For instance, a CONST for an address is usually expanded
4325 multiple times to loads into different registers, thus creating many
4326 subexpressions of the form:
4328 (set (reg1) (some_const))
4329 (set (mem (... reg1 ...) (thing)))
4330 (set (reg2) (some_const))
4331 (set (mem (... reg2 ...) (thing)))
4333 After canonicalizing, the code takes the following form:
4335 (set (reg1) (some_const))
4336 (set (mem (... reg1 ...) (thing)))
4337 (set (reg2) (some_const))
4338 (set (mem (... reg1 ...) (thing)))
4340 The set to reg2 is now trivially dead, and the memory reference (or
4341 address, or whatever) may be a candidate for further CSEing.
4343 In this function, the result of apply_change_group can be ignored;
4344 see canon_reg. */
4346 static void
4347 canonicalize_insn (rtx_insn *insn, struct set **psets, int n_sets)
4349 struct set *sets = *psets;
4350 rtx tem;
4351 rtx x = PATTERN (insn);
4352 int i;
4354 if (CALL_P (insn))
4356 for (tem = CALL_INSN_FUNCTION_USAGE (insn); tem; tem = XEXP (tem, 1))
4357 if (GET_CODE (XEXP (tem, 0)) != SET)
4358 XEXP (tem, 0) = canon_reg (XEXP (tem, 0), insn);
4361 if (GET_CODE (x) == SET && GET_CODE (SET_SRC (x)) == CALL)
4363 canon_reg (SET_SRC (x), insn);
4364 apply_change_group ();
4365 fold_rtx (SET_SRC (x), insn);
4367 else if (GET_CODE (x) == CLOBBER)
4369 /* If we clobber memory, canon the address.
4370 This does nothing when a register is clobbered
4371 because we have already invalidated the reg. */
4372 if (MEM_P (XEXP (x, 0)))
4373 canon_reg (XEXP (x, 0), insn);
4375 else if (GET_CODE (x) == USE
4376 && ! (REG_P (XEXP (x, 0))
4377 && REGNO (XEXP (x, 0)) < FIRST_PSEUDO_REGISTER))
4378 /* Canonicalize a USE of a pseudo register or memory location. */
4379 canon_reg (x, insn);
4380 else if (GET_CODE (x) == ASM_OPERANDS)
4382 for (i = ASM_OPERANDS_INPUT_LENGTH (x) - 1; i >= 0; i--)
4384 rtx input = ASM_OPERANDS_INPUT (x, i);
4385 if (!(REG_P (input) && REGNO (input) < FIRST_PSEUDO_REGISTER))
4387 input = canon_reg (input, insn);
4388 validate_change (insn, &ASM_OPERANDS_INPUT (x, i), input, 1);
4392 else if (GET_CODE (x) == CALL)
4394 canon_reg (x, insn);
4395 apply_change_group ();
4396 fold_rtx (x, insn);
4398 else if (DEBUG_INSN_P (insn))
4399 canon_reg (PATTERN (insn), insn);
4400 else if (GET_CODE (x) == PARALLEL)
4402 for (i = XVECLEN (x, 0) - 1; i >= 0; i--)
4404 rtx y = XVECEXP (x, 0, i);
4405 if (GET_CODE (y) == SET && GET_CODE (SET_SRC (y)) == CALL)
4407 canon_reg (SET_SRC (y), insn);
4408 apply_change_group ();
4409 fold_rtx (SET_SRC (y), insn);
4411 else if (GET_CODE (y) == CLOBBER)
4413 if (MEM_P (XEXP (y, 0)))
4414 canon_reg (XEXP (y, 0), insn);
4416 else if (GET_CODE (y) == USE
4417 && ! (REG_P (XEXP (y, 0))
4418 && REGNO (XEXP (y, 0)) < FIRST_PSEUDO_REGISTER))
4419 canon_reg (y, insn);
4420 else if (GET_CODE (y) == CALL)
4422 canon_reg (y, insn);
4423 apply_change_group ();
4424 fold_rtx (y, insn);
4429 if (n_sets == 1 && REG_NOTES (insn) != 0
4430 && (tem = find_reg_note (insn, REG_EQUAL, NULL_RTX)) != 0)
4432 /* We potentially will process this insn many times. Therefore,
4433 drop the REG_EQUAL note if it is equal to the SET_SRC of the
4434 unique set in INSN.
4436 Do not do so if the REG_EQUAL note is for a STRICT_LOW_PART,
4437 because cse_insn handles those specially. */
4438 if (GET_CODE (SET_DEST (sets[0].rtl)) != STRICT_LOW_PART
4439 && rtx_equal_p (XEXP (tem, 0), SET_SRC (sets[0].rtl)))
4440 remove_note (insn, tem);
4441 else
4443 canon_reg (XEXP (tem, 0), insn);
4444 apply_change_group ();
4445 XEXP (tem, 0) = fold_rtx (XEXP (tem, 0), insn);
4446 df_notes_rescan (insn);
4450 /* Canonicalize sources and addresses of destinations.
4451 We do this in a separate pass to avoid problems when a MATCH_DUP is
4452 present in the insn pattern. In that case, we want to ensure that
4453 we don't break the duplicate nature of the pattern. So we will replace
4454 both operands at the same time. Otherwise, we would fail to find an
4455 equivalent substitution in the loop calling validate_change below.
4457 We used to suppress canonicalization of DEST if it appears in SRC,
4458 but we don't do this any more. */
4460 for (i = 0; i < n_sets; i++)
4462 rtx dest = SET_DEST (sets[i].rtl);
4463 rtx src = SET_SRC (sets[i].rtl);
4464 rtx new_rtx = canon_reg (src, insn);
4466 validate_change (insn, &SET_SRC (sets[i].rtl), new_rtx, 1);
4468 if (GET_CODE (dest) == ZERO_EXTRACT)
4470 validate_change (insn, &XEXP (dest, 1),
4471 canon_reg (XEXP (dest, 1), insn), 1);
4472 validate_change (insn, &XEXP (dest, 2),
4473 canon_reg (XEXP (dest, 2), insn), 1);
4476 while (GET_CODE (dest) == SUBREG
4477 || GET_CODE (dest) == ZERO_EXTRACT
4478 || GET_CODE (dest) == STRICT_LOW_PART)
4479 dest = XEXP (dest, 0);
4481 if (MEM_P (dest))
4482 canon_reg (dest, insn);
4485 /* Now that we have done all the replacements, we can apply the change
4486 group and see if they all work. Note that this will cause some
4487 canonicalizations that would have worked individually not to be applied
4488 because some other canonicalization didn't work, but this should not
4489 occur often.
4491 The result of apply_change_group can be ignored; see canon_reg. */
4493 apply_change_group ();
4496 /* Main function of CSE.
4497 First simplify sources and addresses of all assignments
4498 in the instruction, using previously-computed equivalents values.
4499 Then install the new sources and destinations in the table
4500 of available values. */
4502 static void
4503 cse_insn (rtx_insn *insn)
4505 rtx x = PATTERN (insn);
4506 int i;
4507 rtx tem;
4508 int n_sets = 0;
4510 rtx src_eqv = 0;
4511 struct table_elt *src_eqv_elt = 0;
4512 int src_eqv_volatile = 0;
4513 int src_eqv_in_memory = 0;
4514 unsigned src_eqv_hash = 0;
4516 struct set *sets = (struct set *) 0;
4518 if (GET_CODE (x) == SET)
4519 sets = XALLOCA (struct set);
4520 else if (GET_CODE (x) == PARALLEL)
4521 sets = XALLOCAVEC (struct set, XVECLEN (x, 0));
4523 this_insn = insn;
4524 /* Records what this insn does to set CC0. */
4525 this_insn_cc0 = 0;
4526 this_insn_cc0_mode = VOIDmode;
4528 /* Find all regs explicitly clobbered in this insn,
4529 to ensure they are not replaced with any other regs
4530 elsewhere in this insn. */
4531 invalidate_from_sets_and_clobbers (insn);
4533 /* Record all the SETs in this instruction. */
4534 n_sets = find_sets_in_insn (insn, &sets);
4536 /* Substitute the canonical register where possible. */
4537 canonicalize_insn (insn, &sets, n_sets);
4539 /* If this insn has a REG_EQUAL note, store the equivalent value in SRC_EQV,
4540 if different, or if the DEST is a STRICT_LOW_PART. The latter condition
4541 is necessary because SRC_EQV is handled specially for this case, and if
4542 it isn't set, then there will be no equivalence for the destination. */
4543 if (n_sets == 1 && REG_NOTES (insn) != 0
4544 && (tem = find_reg_note (insn, REG_EQUAL, NULL_RTX)) != 0
4545 && (! rtx_equal_p (XEXP (tem, 0), SET_SRC (sets[0].rtl))
4546 || GET_CODE (SET_DEST (sets[0].rtl)) == STRICT_LOW_PART))
4547 src_eqv = copy_rtx (XEXP (tem, 0));
4549 /* Set sets[i].src_elt to the class each source belongs to.
4550 Detect assignments from or to volatile things
4551 and set set[i] to zero so they will be ignored
4552 in the rest of this function.
4554 Nothing in this loop changes the hash table or the register chains. */
4556 for (i = 0; i < n_sets; i++)
4558 bool repeat = false;
4559 rtx src, dest;
4560 rtx src_folded;
4561 struct table_elt *elt = 0, *p;
4562 machine_mode mode;
4563 rtx src_eqv_here;
4564 rtx src_const = 0;
4565 rtx src_related = 0;
4566 bool src_related_is_const_anchor = false;
4567 struct table_elt *src_const_elt = 0;
4568 int src_cost = MAX_COST;
4569 int src_eqv_cost = MAX_COST;
4570 int src_folded_cost = MAX_COST;
4571 int src_related_cost = MAX_COST;
4572 int src_elt_cost = MAX_COST;
4573 int src_regcost = MAX_COST;
4574 int src_eqv_regcost = MAX_COST;
4575 int src_folded_regcost = MAX_COST;
4576 int src_related_regcost = MAX_COST;
4577 int src_elt_regcost = MAX_COST;
4578 /* Set nonzero if we need to call force_const_mem on with the
4579 contents of src_folded before using it. */
4580 int src_folded_force_flag = 0;
4582 dest = SET_DEST (sets[i].rtl);
4583 src = SET_SRC (sets[i].rtl);
4585 /* If SRC is a constant that has no machine mode,
4586 hash it with the destination's machine mode.
4587 This way we can keep different modes separate. */
4589 mode = GET_MODE (src) == VOIDmode ? GET_MODE (dest) : GET_MODE (src);
4590 sets[i].mode = mode;
4592 if (src_eqv)
4594 machine_mode eqvmode = mode;
4595 if (GET_CODE (dest) == STRICT_LOW_PART)
4596 eqvmode = GET_MODE (SUBREG_REG (XEXP (dest, 0)));
4597 do_not_record = 0;
4598 hash_arg_in_memory = 0;
4599 src_eqv_hash = HASH (src_eqv, eqvmode);
4601 /* Find the equivalence class for the equivalent expression. */
4603 if (!do_not_record)
4604 src_eqv_elt = lookup (src_eqv, src_eqv_hash, eqvmode);
4606 src_eqv_volatile = do_not_record;
4607 src_eqv_in_memory = hash_arg_in_memory;
4610 /* If this is a STRICT_LOW_PART assignment, src_eqv corresponds to the
4611 value of the INNER register, not the destination. So it is not
4612 a valid substitution for the source. But save it for later. */
4613 if (GET_CODE (dest) == STRICT_LOW_PART)
4614 src_eqv_here = 0;
4615 else
4616 src_eqv_here = src_eqv;
4618 /* Simplify and foldable subexpressions in SRC. Then get the fully-
4619 simplified result, which may not necessarily be valid. */
4620 src_folded = fold_rtx (src, insn);
4622 #if 0
4623 /* ??? This caused bad code to be generated for the m68k port with -O2.
4624 Suppose src is (CONST_INT -1), and that after truncation src_folded
4625 is (CONST_INT 3). Suppose src_folded is then used for src_const.
4626 At the end we will add src and src_const to the same equivalence
4627 class. We now have 3 and -1 on the same equivalence class. This
4628 causes later instructions to be mis-optimized. */
4629 /* If storing a constant in a bitfield, pre-truncate the constant
4630 so we will be able to record it later. */
4631 if (GET_CODE (SET_DEST (sets[i].rtl)) == ZERO_EXTRACT)
4633 rtx width = XEXP (SET_DEST (sets[i].rtl), 1);
4635 if (CONST_INT_P (src)
4636 && CONST_INT_P (width)
4637 && INTVAL (width) < HOST_BITS_PER_WIDE_INT
4638 && (INTVAL (src) & ((HOST_WIDE_INT) (-1) << INTVAL (width))))
4639 src_folded
4640 = GEN_INT (INTVAL (src) & (((HOST_WIDE_INT) 1
4641 << INTVAL (width)) - 1));
4643 #endif
4645 /* Compute SRC's hash code, and also notice if it
4646 should not be recorded at all. In that case,
4647 prevent any further processing of this assignment. */
4648 do_not_record = 0;
4649 hash_arg_in_memory = 0;
4651 sets[i].src = src;
4652 sets[i].src_hash = HASH (src, mode);
4653 sets[i].src_volatile = do_not_record;
4654 sets[i].src_in_memory = hash_arg_in_memory;
4656 /* If SRC is a MEM, there is a REG_EQUIV note for SRC, and DEST is
4657 a pseudo, do not record SRC. Using SRC as a replacement for
4658 anything else will be incorrect in that situation. Note that
4659 this usually occurs only for stack slots, in which case all the
4660 RTL would be referring to SRC, so we don't lose any optimization
4661 opportunities by not having SRC in the hash table. */
4663 if (MEM_P (src)
4664 && find_reg_note (insn, REG_EQUIV, NULL_RTX) != 0
4665 && REG_P (dest)
4666 && REGNO (dest) >= FIRST_PSEUDO_REGISTER)
4667 sets[i].src_volatile = 1;
4669 else if (GET_CODE (src) == ASM_OPERANDS
4670 && GET_CODE (x) == PARALLEL)
4672 /* Do not record result of a non-volatile inline asm with
4673 more than one result. */
4674 if (n_sets > 1)
4675 sets[i].src_volatile = 1;
4677 int j, lim = XVECLEN (x, 0);
4678 for (j = 0; j < lim; j++)
4680 rtx y = XVECEXP (x, 0, j);
4681 /* And do not record result of a non-volatile inline asm
4682 with "memory" clobber. */
4683 if (GET_CODE (y) == CLOBBER && MEM_P (XEXP (y, 0)))
4685 sets[i].src_volatile = 1;
4686 break;
4691 #if 0
4692 /* It is no longer clear why we used to do this, but it doesn't
4693 appear to still be needed. So let's try without it since this
4694 code hurts cse'ing widened ops. */
4695 /* If source is a paradoxical subreg (such as QI treated as an SI),
4696 treat it as volatile. It may do the work of an SI in one context
4697 where the extra bits are not being used, but cannot replace an SI
4698 in general. */
4699 if (paradoxical_subreg_p (src))
4700 sets[i].src_volatile = 1;
4701 #endif
4703 /* Locate all possible equivalent forms for SRC. Try to replace
4704 SRC in the insn with each cheaper equivalent.
4706 We have the following types of equivalents: SRC itself, a folded
4707 version, a value given in a REG_EQUAL note, or a value related
4708 to a constant.
4710 Each of these equivalents may be part of an additional class
4711 of equivalents (if more than one is in the table, they must be in
4712 the same class; we check for this).
4714 If the source is volatile, we don't do any table lookups.
4716 We note any constant equivalent for possible later use in a
4717 REG_NOTE. */
4719 if (!sets[i].src_volatile)
4720 elt = lookup (src, sets[i].src_hash, mode);
4722 sets[i].src_elt = elt;
4724 if (elt && src_eqv_here && src_eqv_elt)
4726 if (elt->first_same_value != src_eqv_elt->first_same_value)
4728 /* The REG_EQUAL is indicating that two formerly distinct
4729 classes are now equivalent. So merge them. */
4730 merge_equiv_classes (elt, src_eqv_elt);
4731 src_eqv_hash = HASH (src_eqv, elt->mode);
4732 src_eqv_elt = lookup (src_eqv, src_eqv_hash, elt->mode);
4735 src_eqv_here = 0;
4738 else if (src_eqv_elt)
4739 elt = src_eqv_elt;
4741 /* Try to find a constant somewhere and record it in `src_const'.
4742 Record its table element, if any, in `src_const_elt'. Look in
4743 any known equivalences first. (If the constant is not in the
4744 table, also set `sets[i].src_const_hash'). */
4745 if (elt)
4746 for (p = elt->first_same_value; p; p = p->next_same_value)
4747 if (p->is_const)
4749 src_const = p->exp;
4750 src_const_elt = elt;
4751 break;
4754 if (src_const == 0
4755 && (CONSTANT_P (src_folded)
4756 /* Consider (minus (label_ref L1) (label_ref L2)) as
4757 "constant" here so we will record it. This allows us
4758 to fold switch statements when an ADDR_DIFF_VEC is used. */
4759 || (GET_CODE (src_folded) == MINUS
4760 && GET_CODE (XEXP (src_folded, 0)) == LABEL_REF
4761 && GET_CODE (XEXP (src_folded, 1)) == LABEL_REF)))
4762 src_const = src_folded, src_const_elt = elt;
4763 else if (src_const == 0 && src_eqv_here && CONSTANT_P (src_eqv_here))
4764 src_const = src_eqv_here, src_const_elt = src_eqv_elt;
4766 /* If we don't know if the constant is in the table, get its
4767 hash code and look it up. */
4768 if (src_const && src_const_elt == 0)
4770 sets[i].src_const_hash = HASH (src_const, mode);
4771 src_const_elt = lookup (src_const, sets[i].src_const_hash, mode);
4774 sets[i].src_const = src_const;
4775 sets[i].src_const_elt = src_const_elt;
4777 /* If the constant and our source are both in the table, mark them as
4778 equivalent. Otherwise, if a constant is in the table but the source
4779 isn't, set ELT to it. */
4780 if (src_const_elt && elt
4781 && src_const_elt->first_same_value != elt->first_same_value)
4782 merge_equiv_classes (elt, src_const_elt);
4783 else if (src_const_elt && elt == 0)
4784 elt = src_const_elt;
4786 /* See if there is a register linearly related to a constant
4787 equivalent of SRC. */
4788 if (src_const
4789 && (GET_CODE (src_const) == CONST
4790 || (src_const_elt && src_const_elt->related_value != 0)))
4792 src_related = use_related_value (src_const, src_const_elt);
4793 if (src_related)
4795 struct table_elt *src_related_elt
4796 = lookup (src_related, HASH (src_related, mode), mode);
4797 if (src_related_elt && elt)
4799 if (elt->first_same_value
4800 != src_related_elt->first_same_value)
4801 /* This can occur when we previously saw a CONST
4802 involving a SYMBOL_REF and then see the SYMBOL_REF
4803 twice. Merge the involved classes. */
4804 merge_equiv_classes (elt, src_related_elt);
4806 src_related = 0;
4807 src_related_elt = 0;
4809 else if (src_related_elt && elt == 0)
4810 elt = src_related_elt;
4814 /* See if we have a CONST_INT that is already in a register in a
4815 wider mode. */
4817 if (src_const && src_related == 0 && CONST_INT_P (src_const)
4818 && GET_MODE_CLASS (mode) == MODE_INT
4819 && GET_MODE_PRECISION (mode) < BITS_PER_WORD)
4821 machine_mode wider_mode;
4823 for (wider_mode = GET_MODE_WIDER_MODE (mode);
4824 wider_mode != VOIDmode
4825 && GET_MODE_PRECISION (wider_mode) <= BITS_PER_WORD
4826 && src_related == 0;
4827 wider_mode = GET_MODE_WIDER_MODE (wider_mode))
4829 struct table_elt *const_elt
4830 = lookup (src_const, HASH (src_const, wider_mode), wider_mode);
4832 if (const_elt == 0)
4833 continue;
4835 for (const_elt = const_elt->first_same_value;
4836 const_elt; const_elt = const_elt->next_same_value)
4837 if (REG_P (const_elt->exp))
4839 src_related = gen_lowpart (mode, const_elt->exp);
4840 break;
4845 /* Another possibility is that we have an AND with a constant in
4846 a mode narrower than a word. If so, it might have been generated
4847 as part of an "if" which would narrow the AND. If we already
4848 have done the AND in a wider mode, we can use a SUBREG of that
4849 value. */
4851 if (flag_expensive_optimizations && ! src_related
4852 && GET_CODE (src) == AND && CONST_INT_P (XEXP (src, 1))
4853 && GET_MODE_SIZE (mode) < UNITS_PER_WORD)
4855 machine_mode tmode;
4856 rtx new_and = gen_rtx_AND (VOIDmode, NULL_RTX, XEXP (src, 1));
4858 for (tmode = GET_MODE_WIDER_MODE (mode);
4859 GET_MODE_SIZE (tmode) <= UNITS_PER_WORD;
4860 tmode = GET_MODE_WIDER_MODE (tmode))
4862 rtx inner = gen_lowpart (tmode, XEXP (src, 0));
4863 struct table_elt *larger_elt;
4865 if (inner)
4867 PUT_MODE (new_and, tmode);
4868 XEXP (new_and, 0) = inner;
4869 larger_elt = lookup (new_and, HASH (new_and, tmode), tmode);
4870 if (larger_elt == 0)
4871 continue;
4873 for (larger_elt = larger_elt->first_same_value;
4874 larger_elt; larger_elt = larger_elt->next_same_value)
4875 if (REG_P (larger_elt->exp))
4877 src_related
4878 = gen_lowpart (mode, larger_elt->exp);
4879 break;
4882 if (src_related)
4883 break;
4888 #ifdef LOAD_EXTEND_OP
4889 /* See if a MEM has already been loaded with a widening operation;
4890 if it has, we can use a subreg of that. Many CISC machines
4891 also have such operations, but this is only likely to be
4892 beneficial on these machines. */
4894 if (flag_expensive_optimizations && src_related == 0
4895 && (GET_MODE_SIZE (mode) < UNITS_PER_WORD)
4896 && GET_MODE_CLASS (mode) == MODE_INT
4897 && MEM_P (src) && ! do_not_record
4898 && LOAD_EXTEND_OP (mode) != UNKNOWN)
4900 struct rtx_def memory_extend_buf;
4901 rtx memory_extend_rtx = &memory_extend_buf;
4902 machine_mode tmode;
4904 /* Set what we are trying to extend and the operation it might
4905 have been extended with. */
4906 memset (memory_extend_rtx, 0, sizeof (*memory_extend_rtx));
4907 PUT_CODE (memory_extend_rtx, LOAD_EXTEND_OP (mode));
4908 XEXP (memory_extend_rtx, 0) = src;
4910 for (tmode = GET_MODE_WIDER_MODE (mode);
4911 GET_MODE_SIZE (tmode) <= UNITS_PER_WORD;
4912 tmode = GET_MODE_WIDER_MODE (tmode))
4914 struct table_elt *larger_elt;
4916 PUT_MODE (memory_extend_rtx, tmode);
4917 larger_elt = lookup (memory_extend_rtx,
4918 HASH (memory_extend_rtx, tmode), tmode);
4919 if (larger_elt == 0)
4920 continue;
4922 for (larger_elt = larger_elt->first_same_value;
4923 larger_elt; larger_elt = larger_elt->next_same_value)
4924 if (REG_P (larger_elt->exp))
4926 src_related = gen_lowpart (mode, larger_elt->exp);
4927 break;
4930 if (src_related)
4931 break;
4934 #endif /* LOAD_EXTEND_OP */
4936 /* Try to express the constant using a register+offset expression
4937 derived from a constant anchor. */
4939 if (targetm.const_anchor
4940 && !src_related
4941 && src_const
4942 && GET_CODE (src_const) == CONST_INT)
4944 src_related = try_const_anchors (src_const, mode);
4945 src_related_is_const_anchor = src_related != NULL_RTX;
4949 if (src == src_folded)
4950 src_folded = 0;
4952 /* At this point, ELT, if nonzero, points to a class of expressions
4953 equivalent to the source of this SET and SRC, SRC_EQV, SRC_FOLDED,
4954 and SRC_RELATED, if nonzero, each contain additional equivalent
4955 expressions. Prune these latter expressions by deleting expressions
4956 already in the equivalence class.
4958 Check for an equivalent identical to the destination. If found,
4959 this is the preferred equivalent since it will likely lead to
4960 elimination of the insn. Indicate this by placing it in
4961 `src_related'. */
4963 if (elt)
4964 elt = elt->first_same_value;
4965 for (p = elt; p; p = p->next_same_value)
4967 enum rtx_code code = GET_CODE (p->exp);
4969 /* If the expression is not valid, ignore it. Then we do not
4970 have to check for validity below. In most cases, we can use
4971 `rtx_equal_p', since canonicalization has already been done. */
4972 if (code != REG && ! exp_equiv_p (p->exp, p->exp, 1, false))
4973 continue;
4975 /* Also skip paradoxical subregs, unless that's what we're
4976 looking for. */
4977 if (paradoxical_subreg_p (p->exp)
4978 && ! (src != 0
4979 && GET_CODE (src) == SUBREG
4980 && GET_MODE (src) == GET_MODE (p->exp)
4981 && (GET_MODE_SIZE (GET_MODE (SUBREG_REG (src)))
4982 < GET_MODE_SIZE (GET_MODE (SUBREG_REG (p->exp))))))
4983 continue;
4985 if (src && GET_CODE (src) == code && rtx_equal_p (src, p->exp))
4986 src = 0;
4987 else if (src_folded && GET_CODE (src_folded) == code
4988 && rtx_equal_p (src_folded, p->exp))
4989 src_folded = 0;
4990 else if (src_eqv_here && GET_CODE (src_eqv_here) == code
4991 && rtx_equal_p (src_eqv_here, p->exp))
4992 src_eqv_here = 0;
4993 else if (src_related && GET_CODE (src_related) == code
4994 && rtx_equal_p (src_related, p->exp))
4995 src_related = 0;
4997 /* This is the same as the destination of the insns, we want
4998 to prefer it. Copy it to src_related. The code below will
4999 then give it a negative cost. */
5000 if (GET_CODE (dest) == code && rtx_equal_p (p->exp, dest))
5001 src_related = dest;
5004 /* Find the cheapest valid equivalent, trying all the available
5005 possibilities. Prefer items not in the hash table to ones
5006 that are when they are equal cost. Note that we can never
5007 worsen an insn as the current contents will also succeed.
5008 If we find an equivalent identical to the destination, use it as best,
5009 since this insn will probably be eliminated in that case. */
5010 if (src)
5012 if (rtx_equal_p (src, dest))
5013 src_cost = src_regcost = -1;
5014 else
5016 src_cost = COST (src);
5017 src_regcost = approx_reg_cost (src);
5021 if (src_eqv_here)
5023 if (rtx_equal_p (src_eqv_here, dest))
5024 src_eqv_cost = src_eqv_regcost = -1;
5025 else
5027 src_eqv_cost = COST (src_eqv_here);
5028 src_eqv_regcost = approx_reg_cost (src_eqv_here);
5032 if (src_folded)
5034 if (rtx_equal_p (src_folded, dest))
5035 src_folded_cost = src_folded_regcost = -1;
5036 else
5038 src_folded_cost = COST (src_folded);
5039 src_folded_regcost = approx_reg_cost (src_folded);
5043 if (src_related)
5045 if (rtx_equal_p (src_related, dest))
5046 src_related_cost = src_related_regcost = -1;
5047 else
5049 src_related_cost = COST (src_related);
5050 src_related_regcost = approx_reg_cost (src_related);
5052 /* If a const-anchor is used to synthesize a constant that
5053 normally requires multiple instructions then slightly prefer
5054 it over the original sequence. These instructions are likely
5055 to become redundant now. We can't compare against the cost
5056 of src_eqv_here because, on MIPS for example, multi-insn
5057 constants have zero cost; they are assumed to be hoisted from
5058 loops. */
5059 if (src_related_is_const_anchor
5060 && src_related_cost == src_cost
5061 && src_eqv_here)
5062 src_related_cost--;
5066 /* If this was an indirect jump insn, a known label will really be
5067 cheaper even though it looks more expensive. */
5068 if (dest == pc_rtx && src_const && GET_CODE (src_const) == LABEL_REF)
5069 src_folded = src_const, src_folded_cost = src_folded_regcost = -1;
5071 /* Terminate loop when replacement made. This must terminate since
5072 the current contents will be tested and will always be valid. */
5073 while (1)
5075 rtx trial;
5077 /* Skip invalid entries. */
5078 while (elt && !REG_P (elt->exp)
5079 && ! exp_equiv_p (elt->exp, elt->exp, 1, false))
5080 elt = elt->next_same_value;
5082 /* A paradoxical subreg would be bad here: it'll be the right
5083 size, but later may be adjusted so that the upper bits aren't
5084 what we want. So reject it. */
5085 if (elt != 0
5086 && paradoxical_subreg_p (elt->exp)
5087 /* It is okay, though, if the rtx we're trying to match
5088 will ignore any of the bits we can't predict. */
5089 && ! (src != 0
5090 && GET_CODE (src) == SUBREG
5091 && GET_MODE (src) == GET_MODE (elt->exp)
5092 && (GET_MODE_SIZE (GET_MODE (SUBREG_REG (src)))
5093 < GET_MODE_SIZE (GET_MODE (SUBREG_REG (elt->exp))))))
5095 elt = elt->next_same_value;
5096 continue;
5099 if (elt)
5101 src_elt_cost = elt->cost;
5102 src_elt_regcost = elt->regcost;
5105 /* Find cheapest and skip it for the next time. For items
5106 of equal cost, use this order:
5107 src_folded, src, src_eqv, src_related and hash table entry. */
5108 if (src_folded
5109 && preferable (src_folded_cost, src_folded_regcost,
5110 src_cost, src_regcost) <= 0
5111 && preferable (src_folded_cost, src_folded_regcost,
5112 src_eqv_cost, src_eqv_regcost) <= 0
5113 && preferable (src_folded_cost, src_folded_regcost,
5114 src_related_cost, src_related_regcost) <= 0
5115 && preferable (src_folded_cost, src_folded_regcost,
5116 src_elt_cost, src_elt_regcost) <= 0)
5118 trial = src_folded, src_folded_cost = MAX_COST;
5119 if (src_folded_force_flag)
5121 rtx forced = force_const_mem (mode, trial);
5122 if (forced)
5123 trial = forced;
5126 else if (src
5127 && preferable (src_cost, src_regcost,
5128 src_eqv_cost, src_eqv_regcost) <= 0
5129 && preferable (src_cost, src_regcost,
5130 src_related_cost, src_related_regcost) <= 0
5131 && preferable (src_cost, src_regcost,
5132 src_elt_cost, src_elt_regcost) <= 0)
5133 trial = src, src_cost = MAX_COST;
5134 else if (src_eqv_here
5135 && preferable (src_eqv_cost, src_eqv_regcost,
5136 src_related_cost, src_related_regcost) <= 0
5137 && preferable (src_eqv_cost, src_eqv_regcost,
5138 src_elt_cost, src_elt_regcost) <= 0)
5139 trial = src_eqv_here, src_eqv_cost = MAX_COST;
5140 else if (src_related
5141 && preferable (src_related_cost, src_related_regcost,
5142 src_elt_cost, src_elt_regcost) <= 0)
5143 trial = src_related, src_related_cost = MAX_COST;
5144 else
5146 trial = elt->exp;
5147 elt = elt->next_same_value;
5148 src_elt_cost = MAX_COST;
5151 /* Avoid creation of overlapping memory moves. */
5152 if (MEM_P (trial) && MEM_P (SET_DEST (sets[i].rtl)))
5154 rtx src, dest;
5156 /* BLKmode moves are not handled by cse anyway. */
5157 if (GET_MODE (trial) == BLKmode)
5158 break;
5160 src = canon_rtx (trial);
5161 dest = canon_rtx (SET_DEST (sets[i].rtl));
5163 if (!MEM_P (src) || !MEM_P (dest)
5164 || !nonoverlapping_memrefs_p (src, dest, false))
5165 break;
5168 /* Try to optimize
5169 (set (reg:M N) (const_int A))
5170 (set (reg:M2 O) (const_int B))
5171 (set (zero_extract:M2 (reg:M N) (const_int C) (const_int D))
5172 (reg:M2 O)). */
5173 if (GET_CODE (SET_DEST (sets[i].rtl)) == ZERO_EXTRACT
5174 && CONST_INT_P (trial)
5175 && CONST_INT_P (XEXP (SET_DEST (sets[i].rtl), 1))
5176 && CONST_INT_P (XEXP (SET_DEST (sets[i].rtl), 2))
5177 && REG_P (XEXP (SET_DEST (sets[i].rtl), 0))
5178 && (GET_MODE_PRECISION (GET_MODE (SET_DEST (sets[i].rtl)))
5179 >= INTVAL (XEXP (SET_DEST (sets[i].rtl), 1)))
5180 && ((unsigned) INTVAL (XEXP (SET_DEST (sets[i].rtl), 1))
5181 + (unsigned) INTVAL (XEXP (SET_DEST (sets[i].rtl), 2))
5182 <= HOST_BITS_PER_WIDE_INT))
5184 rtx dest_reg = XEXP (SET_DEST (sets[i].rtl), 0);
5185 rtx width = XEXP (SET_DEST (sets[i].rtl), 1);
5186 rtx pos = XEXP (SET_DEST (sets[i].rtl), 2);
5187 unsigned int dest_hash = HASH (dest_reg, GET_MODE (dest_reg));
5188 struct table_elt *dest_elt
5189 = lookup (dest_reg, dest_hash, GET_MODE (dest_reg));
5190 rtx dest_cst = NULL;
5192 if (dest_elt)
5193 for (p = dest_elt->first_same_value; p; p = p->next_same_value)
5194 if (p->is_const && CONST_INT_P (p->exp))
5196 dest_cst = p->exp;
5197 break;
5199 if (dest_cst)
5201 HOST_WIDE_INT val = INTVAL (dest_cst);
5202 HOST_WIDE_INT mask;
5203 unsigned int shift;
5204 if (BITS_BIG_ENDIAN)
5205 shift = GET_MODE_PRECISION (GET_MODE (dest_reg))
5206 - INTVAL (pos) - INTVAL (width);
5207 else
5208 shift = INTVAL (pos);
5209 if (INTVAL (width) == HOST_BITS_PER_WIDE_INT)
5210 mask = ~(HOST_WIDE_INT) 0;
5211 else
5212 mask = ((HOST_WIDE_INT) 1 << INTVAL (width)) - 1;
5213 val &= ~(mask << shift);
5214 val |= (INTVAL (trial) & mask) << shift;
5215 val = trunc_int_for_mode (val, GET_MODE (dest_reg));
5216 validate_unshare_change (insn, &SET_DEST (sets[i].rtl),
5217 dest_reg, 1);
5218 validate_unshare_change (insn, &SET_SRC (sets[i].rtl),
5219 GEN_INT (val), 1);
5220 if (apply_change_group ())
5222 rtx note = find_reg_note (insn, REG_EQUAL, NULL_RTX);
5223 if (note)
5225 remove_note (insn, note);
5226 df_notes_rescan (insn);
5228 src_eqv = NULL_RTX;
5229 src_eqv_elt = NULL;
5230 src_eqv_volatile = 0;
5231 src_eqv_in_memory = 0;
5232 src_eqv_hash = 0;
5233 repeat = true;
5234 break;
5239 /* We don't normally have an insn matching (set (pc) (pc)), so
5240 check for this separately here. We will delete such an
5241 insn below.
5243 For other cases such as a table jump or conditional jump
5244 where we know the ultimate target, go ahead and replace the
5245 operand. While that may not make a valid insn, we will
5246 reemit the jump below (and also insert any necessary
5247 barriers). */
5248 if (n_sets == 1 && dest == pc_rtx
5249 && (trial == pc_rtx
5250 || (GET_CODE (trial) == LABEL_REF
5251 && ! condjump_p (insn))))
5253 /* Don't substitute non-local labels, this confuses CFG. */
5254 if (GET_CODE (trial) == LABEL_REF
5255 && LABEL_REF_NONLOCAL_P (trial))
5256 continue;
5258 SET_SRC (sets[i].rtl) = trial;
5259 cse_jumps_altered = true;
5260 break;
5263 /* Reject certain invalid forms of CONST that we create. */
5264 else if (CONSTANT_P (trial)
5265 && GET_CODE (trial) == CONST
5266 /* Reject cases that will cause decode_rtx_const to
5267 die. On the alpha when simplifying a switch, we
5268 get (const (truncate (minus (label_ref)
5269 (label_ref)))). */
5270 && (GET_CODE (XEXP (trial, 0)) == TRUNCATE
5271 /* Likewise on IA-64, except without the
5272 truncate. */
5273 || (GET_CODE (XEXP (trial, 0)) == MINUS
5274 && GET_CODE (XEXP (XEXP (trial, 0), 0)) == LABEL_REF
5275 && GET_CODE (XEXP (XEXP (trial, 0), 1)) == LABEL_REF)))
5276 /* Do nothing for this case. */
5279 /* Look for a substitution that makes a valid insn. */
5280 else if (validate_unshare_change (insn, &SET_SRC (sets[i].rtl),
5281 trial, 0))
5283 rtx new_rtx = canon_reg (SET_SRC (sets[i].rtl), insn);
5285 /* The result of apply_change_group can be ignored; see
5286 canon_reg. */
5288 validate_change (insn, &SET_SRC (sets[i].rtl), new_rtx, 1);
5289 apply_change_group ();
5291 break;
5294 /* If we previously found constant pool entries for
5295 constants and this is a constant, try making a
5296 pool entry. Put it in src_folded unless we already have done
5297 this since that is where it likely came from. */
5299 else if (constant_pool_entries_cost
5300 && CONSTANT_P (trial)
5301 && (src_folded == 0
5302 || (!MEM_P (src_folded)
5303 && ! src_folded_force_flag))
5304 && GET_MODE_CLASS (mode) != MODE_CC
5305 && mode != VOIDmode)
5307 src_folded_force_flag = 1;
5308 src_folded = trial;
5309 src_folded_cost = constant_pool_entries_cost;
5310 src_folded_regcost = constant_pool_entries_regcost;
5314 /* If we changed the insn too much, handle this set from scratch. */
5315 if (repeat)
5317 i--;
5318 continue;
5321 src = SET_SRC (sets[i].rtl);
5323 /* In general, it is good to have a SET with SET_SRC == SET_DEST.
5324 However, there is an important exception: If both are registers
5325 that are not the head of their equivalence class, replace SET_SRC
5326 with the head of the class. If we do not do this, we will have
5327 both registers live over a portion of the basic block. This way,
5328 their lifetimes will likely abut instead of overlapping. */
5329 if (REG_P (dest)
5330 && REGNO_QTY_VALID_P (REGNO (dest)))
5332 int dest_q = REG_QTY (REGNO (dest));
5333 struct qty_table_elem *dest_ent = &qty_table[dest_q];
5335 if (dest_ent->mode == GET_MODE (dest)
5336 && dest_ent->first_reg != REGNO (dest)
5337 && REG_P (src) && REGNO (src) == REGNO (dest)
5338 /* Don't do this if the original insn had a hard reg as
5339 SET_SRC or SET_DEST. */
5340 && (!REG_P (sets[i].src)
5341 || REGNO (sets[i].src) >= FIRST_PSEUDO_REGISTER)
5342 && (!REG_P (dest) || REGNO (dest) >= FIRST_PSEUDO_REGISTER))
5343 /* We can't call canon_reg here because it won't do anything if
5344 SRC is a hard register. */
5346 int src_q = REG_QTY (REGNO (src));
5347 struct qty_table_elem *src_ent = &qty_table[src_q];
5348 int first = src_ent->first_reg;
5349 rtx new_src
5350 = (first >= FIRST_PSEUDO_REGISTER
5351 ? regno_reg_rtx[first] : gen_rtx_REG (GET_MODE (src), first));
5353 /* We must use validate-change even for this, because this
5354 might be a special no-op instruction, suitable only to
5355 tag notes onto. */
5356 if (validate_change (insn, &SET_SRC (sets[i].rtl), new_src, 0))
5358 src = new_src;
5359 /* If we had a constant that is cheaper than what we are now
5360 setting SRC to, use that constant. We ignored it when we
5361 thought we could make this into a no-op. */
5362 if (src_const && COST (src_const) < COST (src)
5363 && validate_change (insn, &SET_SRC (sets[i].rtl),
5364 src_const, 0))
5365 src = src_const;
5370 /* If we made a change, recompute SRC values. */
5371 if (src != sets[i].src)
5373 do_not_record = 0;
5374 hash_arg_in_memory = 0;
5375 sets[i].src = src;
5376 sets[i].src_hash = HASH (src, mode);
5377 sets[i].src_volatile = do_not_record;
5378 sets[i].src_in_memory = hash_arg_in_memory;
5379 sets[i].src_elt = lookup (src, sets[i].src_hash, mode);
5382 /* If this is a single SET, we are setting a register, and we have an
5383 equivalent constant, we want to add a REG_EQUAL note if the constant
5384 is different from the source. We don't want to do it for a constant
5385 pseudo since verifying that this pseudo hasn't been eliminated is a
5386 pain; moreover such a note won't help anything.
5388 Avoid a REG_EQUAL note for (CONST (MINUS (LABEL_REF) (LABEL_REF)))
5389 which can be created for a reference to a compile time computable
5390 entry in a jump table. */
5391 if (n_sets == 1
5392 && REG_P (dest)
5393 && src_const
5394 && !REG_P (src_const)
5395 && !(GET_CODE (src_const) == SUBREG
5396 && REG_P (SUBREG_REG (src_const)))
5397 && !(GET_CODE (src_const) == CONST
5398 && GET_CODE (XEXP (src_const, 0)) == MINUS
5399 && GET_CODE (XEXP (XEXP (src_const, 0), 0)) == LABEL_REF
5400 && GET_CODE (XEXP (XEXP (src_const, 0), 1)) == LABEL_REF)
5401 && !rtx_equal_p (src, src_const))
5403 /* Make sure that the rtx is not shared. */
5404 src_const = copy_rtx (src_const);
5406 /* Record the actual constant value in a REG_EQUAL note,
5407 making a new one if one does not already exist. */
5408 set_unique_reg_note (insn, REG_EQUAL, src_const);
5409 df_notes_rescan (insn);
5412 /* Now deal with the destination. */
5413 do_not_record = 0;
5415 /* Look within any ZERO_EXTRACT to the MEM or REG within it. */
5416 while (GET_CODE (dest) == SUBREG
5417 || GET_CODE (dest) == ZERO_EXTRACT
5418 || GET_CODE (dest) == STRICT_LOW_PART)
5419 dest = XEXP (dest, 0);
5421 sets[i].inner_dest = dest;
5423 if (MEM_P (dest))
5425 #ifdef PUSH_ROUNDING
5426 /* Stack pushes invalidate the stack pointer. */
5427 rtx addr = XEXP (dest, 0);
5428 if (GET_RTX_CLASS (GET_CODE (addr)) == RTX_AUTOINC
5429 && XEXP (addr, 0) == stack_pointer_rtx)
5430 invalidate (stack_pointer_rtx, VOIDmode);
5431 #endif
5432 dest = fold_rtx (dest, insn);
5435 /* Compute the hash code of the destination now,
5436 before the effects of this instruction are recorded,
5437 since the register values used in the address computation
5438 are those before this instruction. */
5439 sets[i].dest_hash = HASH (dest, mode);
5441 /* Don't enter a bit-field in the hash table
5442 because the value in it after the store
5443 may not equal what was stored, due to truncation. */
5445 if (GET_CODE (SET_DEST (sets[i].rtl)) == ZERO_EXTRACT)
5447 rtx width = XEXP (SET_DEST (sets[i].rtl), 1);
5449 if (src_const != 0 && CONST_INT_P (src_const)
5450 && CONST_INT_P (width)
5451 && INTVAL (width) < HOST_BITS_PER_WIDE_INT
5452 && ! (INTVAL (src_const)
5453 & (HOST_WIDE_INT_M1U << INTVAL (width))))
5454 /* Exception: if the value is constant,
5455 and it won't be truncated, record it. */
5457 else
5459 /* This is chosen so that the destination will be invalidated
5460 but no new value will be recorded.
5461 We must invalidate because sometimes constant
5462 values can be recorded for bitfields. */
5463 sets[i].src_elt = 0;
5464 sets[i].src_volatile = 1;
5465 src_eqv = 0;
5466 src_eqv_elt = 0;
5470 /* If only one set in a JUMP_INSN and it is now a no-op, we can delete
5471 the insn. */
5472 else if (n_sets == 1 && dest == pc_rtx && src == pc_rtx)
5474 /* One less use of the label this insn used to jump to. */
5475 delete_insn_and_edges (insn);
5476 cse_jumps_altered = true;
5477 /* No more processing for this set. */
5478 sets[i].rtl = 0;
5481 /* If this SET is now setting PC to a label, we know it used to
5482 be a conditional or computed branch. */
5483 else if (dest == pc_rtx && GET_CODE (src) == LABEL_REF
5484 && !LABEL_REF_NONLOCAL_P (src))
5486 /* We reemit the jump in as many cases as possible just in
5487 case the form of an unconditional jump is significantly
5488 different than a computed jump or conditional jump.
5490 If this insn has multiple sets, then reemitting the
5491 jump is nontrivial. So instead we just force rerecognition
5492 and hope for the best. */
5493 if (n_sets == 1)
5495 rtx_insn *new_rtx;
5496 rtx note;
5498 new_rtx = emit_jump_insn_before (gen_jump (XEXP (src, 0)), insn);
5499 JUMP_LABEL (new_rtx) = XEXP (src, 0);
5500 LABEL_NUSES (XEXP (src, 0))++;
5502 /* Make sure to copy over REG_NON_LOCAL_GOTO. */
5503 note = find_reg_note (insn, REG_NON_LOCAL_GOTO, 0);
5504 if (note)
5506 XEXP (note, 1) = NULL_RTX;
5507 REG_NOTES (new_rtx) = note;
5510 delete_insn_and_edges (insn);
5511 insn = new_rtx;
5513 else
5514 INSN_CODE (insn) = -1;
5516 /* Do not bother deleting any unreachable code, let jump do it. */
5517 cse_jumps_altered = true;
5518 sets[i].rtl = 0;
5521 /* If destination is volatile, invalidate it and then do no further
5522 processing for this assignment. */
5524 else if (do_not_record)
5526 invalidate_dest (dest);
5527 sets[i].rtl = 0;
5530 if (sets[i].rtl != 0 && dest != SET_DEST (sets[i].rtl))
5532 do_not_record = 0;
5533 sets[i].dest_hash = HASH (SET_DEST (sets[i].rtl), mode);
5534 if (do_not_record)
5536 invalidate_dest (SET_DEST (sets[i].rtl));
5537 sets[i].rtl = 0;
5541 /* If setting CC0, record what it was set to, or a constant, if it
5542 is equivalent to a constant. If it is being set to a floating-point
5543 value, make a COMPARE with the appropriate constant of 0. If we
5544 don't do this, later code can interpret this as a test against
5545 const0_rtx, which can cause problems if we try to put it into an
5546 insn as a floating-point operand. */
5547 if (dest == cc0_rtx)
5549 this_insn_cc0 = src_const && mode != VOIDmode ? src_const : src;
5550 this_insn_cc0_mode = mode;
5551 if (FLOAT_MODE_P (mode))
5552 this_insn_cc0 = gen_rtx_COMPARE (VOIDmode, this_insn_cc0,
5553 CONST0_RTX (mode));
5557 /* Now enter all non-volatile source expressions in the hash table
5558 if they are not already present.
5559 Record their equivalence classes in src_elt.
5560 This way we can insert the corresponding destinations into
5561 the same classes even if the actual sources are no longer in them
5562 (having been invalidated). */
5564 if (src_eqv && src_eqv_elt == 0 && sets[0].rtl != 0 && ! src_eqv_volatile
5565 && ! rtx_equal_p (src_eqv, SET_DEST (sets[0].rtl)))
5567 struct table_elt *elt;
5568 struct table_elt *classp = sets[0].src_elt;
5569 rtx dest = SET_DEST (sets[0].rtl);
5570 machine_mode eqvmode = GET_MODE (dest);
5572 if (GET_CODE (dest) == STRICT_LOW_PART)
5574 eqvmode = GET_MODE (SUBREG_REG (XEXP (dest, 0)));
5575 classp = 0;
5577 if (insert_regs (src_eqv, classp, 0))
5579 rehash_using_reg (src_eqv);
5580 src_eqv_hash = HASH (src_eqv, eqvmode);
5582 elt = insert (src_eqv, classp, src_eqv_hash, eqvmode);
5583 elt->in_memory = src_eqv_in_memory;
5584 src_eqv_elt = elt;
5586 /* Check to see if src_eqv_elt is the same as a set source which
5587 does not yet have an elt, and if so set the elt of the set source
5588 to src_eqv_elt. */
5589 for (i = 0; i < n_sets; i++)
5590 if (sets[i].rtl && sets[i].src_elt == 0
5591 && rtx_equal_p (SET_SRC (sets[i].rtl), src_eqv))
5592 sets[i].src_elt = src_eqv_elt;
5595 for (i = 0; i < n_sets; i++)
5596 if (sets[i].rtl && ! sets[i].src_volatile
5597 && ! rtx_equal_p (SET_SRC (sets[i].rtl), SET_DEST (sets[i].rtl)))
5599 if (GET_CODE (SET_DEST (sets[i].rtl)) == STRICT_LOW_PART)
5601 /* REG_EQUAL in setting a STRICT_LOW_PART
5602 gives an equivalent for the entire destination register,
5603 not just for the subreg being stored in now.
5604 This is a more interesting equivalence, so we arrange later
5605 to treat the entire reg as the destination. */
5606 sets[i].src_elt = src_eqv_elt;
5607 sets[i].src_hash = src_eqv_hash;
5609 else
5611 /* Insert source and constant equivalent into hash table, if not
5612 already present. */
5613 struct table_elt *classp = src_eqv_elt;
5614 rtx src = sets[i].src;
5615 rtx dest = SET_DEST (sets[i].rtl);
5616 machine_mode mode
5617 = GET_MODE (src) == VOIDmode ? GET_MODE (dest) : GET_MODE (src);
5619 /* It's possible that we have a source value known to be
5620 constant but don't have a REG_EQUAL note on the insn.
5621 Lack of a note will mean src_eqv_elt will be NULL. This
5622 can happen where we've generated a SUBREG to access a
5623 CONST_INT that is already in a register in a wider mode.
5624 Ensure that the source expression is put in the proper
5625 constant class. */
5626 if (!classp)
5627 classp = sets[i].src_const_elt;
5629 if (sets[i].src_elt == 0)
5631 struct table_elt *elt;
5633 /* Note that these insert_regs calls cannot remove
5634 any of the src_elt's, because they would have failed to
5635 match if not still valid. */
5636 if (insert_regs (src, classp, 0))
5638 rehash_using_reg (src);
5639 sets[i].src_hash = HASH (src, mode);
5641 elt = insert (src, classp, sets[i].src_hash, mode);
5642 elt->in_memory = sets[i].src_in_memory;
5643 /* If inline asm has any clobbers, ensure we only reuse
5644 existing inline asms and never try to put the ASM_OPERANDS
5645 into an insn that isn't inline asm. */
5646 if (GET_CODE (src) == ASM_OPERANDS
5647 && GET_CODE (x) == PARALLEL)
5648 elt->cost = MAX_COST;
5649 sets[i].src_elt = classp = elt;
5651 if (sets[i].src_const && sets[i].src_const_elt == 0
5652 && src != sets[i].src_const
5653 && ! rtx_equal_p (sets[i].src_const, src))
5654 sets[i].src_elt = insert (sets[i].src_const, classp,
5655 sets[i].src_const_hash, mode);
5658 else if (sets[i].src_elt == 0)
5659 /* If we did not insert the source into the hash table (e.g., it was
5660 volatile), note the equivalence class for the REG_EQUAL value, if any,
5661 so that the destination goes into that class. */
5662 sets[i].src_elt = src_eqv_elt;
5664 /* Record destination addresses in the hash table. This allows us to
5665 check if they are invalidated by other sets. */
5666 for (i = 0; i < n_sets; i++)
5668 if (sets[i].rtl)
5670 rtx x = sets[i].inner_dest;
5671 struct table_elt *elt;
5672 machine_mode mode;
5673 unsigned hash;
5675 if (MEM_P (x))
5677 x = XEXP (x, 0);
5678 mode = GET_MODE (x);
5679 hash = HASH (x, mode);
5680 elt = lookup (x, hash, mode);
5681 if (!elt)
5683 if (insert_regs (x, NULL, 0))
5685 rtx dest = SET_DEST (sets[i].rtl);
5687 rehash_using_reg (x);
5688 hash = HASH (x, mode);
5689 sets[i].dest_hash = HASH (dest, GET_MODE (dest));
5691 elt = insert (x, NULL, hash, mode);
5694 sets[i].dest_addr_elt = elt;
5696 else
5697 sets[i].dest_addr_elt = NULL;
5701 invalidate_from_clobbers (insn);
5703 /* Some registers are invalidated by subroutine calls. Memory is
5704 invalidated by non-constant calls. */
5706 if (CALL_P (insn))
5708 if (!(RTL_CONST_OR_PURE_CALL_P (insn)))
5709 invalidate_memory ();
5710 invalidate_for_call ();
5713 /* Now invalidate everything set by this instruction.
5714 If a SUBREG or other funny destination is being set,
5715 sets[i].rtl is still nonzero, so here we invalidate the reg
5716 a part of which is being set. */
5718 for (i = 0; i < n_sets; i++)
5719 if (sets[i].rtl)
5721 /* We can't use the inner dest, because the mode associated with
5722 a ZERO_EXTRACT is significant. */
5723 rtx dest = SET_DEST (sets[i].rtl);
5725 /* Needed for registers to remove the register from its
5726 previous quantity's chain.
5727 Needed for memory if this is a nonvarying address, unless
5728 we have just done an invalidate_memory that covers even those. */
5729 if (REG_P (dest) || GET_CODE (dest) == SUBREG)
5730 invalidate (dest, VOIDmode);
5731 else if (MEM_P (dest))
5732 invalidate (dest, VOIDmode);
5733 else if (GET_CODE (dest) == STRICT_LOW_PART
5734 || GET_CODE (dest) == ZERO_EXTRACT)
5735 invalidate (XEXP (dest, 0), GET_MODE (dest));
5738 /* Don't cse over a call to setjmp; on some machines (eg VAX)
5739 the regs restored by the longjmp come from a later time
5740 than the setjmp. */
5741 if (CALL_P (insn) && find_reg_note (insn, REG_SETJMP, NULL))
5743 flush_hash_table ();
5744 goto done;
5747 /* Make sure registers mentioned in destinations
5748 are safe for use in an expression to be inserted.
5749 This removes from the hash table
5750 any invalid entry that refers to one of these registers.
5752 We don't care about the return value from mention_regs because
5753 we are going to hash the SET_DEST values unconditionally. */
5755 for (i = 0; i < n_sets; i++)
5757 if (sets[i].rtl)
5759 rtx x = SET_DEST (sets[i].rtl);
5761 if (!REG_P (x))
5762 mention_regs (x);
5763 else
5765 /* We used to rely on all references to a register becoming
5766 inaccessible when a register changes to a new quantity,
5767 since that changes the hash code. However, that is not
5768 safe, since after HASH_SIZE new quantities we get a
5769 hash 'collision' of a register with its own invalid
5770 entries. And since SUBREGs have been changed not to
5771 change their hash code with the hash code of the register,
5772 it wouldn't work any longer at all. So we have to check
5773 for any invalid references lying around now.
5774 This code is similar to the REG case in mention_regs,
5775 but it knows that reg_tick has been incremented, and
5776 it leaves reg_in_table as -1 . */
5777 unsigned int regno = REGNO (x);
5778 unsigned int endregno = END_REGNO (x);
5779 unsigned int i;
5781 for (i = regno; i < endregno; i++)
5783 if (REG_IN_TABLE (i) >= 0)
5785 remove_invalid_refs (i);
5786 REG_IN_TABLE (i) = -1;
5793 /* We may have just removed some of the src_elt's from the hash table.
5794 So replace each one with the current head of the same class.
5795 Also check if destination addresses have been removed. */
5797 for (i = 0; i < n_sets; i++)
5798 if (sets[i].rtl)
5800 if (sets[i].dest_addr_elt
5801 && sets[i].dest_addr_elt->first_same_value == 0)
5803 /* The elt was removed, which means this destination is not
5804 valid after this instruction. */
5805 sets[i].rtl = NULL_RTX;
5807 else if (sets[i].src_elt && sets[i].src_elt->first_same_value == 0)
5808 /* If elt was removed, find current head of same class,
5809 or 0 if nothing remains of that class. */
5811 struct table_elt *elt = sets[i].src_elt;
5813 while (elt && elt->prev_same_value)
5814 elt = elt->prev_same_value;
5816 while (elt && elt->first_same_value == 0)
5817 elt = elt->next_same_value;
5818 sets[i].src_elt = elt ? elt->first_same_value : 0;
5822 /* Now insert the destinations into their equivalence classes. */
5824 for (i = 0; i < n_sets; i++)
5825 if (sets[i].rtl)
5827 rtx dest = SET_DEST (sets[i].rtl);
5828 struct table_elt *elt;
5830 /* Don't record value if we are not supposed to risk allocating
5831 floating-point values in registers that might be wider than
5832 memory. */
5833 if ((flag_float_store
5834 && MEM_P (dest)
5835 && FLOAT_MODE_P (GET_MODE (dest)))
5836 /* Don't record BLKmode values, because we don't know the
5837 size of it, and can't be sure that other BLKmode values
5838 have the same or smaller size. */
5839 || GET_MODE (dest) == BLKmode
5840 /* If we didn't put a REG_EQUAL value or a source into the hash
5841 table, there is no point is recording DEST. */
5842 || sets[i].src_elt == 0
5843 /* If DEST is a paradoxical SUBREG and SRC is a ZERO_EXTEND
5844 or SIGN_EXTEND, don't record DEST since it can cause
5845 some tracking to be wrong.
5847 ??? Think about this more later. */
5848 || (paradoxical_subreg_p (dest)
5849 && (GET_CODE (sets[i].src) == SIGN_EXTEND
5850 || GET_CODE (sets[i].src) == ZERO_EXTEND)))
5851 continue;
5853 /* STRICT_LOW_PART isn't part of the value BEING set,
5854 and neither is the SUBREG inside it.
5855 Note that in this case SETS[I].SRC_ELT is really SRC_EQV_ELT. */
5856 if (GET_CODE (dest) == STRICT_LOW_PART)
5857 dest = SUBREG_REG (XEXP (dest, 0));
5859 if (REG_P (dest) || GET_CODE (dest) == SUBREG)
5860 /* Registers must also be inserted into chains for quantities. */
5861 if (insert_regs (dest, sets[i].src_elt, 1))
5863 /* If `insert_regs' changes something, the hash code must be
5864 recalculated. */
5865 rehash_using_reg (dest);
5866 sets[i].dest_hash = HASH (dest, GET_MODE (dest));
5869 elt = insert (dest, sets[i].src_elt,
5870 sets[i].dest_hash, GET_MODE (dest));
5872 /* If this is a constant, insert the constant anchors with the
5873 equivalent register-offset expressions using register DEST. */
5874 if (targetm.const_anchor
5875 && REG_P (dest)
5876 && SCALAR_INT_MODE_P (GET_MODE (dest))
5877 && GET_CODE (sets[i].src_elt->exp) == CONST_INT)
5878 insert_const_anchors (dest, sets[i].src_elt->exp, GET_MODE (dest));
5880 elt->in_memory = (MEM_P (sets[i].inner_dest)
5881 && !MEM_READONLY_P (sets[i].inner_dest));
5883 /* If we have (set (subreg:m1 (reg:m2 foo) 0) (bar:m1)), M1 is no
5884 narrower than M2, and both M1 and M2 are the same number of words,
5885 we are also doing (set (reg:m2 foo) (subreg:m2 (bar:m1) 0)) so
5886 make that equivalence as well.
5888 However, BAR may have equivalences for which gen_lowpart
5889 will produce a simpler value than gen_lowpart applied to
5890 BAR (e.g., if BAR was ZERO_EXTENDed from M2), so we will scan all
5891 BAR's equivalences. If we don't get a simplified form, make
5892 the SUBREG. It will not be used in an equivalence, but will
5893 cause two similar assignments to be detected.
5895 Note the loop below will find SUBREG_REG (DEST) since we have
5896 already entered SRC and DEST of the SET in the table. */
5898 if (GET_CODE (dest) == SUBREG
5899 && (((GET_MODE_SIZE (GET_MODE (SUBREG_REG (dest))) - 1)
5900 / UNITS_PER_WORD)
5901 == (GET_MODE_SIZE (GET_MODE (dest)) - 1) / UNITS_PER_WORD)
5902 && (GET_MODE_SIZE (GET_MODE (dest))
5903 >= GET_MODE_SIZE (GET_MODE (SUBREG_REG (dest))))
5904 && sets[i].src_elt != 0)
5906 machine_mode new_mode = GET_MODE (SUBREG_REG (dest));
5907 struct table_elt *elt, *classp = 0;
5909 for (elt = sets[i].src_elt->first_same_value; elt;
5910 elt = elt->next_same_value)
5912 rtx new_src = 0;
5913 unsigned src_hash;
5914 struct table_elt *src_elt;
5915 int byte = 0;
5917 /* Ignore invalid entries. */
5918 if (!REG_P (elt->exp)
5919 && ! exp_equiv_p (elt->exp, elt->exp, 1, false))
5920 continue;
5922 /* We may have already been playing subreg games. If the
5923 mode is already correct for the destination, use it. */
5924 if (GET_MODE (elt->exp) == new_mode)
5925 new_src = elt->exp;
5926 else
5928 /* Calculate big endian correction for the SUBREG_BYTE.
5929 We have already checked that M1 (GET_MODE (dest))
5930 is not narrower than M2 (new_mode). */
5931 if (BYTES_BIG_ENDIAN)
5932 byte = (GET_MODE_SIZE (GET_MODE (dest))
5933 - GET_MODE_SIZE (new_mode));
5935 new_src = simplify_gen_subreg (new_mode, elt->exp,
5936 GET_MODE (dest), byte);
5939 /* The call to simplify_gen_subreg fails if the value
5940 is VOIDmode, yet we can't do any simplification, e.g.
5941 for EXPR_LISTs denoting function call results.
5942 It is invalid to construct a SUBREG with a VOIDmode
5943 SUBREG_REG, hence a zero new_src means we can't do
5944 this substitution. */
5945 if (! new_src)
5946 continue;
5948 src_hash = HASH (new_src, new_mode);
5949 src_elt = lookup (new_src, src_hash, new_mode);
5951 /* Put the new source in the hash table is if isn't
5952 already. */
5953 if (src_elt == 0)
5955 if (insert_regs (new_src, classp, 0))
5957 rehash_using_reg (new_src);
5958 src_hash = HASH (new_src, new_mode);
5960 src_elt = insert (new_src, classp, src_hash, new_mode);
5961 src_elt->in_memory = elt->in_memory;
5962 if (GET_CODE (new_src) == ASM_OPERANDS
5963 && elt->cost == MAX_COST)
5964 src_elt->cost = MAX_COST;
5966 else if (classp && classp != src_elt->first_same_value)
5967 /* Show that two things that we've seen before are
5968 actually the same. */
5969 merge_equiv_classes (src_elt, classp);
5971 classp = src_elt->first_same_value;
5972 /* Ignore invalid entries. */
5973 while (classp
5974 && !REG_P (classp->exp)
5975 && ! exp_equiv_p (classp->exp, classp->exp, 1, false))
5976 classp = classp->next_same_value;
5981 /* Special handling for (set REG0 REG1) where REG0 is the
5982 "cheapest", cheaper than REG1. After cse, REG1 will probably not
5983 be used in the sequel, so (if easily done) change this insn to
5984 (set REG1 REG0) and replace REG1 with REG0 in the previous insn
5985 that computed their value. Then REG1 will become a dead store
5986 and won't cloud the situation for later optimizations.
5988 Do not make this change if REG1 is a hard register, because it will
5989 then be used in the sequel and we may be changing a two-operand insn
5990 into a three-operand insn.
5992 Also do not do this if we are operating on a copy of INSN. */
5994 if (n_sets == 1 && sets[0].rtl)
5995 try_back_substitute_reg (sets[0].rtl, insn);
5997 done:;
6000 /* Remove from the hash table all expressions that reference memory. */
6002 static void
6003 invalidate_memory (void)
6005 int i;
6006 struct table_elt *p, *next;
6008 for (i = 0; i < HASH_SIZE; i++)
6009 for (p = table[i]; p; p = next)
6011 next = p->next_same_hash;
6012 if (p->in_memory)
6013 remove_from_table (p, i);
6017 /* Perform invalidation on the basis of everything about INSN,
6018 except for invalidating the actual places that are SET in it.
6019 This includes the places CLOBBERed, and anything that might
6020 alias with something that is SET or CLOBBERed. */
6022 static void
6023 invalidate_from_clobbers (rtx_insn *insn)
6025 rtx x = PATTERN (insn);
6027 if (GET_CODE (x) == CLOBBER)
6029 rtx ref = XEXP (x, 0);
6030 if (ref)
6032 if (REG_P (ref) || GET_CODE (ref) == SUBREG
6033 || MEM_P (ref))
6034 invalidate (ref, VOIDmode);
6035 else if (GET_CODE (ref) == STRICT_LOW_PART
6036 || GET_CODE (ref) == ZERO_EXTRACT)
6037 invalidate (XEXP (ref, 0), GET_MODE (ref));
6040 else if (GET_CODE (x) == PARALLEL)
6042 int i;
6043 for (i = XVECLEN (x, 0) - 1; i >= 0; i--)
6045 rtx y = XVECEXP (x, 0, i);
6046 if (GET_CODE (y) == CLOBBER)
6048 rtx ref = XEXP (y, 0);
6049 if (REG_P (ref) || GET_CODE (ref) == SUBREG
6050 || MEM_P (ref))
6051 invalidate (ref, VOIDmode);
6052 else if (GET_CODE (ref) == STRICT_LOW_PART
6053 || GET_CODE (ref) == ZERO_EXTRACT)
6054 invalidate (XEXP (ref, 0), GET_MODE (ref));
6060 /* Perform invalidation on the basis of everything about INSN.
6061 This includes the places CLOBBERed, and anything that might
6062 alias with something that is SET or CLOBBERed. */
6064 static void
6065 invalidate_from_sets_and_clobbers (rtx_insn *insn)
6067 rtx tem;
6068 rtx x = PATTERN (insn);
6070 if (CALL_P (insn))
6072 for (tem = CALL_INSN_FUNCTION_USAGE (insn); tem; tem = XEXP (tem, 1))
6073 if (GET_CODE (XEXP (tem, 0)) == CLOBBER)
6074 invalidate (SET_DEST (XEXP (tem, 0)), VOIDmode);
6077 /* Ensure we invalidate the destination register of a CALL insn.
6078 This is necessary for machines where this register is a fixed_reg,
6079 because no other code would invalidate it. */
6080 if (GET_CODE (x) == SET && GET_CODE (SET_SRC (x)) == CALL)
6081 invalidate (SET_DEST (x), VOIDmode);
6083 else if (GET_CODE (x) == PARALLEL)
6085 int i;
6087 for (i = XVECLEN (x, 0) - 1; i >= 0; i--)
6089 rtx y = XVECEXP (x, 0, i);
6090 if (GET_CODE (y) == CLOBBER)
6092 rtx clobbered = XEXP (y, 0);
6094 if (REG_P (clobbered)
6095 || GET_CODE (clobbered) == SUBREG)
6096 invalidate (clobbered, VOIDmode);
6097 else if (GET_CODE (clobbered) == STRICT_LOW_PART
6098 || GET_CODE (clobbered) == ZERO_EXTRACT)
6099 invalidate (XEXP (clobbered, 0), GET_MODE (clobbered));
6101 else if (GET_CODE (y) == SET && GET_CODE (SET_SRC (y)) == CALL)
6102 invalidate (SET_DEST (y), VOIDmode);
6107 /* Process X, part of the REG_NOTES of an insn. Look at any REG_EQUAL notes
6108 and replace any registers in them with either an equivalent constant
6109 or the canonical form of the register. If we are inside an address,
6110 only do this if the address remains valid.
6112 OBJECT is 0 except when within a MEM in which case it is the MEM.
6114 Return the replacement for X. */
6116 static rtx
6117 cse_process_notes_1 (rtx x, rtx object, bool *changed)
6119 enum rtx_code code = GET_CODE (x);
6120 const char *fmt = GET_RTX_FORMAT (code);
6121 int i;
6123 switch (code)
6125 case CONST:
6126 case SYMBOL_REF:
6127 case LABEL_REF:
6128 CASE_CONST_ANY:
6129 case PC:
6130 case CC0:
6131 case LO_SUM:
6132 return x;
6134 case MEM:
6135 validate_change (x, &XEXP (x, 0),
6136 cse_process_notes (XEXP (x, 0), x, changed), 0);
6137 return x;
6139 case EXPR_LIST:
6140 if (REG_NOTE_KIND (x) == REG_EQUAL)
6141 XEXP (x, 0) = cse_process_notes (XEXP (x, 0), NULL_RTX, changed);
6142 /* Fall through. */
6144 case INSN_LIST:
6145 case INT_LIST:
6146 if (XEXP (x, 1))
6147 XEXP (x, 1) = cse_process_notes (XEXP (x, 1), NULL_RTX, changed);
6148 return x;
6150 case SIGN_EXTEND:
6151 case ZERO_EXTEND:
6152 case SUBREG:
6154 rtx new_rtx = cse_process_notes (XEXP (x, 0), object, changed);
6155 /* We don't substitute VOIDmode constants into these rtx,
6156 since they would impede folding. */
6157 if (GET_MODE (new_rtx) != VOIDmode)
6158 validate_change (object, &XEXP (x, 0), new_rtx, 0);
6159 return x;
6162 case UNSIGNED_FLOAT:
6164 rtx new_rtx = cse_process_notes (XEXP (x, 0), object, changed);
6165 /* We don't substitute negative VOIDmode constants into these rtx,
6166 since they would impede folding. */
6167 if (GET_MODE (new_rtx) != VOIDmode
6168 || (CONST_INT_P (new_rtx) && INTVAL (new_rtx) >= 0)
6169 || (CONST_DOUBLE_P (new_rtx) && CONST_DOUBLE_HIGH (new_rtx) >= 0))
6170 validate_change (object, &XEXP (x, 0), new_rtx, 0);
6171 return x;
6174 case REG:
6175 i = REG_QTY (REGNO (x));
6177 /* Return a constant or a constant register. */
6178 if (REGNO_QTY_VALID_P (REGNO (x)))
6180 struct qty_table_elem *ent = &qty_table[i];
6182 if (ent->const_rtx != NULL_RTX
6183 && (CONSTANT_P (ent->const_rtx)
6184 || REG_P (ent->const_rtx)))
6186 rtx new_rtx = gen_lowpart (GET_MODE (x), ent->const_rtx);
6187 if (new_rtx)
6188 return copy_rtx (new_rtx);
6192 /* Otherwise, canonicalize this register. */
6193 return canon_reg (x, NULL);
6195 default:
6196 break;
6199 for (i = 0; i < GET_RTX_LENGTH (code); i++)
6200 if (fmt[i] == 'e')
6201 validate_change (object, &XEXP (x, i),
6202 cse_process_notes (XEXP (x, i), object, changed), 0);
6204 return x;
6207 static rtx
6208 cse_process_notes (rtx x, rtx object, bool *changed)
6210 rtx new_rtx = cse_process_notes_1 (x, object, changed);
6211 if (new_rtx != x)
6212 *changed = true;
6213 return new_rtx;
6217 /* Find a path in the CFG, starting with FIRST_BB to perform CSE on.
6219 DATA is a pointer to a struct cse_basic_block_data, that is used to
6220 describe the path.
6221 It is filled with a queue of basic blocks, starting with FIRST_BB
6222 and following a trace through the CFG.
6224 If all paths starting at FIRST_BB have been followed, or no new path
6225 starting at FIRST_BB can be constructed, this function returns FALSE.
6226 Otherwise, DATA->path is filled and the function returns TRUE indicating
6227 that a path to follow was found.
6229 If FOLLOW_JUMPS is false, the maximum path length is 1 and the only
6230 block in the path will be FIRST_BB. */
6232 static bool
6233 cse_find_path (basic_block first_bb, struct cse_basic_block_data *data,
6234 int follow_jumps)
6236 basic_block bb;
6237 edge e;
6238 int path_size;
6240 bitmap_set_bit (cse_visited_basic_blocks, first_bb->index);
6242 /* See if there is a previous path. */
6243 path_size = data->path_size;
6245 /* There is a previous path. Make sure it started with FIRST_BB. */
6246 if (path_size)
6247 gcc_assert (data->path[0].bb == first_bb);
6249 /* There was only one basic block in the last path. Clear the path and
6250 return, so that paths starting at another basic block can be tried. */
6251 if (path_size == 1)
6253 path_size = 0;
6254 goto done;
6257 /* If the path was empty from the beginning, construct a new path. */
6258 if (path_size == 0)
6259 data->path[path_size++].bb = first_bb;
6260 else
6262 /* Otherwise, path_size must be equal to or greater than 2, because
6263 a previous path exists that is at least two basic blocks long.
6265 Update the previous branch path, if any. If the last branch was
6266 previously along the branch edge, take the fallthrough edge now. */
6267 while (path_size >= 2)
6269 basic_block last_bb_in_path, previous_bb_in_path;
6270 edge e;
6272 --path_size;
6273 last_bb_in_path = data->path[path_size].bb;
6274 previous_bb_in_path = data->path[path_size - 1].bb;
6276 /* If we previously followed a path along the branch edge, try
6277 the fallthru edge now. */
6278 if (EDGE_COUNT (previous_bb_in_path->succs) == 2
6279 && any_condjump_p (BB_END (previous_bb_in_path))
6280 && (e = find_edge (previous_bb_in_path, last_bb_in_path))
6281 && e == BRANCH_EDGE (previous_bb_in_path))
6283 bb = FALLTHRU_EDGE (previous_bb_in_path)->dest;
6284 if (bb != EXIT_BLOCK_PTR_FOR_FN (cfun)
6285 && single_pred_p (bb)
6286 /* We used to assert here that we would only see blocks
6287 that we have not visited yet. But we may end up
6288 visiting basic blocks twice if the CFG has changed
6289 in this run of cse_main, because when the CFG changes
6290 the topological sort of the CFG also changes. A basic
6291 blocks that previously had more than two predecessors
6292 may now have a single predecessor, and become part of
6293 a path that starts at another basic block.
6295 We still want to visit each basic block only once, so
6296 halt the path here if we have already visited BB. */
6297 && !bitmap_bit_p (cse_visited_basic_blocks, bb->index))
6299 bitmap_set_bit (cse_visited_basic_blocks, bb->index);
6300 data->path[path_size++].bb = bb;
6301 break;
6305 data->path[path_size].bb = NULL;
6308 /* If only one block remains in the path, bail. */
6309 if (path_size == 1)
6311 path_size = 0;
6312 goto done;
6316 /* Extend the path if possible. */
6317 if (follow_jumps)
6319 bb = data->path[path_size - 1].bb;
6320 while (bb && path_size < PARAM_VALUE (PARAM_MAX_CSE_PATH_LENGTH))
6322 if (single_succ_p (bb))
6323 e = single_succ_edge (bb);
6324 else if (EDGE_COUNT (bb->succs) == 2
6325 && any_condjump_p (BB_END (bb)))
6327 /* First try to follow the branch. If that doesn't lead
6328 to a useful path, follow the fallthru edge. */
6329 e = BRANCH_EDGE (bb);
6330 if (!single_pred_p (e->dest))
6331 e = FALLTHRU_EDGE (bb);
6333 else
6334 e = NULL;
6336 if (e
6337 && !((e->flags & EDGE_ABNORMAL_CALL) && cfun->has_nonlocal_label)
6338 && e->dest != EXIT_BLOCK_PTR_FOR_FN (cfun)
6339 && single_pred_p (e->dest)
6340 /* Avoid visiting basic blocks twice. The large comment
6341 above explains why this can happen. */
6342 && !bitmap_bit_p (cse_visited_basic_blocks, e->dest->index))
6344 basic_block bb2 = e->dest;
6345 bitmap_set_bit (cse_visited_basic_blocks, bb2->index);
6346 data->path[path_size++].bb = bb2;
6347 bb = bb2;
6349 else
6350 bb = NULL;
6354 done:
6355 data->path_size = path_size;
6356 return path_size != 0;
6359 /* Dump the path in DATA to file F. NSETS is the number of sets
6360 in the path. */
6362 static void
6363 cse_dump_path (struct cse_basic_block_data *data, int nsets, FILE *f)
6365 int path_entry;
6367 fprintf (f, ";; Following path with %d sets: ", nsets);
6368 for (path_entry = 0; path_entry < data->path_size; path_entry++)
6369 fprintf (f, "%d ", (data->path[path_entry].bb)->index);
6370 fputc ('\n', dump_file);
6371 fflush (f);
6375 /* Return true if BB has exception handling successor edges. */
6377 static bool
6378 have_eh_succ_edges (basic_block bb)
6380 edge e;
6381 edge_iterator ei;
6383 FOR_EACH_EDGE (e, ei, bb->succs)
6384 if (e->flags & EDGE_EH)
6385 return true;
6387 return false;
6391 /* Scan to the end of the path described by DATA. Return an estimate of
6392 the total number of SETs of all insns in the path. */
6394 static void
6395 cse_prescan_path (struct cse_basic_block_data *data)
6397 int nsets = 0;
6398 int path_size = data->path_size;
6399 int path_entry;
6401 /* Scan to end of each basic block in the path. */
6402 for (path_entry = 0; path_entry < path_size; path_entry++)
6404 basic_block bb;
6405 rtx_insn *insn;
6407 bb = data->path[path_entry].bb;
6409 FOR_BB_INSNS (bb, insn)
6411 if (!INSN_P (insn))
6412 continue;
6414 /* A PARALLEL can have lots of SETs in it,
6415 especially if it is really an ASM_OPERANDS. */
6416 if (GET_CODE (PATTERN (insn)) == PARALLEL)
6417 nsets += XVECLEN (PATTERN (insn), 0);
6418 else
6419 nsets += 1;
6423 data->nsets = nsets;
6426 /* Return true if the pattern of INSN uses a LABEL_REF for which
6427 there isn't a REG_LABEL_OPERAND note. */
6429 static bool
6430 check_for_label_ref (rtx_insn *insn)
6432 /* If this insn uses a LABEL_REF and there isn't a REG_LABEL_OPERAND
6433 note for it, we must rerun jump since it needs to place the note. If
6434 this is a LABEL_REF for a CODE_LABEL that isn't in the insn chain,
6435 don't do this since no REG_LABEL_OPERAND will be added. */
6436 subrtx_iterator::array_type array;
6437 FOR_EACH_SUBRTX (iter, array, PATTERN (insn), ALL)
6439 const_rtx x = *iter;
6440 if (GET_CODE (x) == LABEL_REF
6441 && !LABEL_REF_NONLOCAL_P (x)
6442 && (!JUMP_P (insn)
6443 || !label_is_jump_target_p (LABEL_REF_LABEL (x), insn))
6444 && LABEL_P (LABEL_REF_LABEL (x))
6445 && INSN_UID (LABEL_REF_LABEL (x)) != 0
6446 && !find_reg_note (insn, REG_LABEL_OPERAND, LABEL_REF_LABEL (x)))
6447 return true;
6449 return false;
6452 /* Process a single extended basic block described by EBB_DATA. */
6454 static void
6455 cse_extended_basic_block (struct cse_basic_block_data *ebb_data)
6457 int path_size = ebb_data->path_size;
6458 int path_entry;
6459 int num_insns = 0;
6461 /* Allocate the space needed by qty_table. */
6462 qty_table = XNEWVEC (struct qty_table_elem, max_qty);
6464 new_basic_block ();
6465 cse_ebb_live_in = df_get_live_in (ebb_data->path[0].bb);
6466 cse_ebb_live_out = df_get_live_out (ebb_data->path[path_size - 1].bb);
6467 for (path_entry = 0; path_entry < path_size; path_entry++)
6469 basic_block bb;
6470 rtx_insn *insn;
6472 bb = ebb_data->path[path_entry].bb;
6474 /* Invalidate recorded information for eh regs if there is an EH
6475 edge pointing to that bb. */
6476 if (bb_has_eh_pred (bb))
6478 df_ref def;
6480 FOR_EACH_ARTIFICIAL_DEF (def, bb->index)
6481 if (DF_REF_FLAGS (def) & DF_REF_AT_TOP)
6482 invalidate (DF_REF_REG (def), GET_MODE (DF_REF_REG (def)));
6485 optimize_this_for_speed_p = optimize_bb_for_speed_p (bb);
6486 FOR_BB_INSNS (bb, insn)
6488 /* If we have processed 1,000 insns, flush the hash table to
6489 avoid extreme quadratic behavior. We must not include NOTEs
6490 in the count since there may be more of them when generating
6491 debugging information. If we clear the table at different
6492 times, code generated with -g -O might be different than code
6493 generated with -O but not -g.
6495 FIXME: This is a real kludge and needs to be done some other
6496 way. */
6497 if (NONDEBUG_INSN_P (insn)
6498 && num_insns++ > PARAM_VALUE (PARAM_MAX_CSE_INSNS))
6500 flush_hash_table ();
6501 num_insns = 0;
6504 if (INSN_P (insn))
6506 /* Process notes first so we have all notes in canonical forms
6507 when looking for duplicate operations. */
6508 if (REG_NOTES (insn))
6510 bool changed = false;
6511 REG_NOTES (insn) = cse_process_notes (REG_NOTES (insn),
6512 NULL_RTX, &changed);
6513 if (changed)
6514 df_notes_rescan (insn);
6517 cse_insn (insn);
6519 /* If we haven't already found an insn where we added a LABEL_REF,
6520 check this one. */
6521 if (INSN_P (insn) && !recorded_label_ref
6522 && check_for_label_ref (insn))
6523 recorded_label_ref = true;
6525 if (HAVE_cc0 && NONDEBUG_INSN_P (insn))
6527 /* If the previous insn sets CC0 and this insn no
6528 longer references CC0, delete the previous insn.
6529 Here we use fact that nothing expects CC0 to be
6530 valid over an insn, which is true until the final
6531 pass. */
6532 rtx_insn *prev_insn;
6533 rtx tem;
6535 prev_insn = prev_nonnote_nondebug_insn (insn);
6536 if (prev_insn && NONJUMP_INSN_P (prev_insn)
6537 && (tem = single_set (prev_insn)) != NULL_RTX
6538 && SET_DEST (tem) == cc0_rtx
6539 && ! reg_mentioned_p (cc0_rtx, PATTERN (insn)))
6540 delete_insn (prev_insn);
6542 /* If this insn is not the last insn in the basic
6543 block, it will be PREV_INSN(insn) in the next
6544 iteration. If we recorded any CC0-related
6545 information for this insn, remember it. */
6546 if (insn != BB_END (bb))
6548 prev_insn_cc0 = this_insn_cc0;
6549 prev_insn_cc0_mode = this_insn_cc0_mode;
6555 /* With non-call exceptions, we are not always able to update
6556 the CFG properly inside cse_insn. So clean up possibly
6557 redundant EH edges here. */
6558 if (cfun->can_throw_non_call_exceptions && have_eh_succ_edges (bb))
6559 cse_cfg_altered |= purge_dead_edges (bb);
6561 /* If we changed a conditional jump, we may have terminated
6562 the path we are following. Check that by verifying that
6563 the edge we would take still exists. If the edge does
6564 not exist anymore, purge the remainder of the path.
6565 Note that this will cause us to return to the caller. */
6566 if (path_entry < path_size - 1)
6568 basic_block next_bb = ebb_data->path[path_entry + 1].bb;
6569 if (!find_edge (bb, next_bb))
6573 path_size--;
6575 /* If we truncate the path, we must also reset the
6576 visited bit on the remaining blocks in the path,
6577 or we will never visit them at all. */
6578 bitmap_clear_bit (cse_visited_basic_blocks,
6579 ebb_data->path[path_size].bb->index);
6580 ebb_data->path[path_size].bb = NULL;
6582 while (path_size - 1 != path_entry);
6583 ebb_data->path_size = path_size;
6587 /* If this is a conditional jump insn, record any known
6588 equivalences due to the condition being tested. */
6589 insn = BB_END (bb);
6590 if (path_entry < path_size - 1
6591 && JUMP_P (insn)
6592 && single_set (insn)
6593 && any_condjump_p (insn))
6595 basic_block next_bb = ebb_data->path[path_entry + 1].bb;
6596 bool taken = (next_bb == BRANCH_EDGE (bb)->dest);
6597 record_jump_equiv (insn, taken);
6600 /* Clear the CC0-tracking related insns, they can't provide
6601 useful information across basic block boundaries. */
6602 prev_insn_cc0 = 0;
6605 gcc_assert (next_qty <= max_qty);
6607 free (qty_table);
6611 /* Perform cse on the instructions of a function.
6612 F is the first instruction.
6613 NREGS is one plus the highest pseudo-reg number used in the instruction.
6615 Return 2 if jump optimizations should be redone due to simplifications
6616 in conditional jump instructions.
6617 Return 1 if the CFG should be cleaned up because it has been modified.
6618 Return 0 otherwise. */
6620 static int
6621 cse_main (rtx_insn *f ATTRIBUTE_UNUSED, int nregs)
6623 struct cse_basic_block_data ebb_data;
6624 basic_block bb;
6625 int *rc_order = XNEWVEC (int, last_basic_block_for_fn (cfun));
6626 int i, n_blocks;
6628 df_set_flags (DF_LR_RUN_DCE);
6629 df_note_add_problem ();
6630 df_analyze ();
6631 df_set_flags (DF_DEFER_INSN_RESCAN);
6633 reg_scan (get_insns (), max_reg_num ());
6634 init_cse_reg_info (nregs);
6636 ebb_data.path = XNEWVEC (struct branch_path,
6637 PARAM_VALUE (PARAM_MAX_CSE_PATH_LENGTH));
6639 cse_cfg_altered = false;
6640 cse_jumps_altered = false;
6641 recorded_label_ref = false;
6642 constant_pool_entries_cost = 0;
6643 constant_pool_entries_regcost = 0;
6644 ebb_data.path_size = 0;
6645 ebb_data.nsets = 0;
6646 rtl_hooks = cse_rtl_hooks;
6648 init_recog ();
6649 init_alias_analysis ();
6651 reg_eqv_table = XNEWVEC (struct reg_eqv_elem, nregs);
6653 /* Set up the table of already visited basic blocks. */
6654 cse_visited_basic_blocks = sbitmap_alloc (last_basic_block_for_fn (cfun));
6655 bitmap_clear (cse_visited_basic_blocks);
6657 /* Loop over basic blocks in reverse completion order (RPO),
6658 excluding the ENTRY and EXIT blocks. */
6659 n_blocks = pre_and_rev_post_order_compute (NULL, rc_order, false);
6660 i = 0;
6661 while (i < n_blocks)
6663 /* Find the first block in the RPO queue that we have not yet
6664 processed before. */
6667 bb = BASIC_BLOCK_FOR_FN (cfun, rc_order[i++]);
6669 while (bitmap_bit_p (cse_visited_basic_blocks, bb->index)
6670 && i < n_blocks);
6672 /* Find all paths starting with BB, and process them. */
6673 while (cse_find_path (bb, &ebb_data, flag_cse_follow_jumps))
6675 /* Pre-scan the path. */
6676 cse_prescan_path (&ebb_data);
6678 /* If this basic block has no sets, skip it. */
6679 if (ebb_data.nsets == 0)
6680 continue;
6682 /* Get a reasonable estimate for the maximum number of qty's
6683 needed for this path. For this, we take the number of sets
6684 and multiply that by MAX_RECOG_OPERANDS. */
6685 max_qty = ebb_data.nsets * MAX_RECOG_OPERANDS;
6687 /* Dump the path we're about to process. */
6688 if (dump_file)
6689 cse_dump_path (&ebb_data, ebb_data.nsets, dump_file);
6691 cse_extended_basic_block (&ebb_data);
6695 /* Clean up. */
6696 end_alias_analysis ();
6697 free (reg_eqv_table);
6698 free (ebb_data.path);
6699 sbitmap_free (cse_visited_basic_blocks);
6700 free (rc_order);
6701 rtl_hooks = general_rtl_hooks;
6703 if (cse_jumps_altered || recorded_label_ref)
6704 return 2;
6705 else if (cse_cfg_altered)
6706 return 1;
6707 else
6708 return 0;
6711 /* Count the number of times registers are used (not set) in X.
6712 COUNTS is an array in which we accumulate the count, INCR is how much
6713 we count each register usage.
6715 Don't count a usage of DEST, which is the SET_DEST of a SET which
6716 contains X in its SET_SRC. This is because such a SET does not
6717 modify the liveness of DEST.
6718 DEST is set to pc_rtx for a trapping insn, or for an insn with side effects.
6719 We must then count uses of a SET_DEST regardless, because the insn can't be
6720 deleted here. */
6722 static void
6723 count_reg_usage (rtx x, int *counts, rtx dest, int incr)
6725 enum rtx_code code;
6726 rtx note;
6727 const char *fmt;
6728 int i, j;
6730 if (x == 0)
6731 return;
6733 switch (code = GET_CODE (x))
6735 case REG:
6736 if (x != dest)
6737 counts[REGNO (x)] += incr;
6738 return;
6740 case PC:
6741 case CC0:
6742 case CONST:
6743 CASE_CONST_ANY:
6744 case SYMBOL_REF:
6745 case LABEL_REF:
6746 return;
6748 case CLOBBER:
6749 /* If we are clobbering a MEM, mark any registers inside the address
6750 as being used. */
6751 if (MEM_P (XEXP (x, 0)))
6752 count_reg_usage (XEXP (XEXP (x, 0), 0), counts, NULL_RTX, incr);
6753 return;
6755 case SET:
6756 /* Unless we are setting a REG, count everything in SET_DEST. */
6757 if (!REG_P (SET_DEST (x)))
6758 count_reg_usage (SET_DEST (x), counts, NULL_RTX, incr);
6759 count_reg_usage (SET_SRC (x), counts,
6760 dest ? dest : SET_DEST (x),
6761 incr);
6762 return;
6764 case DEBUG_INSN:
6765 return;
6767 case CALL_INSN:
6768 case INSN:
6769 case JUMP_INSN:
6770 /* We expect dest to be NULL_RTX here. If the insn may throw,
6771 or if it cannot be deleted due to side-effects, mark this fact
6772 by setting DEST to pc_rtx. */
6773 if ((!cfun->can_delete_dead_exceptions && !insn_nothrow_p (x))
6774 || side_effects_p (PATTERN (x)))
6775 dest = pc_rtx;
6776 if (code == CALL_INSN)
6777 count_reg_usage (CALL_INSN_FUNCTION_USAGE (x), counts, dest, incr);
6778 count_reg_usage (PATTERN (x), counts, dest, incr);
6780 /* Things used in a REG_EQUAL note aren't dead since loop may try to
6781 use them. */
6783 note = find_reg_equal_equiv_note (x);
6784 if (note)
6786 rtx eqv = XEXP (note, 0);
6788 if (GET_CODE (eqv) == EXPR_LIST)
6789 /* This REG_EQUAL note describes the result of a function call.
6790 Process all the arguments. */
6793 count_reg_usage (XEXP (eqv, 0), counts, dest, incr);
6794 eqv = XEXP (eqv, 1);
6796 while (eqv && GET_CODE (eqv) == EXPR_LIST);
6797 else
6798 count_reg_usage (eqv, counts, dest, incr);
6800 return;
6802 case EXPR_LIST:
6803 if (REG_NOTE_KIND (x) == REG_EQUAL
6804 || (REG_NOTE_KIND (x) != REG_NONNEG && GET_CODE (XEXP (x,0)) == USE)
6805 /* FUNCTION_USAGE expression lists may include (CLOBBER (mem /u)),
6806 involving registers in the address. */
6807 || GET_CODE (XEXP (x, 0)) == CLOBBER)
6808 count_reg_usage (XEXP (x, 0), counts, NULL_RTX, incr);
6810 count_reg_usage (XEXP (x, 1), counts, NULL_RTX, incr);
6811 return;
6813 case ASM_OPERANDS:
6814 /* Iterate over just the inputs, not the constraints as well. */
6815 for (i = ASM_OPERANDS_INPUT_LENGTH (x) - 1; i >= 0; i--)
6816 count_reg_usage (ASM_OPERANDS_INPUT (x, i), counts, dest, incr);
6817 return;
6819 case INSN_LIST:
6820 case INT_LIST:
6821 gcc_unreachable ();
6823 default:
6824 break;
6827 fmt = GET_RTX_FORMAT (code);
6828 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
6830 if (fmt[i] == 'e')
6831 count_reg_usage (XEXP (x, i), counts, dest, incr);
6832 else if (fmt[i] == 'E')
6833 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
6834 count_reg_usage (XVECEXP (x, i, j), counts, dest, incr);
6838 /* Return true if X is a dead register. */
6840 static inline int
6841 is_dead_reg (const_rtx x, int *counts)
6843 return (REG_P (x)
6844 && REGNO (x) >= FIRST_PSEUDO_REGISTER
6845 && counts[REGNO (x)] == 0);
6848 /* Return true if set is live. */
6849 static bool
6850 set_live_p (rtx set, rtx_insn *insn ATTRIBUTE_UNUSED, /* Only used with HAVE_cc0. */
6851 int *counts)
6853 rtx tem;
6855 if (set_noop_p (set))
6858 else if (GET_CODE (SET_DEST (set)) == CC0
6859 && !side_effects_p (SET_SRC (set))
6860 && ((tem = next_nonnote_nondebug_insn (insn)) == NULL_RTX
6861 || !INSN_P (tem)
6862 || !reg_referenced_p (cc0_rtx, PATTERN (tem))))
6863 return false;
6864 else if (!is_dead_reg (SET_DEST (set), counts)
6865 || side_effects_p (SET_SRC (set)))
6866 return true;
6867 return false;
6870 /* Return true if insn is live. */
6872 static bool
6873 insn_live_p (rtx_insn *insn, int *counts)
6875 int i;
6876 if (!cfun->can_delete_dead_exceptions && !insn_nothrow_p (insn))
6877 return true;
6878 else if (GET_CODE (PATTERN (insn)) == SET)
6879 return set_live_p (PATTERN (insn), insn, counts);
6880 else if (GET_CODE (PATTERN (insn)) == PARALLEL)
6882 for (i = XVECLEN (PATTERN (insn), 0) - 1; i >= 0; i--)
6884 rtx elt = XVECEXP (PATTERN (insn), 0, i);
6886 if (GET_CODE (elt) == SET)
6888 if (set_live_p (elt, insn, counts))
6889 return true;
6891 else if (GET_CODE (elt) != CLOBBER && GET_CODE (elt) != USE)
6892 return true;
6894 return false;
6896 else if (DEBUG_INSN_P (insn))
6898 rtx_insn *next;
6900 for (next = NEXT_INSN (insn); next; next = NEXT_INSN (next))
6901 if (NOTE_P (next))
6902 continue;
6903 else if (!DEBUG_INSN_P (next))
6904 return true;
6905 else if (INSN_VAR_LOCATION_DECL (insn) == INSN_VAR_LOCATION_DECL (next))
6906 return false;
6908 return true;
6910 else
6911 return true;
6914 /* Count the number of stores into pseudo. Callback for note_stores. */
6916 static void
6917 count_stores (rtx x, const_rtx set ATTRIBUTE_UNUSED, void *data)
6919 int *counts = (int *) data;
6920 if (REG_P (x) && REGNO (x) >= FIRST_PSEUDO_REGISTER)
6921 counts[REGNO (x)]++;
6924 /* Return if DEBUG_INSN pattern PAT needs to be reset because some dead
6925 pseudo doesn't have a replacement. COUNTS[X] is zero if register X
6926 is dead and REPLACEMENTS[X] is null if it has no replacemenet.
6927 Set *SEEN_REPL to true if we see a dead register that does have
6928 a replacement. */
6930 static bool
6931 is_dead_debug_insn (const_rtx pat, int *counts, rtx *replacements,
6932 bool *seen_repl)
6934 subrtx_iterator::array_type array;
6935 FOR_EACH_SUBRTX (iter, array, pat, NONCONST)
6937 const_rtx x = *iter;
6938 if (is_dead_reg (x, counts))
6940 if (replacements && replacements[REGNO (x)] != NULL_RTX)
6941 *seen_repl = true;
6942 else
6943 return true;
6946 return false;
6949 /* Replace a dead pseudo in a DEBUG_INSN with replacement DEBUG_EXPR.
6950 Callback for simplify_replace_fn_rtx. */
6952 static rtx
6953 replace_dead_reg (rtx x, const_rtx old_rtx ATTRIBUTE_UNUSED, void *data)
6955 rtx *replacements = (rtx *) data;
6957 if (REG_P (x)
6958 && REGNO (x) >= FIRST_PSEUDO_REGISTER
6959 && replacements[REGNO (x)] != NULL_RTX)
6961 if (GET_MODE (x) == GET_MODE (replacements[REGNO (x)]))
6962 return replacements[REGNO (x)];
6963 return lowpart_subreg (GET_MODE (x), replacements[REGNO (x)],
6964 GET_MODE (replacements[REGNO (x)]));
6966 return NULL_RTX;
6969 /* Scan all the insns and delete any that are dead; i.e., they store a register
6970 that is never used or they copy a register to itself.
6972 This is used to remove insns made obviously dead by cse, loop or other
6973 optimizations. It improves the heuristics in loop since it won't try to
6974 move dead invariants out of loops or make givs for dead quantities. The
6975 remaining passes of the compilation are also sped up. */
6978 delete_trivially_dead_insns (rtx_insn *insns, int nreg)
6980 int *counts;
6981 rtx_insn *insn, *prev;
6982 rtx *replacements = NULL;
6983 int ndead = 0;
6985 timevar_push (TV_DELETE_TRIVIALLY_DEAD);
6986 /* First count the number of times each register is used. */
6987 if (MAY_HAVE_DEBUG_INSNS)
6989 counts = XCNEWVEC (int, nreg * 3);
6990 for (insn = insns; insn; insn = NEXT_INSN (insn))
6991 if (DEBUG_INSN_P (insn))
6992 count_reg_usage (INSN_VAR_LOCATION_LOC (insn), counts + nreg,
6993 NULL_RTX, 1);
6994 else if (INSN_P (insn))
6996 count_reg_usage (insn, counts, NULL_RTX, 1);
6997 note_stores (PATTERN (insn), count_stores, counts + nreg * 2);
6999 /* If there can be debug insns, COUNTS are 3 consecutive arrays.
7000 First one counts how many times each pseudo is used outside
7001 of debug insns, second counts how many times each pseudo is
7002 used in debug insns and third counts how many times a pseudo
7003 is stored. */
7005 else
7007 counts = XCNEWVEC (int, nreg);
7008 for (insn = insns; insn; insn = NEXT_INSN (insn))
7009 if (INSN_P (insn))
7010 count_reg_usage (insn, counts, NULL_RTX, 1);
7011 /* If no debug insns can be present, COUNTS is just an array
7012 which counts how many times each pseudo is used. */
7014 /* Pseudo PIC register should be considered as used due to possible
7015 new usages generated. */
7016 if (!reload_completed
7017 && pic_offset_table_rtx
7018 && REGNO (pic_offset_table_rtx) >= FIRST_PSEUDO_REGISTER)
7019 counts[REGNO (pic_offset_table_rtx)]++;
7020 /* Go from the last insn to the first and delete insns that only set unused
7021 registers or copy a register to itself. As we delete an insn, remove
7022 usage counts for registers it uses.
7024 The first jump optimization pass may leave a real insn as the last
7025 insn in the function. We must not skip that insn or we may end
7026 up deleting code that is not really dead.
7028 If some otherwise unused register is only used in DEBUG_INSNs,
7029 try to create a DEBUG_EXPR temporary and emit a DEBUG_INSN before
7030 the setter. Then go through DEBUG_INSNs and if a DEBUG_EXPR
7031 has been created for the unused register, replace it with
7032 the DEBUG_EXPR, otherwise reset the DEBUG_INSN. */
7033 for (insn = get_last_insn (); insn; insn = prev)
7035 int live_insn = 0;
7037 prev = PREV_INSN (insn);
7038 if (!INSN_P (insn))
7039 continue;
7041 live_insn = insn_live_p (insn, counts);
7043 /* If this is a dead insn, delete it and show registers in it aren't
7044 being used. */
7046 if (! live_insn && dbg_cnt (delete_trivial_dead))
7048 if (DEBUG_INSN_P (insn))
7049 count_reg_usage (INSN_VAR_LOCATION_LOC (insn), counts + nreg,
7050 NULL_RTX, -1);
7051 else
7053 rtx set;
7054 if (MAY_HAVE_DEBUG_INSNS
7055 && (set = single_set (insn)) != NULL_RTX
7056 && is_dead_reg (SET_DEST (set), counts)
7057 /* Used at least once in some DEBUG_INSN. */
7058 && counts[REGNO (SET_DEST (set)) + nreg] > 0
7059 /* And set exactly once. */
7060 && counts[REGNO (SET_DEST (set)) + nreg * 2] == 1
7061 && !side_effects_p (SET_SRC (set))
7062 && asm_noperands (PATTERN (insn)) < 0)
7064 rtx dval, bind_var_loc;
7065 rtx_insn *bind;
7067 /* Create DEBUG_EXPR (and DEBUG_EXPR_DECL). */
7068 dval = make_debug_expr_from_rtl (SET_DEST (set));
7070 /* Emit a debug bind insn before the insn in which
7071 reg dies. */
7072 bind_var_loc =
7073 gen_rtx_VAR_LOCATION (GET_MODE (SET_DEST (set)),
7074 DEBUG_EXPR_TREE_DECL (dval),
7075 SET_SRC (set),
7076 VAR_INIT_STATUS_INITIALIZED);
7077 count_reg_usage (bind_var_loc, counts + nreg, NULL_RTX, 1);
7079 bind = emit_debug_insn_before (bind_var_loc, insn);
7080 df_insn_rescan (bind);
7082 if (replacements == NULL)
7083 replacements = XCNEWVEC (rtx, nreg);
7084 replacements[REGNO (SET_DEST (set))] = dval;
7087 count_reg_usage (insn, counts, NULL_RTX, -1);
7088 ndead++;
7090 delete_insn_and_edges (insn);
7094 if (MAY_HAVE_DEBUG_INSNS)
7096 for (insn = get_last_insn (); insn; insn = PREV_INSN (insn))
7097 if (DEBUG_INSN_P (insn))
7099 /* If this debug insn references a dead register that wasn't replaced
7100 with an DEBUG_EXPR, reset the DEBUG_INSN. */
7101 bool seen_repl = false;
7102 if (is_dead_debug_insn (INSN_VAR_LOCATION_LOC (insn),
7103 counts, replacements, &seen_repl))
7105 INSN_VAR_LOCATION_LOC (insn) = gen_rtx_UNKNOWN_VAR_LOC ();
7106 df_insn_rescan (insn);
7108 else if (seen_repl)
7110 INSN_VAR_LOCATION_LOC (insn)
7111 = simplify_replace_fn_rtx (INSN_VAR_LOCATION_LOC (insn),
7112 NULL_RTX, replace_dead_reg,
7113 replacements);
7114 df_insn_rescan (insn);
7117 free (replacements);
7120 if (dump_file && ndead)
7121 fprintf (dump_file, "Deleted %i trivially dead insns\n",
7122 ndead);
7123 /* Clean up. */
7124 free (counts);
7125 timevar_pop (TV_DELETE_TRIVIALLY_DEAD);
7126 return ndead;
7129 /* If LOC contains references to NEWREG in a different mode, change them
7130 to use NEWREG instead. */
7132 static void
7133 cse_change_cc_mode (subrtx_ptr_iterator::array_type &array,
7134 rtx *loc, rtx insn, rtx newreg)
7136 FOR_EACH_SUBRTX_PTR (iter, array, loc, NONCONST)
7138 rtx *loc = *iter;
7139 rtx x = *loc;
7140 if (x
7141 && REG_P (x)
7142 && REGNO (x) == REGNO (newreg)
7143 && GET_MODE (x) != GET_MODE (newreg))
7145 validate_change (insn, loc, newreg, 1);
7146 iter.skip_subrtxes ();
7151 /* Change the mode of any reference to the register REGNO (NEWREG) to
7152 GET_MODE (NEWREG) in INSN. */
7154 static void
7155 cse_change_cc_mode_insn (rtx_insn *insn, rtx newreg)
7157 int success;
7159 if (!INSN_P (insn))
7160 return;
7162 subrtx_ptr_iterator::array_type array;
7163 cse_change_cc_mode (array, &PATTERN (insn), insn, newreg);
7164 cse_change_cc_mode (array, &REG_NOTES (insn), insn, newreg);
7166 /* If the following assertion was triggered, there is most probably
7167 something wrong with the cc_modes_compatible back end function.
7168 CC modes only can be considered compatible if the insn - with the mode
7169 replaced by any of the compatible modes - can still be recognized. */
7170 success = apply_change_group ();
7171 gcc_assert (success);
7174 /* Change the mode of any reference to the register REGNO (NEWREG) to
7175 GET_MODE (NEWREG), starting at START. Stop before END. Stop at
7176 any instruction which modifies NEWREG. */
7178 static void
7179 cse_change_cc_mode_insns (rtx_insn *start, rtx_insn *end, rtx newreg)
7181 rtx_insn *insn;
7183 for (insn = start; insn != end; insn = NEXT_INSN (insn))
7185 if (! INSN_P (insn))
7186 continue;
7188 if (reg_set_p (newreg, insn))
7189 return;
7191 cse_change_cc_mode_insn (insn, newreg);
7195 /* BB is a basic block which finishes with CC_REG as a condition code
7196 register which is set to CC_SRC. Look through the successors of BB
7197 to find blocks which have a single predecessor (i.e., this one),
7198 and look through those blocks for an assignment to CC_REG which is
7199 equivalent to CC_SRC. CAN_CHANGE_MODE indicates whether we are
7200 permitted to change the mode of CC_SRC to a compatible mode. This
7201 returns VOIDmode if no equivalent assignments were found.
7202 Otherwise it returns the mode which CC_SRC should wind up with.
7203 ORIG_BB should be the same as BB in the outermost cse_cc_succs call,
7204 but is passed unmodified down to recursive calls in order to prevent
7205 endless recursion.
7207 The main complexity in this function is handling the mode issues.
7208 We may have more than one duplicate which we can eliminate, and we
7209 try to find a mode which will work for multiple duplicates. */
7211 static machine_mode
7212 cse_cc_succs (basic_block bb, basic_block orig_bb, rtx cc_reg, rtx cc_src,
7213 bool can_change_mode)
7215 bool found_equiv;
7216 machine_mode mode;
7217 unsigned int insn_count;
7218 edge e;
7219 rtx_insn *insns[2];
7220 machine_mode modes[2];
7221 rtx_insn *last_insns[2];
7222 unsigned int i;
7223 rtx newreg;
7224 edge_iterator ei;
7226 /* We expect to have two successors. Look at both before picking
7227 the final mode for the comparison. If we have more successors
7228 (i.e., some sort of table jump, although that seems unlikely),
7229 then we require all beyond the first two to use the same
7230 mode. */
7232 found_equiv = false;
7233 mode = GET_MODE (cc_src);
7234 insn_count = 0;
7235 FOR_EACH_EDGE (e, ei, bb->succs)
7237 rtx_insn *insn;
7238 rtx_insn *end;
7240 if (e->flags & EDGE_COMPLEX)
7241 continue;
7243 if (EDGE_COUNT (e->dest->preds) != 1
7244 || e->dest == EXIT_BLOCK_PTR_FOR_FN (cfun)
7245 /* Avoid endless recursion on unreachable blocks. */
7246 || e->dest == orig_bb)
7247 continue;
7249 end = NEXT_INSN (BB_END (e->dest));
7250 for (insn = BB_HEAD (e->dest); insn != end; insn = NEXT_INSN (insn))
7252 rtx set;
7254 if (! INSN_P (insn))
7255 continue;
7257 /* If CC_SRC is modified, we have to stop looking for
7258 something which uses it. */
7259 if (modified_in_p (cc_src, insn))
7260 break;
7262 /* Check whether INSN sets CC_REG to CC_SRC. */
7263 set = single_set (insn);
7264 if (set
7265 && REG_P (SET_DEST (set))
7266 && REGNO (SET_DEST (set)) == REGNO (cc_reg))
7268 bool found;
7269 machine_mode set_mode;
7270 machine_mode comp_mode;
7272 found = false;
7273 set_mode = GET_MODE (SET_SRC (set));
7274 comp_mode = set_mode;
7275 if (rtx_equal_p (cc_src, SET_SRC (set)))
7276 found = true;
7277 else if (GET_CODE (cc_src) == COMPARE
7278 && GET_CODE (SET_SRC (set)) == COMPARE
7279 && mode != set_mode
7280 && rtx_equal_p (XEXP (cc_src, 0),
7281 XEXP (SET_SRC (set), 0))
7282 && rtx_equal_p (XEXP (cc_src, 1),
7283 XEXP (SET_SRC (set), 1)))
7286 comp_mode = targetm.cc_modes_compatible (mode, set_mode);
7287 if (comp_mode != VOIDmode
7288 && (can_change_mode || comp_mode == mode))
7289 found = true;
7292 if (found)
7294 found_equiv = true;
7295 if (insn_count < ARRAY_SIZE (insns))
7297 insns[insn_count] = insn;
7298 modes[insn_count] = set_mode;
7299 last_insns[insn_count] = end;
7300 ++insn_count;
7302 if (mode != comp_mode)
7304 gcc_assert (can_change_mode);
7305 mode = comp_mode;
7307 /* The modified insn will be re-recognized later. */
7308 PUT_MODE (cc_src, mode);
7311 else
7313 if (set_mode != mode)
7315 /* We found a matching expression in the
7316 wrong mode, but we don't have room to
7317 store it in the array. Punt. This case
7318 should be rare. */
7319 break;
7321 /* INSN sets CC_REG to a value equal to CC_SRC
7322 with the right mode. We can simply delete
7323 it. */
7324 delete_insn (insn);
7327 /* We found an instruction to delete. Keep looking,
7328 in the hopes of finding a three-way jump. */
7329 continue;
7332 /* We found an instruction which sets the condition
7333 code, so don't look any farther. */
7334 break;
7337 /* If INSN sets CC_REG in some other way, don't look any
7338 farther. */
7339 if (reg_set_p (cc_reg, insn))
7340 break;
7343 /* If we fell off the bottom of the block, we can keep looking
7344 through successors. We pass CAN_CHANGE_MODE as false because
7345 we aren't prepared to handle compatibility between the
7346 further blocks and this block. */
7347 if (insn == end)
7349 machine_mode submode;
7351 submode = cse_cc_succs (e->dest, orig_bb, cc_reg, cc_src, false);
7352 if (submode != VOIDmode)
7354 gcc_assert (submode == mode);
7355 found_equiv = true;
7356 can_change_mode = false;
7361 if (! found_equiv)
7362 return VOIDmode;
7364 /* Now INSN_COUNT is the number of instructions we found which set
7365 CC_REG to a value equivalent to CC_SRC. The instructions are in
7366 INSNS. The modes used by those instructions are in MODES. */
7368 newreg = NULL_RTX;
7369 for (i = 0; i < insn_count; ++i)
7371 if (modes[i] != mode)
7373 /* We need to change the mode of CC_REG in INSNS[i] and
7374 subsequent instructions. */
7375 if (! newreg)
7377 if (GET_MODE (cc_reg) == mode)
7378 newreg = cc_reg;
7379 else
7380 newreg = gen_rtx_REG (mode, REGNO (cc_reg));
7382 cse_change_cc_mode_insns (NEXT_INSN (insns[i]), last_insns[i],
7383 newreg);
7386 delete_insn_and_edges (insns[i]);
7389 return mode;
7392 /* If we have a fixed condition code register (or two), walk through
7393 the instructions and try to eliminate duplicate assignments. */
7395 static void
7396 cse_condition_code_reg (void)
7398 unsigned int cc_regno_1;
7399 unsigned int cc_regno_2;
7400 rtx cc_reg_1;
7401 rtx cc_reg_2;
7402 basic_block bb;
7404 if (! targetm.fixed_condition_code_regs (&cc_regno_1, &cc_regno_2))
7405 return;
7407 cc_reg_1 = gen_rtx_REG (CCmode, cc_regno_1);
7408 if (cc_regno_2 != INVALID_REGNUM)
7409 cc_reg_2 = gen_rtx_REG (CCmode, cc_regno_2);
7410 else
7411 cc_reg_2 = NULL_RTX;
7413 FOR_EACH_BB_FN (bb, cfun)
7415 rtx_insn *last_insn;
7416 rtx cc_reg;
7417 rtx_insn *insn;
7418 rtx_insn *cc_src_insn;
7419 rtx cc_src;
7420 machine_mode mode;
7421 machine_mode orig_mode;
7423 /* Look for blocks which end with a conditional jump based on a
7424 condition code register. Then look for the instruction which
7425 sets the condition code register. Then look through the
7426 successor blocks for instructions which set the condition
7427 code register to the same value. There are other possible
7428 uses of the condition code register, but these are by far the
7429 most common and the ones which we are most likely to be able
7430 to optimize. */
7432 last_insn = BB_END (bb);
7433 if (!JUMP_P (last_insn))
7434 continue;
7436 if (reg_referenced_p (cc_reg_1, PATTERN (last_insn)))
7437 cc_reg = cc_reg_1;
7438 else if (cc_reg_2 && reg_referenced_p (cc_reg_2, PATTERN (last_insn)))
7439 cc_reg = cc_reg_2;
7440 else
7441 continue;
7443 cc_src_insn = NULL;
7444 cc_src = NULL_RTX;
7445 for (insn = PREV_INSN (last_insn);
7446 insn && insn != PREV_INSN (BB_HEAD (bb));
7447 insn = PREV_INSN (insn))
7449 rtx set;
7451 if (! INSN_P (insn))
7452 continue;
7453 set = single_set (insn);
7454 if (set
7455 && REG_P (SET_DEST (set))
7456 && REGNO (SET_DEST (set)) == REGNO (cc_reg))
7458 cc_src_insn = insn;
7459 cc_src = SET_SRC (set);
7460 break;
7462 else if (reg_set_p (cc_reg, insn))
7463 break;
7466 if (! cc_src_insn)
7467 continue;
7469 if (modified_between_p (cc_src, cc_src_insn, NEXT_INSN (last_insn)))
7470 continue;
7472 /* Now CC_REG is a condition code register used for a
7473 conditional jump at the end of the block, and CC_SRC, in
7474 CC_SRC_INSN, is the value to which that condition code
7475 register is set, and CC_SRC is still meaningful at the end of
7476 the basic block. */
7478 orig_mode = GET_MODE (cc_src);
7479 mode = cse_cc_succs (bb, bb, cc_reg, cc_src, true);
7480 if (mode != VOIDmode)
7482 gcc_assert (mode == GET_MODE (cc_src));
7483 if (mode != orig_mode)
7485 rtx newreg = gen_rtx_REG (mode, REGNO (cc_reg));
7487 cse_change_cc_mode_insn (cc_src_insn, newreg);
7489 /* Do the same in the following insns that use the
7490 current value of CC_REG within BB. */
7491 cse_change_cc_mode_insns (NEXT_INSN (cc_src_insn),
7492 NEXT_INSN (last_insn),
7493 newreg);
7500 /* Perform common subexpression elimination. Nonzero value from
7501 `cse_main' means that jumps were simplified and some code may now
7502 be unreachable, so do jump optimization again. */
7503 static unsigned int
7504 rest_of_handle_cse (void)
7506 int tem;
7508 if (dump_file)
7509 dump_flow_info (dump_file, dump_flags);
7511 tem = cse_main (get_insns (), max_reg_num ());
7513 /* If we are not running more CSE passes, then we are no longer
7514 expecting CSE to be run. But always rerun it in a cheap mode. */
7515 cse_not_expected = !flag_rerun_cse_after_loop && !flag_gcse;
7517 if (tem == 2)
7519 timevar_push (TV_JUMP);
7520 rebuild_jump_labels (get_insns ());
7521 cleanup_cfg (CLEANUP_CFG_CHANGED);
7522 timevar_pop (TV_JUMP);
7524 else if (tem == 1 || optimize > 1)
7525 cleanup_cfg (0);
7527 return 0;
7530 namespace {
7532 const pass_data pass_data_cse =
7534 RTL_PASS, /* type */
7535 "cse1", /* name */
7536 OPTGROUP_NONE, /* optinfo_flags */
7537 TV_CSE, /* tv_id */
7538 0, /* properties_required */
7539 0, /* properties_provided */
7540 0, /* properties_destroyed */
7541 0, /* todo_flags_start */
7542 TODO_df_finish, /* todo_flags_finish */
7545 class pass_cse : public rtl_opt_pass
7547 public:
7548 pass_cse (gcc::context *ctxt)
7549 : rtl_opt_pass (pass_data_cse, ctxt)
7552 /* opt_pass methods: */
7553 virtual bool gate (function *) { return optimize > 0; }
7554 virtual unsigned int execute (function *) { return rest_of_handle_cse (); }
7556 }; // class pass_cse
7558 } // anon namespace
7560 rtl_opt_pass *
7561 make_pass_cse (gcc::context *ctxt)
7563 return new pass_cse (ctxt);
7567 /* Run second CSE pass after loop optimizations. */
7568 static unsigned int
7569 rest_of_handle_cse2 (void)
7571 int tem;
7573 if (dump_file)
7574 dump_flow_info (dump_file, dump_flags);
7576 tem = cse_main (get_insns (), max_reg_num ());
7578 /* Run a pass to eliminate duplicated assignments to condition code
7579 registers. We have to run this after bypass_jumps, because it
7580 makes it harder for that pass to determine whether a jump can be
7581 bypassed safely. */
7582 cse_condition_code_reg ();
7584 delete_trivially_dead_insns (get_insns (), max_reg_num ());
7586 if (tem == 2)
7588 timevar_push (TV_JUMP);
7589 rebuild_jump_labels (get_insns ());
7590 cleanup_cfg (CLEANUP_CFG_CHANGED);
7591 timevar_pop (TV_JUMP);
7593 else if (tem == 1)
7594 cleanup_cfg (0);
7596 cse_not_expected = 1;
7597 return 0;
7601 namespace {
7603 const pass_data pass_data_cse2 =
7605 RTL_PASS, /* type */
7606 "cse2", /* name */
7607 OPTGROUP_NONE, /* optinfo_flags */
7608 TV_CSE2, /* tv_id */
7609 0, /* properties_required */
7610 0, /* properties_provided */
7611 0, /* properties_destroyed */
7612 0, /* todo_flags_start */
7613 TODO_df_finish, /* todo_flags_finish */
7616 class pass_cse2 : public rtl_opt_pass
7618 public:
7619 pass_cse2 (gcc::context *ctxt)
7620 : rtl_opt_pass (pass_data_cse2, ctxt)
7623 /* opt_pass methods: */
7624 virtual bool gate (function *)
7626 return optimize > 0 && flag_rerun_cse_after_loop;
7629 virtual unsigned int execute (function *) { return rest_of_handle_cse2 (); }
7631 }; // class pass_cse2
7633 } // anon namespace
7635 rtl_opt_pass *
7636 make_pass_cse2 (gcc::context *ctxt)
7638 return new pass_cse2 (ctxt);
7641 /* Run second CSE pass after loop optimizations. */
7642 static unsigned int
7643 rest_of_handle_cse_after_global_opts (void)
7645 int save_cfj;
7646 int tem;
7648 /* We only want to do local CSE, so don't follow jumps. */
7649 save_cfj = flag_cse_follow_jumps;
7650 flag_cse_follow_jumps = 0;
7652 rebuild_jump_labels (get_insns ());
7653 tem = cse_main (get_insns (), max_reg_num ());
7654 purge_all_dead_edges ();
7655 delete_trivially_dead_insns (get_insns (), max_reg_num ());
7657 cse_not_expected = !flag_rerun_cse_after_loop;
7659 /* If cse altered any jumps, rerun jump opts to clean things up. */
7660 if (tem == 2)
7662 timevar_push (TV_JUMP);
7663 rebuild_jump_labels (get_insns ());
7664 cleanup_cfg (CLEANUP_CFG_CHANGED);
7665 timevar_pop (TV_JUMP);
7667 else if (tem == 1)
7668 cleanup_cfg (0);
7670 flag_cse_follow_jumps = save_cfj;
7671 return 0;
7674 namespace {
7676 const pass_data pass_data_cse_after_global_opts =
7678 RTL_PASS, /* type */
7679 "cse_local", /* name */
7680 OPTGROUP_NONE, /* optinfo_flags */
7681 TV_CSE, /* tv_id */
7682 0, /* properties_required */
7683 0, /* properties_provided */
7684 0, /* properties_destroyed */
7685 0, /* todo_flags_start */
7686 TODO_df_finish, /* todo_flags_finish */
7689 class pass_cse_after_global_opts : public rtl_opt_pass
7691 public:
7692 pass_cse_after_global_opts (gcc::context *ctxt)
7693 : rtl_opt_pass (pass_data_cse_after_global_opts, ctxt)
7696 /* opt_pass methods: */
7697 virtual bool gate (function *)
7699 return optimize > 0 && flag_rerun_cse_after_global_opts;
7702 virtual unsigned int execute (function *)
7704 return rest_of_handle_cse_after_global_opts ();
7707 }; // class pass_cse_after_global_opts
7709 } // anon namespace
7711 rtl_opt_pass *
7712 make_pass_cse_after_global_opts (gcc::context *ctxt)
7714 return new pass_cse_after_global_opts (ctxt);