Daily bump.
[official-gcc.git] / gcc / cse.c
blobd7638f051f337818dad1c5ab2e1adba2847bf3ed
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 #ifdef HAVE_cc0
285 /* For machines that have a CC0, we do not record its value in the hash
286 table since its use is guaranteed to be the insn immediately following
287 its definition and any other insn is presumed to invalidate it.
289 Instead, we store below the current and last value assigned to CC0.
290 If it should happen to be a constant, it is stored in preference
291 to the actual assigned value. In case it is a constant, we store
292 the mode in which the constant should be interpreted. */
294 static rtx this_insn_cc0, prev_insn_cc0;
295 static machine_mode this_insn_cc0_mode, prev_insn_cc0_mode;
296 #endif
298 /* Insn being scanned. */
300 static rtx_insn *this_insn;
301 static bool optimize_this_for_speed_p;
303 /* Index by register number, gives the number of the next (or
304 previous) register in the chain of registers sharing the same
305 value.
307 Or -1 if this register is at the end of the chain.
309 If REG_QTY (N) == -N - 1, reg_eqv_table[N].next is undefined. */
311 /* Per-register equivalence chain. */
312 struct reg_eqv_elem
314 int next, prev;
317 /* The table of all register equivalence chains. */
318 static struct reg_eqv_elem *reg_eqv_table;
320 struct cse_reg_info
322 /* The timestamp at which this register is initialized. */
323 unsigned int timestamp;
325 /* The quantity number of the register's current contents. */
326 int reg_qty;
328 /* The number of times the register has been altered in the current
329 basic block. */
330 int reg_tick;
332 /* The REG_TICK value at which rtx's containing this register are
333 valid in the hash table. If this does not equal the current
334 reg_tick value, such expressions existing in the hash table are
335 invalid. */
336 int reg_in_table;
338 /* The SUBREG that was set when REG_TICK was last incremented. Set
339 to -1 if the last store was to the whole register, not a subreg. */
340 unsigned int subreg_ticked;
343 /* A table of cse_reg_info indexed by register numbers. */
344 static struct cse_reg_info *cse_reg_info_table;
346 /* The size of the above table. */
347 static unsigned int cse_reg_info_table_size;
349 /* The index of the first entry that has not been initialized. */
350 static unsigned int cse_reg_info_table_first_uninitialized;
352 /* The timestamp at the beginning of the current run of
353 cse_extended_basic_block. We increment this variable at the beginning of
354 the current run of cse_extended_basic_block. The timestamp field of a
355 cse_reg_info entry matches the value of this variable if and only
356 if the entry has been initialized during the current run of
357 cse_extended_basic_block. */
358 static unsigned int cse_reg_info_timestamp;
360 /* A HARD_REG_SET containing all the hard registers for which there is
361 currently a REG expression in the hash table. Note the difference
362 from the above variables, which indicate if the REG is mentioned in some
363 expression in the table. */
365 static HARD_REG_SET hard_regs_in_table;
367 /* True if CSE has altered the CFG. */
368 static bool cse_cfg_altered;
370 /* True if CSE has altered conditional jump insns in such a way
371 that jump optimization should be redone. */
372 static bool cse_jumps_altered;
374 /* True if we put a LABEL_REF into the hash table for an INSN
375 without a REG_LABEL_OPERAND, we have to rerun jump after CSE
376 to put in the note. */
377 static bool recorded_label_ref;
379 /* canon_hash stores 1 in do_not_record
380 if it notices a reference to CC0, PC, or some other volatile
381 subexpression. */
383 static int do_not_record;
385 /* canon_hash stores 1 in hash_arg_in_memory
386 if it notices a reference to memory within the expression being hashed. */
388 static int hash_arg_in_memory;
390 /* The hash table contains buckets which are chains of `struct table_elt's,
391 each recording one expression's information.
392 That expression is in the `exp' field.
394 The canon_exp field contains a canonical (from the point of view of
395 alias analysis) version of the `exp' field.
397 Those elements with the same hash code are chained in both directions
398 through the `next_same_hash' and `prev_same_hash' fields.
400 Each set of expressions with equivalent values
401 are on a two-way chain through the `next_same_value'
402 and `prev_same_value' fields, and all point with
403 the `first_same_value' field at the first element in
404 that chain. The chain is in order of increasing cost.
405 Each element's cost value is in its `cost' field.
407 The `in_memory' field is nonzero for elements that
408 involve any reference to memory. These elements are removed
409 whenever a write is done to an unidentified location in memory.
410 To be safe, we assume that a memory address is unidentified unless
411 the address is either a symbol constant or a constant plus
412 the frame pointer or argument pointer.
414 The `related_value' field is used to connect related expressions
415 (that differ by adding an integer).
416 The related expressions are chained in a circular fashion.
417 `related_value' is zero for expressions for which this
418 chain is not useful.
420 The `cost' field stores the cost of this element's expression.
421 The `regcost' field stores the value returned by approx_reg_cost for
422 this element's expression.
424 The `is_const' flag is set if the element is a constant (including
425 a fixed address).
427 The `flag' field is used as a temporary during some search routines.
429 The `mode' field is usually the same as GET_MODE (`exp'), but
430 if `exp' is a CONST_INT and has no machine mode then the `mode'
431 field is the mode it was being used as. Each constant is
432 recorded separately for each mode it is used with. */
434 struct table_elt
436 rtx exp;
437 rtx canon_exp;
438 struct table_elt *next_same_hash;
439 struct table_elt *prev_same_hash;
440 struct table_elt *next_same_value;
441 struct table_elt *prev_same_value;
442 struct table_elt *first_same_value;
443 struct table_elt *related_value;
444 int cost;
445 int regcost;
446 /* The size of this field should match the size
447 of the mode field of struct rtx_def (see rtl.h). */
448 ENUM_BITFIELD(machine_mode) mode : 8;
449 char in_memory;
450 char is_const;
451 char flag;
454 /* We don't want a lot of buckets, because we rarely have very many
455 things stored in the hash table, and a lot of buckets slows
456 down a lot of loops that happen frequently. */
457 #define HASH_SHIFT 5
458 #define HASH_SIZE (1 << HASH_SHIFT)
459 #define HASH_MASK (HASH_SIZE - 1)
461 /* Compute hash code of X in mode M. Special-case case where X is a pseudo
462 register (hard registers may require `do_not_record' to be set). */
464 #define HASH(X, M) \
465 ((REG_P (X) && REGNO (X) >= FIRST_PSEUDO_REGISTER \
466 ? (((unsigned) REG << 7) + (unsigned) REG_QTY (REGNO (X))) \
467 : canon_hash (X, M)) & HASH_MASK)
469 /* Like HASH, but without side-effects. */
470 #define SAFE_HASH(X, M) \
471 ((REG_P (X) && REGNO (X) >= FIRST_PSEUDO_REGISTER \
472 ? (((unsigned) REG << 7) + (unsigned) REG_QTY (REGNO (X))) \
473 : safe_hash (X, M)) & HASH_MASK)
475 /* Determine whether register number N is considered a fixed register for the
476 purpose of approximating register costs.
477 It is desirable to replace other regs with fixed regs, to reduce need for
478 non-fixed hard regs.
479 A reg wins if it is either the frame pointer or designated as fixed. */
480 #define FIXED_REGNO_P(N) \
481 ((N) == FRAME_POINTER_REGNUM || (N) == HARD_FRAME_POINTER_REGNUM \
482 || fixed_regs[N] || global_regs[N])
484 /* Compute cost of X, as stored in the `cost' field of a table_elt. Fixed
485 hard registers and pointers into the frame are the cheapest with a cost
486 of 0. Next come pseudos with a cost of one and other hard registers with
487 a cost of 2. Aside from these special cases, call `rtx_cost'. */
489 #define CHEAP_REGNO(N) \
490 (REGNO_PTR_FRAME_P (N) \
491 || (HARD_REGISTER_NUM_P (N) \
492 && FIXED_REGNO_P (N) && REGNO_REG_CLASS (N) != NO_REGS))
494 #define COST(X) (REG_P (X) ? 0 : notreg_cost (X, SET, 1))
495 #define COST_IN(X, OUTER, OPNO) (REG_P (X) ? 0 : notreg_cost (X, OUTER, OPNO))
497 /* Get the number of times this register has been updated in this
498 basic block. */
500 #define REG_TICK(N) (get_cse_reg_info (N)->reg_tick)
502 /* Get the point at which REG was recorded in the table. */
504 #define REG_IN_TABLE(N) (get_cse_reg_info (N)->reg_in_table)
506 /* Get the SUBREG set at the last increment to REG_TICK (-1 if not a
507 SUBREG). */
509 #define SUBREG_TICKED(N) (get_cse_reg_info (N)->subreg_ticked)
511 /* Get the quantity number for REG. */
513 #define REG_QTY(N) (get_cse_reg_info (N)->reg_qty)
515 /* Determine if the quantity number for register X represents a valid index
516 into the qty_table. */
518 #define REGNO_QTY_VALID_P(N) (REG_QTY (N) >= 0)
520 /* Compare table_elt X and Y and return true iff X is cheaper than Y. */
522 #define CHEAPER(X, Y) \
523 (preferable ((X)->cost, (X)->regcost, (Y)->cost, (Y)->regcost) < 0)
525 static struct table_elt *table[HASH_SIZE];
527 /* Chain of `struct table_elt's made so far for this function
528 but currently removed from the table. */
530 static struct table_elt *free_element_chain;
532 /* Set to the cost of a constant pool reference if one was found for a
533 symbolic constant. If this was found, it means we should try to
534 convert constants into constant pool entries if they don't fit in
535 the insn. */
537 static int constant_pool_entries_cost;
538 static int constant_pool_entries_regcost;
540 /* Trace a patch through the CFG. */
542 struct branch_path
544 /* The basic block for this path entry. */
545 basic_block bb;
548 /* This data describes a block that will be processed by
549 cse_extended_basic_block. */
551 struct cse_basic_block_data
553 /* Total number of SETs in block. */
554 int nsets;
555 /* Size of current branch path, if any. */
556 int path_size;
557 /* Current path, indicating which basic_blocks will be processed. */
558 struct branch_path *path;
562 /* Pointers to the live in/live out bitmaps for the boundaries of the
563 current EBB. */
564 static bitmap cse_ebb_live_in, cse_ebb_live_out;
566 /* A simple bitmap to track which basic blocks have been visited
567 already as part of an already processed extended basic block. */
568 static sbitmap cse_visited_basic_blocks;
570 static bool fixed_base_plus_p (rtx x);
571 static int notreg_cost (rtx, enum rtx_code, int);
572 static int preferable (int, int, int, int);
573 static void new_basic_block (void);
574 static void make_new_qty (unsigned int, machine_mode);
575 static void make_regs_eqv (unsigned int, unsigned int);
576 static void delete_reg_equiv (unsigned int);
577 static int mention_regs (rtx);
578 static int insert_regs (rtx, struct table_elt *, int);
579 static void remove_from_table (struct table_elt *, unsigned);
580 static void remove_pseudo_from_table (rtx, unsigned);
581 static struct table_elt *lookup (rtx, unsigned, machine_mode);
582 static struct table_elt *lookup_for_remove (rtx, unsigned, machine_mode);
583 static rtx lookup_as_function (rtx, enum rtx_code);
584 static struct table_elt *insert_with_costs (rtx, struct table_elt *, unsigned,
585 machine_mode, int, int);
586 static struct table_elt *insert (rtx, struct table_elt *, unsigned,
587 machine_mode);
588 static void merge_equiv_classes (struct table_elt *, struct table_elt *);
589 static void invalidate (rtx, machine_mode);
590 static void remove_invalid_refs (unsigned int);
591 static void remove_invalid_subreg_refs (unsigned int, unsigned int,
592 machine_mode);
593 static void rehash_using_reg (rtx);
594 static void invalidate_memory (void);
595 static void invalidate_for_call (void);
596 static rtx use_related_value (rtx, struct table_elt *);
598 static inline unsigned canon_hash (rtx, machine_mode);
599 static inline unsigned safe_hash (rtx, machine_mode);
600 static inline unsigned hash_rtx_string (const char *);
602 static rtx canon_reg (rtx, rtx_insn *);
603 static enum rtx_code find_comparison_args (enum rtx_code, rtx *, rtx *,
604 machine_mode *,
605 machine_mode *);
606 static rtx fold_rtx (rtx, rtx_insn *);
607 static rtx equiv_constant (rtx);
608 static void record_jump_equiv (rtx_insn *, bool);
609 static void record_jump_cond (enum rtx_code, machine_mode, rtx, rtx,
610 int);
611 static void cse_insn (rtx_insn *);
612 static void cse_prescan_path (struct cse_basic_block_data *);
613 static void invalidate_from_clobbers (rtx_insn *);
614 static void invalidate_from_sets_and_clobbers (rtx_insn *);
615 static rtx cse_process_notes (rtx, rtx, bool *);
616 static void cse_extended_basic_block (struct cse_basic_block_data *);
617 extern void dump_class (struct table_elt*);
618 static void get_cse_reg_info_1 (unsigned int regno);
619 static struct cse_reg_info * get_cse_reg_info (unsigned int regno);
621 static void flush_hash_table (void);
622 static bool insn_live_p (rtx_insn *, int *);
623 static bool set_live_p (rtx, rtx_insn *, int *);
624 static void cse_change_cc_mode_insn (rtx_insn *, rtx);
625 static void cse_change_cc_mode_insns (rtx_insn *, rtx_insn *, rtx);
626 static machine_mode cse_cc_succs (basic_block, basic_block, rtx, rtx,
627 bool);
630 #undef RTL_HOOKS_GEN_LOWPART
631 #define RTL_HOOKS_GEN_LOWPART gen_lowpart_if_possible
633 static const struct rtl_hooks cse_rtl_hooks = RTL_HOOKS_INITIALIZER;
635 /* Nonzero if X has the form (PLUS frame-pointer integer). */
637 static bool
638 fixed_base_plus_p (rtx x)
640 switch (GET_CODE (x))
642 case REG:
643 if (x == frame_pointer_rtx || x == hard_frame_pointer_rtx)
644 return true;
645 if (x == arg_pointer_rtx && fixed_regs[ARG_POINTER_REGNUM])
646 return true;
647 return false;
649 case PLUS:
650 if (!CONST_INT_P (XEXP (x, 1)))
651 return false;
652 return fixed_base_plus_p (XEXP (x, 0));
654 default:
655 return false;
659 /* Dump the expressions in the equivalence class indicated by CLASSP.
660 This function is used only for debugging. */
661 DEBUG_FUNCTION void
662 dump_class (struct table_elt *classp)
664 struct table_elt *elt;
666 fprintf (stderr, "Equivalence chain for ");
667 print_rtl (stderr, classp->exp);
668 fprintf (stderr, ": \n");
670 for (elt = classp->first_same_value; elt; elt = elt->next_same_value)
672 print_rtl (stderr, elt->exp);
673 fprintf (stderr, "\n");
677 /* Return an estimate of the cost of the registers used in an rtx.
678 This is mostly the number of different REG expressions in the rtx;
679 however for some exceptions like fixed registers we use a cost of
680 0. If any other hard register reference occurs, return MAX_COST. */
682 static int
683 approx_reg_cost (const_rtx x)
685 int cost = 0;
686 subrtx_iterator::array_type array;
687 FOR_EACH_SUBRTX (iter, array, x, NONCONST)
689 const_rtx x = *iter;
690 if (REG_P (x))
692 unsigned int regno = REGNO (x);
693 if (!CHEAP_REGNO (regno))
695 if (regno < FIRST_PSEUDO_REGISTER)
697 if (targetm.small_register_classes_for_mode_p (GET_MODE (x)))
698 return MAX_COST;
699 cost += 2;
701 else
702 cost += 1;
706 return cost;
709 /* Return a negative value if an rtx A, whose costs are given by COST_A
710 and REGCOST_A, is more desirable than an rtx B.
711 Return a positive value if A is less desirable, or 0 if the two are
712 equally good. */
713 static int
714 preferable (int cost_a, int regcost_a, int cost_b, int regcost_b)
716 /* First, get rid of cases involving expressions that are entirely
717 unwanted. */
718 if (cost_a != cost_b)
720 if (cost_a == MAX_COST)
721 return 1;
722 if (cost_b == MAX_COST)
723 return -1;
726 /* Avoid extending lifetimes of hardregs. */
727 if (regcost_a != regcost_b)
729 if (regcost_a == MAX_COST)
730 return 1;
731 if (regcost_b == MAX_COST)
732 return -1;
735 /* Normal operation costs take precedence. */
736 if (cost_a != cost_b)
737 return cost_a - cost_b;
738 /* Only if these are identical consider effects on register pressure. */
739 if (regcost_a != regcost_b)
740 return regcost_a - regcost_b;
741 return 0;
744 /* Internal function, to compute cost when X is not a register; called
745 from COST macro to keep it simple. */
747 static int
748 notreg_cost (rtx x, enum rtx_code outer, int opno)
750 return ((GET_CODE (x) == SUBREG
751 && REG_P (SUBREG_REG (x))
752 && GET_MODE_CLASS (GET_MODE (x)) == MODE_INT
753 && GET_MODE_CLASS (GET_MODE (SUBREG_REG (x))) == MODE_INT
754 && (GET_MODE_SIZE (GET_MODE (x))
755 < GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))))
756 && subreg_lowpart_p (x)
757 && TRULY_NOOP_TRUNCATION_MODES_P (GET_MODE (x),
758 GET_MODE (SUBREG_REG (x))))
760 : rtx_cost (x, outer, opno, optimize_this_for_speed_p) * 2);
764 /* Initialize CSE_REG_INFO_TABLE. */
766 static void
767 init_cse_reg_info (unsigned int nregs)
769 /* Do we need to grow the table? */
770 if (nregs > cse_reg_info_table_size)
772 unsigned int new_size;
774 if (cse_reg_info_table_size < 2048)
776 /* Compute a new size that is a power of 2 and no smaller
777 than the large of NREGS and 64. */
778 new_size = (cse_reg_info_table_size
779 ? cse_reg_info_table_size : 64);
781 while (new_size < nregs)
782 new_size *= 2;
784 else
786 /* If we need a big table, allocate just enough to hold
787 NREGS registers. */
788 new_size = nregs;
791 /* Reallocate the table with NEW_SIZE entries. */
792 free (cse_reg_info_table);
793 cse_reg_info_table = XNEWVEC (struct cse_reg_info, new_size);
794 cse_reg_info_table_size = new_size;
795 cse_reg_info_table_first_uninitialized = 0;
798 /* Do we have all of the first NREGS entries initialized? */
799 if (cse_reg_info_table_first_uninitialized < nregs)
801 unsigned int old_timestamp = cse_reg_info_timestamp - 1;
802 unsigned int i;
804 /* Put the old timestamp on newly allocated entries so that they
805 will all be considered out of date. We do not touch those
806 entries beyond the first NREGS entries to be nice to the
807 virtual memory. */
808 for (i = cse_reg_info_table_first_uninitialized; i < nregs; i++)
809 cse_reg_info_table[i].timestamp = old_timestamp;
811 cse_reg_info_table_first_uninitialized = nregs;
815 /* Given REGNO, initialize the cse_reg_info entry for REGNO. */
817 static void
818 get_cse_reg_info_1 (unsigned int regno)
820 /* Set TIMESTAMP field to CSE_REG_INFO_TIMESTAMP so that this
821 entry will be considered to have been initialized. */
822 cse_reg_info_table[regno].timestamp = cse_reg_info_timestamp;
824 /* Initialize the rest of the entry. */
825 cse_reg_info_table[regno].reg_tick = 1;
826 cse_reg_info_table[regno].reg_in_table = -1;
827 cse_reg_info_table[regno].subreg_ticked = -1;
828 cse_reg_info_table[regno].reg_qty = -regno - 1;
831 /* Find a cse_reg_info entry for REGNO. */
833 static inline struct cse_reg_info *
834 get_cse_reg_info (unsigned int regno)
836 struct cse_reg_info *p = &cse_reg_info_table[regno];
838 /* If this entry has not been initialized, go ahead and initialize
839 it. */
840 if (p->timestamp != cse_reg_info_timestamp)
841 get_cse_reg_info_1 (regno);
843 return p;
846 /* Clear the hash table and initialize each register with its own quantity,
847 for a new basic block. */
849 static void
850 new_basic_block (void)
852 int i;
854 next_qty = 0;
856 /* Invalidate cse_reg_info_table. */
857 cse_reg_info_timestamp++;
859 /* Clear out hash table state for this pass. */
860 CLEAR_HARD_REG_SET (hard_regs_in_table);
862 /* The per-quantity values used to be initialized here, but it is
863 much faster to initialize each as it is made in `make_new_qty'. */
865 for (i = 0; i < HASH_SIZE; i++)
867 struct table_elt *first;
869 first = table[i];
870 if (first != NULL)
872 struct table_elt *last = first;
874 table[i] = NULL;
876 while (last->next_same_hash != NULL)
877 last = last->next_same_hash;
879 /* Now relink this hash entire chain into
880 the free element list. */
882 last->next_same_hash = free_element_chain;
883 free_element_chain = first;
887 #ifdef HAVE_cc0
888 prev_insn_cc0 = 0;
889 #endif
892 /* Say that register REG contains a quantity in mode MODE not in any
893 register before and initialize that quantity. */
895 static void
896 make_new_qty (unsigned int reg, machine_mode mode)
898 int q;
899 struct qty_table_elem *ent;
900 struct reg_eqv_elem *eqv;
902 gcc_assert (next_qty < max_qty);
904 q = REG_QTY (reg) = next_qty++;
905 ent = &qty_table[q];
906 ent->first_reg = reg;
907 ent->last_reg = reg;
908 ent->mode = mode;
909 ent->const_rtx = ent->const_insn = NULL;
910 ent->comparison_code = UNKNOWN;
912 eqv = &reg_eqv_table[reg];
913 eqv->next = eqv->prev = -1;
916 /* Make reg NEW equivalent to reg OLD.
917 OLD is not changing; NEW is. */
919 static void
920 make_regs_eqv (unsigned int new_reg, unsigned int old_reg)
922 unsigned int lastr, firstr;
923 int q = REG_QTY (old_reg);
924 struct qty_table_elem *ent;
926 ent = &qty_table[q];
928 /* Nothing should become eqv until it has a "non-invalid" qty number. */
929 gcc_assert (REGNO_QTY_VALID_P (old_reg));
931 REG_QTY (new_reg) = q;
932 firstr = ent->first_reg;
933 lastr = ent->last_reg;
935 /* Prefer fixed hard registers to anything. Prefer pseudo regs to other
936 hard regs. Among pseudos, if NEW will live longer than any other reg
937 of the same qty, and that is beyond the current basic block,
938 make it the new canonical replacement for this qty. */
939 if (! (firstr < FIRST_PSEUDO_REGISTER && FIXED_REGNO_P (firstr))
940 /* Certain fixed registers might be of the class NO_REGS. This means
941 that not only can they not be allocated by the compiler, but
942 they cannot be used in substitutions or canonicalizations
943 either. */
944 && (new_reg >= FIRST_PSEUDO_REGISTER || REGNO_REG_CLASS (new_reg) != NO_REGS)
945 && ((new_reg < FIRST_PSEUDO_REGISTER && FIXED_REGNO_P (new_reg))
946 || (new_reg >= FIRST_PSEUDO_REGISTER
947 && (firstr < FIRST_PSEUDO_REGISTER
948 || (bitmap_bit_p (cse_ebb_live_out, new_reg)
949 && !bitmap_bit_p (cse_ebb_live_out, firstr))
950 || (bitmap_bit_p (cse_ebb_live_in, new_reg)
951 && !bitmap_bit_p (cse_ebb_live_in, firstr))))))
953 reg_eqv_table[firstr].prev = new_reg;
954 reg_eqv_table[new_reg].next = firstr;
955 reg_eqv_table[new_reg].prev = -1;
956 ent->first_reg = new_reg;
958 else
960 /* If NEW is a hard reg (known to be non-fixed), insert at end.
961 Otherwise, insert before any non-fixed hard regs that are at the
962 end. Registers of class NO_REGS cannot be used as an
963 equivalent for anything. */
964 while (lastr < FIRST_PSEUDO_REGISTER && reg_eqv_table[lastr].prev >= 0
965 && (REGNO_REG_CLASS (lastr) == NO_REGS || ! FIXED_REGNO_P (lastr))
966 && new_reg >= FIRST_PSEUDO_REGISTER)
967 lastr = reg_eqv_table[lastr].prev;
968 reg_eqv_table[new_reg].next = reg_eqv_table[lastr].next;
969 if (reg_eqv_table[lastr].next >= 0)
970 reg_eqv_table[reg_eqv_table[lastr].next].prev = new_reg;
971 else
972 qty_table[q].last_reg = new_reg;
973 reg_eqv_table[lastr].next = new_reg;
974 reg_eqv_table[new_reg].prev = lastr;
978 /* Remove REG from its equivalence class. */
980 static void
981 delete_reg_equiv (unsigned int reg)
983 struct qty_table_elem *ent;
984 int q = REG_QTY (reg);
985 int p, n;
987 /* If invalid, do nothing. */
988 if (! REGNO_QTY_VALID_P (reg))
989 return;
991 ent = &qty_table[q];
993 p = reg_eqv_table[reg].prev;
994 n = reg_eqv_table[reg].next;
996 if (n != -1)
997 reg_eqv_table[n].prev = p;
998 else
999 ent->last_reg = p;
1000 if (p != -1)
1001 reg_eqv_table[p].next = n;
1002 else
1003 ent->first_reg = n;
1005 REG_QTY (reg) = -reg - 1;
1008 /* Remove any invalid expressions from the hash table
1009 that refer to any of the registers contained in expression X.
1011 Make sure that newly inserted references to those registers
1012 as subexpressions will be considered valid.
1014 mention_regs is not called when a register itself
1015 is being stored in the table.
1017 Return 1 if we have done something that may have changed the hash code
1018 of X. */
1020 static int
1021 mention_regs (rtx x)
1023 enum rtx_code code;
1024 int i, j;
1025 const char *fmt;
1026 int changed = 0;
1028 if (x == 0)
1029 return 0;
1031 code = GET_CODE (x);
1032 if (code == REG)
1034 unsigned int regno = REGNO (x);
1035 unsigned int endregno = END_REGNO (x);
1036 unsigned int i;
1038 for (i = regno; i < endregno; i++)
1040 if (REG_IN_TABLE (i) >= 0 && REG_IN_TABLE (i) != REG_TICK (i))
1041 remove_invalid_refs (i);
1043 REG_IN_TABLE (i) = REG_TICK (i);
1044 SUBREG_TICKED (i) = -1;
1047 return 0;
1050 /* If this is a SUBREG, we don't want to discard other SUBREGs of the same
1051 pseudo if they don't use overlapping words. We handle only pseudos
1052 here for simplicity. */
1053 if (code == SUBREG && REG_P (SUBREG_REG (x))
1054 && REGNO (SUBREG_REG (x)) >= FIRST_PSEUDO_REGISTER)
1056 unsigned int i = REGNO (SUBREG_REG (x));
1058 if (REG_IN_TABLE (i) >= 0 && REG_IN_TABLE (i) != REG_TICK (i))
1060 /* If REG_IN_TABLE (i) differs from REG_TICK (i) by one, and
1061 the last store to this register really stored into this
1062 subreg, then remove the memory of this subreg.
1063 Otherwise, remove any memory of the entire register and
1064 all its subregs from the table. */
1065 if (REG_TICK (i) - REG_IN_TABLE (i) > 1
1066 || SUBREG_TICKED (i) != REGNO (SUBREG_REG (x)))
1067 remove_invalid_refs (i);
1068 else
1069 remove_invalid_subreg_refs (i, SUBREG_BYTE (x), GET_MODE (x));
1072 REG_IN_TABLE (i) = REG_TICK (i);
1073 SUBREG_TICKED (i) = REGNO (SUBREG_REG (x));
1074 return 0;
1077 /* If X is a comparison or a COMPARE and either operand is a register
1078 that does not have a quantity, give it one. This is so that a later
1079 call to record_jump_equiv won't cause X to be assigned a different
1080 hash code and not found in the table after that call.
1082 It is not necessary to do this here, since rehash_using_reg can
1083 fix up the table later, but doing this here eliminates the need to
1084 call that expensive function in the most common case where the only
1085 use of the register is in the comparison. */
1087 if (code == COMPARE || COMPARISON_P (x))
1089 if (REG_P (XEXP (x, 0))
1090 && ! REGNO_QTY_VALID_P (REGNO (XEXP (x, 0))))
1091 if (insert_regs (XEXP (x, 0), NULL, 0))
1093 rehash_using_reg (XEXP (x, 0));
1094 changed = 1;
1097 if (REG_P (XEXP (x, 1))
1098 && ! REGNO_QTY_VALID_P (REGNO (XEXP (x, 1))))
1099 if (insert_regs (XEXP (x, 1), NULL, 0))
1101 rehash_using_reg (XEXP (x, 1));
1102 changed = 1;
1106 fmt = GET_RTX_FORMAT (code);
1107 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1108 if (fmt[i] == 'e')
1109 changed |= mention_regs (XEXP (x, i));
1110 else if (fmt[i] == 'E')
1111 for (j = 0; j < XVECLEN (x, i); j++)
1112 changed |= mention_regs (XVECEXP (x, i, j));
1114 return changed;
1117 /* Update the register quantities for inserting X into the hash table
1118 with a value equivalent to CLASSP.
1119 (If the class does not contain a REG, it is irrelevant.)
1120 If MODIFIED is nonzero, X is a destination; it is being modified.
1121 Note that delete_reg_equiv should be called on a register
1122 before insert_regs is done on that register with MODIFIED != 0.
1124 Nonzero value means that elements of reg_qty have changed
1125 so X's hash code may be different. */
1127 static int
1128 insert_regs (rtx x, struct table_elt *classp, int modified)
1130 if (REG_P (x))
1132 unsigned int regno = REGNO (x);
1133 int qty_valid;
1135 /* If REGNO is in the equivalence table already but is of the
1136 wrong mode for that equivalence, don't do anything here. */
1138 qty_valid = REGNO_QTY_VALID_P (regno);
1139 if (qty_valid)
1141 struct qty_table_elem *ent = &qty_table[REG_QTY (regno)];
1143 if (ent->mode != GET_MODE (x))
1144 return 0;
1147 if (modified || ! qty_valid)
1149 if (classp)
1150 for (classp = classp->first_same_value;
1151 classp != 0;
1152 classp = classp->next_same_value)
1153 if (REG_P (classp->exp)
1154 && GET_MODE (classp->exp) == GET_MODE (x))
1156 unsigned c_regno = REGNO (classp->exp);
1158 gcc_assert (REGNO_QTY_VALID_P (c_regno));
1160 /* Suppose that 5 is hard reg and 100 and 101 are
1161 pseudos. Consider
1163 (set (reg:si 100) (reg:si 5))
1164 (set (reg:si 5) (reg:si 100))
1165 (set (reg:di 101) (reg:di 5))
1167 We would now set REG_QTY (101) = REG_QTY (5), but the
1168 entry for 5 is in SImode. When we use this later in
1169 copy propagation, we get the register in wrong mode. */
1170 if (qty_table[REG_QTY (c_regno)].mode != GET_MODE (x))
1171 continue;
1173 make_regs_eqv (regno, c_regno);
1174 return 1;
1177 /* Mention_regs for a SUBREG checks if REG_TICK is exactly one larger
1178 than REG_IN_TABLE to find out if there was only a single preceding
1179 invalidation - for the SUBREG - or another one, which would be
1180 for the full register. However, if we find here that REG_TICK
1181 indicates that the register is invalid, it means that it has
1182 been invalidated in a separate operation. The SUBREG might be used
1183 now (then this is a recursive call), or we might use the full REG
1184 now and a SUBREG of it later. So bump up REG_TICK so that
1185 mention_regs will do the right thing. */
1186 if (! modified
1187 && REG_IN_TABLE (regno) >= 0
1188 && REG_TICK (regno) == REG_IN_TABLE (regno) + 1)
1189 REG_TICK (regno)++;
1190 make_new_qty (regno, GET_MODE (x));
1191 return 1;
1194 return 0;
1197 /* If X is a SUBREG, we will likely be inserting the inner register in the
1198 table. If that register doesn't have an assigned quantity number at
1199 this point but does later, the insertion that we will be doing now will
1200 not be accessible because its hash code will have changed. So assign
1201 a quantity number now. */
1203 else if (GET_CODE (x) == SUBREG && REG_P (SUBREG_REG (x))
1204 && ! REGNO_QTY_VALID_P (REGNO (SUBREG_REG (x))))
1206 insert_regs (SUBREG_REG (x), NULL, 0);
1207 mention_regs (x);
1208 return 1;
1210 else
1211 return mention_regs (x);
1215 /* Compute upper and lower anchors for CST. Also compute the offset of CST
1216 from these anchors/bases such that *_BASE + *_OFFS = CST. Return false iff
1217 CST is equal to an anchor. */
1219 static bool
1220 compute_const_anchors (rtx cst,
1221 HOST_WIDE_INT *lower_base, HOST_WIDE_INT *lower_offs,
1222 HOST_WIDE_INT *upper_base, HOST_WIDE_INT *upper_offs)
1224 HOST_WIDE_INT n = INTVAL (cst);
1226 *lower_base = n & ~(targetm.const_anchor - 1);
1227 if (*lower_base == n)
1228 return false;
1230 *upper_base =
1231 (n + (targetm.const_anchor - 1)) & ~(targetm.const_anchor - 1);
1232 *upper_offs = n - *upper_base;
1233 *lower_offs = n - *lower_base;
1234 return true;
1237 /* Insert the equivalence between ANCHOR and (REG + OFF) in mode MODE. */
1239 static void
1240 insert_const_anchor (HOST_WIDE_INT anchor, rtx reg, HOST_WIDE_INT offs,
1241 machine_mode mode)
1243 struct table_elt *elt;
1244 unsigned hash;
1245 rtx anchor_exp;
1246 rtx exp;
1248 anchor_exp = GEN_INT (anchor);
1249 hash = HASH (anchor_exp, mode);
1250 elt = lookup (anchor_exp, hash, mode);
1251 if (!elt)
1252 elt = insert (anchor_exp, NULL, hash, mode);
1254 exp = plus_constant (mode, reg, offs);
1255 /* REG has just been inserted and the hash codes recomputed. */
1256 mention_regs (exp);
1257 hash = HASH (exp, mode);
1259 /* Use the cost of the register rather than the whole expression. When
1260 looking up constant anchors we will further offset the corresponding
1261 expression therefore it does not make sense to prefer REGs over
1262 reg-immediate additions. Prefer instead the oldest expression. Also
1263 don't prefer pseudos over hard regs so that we derive constants in
1264 argument registers from other argument registers rather than from the
1265 original pseudo that was used to synthesize the constant. */
1266 insert_with_costs (exp, elt, hash, mode, COST (reg), 1);
1269 /* The constant CST is equivalent to the register REG. Create
1270 equivalences between the two anchors of CST and the corresponding
1271 register-offset expressions using REG. */
1273 static void
1274 insert_const_anchors (rtx reg, rtx cst, machine_mode mode)
1276 HOST_WIDE_INT lower_base, lower_offs, upper_base, upper_offs;
1278 if (!compute_const_anchors (cst, &lower_base, &lower_offs,
1279 &upper_base, &upper_offs))
1280 return;
1282 /* Ignore anchors of value 0. Constants accessible from zero are
1283 simple. */
1284 if (lower_base != 0)
1285 insert_const_anchor (lower_base, reg, -lower_offs, mode);
1287 if (upper_base != 0)
1288 insert_const_anchor (upper_base, reg, -upper_offs, mode);
1291 /* We need to express ANCHOR_ELT->exp + OFFS. Walk the equivalence list of
1292 ANCHOR_ELT and see if offsetting any of the entries by OFFS would create a
1293 valid expression. Return the cheapest and oldest of such expressions. In
1294 *OLD, return how old the resulting expression is compared to the other
1295 equivalent expressions. */
1297 static rtx
1298 find_reg_offset_for_const (struct table_elt *anchor_elt, HOST_WIDE_INT offs,
1299 unsigned *old)
1301 struct table_elt *elt;
1302 unsigned idx;
1303 struct table_elt *match_elt;
1304 rtx match;
1306 /* Find the cheapest and *oldest* expression to maximize the chance of
1307 reusing the same pseudo. */
1309 match_elt = NULL;
1310 match = NULL_RTX;
1311 for (elt = anchor_elt->first_same_value, idx = 0;
1312 elt;
1313 elt = elt->next_same_value, idx++)
1315 if (match_elt && CHEAPER (match_elt, elt))
1316 return match;
1318 if (REG_P (elt->exp)
1319 || (GET_CODE (elt->exp) == PLUS
1320 && REG_P (XEXP (elt->exp, 0))
1321 && GET_CODE (XEXP (elt->exp, 1)) == CONST_INT))
1323 rtx x;
1325 /* Ignore expressions that are no longer valid. */
1326 if (!REG_P (elt->exp) && !exp_equiv_p (elt->exp, elt->exp, 1, false))
1327 continue;
1329 x = plus_constant (GET_MODE (elt->exp), elt->exp, offs);
1330 if (REG_P (x)
1331 || (GET_CODE (x) == PLUS
1332 && IN_RANGE (INTVAL (XEXP (x, 1)),
1333 -targetm.const_anchor,
1334 targetm.const_anchor - 1)))
1336 match = x;
1337 match_elt = elt;
1338 *old = idx;
1343 return match;
1346 /* Try to express the constant SRC_CONST using a register+offset expression
1347 derived from a constant anchor. Return it if successful or NULL_RTX,
1348 otherwise. */
1350 static rtx
1351 try_const_anchors (rtx src_const, machine_mode mode)
1353 struct table_elt *lower_elt, *upper_elt;
1354 HOST_WIDE_INT lower_base, lower_offs, upper_base, upper_offs;
1355 rtx lower_anchor_rtx, upper_anchor_rtx;
1356 rtx lower_exp = NULL_RTX, upper_exp = NULL_RTX;
1357 unsigned lower_old, upper_old;
1359 /* CONST_INT is used for CC modes, but we should leave those alone. */
1360 if (GET_MODE_CLASS (mode) == MODE_CC)
1361 return NULL_RTX;
1363 gcc_assert (SCALAR_INT_MODE_P (mode));
1364 if (!compute_const_anchors (src_const, &lower_base, &lower_offs,
1365 &upper_base, &upper_offs))
1366 return NULL_RTX;
1368 lower_anchor_rtx = GEN_INT (lower_base);
1369 upper_anchor_rtx = GEN_INT (upper_base);
1370 lower_elt = lookup (lower_anchor_rtx, HASH (lower_anchor_rtx, mode), mode);
1371 upper_elt = lookup (upper_anchor_rtx, HASH (upper_anchor_rtx, mode), mode);
1373 if (lower_elt)
1374 lower_exp = find_reg_offset_for_const (lower_elt, lower_offs, &lower_old);
1375 if (upper_elt)
1376 upper_exp = find_reg_offset_for_const (upper_elt, upper_offs, &upper_old);
1378 if (!lower_exp)
1379 return upper_exp;
1380 if (!upper_exp)
1381 return lower_exp;
1383 /* Return the older expression. */
1384 return (upper_old > lower_old ? upper_exp : lower_exp);
1387 /* Look in or update the hash table. */
1389 /* Remove table element ELT from use in the table.
1390 HASH is its hash code, made using the HASH macro.
1391 It's an argument because often that is known in advance
1392 and we save much time not recomputing it. */
1394 static void
1395 remove_from_table (struct table_elt *elt, unsigned int hash)
1397 if (elt == 0)
1398 return;
1400 /* Mark this element as removed. See cse_insn. */
1401 elt->first_same_value = 0;
1403 /* Remove the table element from its equivalence class. */
1406 struct table_elt *prev = elt->prev_same_value;
1407 struct table_elt *next = elt->next_same_value;
1409 if (next)
1410 next->prev_same_value = prev;
1412 if (prev)
1413 prev->next_same_value = next;
1414 else
1416 struct table_elt *newfirst = next;
1417 while (next)
1419 next->first_same_value = newfirst;
1420 next = next->next_same_value;
1425 /* Remove the table element from its hash bucket. */
1428 struct table_elt *prev = elt->prev_same_hash;
1429 struct table_elt *next = elt->next_same_hash;
1431 if (next)
1432 next->prev_same_hash = prev;
1434 if (prev)
1435 prev->next_same_hash = next;
1436 else if (table[hash] == elt)
1437 table[hash] = next;
1438 else
1440 /* This entry is not in the proper hash bucket. This can happen
1441 when two classes were merged by `merge_equiv_classes'. Search
1442 for the hash bucket that it heads. This happens only very
1443 rarely, so the cost is acceptable. */
1444 for (hash = 0; hash < HASH_SIZE; hash++)
1445 if (table[hash] == elt)
1446 table[hash] = next;
1450 /* Remove the table element from its related-value circular chain. */
1452 if (elt->related_value != 0 && elt->related_value != elt)
1454 struct table_elt *p = elt->related_value;
1456 while (p->related_value != elt)
1457 p = p->related_value;
1458 p->related_value = elt->related_value;
1459 if (p->related_value == p)
1460 p->related_value = 0;
1463 /* Now add it to the free element chain. */
1464 elt->next_same_hash = free_element_chain;
1465 free_element_chain = elt;
1468 /* Same as above, but X is a pseudo-register. */
1470 static void
1471 remove_pseudo_from_table (rtx x, unsigned int hash)
1473 struct table_elt *elt;
1475 /* Because a pseudo-register can be referenced in more than one
1476 mode, we might have to remove more than one table entry. */
1477 while ((elt = lookup_for_remove (x, hash, VOIDmode)))
1478 remove_from_table (elt, hash);
1481 /* Look up X in the hash table and return its table element,
1482 or 0 if X is not in the table.
1484 MODE is the machine-mode of X, or if X is an integer constant
1485 with VOIDmode then MODE is the mode with which X will be used.
1487 Here we are satisfied to find an expression whose tree structure
1488 looks like X. */
1490 static struct table_elt *
1491 lookup (rtx x, unsigned int hash, machine_mode mode)
1493 struct table_elt *p;
1495 for (p = table[hash]; p; p = p->next_same_hash)
1496 if (mode == p->mode && ((x == p->exp && REG_P (x))
1497 || exp_equiv_p (x, p->exp, !REG_P (x), false)))
1498 return p;
1500 return 0;
1503 /* Like `lookup' but don't care whether the table element uses invalid regs.
1504 Also ignore discrepancies in the machine mode of a register. */
1506 static struct table_elt *
1507 lookup_for_remove (rtx x, unsigned int hash, machine_mode mode)
1509 struct table_elt *p;
1511 if (REG_P (x))
1513 unsigned int regno = REGNO (x);
1515 /* Don't check the machine mode when comparing registers;
1516 invalidating (REG:SI 0) also invalidates (REG:DF 0). */
1517 for (p = table[hash]; p; p = p->next_same_hash)
1518 if (REG_P (p->exp)
1519 && REGNO (p->exp) == regno)
1520 return p;
1522 else
1524 for (p = table[hash]; p; p = p->next_same_hash)
1525 if (mode == p->mode
1526 && (x == p->exp || exp_equiv_p (x, p->exp, 0, false)))
1527 return p;
1530 return 0;
1533 /* Look for an expression equivalent to X and with code CODE.
1534 If one is found, return that expression. */
1536 static rtx
1537 lookup_as_function (rtx x, enum rtx_code code)
1539 struct table_elt *p
1540 = lookup (x, SAFE_HASH (x, VOIDmode), GET_MODE (x));
1542 if (p == 0)
1543 return 0;
1545 for (p = p->first_same_value; p; p = p->next_same_value)
1546 if (GET_CODE (p->exp) == code
1547 /* Make sure this is a valid entry in the table. */
1548 && exp_equiv_p (p->exp, p->exp, 1, false))
1549 return p->exp;
1551 return 0;
1554 /* Insert X in the hash table, assuming HASH is its hash code and
1555 CLASSP is an element of the class it should go in (or 0 if a new
1556 class should be made). COST is the code of X and reg_cost is the
1557 cost of registers in X. It is inserted at the proper position to
1558 keep the class in the order cheapest first.
1560 MODE is the machine-mode of X, or if X is an integer constant
1561 with VOIDmode then MODE is the mode with which X will be used.
1563 For elements of equal cheapness, the most recent one
1564 goes in front, except that the first element in the list
1565 remains first unless a cheaper element is added. The order of
1566 pseudo-registers does not matter, as canon_reg will be called to
1567 find the cheapest when a register is retrieved from the table.
1569 The in_memory field in the hash table element is set to 0.
1570 The caller must set it nonzero if appropriate.
1572 You should call insert_regs (X, CLASSP, MODIFY) before calling here,
1573 and if insert_regs returns a nonzero value
1574 you must then recompute its hash code before calling here.
1576 If necessary, update table showing constant values of quantities. */
1578 static struct table_elt *
1579 insert_with_costs (rtx x, struct table_elt *classp, unsigned int hash,
1580 machine_mode mode, int cost, int reg_cost)
1582 struct table_elt *elt;
1584 /* If X is a register and we haven't made a quantity for it,
1585 something is wrong. */
1586 gcc_assert (!REG_P (x) || REGNO_QTY_VALID_P (REGNO (x)));
1588 /* If X is a hard register, show it is being put in the table. */
1589 if (REG_P (x) && REGNO (x) < FIRST_PSEUDO_REGISTER)
1590 add_to_hard_reg_set (&hard_regs_in_table, GET_MODE (x), REGNO (x));
1592 /* Put an element for X into the right hash bucket. */
1594 elt = free_element_chain;
1595 if (elt)
1596 free_element_chain = elt->next_same_hash;
1597 else
1598 elt = XNEW (struct table_elt);
1600 elt->exp = x;
1601 elt->canon_exp = NULL_RTX;
1602 elt->cost = cost;
1603 elt->regcost = reg_cost;
1604 elt->next_same_value = 0;
1605 elt->prev_same_value = 0;
1606 elt->next_same_hash = table[hash];
1607 elt->prev_same_hash = 0;
1608 elt->related_value = 0;
1609 elt->in_memory = 0;
1610 elt->mode = mode;
1611 elt->is_const = (CONSTANT_P (x) || fixed_base_plus_p (x));
1613 if (table[hash])
1614 table[hash]->prev_same_hash = elt;
1615 table[hash] = elt;
1617 /* Put it into the proper value-class. */
1618 if (classp)
1620 classp = classp->first_same_value;
1621 if (CHEAPER (elt, classp))
1622 /* Insert at the head of the class. */
1624 struct table_elt *p;
1625 elt->next_same_value = classp;
1626 classp->prev_same_value = elt;
1627 elt->first_same_value = elt;
1629 for (p = classp; p; p = p->next_same_value)
1630 p->first_same_value = elt;
1632 else
1634 /* Insert not at head of the class. */
1635 /* Put it after the last element cheaper than X. */
1636 struct table_elt *p, *next;
1638 for (p = classp;
1639 (next = p->next_same_value) && CHEAPER (next, elt);
1640 p = next)
1643 /* Put it after P and before NEXT. */
1644 elt->next_same_value = next;
1645 if (next)
1646 next->prev_same_value = elt;
1648 elt->prev_same_value = p;
1649 p->next_same_value = elt;
1650 elt->first_same_value = classp;
1653 else
1654 elt->first_same_value = elt;
1656 /* If this is a constant being set equivalent to a register or a register
1657 being set equivalent to a constant, note the constant equivalence.
1659 If this is a constant, it cannot be equivalent to a different constant,
1660 and a constant is the only thing that can be cheaper than a register. So
1661 we know the register is the head of the class (before the constant was
1662 inserted).
1664 If this is a register that is not already known equivalent to a
1665 constant, we must check the entire class.
1667 If this is a register that is already known equivalent to an insn,
1668 update the qtys `const_insn' to show that `this_insn' is the latest
1669 insn making that quantity equivalent to the constant. */
1671 if (elt->is_const && classp && REG_P (classp->exp)
1672 && !REG_P (x))
1674 int exp_q = REG_QTY (REGNO (classp->exp));
1675 struct qty_table_elem *exp_ent = &qty_table[exp_q];
1677 exp_ent->const_rtx = gen_lowpart (exp_ent->mode, x);
1678 exp_ent->const_insn = this_insn;
1681 else if (REG_P (x)
1682 && classp
1683 && ! qty_table[REG_QTY (REGNO (x))].const_rtx
1684 && ! elt->is_const)
1686 struct table_elt *p;
1688 for (p = classp; p != 0; p = p->next_same_value)
1690 if (p->is_const && !REG_P (p->exp))
1692 int x_q = REG_QTY (REGNO (x));
1693 struct qty_table_elem *x_ent = &qty_table[x_q];
1695 x_ent->const_rtx
1696 = gen_lowpart (GET_MODE (x), p->exp);
1697 x_ent->const_insn = this_insn;
1698 break;
1703 else if (REG_P (x)
1704 && qty_table[REG_QTY (REGNO (x))].const_rtx
1705 && GET_MODE (x) == qty_table[REG_QTY (REGNO (x))].mode)
1706 qty_table[REG_QTY (REGNO (x))].const_insn = this_insn;
1708 /* If this is a constant with symbolic value,
1709 and it has a term with an explicit integer value,
1710 link it up with related expressions. */
1711 if (GET_CODE (x) == CONST)
1713 rtx subexp = get_related_value (x);
1714 unsigned subhash;
1715 struct table_elt *subelt, *subelt_prev;
1717 if (subexp != 0)
1719 /* Get the integer-free subexpression in the hash table. */
1720 subhash = SAFE_HASH (subexp, mode);
1721 subelt = lookup (subexp, subhash, mode);
1722 if (subelt == 0)
1723 subelt = insert (subexp, NULL, subhash, mode);
1724 /* Initialize SUBELT's circular chain if it has none. */
1725 if (subelt->related_value == 0)
1726 subelt->related_value = subelt;
1727 /* Find the element in the circular chain that precedes SUBELT. */
1728 subelt_prev = subelt;
1729 while (subelt_prev->related_value != subelt)
1730 subelt_prev = subelt_prev->related_value;
1731 /* Put new ELT into SUBELT's circular chain just before SUBELT.
1732 This way the element that follows SUBELT is the oldest one. */
1733 elt->related_value = subelt_prev->related_value;
1734 subelt_prev->related_value = elt;
1738 return elt;
1741 /* Wrap insert_with_costs by passing the default costs. */
1743 static struct table_elt *
1744 insert (rtx x, struct table_elt *classp, unsigned int hash,
1745 machine_mode mode)
1747 return
1748 insert_with_costs (x, classp, hash, mode, COST (x), approx_reg_cost (x));
1752 /* Given two equivalence classes, CLASS1 and CLASS2, put all the entries from
1753 CLASS2 into CLASS1. This is done when we have reached an insn which makes
1754 the two classes equivalent.
1756 CLASS1 will be the surviving class; CLASS2 should not be used after this
1757 call.
1759 Any invalid entries in CLASS2 will not be copied. */
1761 static void
1762 merge_equiv_classes (struct table_elt *class1, struct table_elt *class2)
1764 struct table_elt *elt, *next, *new_elt;
1766 /* Ensure we start with the head of the classes. */
1767 class1 = class1->first_same_value;
1768 class2 = class2->first_same_value;
1770 /* If they were already equal, forget it. */
1771 if (class1 == class2)
1772 return;
1774 for (elt = class2; elt; elt = next)
1776 unsigned int hash;
1777 rtx exp = elt->exp;
1778 machine_mode mode = elt->mode;
1780 next = elt->next_same_value;
1782 /* Remove old entry, make a new one in CLASS1's class.
1783 Don't do this for invalid entries as we cannot find their
1784 hash code (it also isn't necessary). */
1785 if (REG_P (exp) || exp_equiv_p (exp, exp, 1, false))
1787 bool need_rehash = false;
1789 hash_arg_in_memory = 0;
1790 hash = HASH (exp, mode);
1792 if (REG_P (exp))
1794 need_rehash = REGNO_QTY_VALID_P (REGNO (exp));
1795 delete_reg_equiv (REGNO (exp));
1798 if (REG_P (exp) && REGNO (exp) >= FIRST_PSEUDO_REGISTER)
1799 remove_pseudo_from_table (exp, hash);
1800 else
1801 remove_from_table (elt, hash);
1803 if (insert_regs (exp, class1, 0) || need_rehash)
1805 rehash_using_reg (exp);
1806 hash = HASH (exp, mode);
1808 new_elt = insert (exp, class1, hash, mode);
1809 new_elt->in_memory = hash_arg_in_memory;
1810 if (GET_CODE (exp) == ASM_OPERANDS && elt->cost == MAX_COST)
1811 new_elt->cost = MAX_COST;
1816 /* Flush the entire hash table. */
1818 static void
1819 flush_hash_table (void)
1821 int i;
1822 struct table_elt *p;
1824 for (i = 0; i < HASH_SIZE; i++)
1825 for (p = table[i]; p; p = table[i])
1827 /* Note that invalidate can remove elements
1828 after P in the current hash chain. */
1829 if (REG_P (p->exp))
1830 invalidate (p->exp, VOIDmode);
1831 else
1832 remove_from_table (p, i);
1836 /* Check whether an anti dependence exists between X and EXP. MODE and
1837 ADDR are as for canon_anti_dependence. */
1839 static bool
1840 check_dependence (const_rtx x, rtx exp, machine_mode mode, rtx addr)
1842 subrtx_iterator::array_type array;
1843 FOR_EACH_SUBRTX (iter, array, x, NONCONST)
1845 const_rtx x = *iter;
1846 if (MEM_P (x) && canon_anti_dependence (x, true, exp, mode, addr))
1847 return true;
1849 return false;
1852 /* Remove from the hash table, or mark as invalid, all expressions whose
1853 values could be altered by storing in X. X is a register, a subreg, or
1854 a memory reference with nonvarying address (because, when a memory
1855 reference with a varying address is stored in, all memory references are
1856 removed by invalidate_memory so specific invalidation is superfluous).
1857 FULL_MODE, if not VOIDmode, indicates that this much should be
1858 invalidated instead of just the amount indicated by the mode of X. This
1859 is only used for bitfield stores into memory.
1861 A nonvarying address may be just a register or just a symbol reference,
1862 or it may be either of those plus a numeric offset. */
1864 static void
1865 invalidate (rtx x, machine_mode full_mode)
1867 int i;
1868 struct table_elt *p;
1869 rtx addr;
1871 switch (GET_CODE (x))
1873 case REG:
1875 /* If X is a register, dependencies on its contents are recorded
1876 through the qty number mechanism. Just change the qty number of
1877 the register, mark it as invalid for expressions that refer to it,
1878 and remove it itself. */
1879 unsigned int regno = REGNO (x);
1880 unsigned int hash = HASH (x, GET_MODE (x));
1882 /* Remove REGNO from any quantity list it might be on and indicate
1883 that its value might have changed. If it is a pseudo, remove its
1884 entry from the hash table.
1886 For a hard register, we do the first two actions above for any
1887 additional hard registers corresponding to X. Then, if any of these
1888 registers are in the table, we must remove any REG entries that
1889 overlap these registers. */
1891 delete_reg_equiv (regno);
1892 REG_TICK (regno)++;
1893 SUBREG_TICKED (regno) = -1;
1895 if (regno >= FIRST_PSEUDO_REGISTER)
1896 remove_pseudo_from_table (x, hash);
1897 else
1899 HOST_WIDE_INT in_table
1900 = TEST_HARD_REG_BIT (hard_regs_in_table, regno);
1901 unsigned int endregno = END_HARD_REGNO (x);
1902 unsigned int tregno, tendregno, rn;
1903 struct table_elt *p, *next;
1905 CLEAR_HARD_REG_BIT (hard_regs_in_table, regno);
1907 for (rn = regno + 1; rn < endregno; rn++)
1909 in_table |= TEST_HARD_REG_BIT (hard_regs_in_table, rn);
1910 CLEAR_HARD_REG_BIT (hard_regs_in_table, rn);
1911 delete_reg_equiv (rn);
1912 REG_TICK (rn)++;
1913 SUBREG_TICKED (rn) = -1;
1916 if (in_table)
1917 for (hash = 0; hash < HASH_SIZE; hash++)
1918 for (p = table[hash]; p; p = next)
1920 next = p->next_same_hash;
1922 if (!REG_P (p->exp)
1923 || REGNO (p->exp) >= FIRST_PSEUDO_REGISTER)
1924 continue;
1926 tregno = REGNO (p->exp);
1927 tendregno = END_HARD_REGNO (p->exp);
1928 if (tendregno > regno && tregno < endregno)
1929 remove_from_table (p, hash);
1933 return;
1935 case SUBREG:
1936 invalidate (SUBREG_REG (x), VOIDmode);
1937 return;
1939 case PARALLEL:
1940 for (i = XVECLEN (x, 0) - 1; i >= 0; --i)
1941 invalidate (XVECEXP (x, 0, i), VOIDmode);
1942 return;
1944 case EXPR_LIST:
1945 /* This is part of a disjoint return value; extract the location in
1946 question ignoring the offset. */
1947 invalidate (XEXP (x, 0), VOIDmode);
1948 return;
1950 case MEM:
1951 addr = canon_rtx (get_addr (XEXP (x, 0)));
1952 /* Calculate the canonical version of X here so that
1953 true_dependence doesn't generate new RTL for X on each call. */
1954 x = canon_rtx (x);
1956 /* Remove all hash table elements that refer to overlapping pieces of
1957 memory. */
1958 if (full_mode == VOIDmode)
1959 full_mode = GET_MODE (x);
1961 for (i = 0; i < HASH_SIZE; i++)
1963 struct table_elt *next;
1965 for (p = table[i]; p; p = next)
1967 next = p->next_same_hash;
1968 if (p->in_memory)
1970 /* Just canonicalize the expression once;
1971 otherwise each time we call invalidate
1972 true_dependence will canonicalize the
1973 expression again. */
1974 if (!p->canon_exp)
1975 p->canon_exp = canon_rtx (p->exp);
1976 if (check_dependence (p->canon_exp, x, full_mode, addr))
1977 remove_from_table (p, i);
1981 return;
1983 default:
1984 gcc_unreachable ();
1988 /* Invalidate DEST. Used when DEST is not going to be added
1989 into the hash table for some reason, e.g. do_not_record
1990 flagged on it. */
1992 static void
1993 invalidate_dest (rtx dest)
1995 if (REG_P (dest)
1996 || GET_CODE (dest) == SUBREG
1997 || MEM_P (dest))
1998 invalidate (dest, VOIDmode);
1999 else if (GET_CODE (dest) == STRICT_LOW_PART
2000 || GET_CODE (dest) == ZERO_EXTRACT)
2001 invalidate (XEXP (dest, 0), GET_MODE (dest));
2004 /* Remove all expressions that refer to register REGNO,
2005 since they are already invalid, and we are about to
2006 mark that register valid again and don't want the old
2007 expressions to reappear as valid. */
2009 static void
2010 remove_invalid_refs (unsigned int regno)
2012 unsigned int i;
2013 struct table_elt *p, *next;
2015 for (i = 0; i < HASH_SIZE; i++)
2016 for (p = table[i]; p; p = next)
2018 next = p->next_same_hash;
2019 if (!REG_P (p->exp) && refers_to_regno_p (regno, p->exp))
2020 remove_from_table (p, i);
2024 /* Likewise for a subreg with subreg_reg REGNO, subreg_byte OFFSET,
2025 and mode MODE. */
2026 static void
2027 remove_invalid_subreg_refs (unsigned int regno, unsigned int offset,
2028 machine_mode mode)
2030 unsigned int i;
2031 struct table_elt *p, *next;
2032 unsigned int end = offset + (GET_MODE_SIZE (mode) - 1);
2034 for (i = 0; i < HASH_SIZE; i++)
2035 for (p = table[i]; p; p = next)
2037 rtx exp = p->exp;
2038 next = p->next_same_hash;
2040 if (!REG_P (exp)
2041 && (GET_CODE (exp) != SUBREG
2042 || !REG_P (SUBREG_REG (exp))
2043 || REGNO (SUBREG_REG (exp)) != regno
2044 || (((SUBREG_BYTE (exp)
2045 + (GET_MODE_SIZE (GET_MODE (exp)) - 1)) >= offset)
2046 && SUBREG_BYTE (exp) <= end))
2047 && refers_to_regno_p (regno, p->exp))
2048 remove_from_table (p, i);
2052 /* Recompute the hash codes of any valid entries in the hash table that
2053 reference X, if X is a register, or SUBREG_REG (X) if X is a SUBREG.
2055 This is called when we make a jump equivalence. */
2057 static void
2058 rehash_using_reg (rtx x)
2060 unsigned int i;
2061 struct table_elt *p, *next;
2062 unsigned hash;
2064 if (GET_CODE (x) == SUBREG)
2065 x = SUBREG_REG (x);
2067 /* If X is not a register or if the register is known not to be in any
2068 valid entries in the table, we have no work to do. */
2070 if (!REG_P (x)
2071 || REG_IN_TABLE (REGNO (x)) < 0
2072 || REG_IN_TABLE (REGNO (x)) != REG_TICK (REGNO (x)))
2073 return;
2075 /* Scan all hash chains looking for valid entries that mention X.
2076 If we find one and it is in the wrong hash chain, move it. */
2078 for (i = 0; i < HASH_SIZE; i++)
2079 for (p = table[i]; p; p = next)
2081 next = p->next_same_hash;
2082 if (reg_mentioned_p (x, p->exp)
2083 && exp_equiv_p (p->exp, p->exp, 1, false)
2084 && i != (hash = SAFE_HASH (p->exp, p->mode)))
2086 if (p->next_same_hash)
2087 p->next_same_hash->prev_same_hash = p->prev_same_hash;
2089 if (p->prev_same_hash)
2090 p->prev_same_hash->next_same_hash = p->next_same_hash;
2091 else
2092 table[i] = p->next_same_hash;
2094 p->next_same_hash = table[hash];
2095 p->prev_same_hash = 0;
2096 if (table[hash])
2097 table[hash]->prev_same_hash = p;
2098 table[hash] = p;
2103 /* Remove from the hash table any expression that is a call-clobbered
2104 register. Also update their TICK values. */
2106 static void
2107 invalidate_for_call (void)
2109 unsigned int regno, endregno;
2110 unsigned int i;
2111 unsigned hash;
2112 struct table_elt *p, *next;
2113 int in_table = 0;
2114 hard_reg_set_iterator hrsi;
2116 /* Go through all the hard registers. For each that is clobbered in
2117 a CALL_INSN, remove the register from quantity chains and update
2118 reg_tick if defined. Also see if any of these registers is currently
2119 in the table. */
2120 EXECUTE_IF_SET_IN_HARD_REG_SET (regs_invalidated_by_call, 0, regno, hrsi)
2122 delete_reg_equiv (regno);
2123 if (REG_TICK (regno) >= 0)
2125 REG_TICK (regno)++;
2126 SUBREG_TICKED (regno) = -1;
2128 in_table |= (TEST_HARD_REG_BIT (hard_regs_in_table, regno) != 0);
2131 /* In the case where we have no call-clobbered hard registers in the
2132 table, we are done. Otherwise, scan the table and remove any
2133 entry that overlaps a call-clobbered register. */
2135 if (in_table)
2136 for (hash = 0; hash < HASH_SIZE; hash++)
2137 for (p = table[hash]; p; p = next)
2139 next = p->next_same_hash;
2141 if (!REG_P (p->exp)
2142 || REGNO (p->exp) >= FIRST_PSEUDO_REGISTER)
2143 continue;
2145 regno = REGNO (p->exp);
2146 endregno = END_HARD_REGNO (p->exp);
2148 for (i = regno; i < endregno; i++)
2149 if (TEST_HARD_REG_BIT (regs_invalidated_by_call, i))
2151 remove_from_table (p, hash);
2152 break;
2157 /* Given an expression X of type CONST,
2158 and ELT which is its table entry (or 0 if it
2159 is not in the hash table),
2160 return an alternate expression for X as a register plus integer.
2161 If none can be found, return 0. */
2163 static rtx
2164 use_related_value (rtx x, struct table_elt *elt)
2166 struct table_elt *relt = 0;
2167 struct table_elt *p, *q;
2168 HOST_WIDE_INT offset;
2170 /* First, is there anything related known?
2171 If we have a table element, we can tell from that.
2172 Otherwise, must look it up. */
2174 if (elt != 0 && elt->related_value != 0)
2175 relt = elt;
2176 else if (elt == 0 && GET_CODE (x) == CONST)
2178 rtx subexp = get_related_value (x);
2179 if (subexp != 0)
2180 relt = lookup (subexp,
2181 SAFE_HASH (subexp, GET_MODE (subexp)),
2182 GET_MODE (subexp));
2185 if (relt == 0)
2186 return 0;
2188 /* Search all related table entries for one that has an
2189 equivalent register. */
2191 p = relt;
2192 while (1)
2194 /* This loop is strange in that it is executed in two different cases.
2195 The first is when X is already in the table. Then it is searching
2196 the RELATED_VALUE list of X's class (RELT). The second case is when
2197 X is not in the table. Then RELT points to a class for the related
2198 value.
2200 Ensure that, whatever case we are in, that we ignore classes that have
2201 the same value as X. */
2203 if (rtx_equal_p (x, p->exp))
2204 q = 0;
2205 else
2206 for (q = p->first_same_value; q; q = q->next_same_value)
2207 if (REG_P (q->exp))
2208 break;
2210 if (q)
2211 break;
2213 p = p->related_value;
2215 /* We went all the way around, so there is nothing to be found.
2216 Alternatively, perhaps RELT was in the table for some other reason
2217 and it has no related values recorded. */
2218 if (p == relt || p == 0)
2219 break;
2222 if (q == 0)
2223 return 0;
2225 offset = (get_integer_term (x) - get_integer_term (p->exp));
2226 /* Note: OFFSET may be 0 if P->xexp and X are related by commutativity. */
2227 return plus_constant (q->mode, q->exp, offset);
2231 /* Hash a string. Just add its bytes up. */
2232 static inline unsigned
2233 hash_rtx_string (const char *ps)
2235 unsigned hash = 0;
2236 const unsigned char *p = (const unsigned char *) ps;
2238 if (p)
2239 while (*p)
2240 hash += *p++;
2242 return hash;
2245 /* Same as hash_rtx, but call CB on each rtx if it is not NULL.
2246 When the callback returns true, we continue with the new rtx. */
2248 unsigned
2249 hash_rtx_cb (const_rtx x, machine_mode mode,
2250 int *do_not_record_p, int *hash_arg_in_memory_p,
2251 bool have_reg_qty, hash_rtx_callback_function cb)
2253 int i, j;
2254 unsigned hash = 0;
2255 enum rtx_code code;
2256 const char *fmt;
2257 machine_mode newmode;
2258 rtx newx;
2260 /* Used to turn recursion into iteration. We can't rely on GCC's
2261 tail-recursion elimination since we need to keep accumulating values
2262 in HASH. */
2263 repeat:
2264 if (x == 0)
2265 return hash;
2267 /* Invoke the callback first. */
2268 if (cb != NULL
2269 && ((*cb) (x, mode, &newx, &newmode)))
2271 hash += hash_rtx_cb (newx, newmode, do_not_record_p,
2272 hash_arg_in_memory_p, have_reg_qty, cb);
2273 return hash;
2276 code = GET_CODE (x);
2277 switch (code)
2279 case REG:
2281 unsigned int regno = REGNO (x);
2283 if (do_not_record_p && !reload_completed)
2285 /* On some machines, we can't record any non-fixed hard register,
2286 because extending its life will cause reload problems. We
2287 consider ap, fp, sp, gp to be fixed for this purpose.
2289 We also consider CCmode registers to be fixed for this purpose;
2290 failure to do so leads to failure to simplify 0<100 type of
2291 conditionals.
2293 On all machines, we can't record any global registers.
2294 Nor should we record any register that is in a small
2295 class, as defined by TARGET_CLASS_LIKELY_SPILLED_P. */
2296 bool record;
2298 if (regno >= FIRST_PSEUDO_REGISTER)
2299 record = true;
2300 else if (x == frame_pointer_rtx
2301 || x == hard_frame_pointer_rtx
2302 || x == arg_pointer_rtx
2303 || x == stack_pointer_rtx
2304 || x == pic_offset_table_rtx)
2305 record = true;
2306 else if (global_regs[regno])
2307 record = false;
2308 else if (fixed_regs[regno])
2309 record = true;
2310 else if (GET_MODE_CLASS (GET_MODE (x)) == MODE_CC)
2311 record = true;
2312 else if (targetm.small_register_classes_for_mode_p (GET_MODE (x)))
2313 record = false;
2314 else if (targetm.class_likely_spilled_p (REGNO_REG_CLASS (regno)))
2315 record = false;
2316 else
2317 record = true;
2319 if (!record)
2321 *do_not_record_p = 1;
2322 return 0;
2326 hash += ((unsigned int) REG << 7);
2327 hash += (have_reg_qty ? (unsigned) REG_QTY (regno) : regno);
2328 return hash;
2331 /* We handle SUBREG of a REG specially because the underlying
2332 reg changes its hash value with every value change; we don't
2333 want to have to forget unrelated subregs when one subreg changes. */
2334 case SUBREG:
2336 if (REG_P (SUBREG_REG (x)))
2338 hash += (((unsigned int) SUBREG << 7)
2339 + REGNO (SUBREG_REG (x))
2340 + (SUBREG_BYTE (x) / UNITS_PER_WORD));
2341 return hash;
2343 break;
2346 case CONST_INT:
2347 hash += (((unsigned int) CONST_INT << 7) + (unsigned int) mode
2348 + (unsigned int) INTVAL (x));
2349 return hash;
2351 case CONST_WIDE_INT:
2352 for (i = 0; i < CONST_WIDE_INT_NUNITS (x); i++)
2353 hash += CONST_WIDE_INT_ELT (x, i);
2354 return hash;
2356 case CONST_DOUBLE:
2357 /* This is like the general case, except that it only counts
2358 the integers representing the constant. */
2359 hash += (unsigned int) code + (unsigned int) GET_MODE (x);
2360 if (TARGET_SUPPORTS_WIDE_INT == 0 && GET_MODE (x) == VOIDmode)
2361 hash += ((unsigned int) CONST_DOUBLE_LOW (x)
2362 + (unsigned int) CONST_DOUBLE_HIGH (x));
2363 else
2364 hash += real_hash (CONST_DOUBLE_REAL_VALUE (x));
2365 return hash;
2367 case CONST_FIXED:
2368 hash += (unsigned int) code + (unsigned int) GET_MODE (x);
2369 hash += fixed_hash (CONST_FIXED_VALUE (x));
2370 return hash;
2372 case CONST_VECTOR:
2374 int units;
2375 rtx elt;
2377 units = CONST_VECTOR_NUNITS (x);
2379 for (i = 0; i < units; ++i)
2381 elt = CONST_VECTOR_ELT (x, i);
2382 hash += hash_rtx_cb (elt, GET_MODE (elt),
2383 do_not_record_p, hash_arg_in_memory_p,
2384 have_reg_qty, cb);
2387 return hash;
2390 /* Assume there is only one rtx object for any given label. */
2391 case LABEL_REF:
2392 /* We don't hash on the address of the CODE_LABEL to avoid bootstrap
2393 differences and differences between each stage's debugging dumps. */
2394 hash += (((unsigned int) LABEL_REF << 7)
2395 + CODE_LABEL_NUMBER (LABEL_REF_LABEL (x)));
2396 return hash;
2398 case SYMBOL_REF:
2400 /* Don't hash on the symbol's address to avoid bootstrap differences.
2401 Different hash values may cause expressions to be recorded in
2402 different orders and thus different registers to be used in the
2403 final assembler. This also avoids differences in the dump files
2404 between various stages. */
2405 unsigned int h = 0;
2406 const unsigned char *p = (const unsigned char *) XSTR (x, 0);
2408 while (*p)
2409 h += (h << 7) + *p++; /* ??? revisit */
2411 hash += ((unsigned int) SYMBOL_REF << 7) + h;
2412 return hash;
2415 case MEM:
2416 /* We don't record if marked volatile or if BLKmode since we don't
2417 know the size of the move. */
2418 if (do_not_record_p && (MEM_VOLATILE_P (x) || GET_MODE (x) == BLKmode))
2420 *do_not_record_p = 1;
2421 return 0;
2423 if (hash_arg_in_memory_p && !MEM_READONLY_P (x))
2424 *hash_arg_in_memory_p = 1;
2426 /* Now that we have already found this special case,
2427 might as well speed it up as much as possible. */
2428 hash += (unsigned) MEM;
2429 x = XEXP (x, 0);
2430 goto repeat;
2432 case USE:
2433 /* A USE that mentions non-volatile memory needs special
2434 handling since the MEM may be BLKmode which normally
2435 prevents an entry from being made. Pure calls are
2436 marked by a USE which mentions BLKmode memory.
2437 See calls.c:emit_call_1. */
2438 if (MEM_P (XEXP (x, 0))
2439 && ! MEM_VOLATILE_P (XEXP (x, 0)))
2441 hash += (unsigned) USE;
2442 x = XEXP (x, 0);
2444 if (hash_arg_in_memory_p && !MEM_READONLY_P (x))
2445 *hash_arg_in_memory_p = 1;
2447 /* Now that we have already found this special case,
2448 might as well speed it up as much as possible. */
2449 hash += (unsigned) MEM;
2450 x = XEXP (x, 0);
2451 goto repeat;
2453 break;
2455 case PRE_DEC:
2456 case PRE_INC:
2457 case POST_DEC:
2458 case POST_INC:
2459 case PRE_MODIFY:
2460 case POST_MODIFY:
2461 case PC:
2462 case CC0:
2463 case CALL:
2464 case UNSPEC_VOLATILE:
2465 if (do_not_record_p) {
2466 *do_not_record_p = 1;
2467 return 0;
2469 else
2470 return hash;
2471 break;
2473 case ASM_OPERANDS:
2474 if (do_not_record_p && MEM_VOLATILE_P (x))
2476 *do_not_record_p = 1;
2477 return 0;
2479 else
2481 /* We don't want to take the filename and line into account. */
2482 hash += (unsigned) code + (unsigned) GET_MODE (x)
2483 + hash_rtx_string (ASM_OPERANDS_TEMPLATE (x))
2484 + hash_rtx_string (ASM_OPERANDS_OUTPUT_CONSTRAINT (x))
2485 + (unsigned) ASM_OPERANDS_OUTPUT_IDX (x);
2487 if (ASM_OPERANDS_INPUT_LENGTH (x))
2489 for (i = 1; i < ASM_OPERANDS_INPUT_LENGTH (x); i++)
2491 hash += (hash_rtx_cb (ASM_OPERANDS_INPUT (x, i),
2492 GET_MODE (ASM_OPERANDS_INPUT (x, i)),
2493 do_not_record_p, hash_arg_in_memory_p,
2494 have_reg_qty, cb)
2495 + hash_rtx_string
2496 (ASM_OPERANDS_INPUT_CONSTRAINT (x, i)));
2499 hash += hash_rtx_string (ASM_OPERANDS_INPUT_CONSTRAINT (x, 0));
2500 x = ASM_OPERANDS_INPUT (x, 0);
2501 mode = GET_MODE (x);
2502 goto repeat;
2505 return hash;
2507 break;
2509 default:
2510 break;
2513 i = GET_RTX_LENGTH (code) - 1;
2514 hash += (unsigned) code + (unsigned) GET_MODE (x);
2515 fmt = GET_RTX_FORMAT (code);
2516 for (; i >= 0; i--)
2518 switch (fmt[i])
2520 case 'e':
2521 /* If we are about to do the last recursive call
2522 needed at this level, change it into iteration.
2523 This function is called enough to be worth it. */
2524 if (i == 0)
2526 x = XEXP (x, i);
2527 goto repeat;
2530 hash += hash_rtx_cb (XEXP (x, i), VOIDmode, do_not_record_p,
2531 hash_arg_in_memory_p,
2532 have_reg_qty, cb);
2533 break;
2535 case 'E':
2536 for (j = 0; j < XVECLEN (x, i); j++)
2537 hash += hash_rtx_cb (XVECEXP (x, i, j), VOIDmode, do_not_record_p,
2538 hash_arg_in_memory_p,
2539 have_reg_qty, cb);
2540 break;
2542 case 's':
2543 hash += hash_rtx_string (XSTR (x, i));
2544 break;
2546 case 'i':
2547 hash += (unsigned int) XINT (x, i);
2548 break;
2550 case '0': case 't':
2551 /* Unused. */
2552 break;
2554 default:
2555 gcc_unreachable ();
2559 return hash;
2562 /* Hash an rtx. We are careful to make sure the value is never negative.
2563 Equivalent registers hash identically.
2564 MODE is used in hashing for CONST_INTs only;
2565 otherwise the mode of X is used.
2567 Store 1 in DO_NOT_RECORD_P if any subexpression is volatile.
2569 If HASH_ARG_IN_MEMORY_P is not NULL, store 1 in it if X contains
2570 a MEM rtx which does not have the MEM_READONLY_P flag set.
2572 Note that cse_insn knows that the hash code of a MEM expression
2573 is just (int) MEM plus the hash code of the address. */
2575 unsigned
2576 hash_rtx (const_rtx x, machine_mode mode, int *do_not_record_p,
2577 int *hash_arg_in_memory_p, bool have_reg_qty)
2579 return hash_rtx_cb (x, mode, do_not_record_p,
2580 hash_arg_in_memory_p, have_reg_qty, NULL);
2583 /* Hash an rtx X for cse via hash_rtx.
2584 Stores 1 in do_not_record if any subexpression is volatile.
2585 Stores 1 in hash_arg_in_memory if X contains a mem rtx which
2586 does not have the MEM_READONLY_P flag set. */
2588 static inline unsigned
2589 canon_hash (rtx x, machine_mode mode)
2591 return hash_rtx (x, mode, &do_not_record, &hash_arg_in_memory, true);
2594 /* Like canon_hash but with no side effects, i.e. do_not_record
2595 and hash_arg_in_memory are not changed. */
2597 static inline unsigned
2598 safe_hash (rtx x, machine_mode mode)
2600 int dummy_do_not_record;
2601 return hash_rtx (x, mode, &dummy_do_not_record, NULL, true);
2604 /* Return 1 iff X and Y would canonicalize into the same thing,
2605 without actually constructing the canonicalization of either one.
2606 If VALIDATE is nonzero,
2607 we assume X is an expression being processed from the rtl
2608 and Y was found in the hash table. We check register refs
2609 in Y for being marked as valid.
2611 If FOR_GCSE is true, we compare X and Y for equivalence for GCSE. */
2614 exp_equiv_p (const_rtx x, const_rtx y, int validate, bool for_gcse)
2616 int i, j;
2617 enum rtx_code code;
2618 const char *fmt;
2620 /* Note: it is incorrect to assume an expression is equivalent to itself
2621 if VALIDATE is nonzero. */
2622 if (x == y && !validate)
2623 return 1;
2625 if (x == 0 || y == 0)
2626 return x == y;
2628 code = GET_CODE (x);
2629 if (code != GET_CODE (y))
2630 return 0;
2632 /* (MULT:SI x y) and (MULT:HI x y) are NOT equivalent. */
2633 if (GET_MODE (x) != GET_MODE (y))
2634 return 0;
2636 /* MEMs referring to different address space are not equivalent. */
2637 if (code == MEM && MEM_ADDR_SPACE (x) != MEM_ADDR_SPACE (y))
2638 return 0;
2640 switch (code)
2642 case PC:
2643 case CC0:
2644 CASE_CONST_UNIQUE:
2645 return x == y;
2647 case LABEL_REF:
2648 return LABEL_REF_LABEL (x) == LABEL_REF_LABEL (y);
2650 case SYMBOL_REF:
2651 return XSTR (x, 0) == XSTR (y, 0);
2653 case REG:
2654 if (for_gcse)
2655 return REGNO (x) == REGNO (y);
2656 else
2658 unsigned int regno = REGNO (y);
2659 unsigned int i;
2660 unsigned int endregno = END_REGNO (y);
2662 /* If the quantities are not the same, the expressions are not
2663 equivalent. If there are and we are not to validate, they
2664 are equivalent. Otherwise, ensure all regs are up-to-date. */
2666 if (REG_QTY (REGNO (x)) != REG_QTY (regno))
2667 return 0;
2669 if (! validate)
2670 return 1;
2672 for (i = regno; i < endregno; i++)
2673 if (REG_IN_TABLE (i) != REG_TICK (i))
2674 return 0;
2676 return 1;
2679 case MEM:
2680 if (for_gcse)
2682 /* A volatile mem should not be considered equivalent to any
2683 other. */
2684 if (MEM_VOLATILE_P (x) || MEM_VOLATILE_P (y))
2685 return 0;
2687 /* Can't merge two expressions in different alias sets, since we
2688 can decide that the expression is transparent in a block when
2689 it isn't, due to it being set with the different alias set.
2691 Also, can't merge two expressions with different MEM_ATTRS.
2692 They could e.g. be two different entities allocated into the
2693 same space on the stack (see e.g. PR25130). In that case, the
2694 MEM addresses can be the same, even though the two MEMs are
2695 absolutely not equivalent.
2697 But because really all MEM attributes should be the same for
2698 equivalent MEMs, we just use the invariant that MEMs that have
2699 the same attributes share the same mem_attrs data structure. */
2700 if (!mem_attrs_eq_p (MEM_ATTRS (x), MEM_ATTRS (y)))
2701 return 0;
2703 /* If we are handling exceptions, we cannot consider two expressions
2704 with different trapping status as equivalent, because simple_mem
2705 might accept one and reject the other. */
2706 if (cfun->can_throw_non_call_exceptions
2707 && (MEM_NOTRAP_P (x) != MEM_NOTRAP_P (y)))
2708 return 0;
2710 break;
2712 /* For commutative operations, check both orders. */
2713 case PLUS:
2714 case MULT:
2715 case AND:
2716 case IOR:
2717 case XOR:
2718 case NE:
2719 case EQ:
2720 return ((exp_equiv_p (XEXP (x, 0), XEXP (y, 0),
2721 validate, for_gcse)
2722 && exp_equiv_p (XEXP (x, 1), XEXP (y, 1),
2723 validate, for_gcse))
2724 || (exp_equiv_p (XEXP (x, 0), XEXP (y, 1),
2725 validate, for_gcse)
2726 && exp_equiv_p (XEXP (x, 1), XEXP (y, 0),
2727 validate, for_gcse)));
2729 case ASM_OPERANDS:
2730 /* We don't use the generic code below because we want to
2731 disregard filename and line numbers. */
2733 /* A volatile asm isn't equivalent to any other. */
2734 if (MEM_VOLATILE_P (x) || MEM_VOLATILE_P (y))
2735 return 0;
2737 if (GET_MODE (x) != GET_MODE (y)
2738 || strcmp (ASM_OPERANDS_TEMPLATE (x), ASM_OPERANDS_TEMPLATE (y))
2739 || strcmp (ASM_OPERANDS_OUTPUT_CONSTRAINT (x),
2740 ASM_OPERANDS_OUTPUT_CONSTRAINT (y))
2741 || ASM_OPERANDS_OUTPUT_IDX (x) != ASM_OPERANDS_OUTPUT_IDX (y)
2742 || ASM_OPERANDS_INPUT_LENGTH (x) != ASM_OPERANDS_INPUT_LENGTH (y))
2743 return 0;
2745 if (ASM_OPERANDS_INPUT_LENGTH (x))
2747 for (i = ASM_OPERANDS_INPUT_LENGTH (x) - 1; i >= 0; i--)
2748 if (! exp_equiv_p (ASM_OPERANDS_INPUT (x, i),
2749 ASM_OPERANDS_INPUT (y, i),
2750 validate, for_gcse)
2751 || strcmp (ASM_OPERANDS_INPUT_CONSTRAINT (x, i),
2752 ASM_OPERANDS_INPUT_CONSTRAINT (y, i)))
2753 return 0;
2756 return 1;
2758 default:
2759 break;
2762 /* Compare the elements. If any pair of corresponding elements
2763 fail to match, return 0 for the whole thing. */
2765 fmt = GET_RTX_FORMAT (code);
2766 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
2768 switch (fmt[i])
2770 case 'e':
2771 if (! exp_equiv_p (XEXP (x, i), XEXP (y, i),
2772 validate, for_gcse))
2773 return 0;
2774 break;
2776 case 'E':
2777 if (XVECLEN (x, i) != XVECLEN (y, i))
2778 return 0;
2779 for (j = 0; j < XVECLEN (x, i); j++)
2780 if (! exp_equiv_p (XVECEXP (x, i, j), XVECEXP (y, i, j),
2781 validate, for_gcse))
2782 return 0;
2783 break;
2785 case 's':
2786 if (strcmp (XSTR (x, i), XSTR (y, i)))
2787 return 0;
2788 break;
2790 case 'i':
2791 if (XINT (x, i) != XINT (y, i))
2792 return 0;
2793 break;
2795 case 'w':
2796 if (XWINT (x, i) != XWINT (y, i))
2797 return 0;
2798 break;
2800 case '0':
2801 case 't':
2802 break;
2804 default:
2805 gcc_unreachable ();
2809 return 1;
2812 /* Subroutine of canon_reg. Pass *XLOC through canon_reg, and validate
2813 the result if necessary. INSN is as for canon_reg. */
2815 static void
2816 validate_canon_reg (rtx *xloc, rtx_insn *insn)
2818 if (*xloc)
2820 rtx new_rtx = canon_reg (*xloc, insn);
2822 /* If replacing pseudo with hard reg or vice versa, ensure the
2823 insn remains valid. Likewise if the insn has MATCH_DUPs. */
2824 gcc_assert (insn && new_rtx);
2825 validate_change (insn, xloc, new_rtx, 1);
2829 /* Canonicalize an expression:
2830 replace each register reference inside it
2831 with the "oldest" equivalent register.
2833 If INSN is nonzero validate_change is used to ensure that INSN remains valid
2834 after we make our substitution. The calls are made with IN_GROUP nonzero
2835 so apply_change_group must be called upon the outermost return from this
2836 function (unless INSN is zero). The result of apply_change_group can
2837 generally be discarded since the changes we are making are optional. */
2839 static rtx
2840 canon_reg (rtx x, rtx_insn *insn)
2842 int i;
2843 enum rtx_code code;
2844 const char *fmt;
2846 if (x == 0)
2847 return x;
2849 code = GET_CODE (x);
2850 switch (code)
2852 case PC:
2853 case CC0:
2854 case CONST:
2855 CASE_CONST_ANY:
2856 case SYMBOL_REF:
2857 case LABEL_REF:
2858 case ADDR_VEC:
2859 case ADDR_DIFF_VEC:
2860 return x;
2862 case REG:
2864 int first;
2865 int q;
2866 struct qty_table_elem *ent;
2868 /* Never replace a hard reg, because hard regs can appear
2869 in more than one machine mode, and we must preserve the mode
2870 of each occurrence. Also, some hard regs appear in
2871 MEMs that are shared and mustn't be altered. Don't try to
2872 replace any reg that maps to a reg of class NO_REGS. */
2873 if (REGNO (x) < FIRST_PSEUDO_REGISTER
2874 || ! REGNO_QTY_VALID_P (REGNO (x)))
2875 return x;
2877 q = REG_QTY (REGNO (x));
2878 ent = &qty_table[q];
2879 first = ent->first_reg;
2880 return (first >= FIRST_PSEUDO_REGISTER ? regno_reg_rtx[first]
2881 : REGNO_REG_CLASS (first) == NO_REGS ? x
2882 : gen_rtx_REG (ent->mode, first));
2885 default:
2886 break;
2889 fmt = GET_RTX_FORMAT (code);
2890 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
2892 int j;
2894 if (fmt[i] == 'e')
2895 validate_canon_reg (&XEXP (x, i), insn);
2896 else if (fmt[i] == 'E')
2897 for (j = 0; j < XVECLEN (x, i); j++)
2898 validate_canon_reg (&XVECEXP (x, i, j), insn);
2901 return x;
2904 /* Given an operation (CODE, *PARG1, *PARG2), where code is a comparison
2905 operation (EQ, NE, GT, etc.), follow it back through the hash table and
2906 what values are being compared.
2908 *PARG1 and *PARG2 are updated to contain the rtx representing the values
2909 actually being compared. For example, if *PARG1 was (cc0) and *PARG2
2910 was (const_int 0), *PARG1 and *PARG2 will be set to the objects that were
2911 compared to produce cc0.
2913 The return value is the comparison operator and is either the code of
2914 A or the code corresponding to the inverse of the comparison. */
2916 static enum rtx_code
2917 find_comparison_args (enum rtx_code code, rtx *parg1, rtx *parg2,
2918 machine_mode *pmode1, machine_mode *pmode2)
2920 rtx arg1, arg2;
2921 hash_set<rtx> *visited = NULL;
2922 /* Set nonzero when we find something of interest. */
2923 rtx x = NULL;
2925 arg1 = *parg1, arg2 = *parg2;
2927 /* If ARG2 is const0_rtx, see what ARG1 is equivalent to. */
2929 while (arg2 == CONST0_RTX (GET_MODE (arg1)))
2931 int reverse_code = 0;
2932 struct table_elt *p = 0;
2934 /* Remember state from previous iteration. */
2935 if (x)
2937 if (!visited)
2938 visited = new hash_set<rtx>;
2939 visited->add (x);
2940 x = 0;
2943 /* If arg1 is a COMPARE, extract the comparison arguments from it.
2944 On machines with CC0, this is the only case that can occur, since
2945 fold_rtx will return the COMPARE or item being compared with zero
2946 when given CC0. */
2948 if (GET_CODE (arg1) == COMPARE && arg2 == const0_rtx)
2949 x = arg1;
2951 /* If ARG1 is a comparison operator and CODE is testing for
2952 STORE_FLAG_VALUE, get the inner arguments. */
2954 else if (COMPARISON_P (arg1))
2956 #ifdef FLOAT_STORE_FLAG_VALUE
2957 REAL_VALUE_TYPE fsfv;
2958 #endif
2960 if (code == NE
2961 || (GET_MODE_CLASS (GET_MODE (arg1)) == MODE_INT
2962 && code == LT && STORE_FLAG_VALUE == -1)
2963 #ifdef FLOAT_STORE_FLAG_VALUE
2964 || (SCALAR_FLOAT_MODE_P (GET_MODE (arg1))
2965 && (fsfv = FLOAT_STORE_FLAG_VALUE (GET_MODE (arg1)),
2966 REAL_VALUE_NEGATIVE (fsfv)))
2967 #endif
2969 x = arg1;
2970 else if (code == EQ
2971 || (GET_MODE_CLASS (GET_MODE (arg1)) == MODE_INT
2972 && code == GE && STORE_FLAG_VALUE == -1)
2973 #ifdef FLOAT_STORE_FLAG_VALUE
2974 || (SCALAR_FLOAT_MODE_P (GET_MODE (arg1))
2975 && (fsfv = FLOAT_STORE_FLAG_VALUE (GET_MODE (arg1)),
2976 REAL_VALUE_NEGATIVE (fsfv)))
2977 #endif
2979 x = arg1, reverse_code = 1;
2982 /* ??? We could also check for
2984 (ne (and (eq (...) (const_int 1))) (const_int 0))
2986 and related forms, but let's wait until we see them occurring. */
2988 if (x == 0)
2989 /* Look up ARG1 in the hash table and see if it has an equivalence
2990 that lets us see what is being compared. */
2991 p = lookup (arg1, SAFE_HASH (arg1, GET_MODE (arg1)), GET_MODE (arg1));
2992 if (p)
2994 p = p->first_same_value;
2996 /* If what we compare is already known to be constant, that is as
2997 good as it gets.
2998 We need to break the loop in this case, because otherwise we
2999 can have an infinite loop when looking at a reg that is known
3000 to be a constant which is the same as a comparison of a reg
3001 against zero which appears later in the insn stream, which in
3002 turn is constant and the same as the comparison of the first reg
3003 against zero... */
3004 if (p->is_const)
3005 break;
3008 for (; p; p = p->next_same_value)
3010 machine_mode inner_mode = GET_MODE (p->exp);
3011 #ifdef FLOAT_STORE_FLAG_VALUE
3012 REAL_VALUE_TYPE fsfv;
3013 #endif
3015 /* If the entry isn't valid, skip it. */
3016 if (! exp_equiv_p (p->exp, p->exp, 1, false))
3017 continue;
3019 /* If it's a comparison we've used before, skip it. */
3020 if (visited && visited->contains (p->exp))
3021 continue;
3023 if (GET_CODE (p->exp) == COMPARE
3024 /* Another possibility is that this machine has a compare insn
3025 that includes the comparison code. In that case, ARG1 would
3026 be equivalent to a comparison operation that would set ARG1 to
3027 either STORE_FLAG_VALUE or zero. If this is an NE operation,
3028 ORIG_CODE is the actual comparison being done; if it is an EQ,
3029 we must reverse ORIG_CODE. On machine with a negative value
3030 for STORE_FLAG_VALUE, also look at LT and GE operations. */
3031 || ((code == NE
3032 || (code == LT
3033 && val_signbit_known_set_p (inner_mode,
3034 STORE_FLAG_VALUE))
3035 #ifdef FLOAT_STORE_FLAG_VALUE
3036 || (code == LT
3037 && SCALAR_FLOAT_MODE_P (inner_mode)
3038 && (fsfv = FLOAT_STORE_FLAG_VALUE (GET_MODE (arg1)),
3039 REAL_VALUE_NEGATIVE (fsfv)))
3040 #endif
3042 && COMPARISON_P (p->exp)))
3044 x = p->exp;
3045 break;
3047 else if ((code == EQ
3048 || (code == GE
3049 && val_signbit_known_set_p (inner_mode,
3050 STORE_FLAG_VALUE))
3051 #ifdef FLOAT_STORE_FLAG_VALUE
3052 || (code == GE
3053 && SCALAR_FLOAT_MODE_P (inner_mode)
3054 && (fsfv = FLOAT_STORE_FLAG_VALUE (GET_MODE (arg1)),
3055 REAL_VALUE_NEGATIVE (fsfv)))
3056 #endif
3058 && COMPARISON_P (p->exp))
3060 reverse_code = 1;
3061 x = p->exp;
3062 break;
3065 /* If this non-trapping address, e.g. fp + constant, the
3066 equivalent is a better operand since it may let us predict
3067 the value of the comparison. */
3068 else if (!rtx_addr_can_trap_p (p->exp))
3070 arg1 = p->exp;
3071 continue;
3075 /* If we didn't find a useful equivalence for ARG1, we are done.
3076 Otherwise, set up for the next iteration. */
3077 if (x == 0)
3078 break;
3080 /* If we need to reverse the comparison, make sure that that is
3081 possible -- we can't necessarily infer the value of GE from LT
3082 with floating-point operands. */
3083 if (reverse_code)
3085 enum rtx_code reversed = reversed_comparison_code (x, NULL_RTX);
3086 if (reversed == UNKNOWN)
3087 break;
3088 else
3089 code = reversed;
3091 else if (COMPARISON_P (x))
3092 code = GET_CODE (x);
3093 arg1 = XEXP (x, 0), arg2 = XEXP (x, 1);
3096 /* Return our results. Return the modes from before fold_rtx
3097 because fold_rtx might produce const_int, and then it's too late. */
3098 *pmode1 = GET_MODE (arg1), *pmode2 = GET_MODE (arg2);
3099 *parg1 = fold_rtx (arg1, 0), *parg2 = fold_rtx (arg2, 0);
3101 if (visited)
3102 delete visited;
3103 return code;
3106 /* If X is a nontrivial arithmetic operation on an argument for which
3107 a constant value can be determined, return the result of operating
3108 on that value, as a constant. Otherwise, return X, possibly with
3109 one or more operands changed to a forward-propagated constant.
3111 If X is a register whose contents are known, we do NOT return
3112 those contents here; equiv_constant is called to perform that task.
3113 For SUBREGs and MEMs, we do that both here and in equiv_constant.
3115 INSN is the insn that we may be modifying. If it is 0, make a copy
3116 of X before modifying it. */
3118 static rtx
3119 fold_rtx (rtx x, rtx_insn *insn)
3121 enum rtx_code code;
3122 machine_mode mode;
3123 const char *fmt;
3124 int i;
3125 rtx new_rtx = 0;
3126 int changed = 0;
3128 /* Operands of X. */
3129 /* Workaround -Wmaybe-uninitialized false positive during
3130 profiledbootstrap by initializing them. */
3131 rtx folded_arg0 = NULL_RTX;
3132 rtx folded_arg1 = NULL_RTX;
3134 /* Constant equivalents of first three operands of X;
3135 0 when no such equivalent is known. */
3136 rtx const_arg0;
3137 rtx const_arg1;
3138 rtx const_arg2;
3140 /* The mode of the first operand of X. We need this for sign and zero
3141 extends. */
3142 machine_mode mode_arg0;
3144 if (x == 0)
3145 return x;
3147 /* Try to perform some initial simplifications on X. */
3148 code = GET_CODE (x);
3149 switch (code)
3151 case MEM:
3152 case SUBREG:
3153 /* The first operand of a SIGN/ZERO_EXTRACT has a different meaning
3154 than it would in other contexts. Basically its mode does not
3155 signify the size of the object read. That information is carried
3156 by size operand. If we happen to have a MEM of the appropriate
3157 mode in our tables with a constant value we could simplify the
3158 extraction incorrectly if we allowed substitution of that value
3159 for the MEM. */
3160 case ZERO_EXTRACT:
3161 case SIGN_EXTRACT:
3162 if ((new_rtx = equiv_constant (x)) != NULL_RTX)
3163 return new_rtx;
3164 return x;
3166 case CONST:
3167 CASE_CONST_ANY:
3168 case SYMBOL_REF:
3169 case LABEL_REF:
3170 case REG:
3171 case PC:
3172 /* No use simplifying an EXPR_LIST
3173 since they are used only for lists of args
3174 in a function call's REG_EQUAL note. */
3175 case EXPR_LIST:
3176 return x;
3178 #ifdef HAVE_cc0
3179 case CC0:
3180 return prev_insn_cc0;
3181 #endif
3183 case ASM_OPERANDS:
3184 if (insn)
3186 for (i = ASM_OPERANDS_INPUT_LENGTH (x) - 1; i >= 0; i--)
3187 validate_change (insn, &ASM_OPERANDS_INPUT (x, i),
3188 fold_rtx (ASM_OPERANDS_INPUT (x, i), insn), 0);
3190 return x;
3192 #ifdef NO_FUNCTION_CSE
3193 case CALL:
3194 if (CONSTANT_P (XEXP (XEXP (x, 0), 0)))
3195 return x;
3196 break;
3197 #endif
3199 /* Anything else goes through the loop below. */
3200 default:
3201 break;
3204 mode = GET_MODE (x);
3205 const_arg0 = 0;
3206 const_arg1 = 0;
3207 const_arg2 = 0;
3208 mode_arg0 = VOIDmode;
3210 /* Try folding our operands.
3211 Then see which ones have constant values known. */
3213 fmt = GET_RTX_FORMAT (code);
3214 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
3215 if (fmt[i] == 'e')
3217 rtx folded_arg = XEXP (x, i), const_arg;
3218 machine_mode mode_arg = GET_MODE (folded_arg);
3220 switch (GET_CODE (folded_arg))
3222 case MEM:
3223 case REG:
3224 case SUBREG:
3225 const_arg = equiv_constant (folded_arg);
3226 break;
3228 case CONST:
3229 CASE_CONST_ANY:
3230 case SYMBOL_REF:
3231 case LABEL_REF:
3232 const_arg = folded_arg;
3233 break;
3235 #ifdef HAVE_cc0
3236 case CC0:
3237 /* The cc0-user and cc0-setter may be in different blocks if
3238 the cc0-setter potentially traps. In that case PREV_INSN_CC0
3239 will have been cleared as we exited the block with the
3240 setter.
3242 While we could potentially track cc0 in this case, it just
3243 doesn't seem to be worth it given that cc0 targets are not
3244 terribly common or important these days and trapping math
3245 is rarely used. The combination of those two conditions
3246 necessary to trip this situation is exceedingly rare in the
3247 real world. */
3248 if (!prev_insn_cc0)
3250 const_arg = NULL_RTX;
3252 else
3254 folded_arg = prev_insn_cc0;
3255 mode_arg = prev_insn_cc0_mode;
3256 const_arg = equiv_constant (folded_arg);
3258 break;
3259 #endif
3261 default:
3262 folded_arg = fold_rtx (folded_arg, insn);
3263 const_arg = equiv_constant (folded_arg);
3264 break;
3267 /* For the first three operands, see if the operand
3268 is constant or equivalent to a constant. */
3269 switch (i)
3271 case 0:
3272 folded_arg0 = folded_arg;
3273 const_arg0 = const_arg;
3274 mode_arg0 = mode_arg;
3275 break;
3276 case 1:
3277 folded_arg1 = folded_arg;
3278 const_arg1 = const_arg;
3279 break;
3280 case 2:
3281 const_arg2 = const_arg;
3282 break;
3285 /* Pick the least expensive of the argument and an equivalent constant
3286 argument. */
3287 if (const_arg != 0
3288 && const_arg != folded_arg
3289 && COST_IN (const_arg, code, i) <= COST_IN (folded_arg, code, i)
3291 /* It's not safe to substitute the operand of a conversion
3292 operator with a constant, as the conversion's identity
3293 depends upon the mode of its operand. This optimization
3294 is handled by the call to simplify_unary_operation. */
3295 && (GET_RTX_CLASS (code) != RTX_UNARY
3296 || GET_MODE (const_arg) == mode_arg0
3297 || (code != ZERO_EXTEND
3298 && code != SIGN_EXTEND
3299 && code != TRUNCATE
3300 && code != FLOAT_TRUNCATE
3301 && code != FLOAT_EXTEND
3302 && code != FLOAT
3303 && code != FIX
3304 && code != UNSIGNED_FLOAT
3305 && code != UNSIGNED_FIX)))
3306 folded_arg = const_arg;
3308 if (folded_arg == XEXP (x, i))
3309 continue;
3311 if (insn == NULL_RTX && !changed)
3312 x = copy_rtx (x);
3313 changed = 1;
3314 validate_unshare_change (insn, &XEXP (x, i), folded_arg, 1);
3317 if (changed)
3319 /* Canonicalize X if necessary, and keep const_argN and folded_argN
3320 consistent with the order in X. */
3321 if (canonicalize_change_group (insn, x))
3323 rtx tem;
3324 tem = const_arg0, const_arg0 = const_arg1, const_arg1 = tem;
3325 tem = folded_arg0, folded_arg0 = folded_arg1, folded_arg1 = tem;
3328 apply_change_group ();
3331 /* If X is an arithmetic operation, see if we can simplify it. */
3333 switch (GET_RTX_CLASS (code))
3335 case RTX_UNARY:
3337 /* We can't simplify extension ops unless we know the
3338 original mode. */
3339 if ((code == ZERO_EXTEND || code == SIGN_EXTEND)
3340 && mode_arg0 == VOIDmode)
3341 break;
3343 new_rtx = simplify_unary_operation (code, mode,
3344 const_arg0 ? const_arg0 : folded_arg0,
3345 mode_arg0);
3347 break;
3349 case RTX_COMPARE:
3350 case RTX_COMM_COMPARE:
3351 /* See what items are actually being compared and set FOLDED_ARG[01]
3352 to those values and CODE to the actual comparison code. If any are
3353 constant, set CONST_ARG0 and CONST_ARG1 appropriately. We needn't
3354 do anything if both operands are already known to be constant. */
3356 /* ??? Vector mode comparisons are not supported yet. */
3357 if (VECTOR_MODE_P (mode))
3358 break;
3360 if (const_arg0 == 0 || const_arg1 == 0)
3362 struct table_elt *p0, *p1;
3363 rtx true_rtx, false_rtx;
3364 machine_mode mode_arg1;
3366 if (SCALAR_FLOAT_MODE_P (mode))
3368 #ifdef FLOAT_STORE_FLAG_VALUE
3369 true_rtx = (CONST_DOUBLE_FROM_REAL_VALUE
3370 (FLOAT_STORE_FLAG_VALUE (mode), mode));
3371 #else
3372 true_rtx = NULL_RTX;
3373 #endif
3374 false_rtx = CONST0_RTX (mode);
3376 else
3378 true_rtx = const_true_rtx;
3379 false_rtx = const0_rtx;
3382 code = find_comparison_args (code, &folded_arg0, &folded_arg1,
3383 &mode_arg0, &mode_arg1);
3385 /* If the mode is VOIDmode or a MODE_CC mode, we don't know
3386 what kinds of things are being compared, so we can't do
3387 anything with this comparison. */
3389 if (mode_arg0 == VOIDmode || GET_MODE_CLASS (mode_arg0) == MODE_CC)
3390 break;
3392 const_arg0 = equiv_constant (folded_arg0);
3393 const_arg1 = equiv_constant (folded_arg1);
3395 /* If we do not now have two constants being compared, see
3396 if we can nevertheless deduce some things about the
3397 comparison. */
3398 if (const_arg0 == 0 || const_arg1 == 0)
3400 if (const_arg1 != NULL)
3402 rtx cheapest_simplification;
3403 int cheapest_cost;
3404 rtx simp_result;
3405 struct table_elt *p;
3407 /* See if we can find an equivalent of folded_arg0
3408 that gets us a cheaper expression, possibly a
3409 constant through simplifications. */
3410 p = lookup (folded_arg0, SAFE_HASH (folded_arg0, mode_arg0),
3411 mode_arg0);
3413 if (p != NULL)
3415 cheapest_simplification = x;
3416 cheapest_cost = COST (x);
3418 for (p = p->first_same_value; p != NULL; p = p->next_same_value)
3420 int cost;
3422 /* If the entry isn't valid, skip it. */
3423 if (! exp_equiv_p (p->exp, p->exp, 1, false))
3424 continue;
3426 /* Try to simplify using this equivalence. */
3427 simp_result
3428 = simplify_relational_operation (code, mode,
3429 mode_arg0,
3430 p->exp,
3431 const_arg1);
3433 if (simp_result == NULL)
3434 continue;
3436 cost = COST (simp_result);
3437 if (cost < cheapest_cost)
3439 cheapest_cost = cost;
3440 cheapest_simplification = simp_result;
3444 /* If we have a cheaper expression now, use that
3445 and try folding it further, from the top. */
3446 if (cheapest_simplification != x)
3447 return fold_rtx (copy_rtx (cheapest_simplification),
3448 insn);
3452 /* See if the two operands are the same. */
3454 if ((REG_P (folded_arg0)
3455 && REG_P (folded_arg1)
3456 && (REG_QTY (REGNO (folded_arg0))
3457 == REG_QTY (REGNO (folded_arg1))))
3458 || ((p0 = lookup (folded_arg0,
3459 SAFE_HASH (folded_arg0, mode_arg0),
3460 mode_arg0))
3461 && (p1 = lookup (folded_arg1,
3462 SAFE_HASH (folded_arg1, mode_arg0),
3463 mode_arg0))
3464 && p0->first_same_value == p1->first_same_value))
3465 folded_arg1 = folded_arg0;
3467 /* If FOLDED_ARG0 is a register, see if the comparison we are
3468 doing now is either the same as we did before or the reverse
3469 (we only check the reverse if not floating-point). */
3470 else if (REG_P (folded_arg0))
3472 int qty = REG_QTY (REGNO (folded_arg0));
3474 if (REGNO_QTY_VALID_P (REGNO (folded_arg0)))
3476 struct qty_table_elem *ent = &qty_table[qty];
3478 if ((comparison_dominates_p (ent->comparison_code, code)
3479 || (! FLOAT_MODE_P (mode_arg0)
3480 && comparison_dominates_p (ent->comparison_code,
3481 reverse_condition (code))))
3482 && (rtx_equal_p (ent->comparison_const, folded_arg1)
3483 || (const_arg1
3484 && rtx_equal_p (ent->comparison_const,
3485 const_arg1))
3486 || (REG_P (folded_arg1)
3487 && (REG_QTY (REGNO (folded_arg1)) == ent->comparison_qty))))
3489 if (comparison_dominates_p (ent->comparison_code, code))
3491 if (true_rtx)
3492 return true_rtx;
3493 else
3494 break;
3496 else
3497 return false_rtx;
3504 /* If we are comparing against zero, see if the first operand is
3505 equivalent to an IOR with a constant. If so, we may be able to
3506 determine the result of this comparison. */
3507 if (const_arg1 == const0_rtx && !const_arg0)
3509 rtx y = lookup_as_function (folded_arg0, IOR);
3510 rtx inner_const;
3512 if (y != 0
3513 && (inner_const = equiv_constant (XEXP (y, 1))) != 0
3514 && CONST_INT_P (inner_const)
3515 && INTVAL (inner_const) != 0)
3516 folded_arg0 = gen_rtx_IOR (mode_arg0, XEXP (y, 0), inner_const);
3520 rtx op0 = const_arg0 ? const_arg0 : copy_rtx (folded_arg0);
3521 rtx op1 = const_arg1 ? const_arg1 : copy_rtx (folded_arg1);
3522 new_rtx = simplify_relational_operation (code, mode, mode_arg0,
3523 op0, op1);
3525 break;
3527 case RTX_BIN_ARITH:
3528 case RTX_COMM_ARITH:
3529 switch (code)
3531 case PLUS:
3532 /* If the second operand is a LABEL_REF, see if the first is a MINUS
3533 with that LABEL_REF as its second operand. If so, the result is
3534 the first operand of that MINUS. This handles switches with an
3535 ADDR_DIFF_VEC table. */
3536 if (const_arg1 && GET_CODE (const_arg1) == LABEL_REF)
3538 rtx y
3539 = GET_CODE (folded_arg0) == MINUS ? folded_arg0
3540 : lookup_as_function (folded_arg0, MINUS);
3542 if (y != 0 && GET_CODE (XEXP (y, 1)) == LABEL_REF
3543 && LABEL_REF_LABEL (XEXP (y, 1)) == LABEL_REF_LABEL (const_arg1))
3544 return XEXP (y, 0);
3546 /* Now try for a CONST of a MINUS like the above. */
3547 if ((y = (GET_CODE (folded_arg0) == CONST ? folded_arg0
3548 : lookup_as_function (folded_arg0, CONST))) != 0
3549 && GET_CODE (XEXP (y, 0)) == MINUS
3550 && GET_CODE (XEXP (XEXP (y, 0), 1)) == LABEL_REF
3551 && LABEL_REF_LABEL (XEXP (XEXP (y, 0), 1)) == LABEL_REF_LABEL (const_arg1))
3552 return XEXP (XEXP (y, 0), 0);
3555 /* Likewise if the operands are in the other order. */
3556 if (const_arg0 && GET_CODE (const_arg0) == LABEL_REF)
3558 rtx y
3559 = GET_CODE (folded_arg1) == MINUS ? folded_arg1
3560 : lookup_as_function (folded_arg1, MINUS);
3562 if (y != 0 && GET_CODE (XEXP (y, 1)) == LABEL_REF
3563 && LABEL_REF_LABEL (XEXP (y, 1)) == LABEL_REF_LABEL (const_arg0))
3564 return XEXP (y, 0);
3566 /* Now try for a CONST of a MINUS like the above. */
3567 if ((y = (GET_CODE (folded_arg1) == CONST ? folded_arg1
3568 : lookup_as_function (folded_arg1, CONST))) != 0
3569 && GET_CODE (XEXP (y, 0)) == MINUS
3570 && GET_CODE (XEXP (XEXP (y, 0), 1)) == LABEL_REF
3571 && LABEL_REF_LABEL (XEXP (XEXP (y, 0), 1)) == LABEL_REF_LABEL (const_arg0))
3572 return XEXP (XEXP (y, 0), 0);
3575 /* If second operand is a register equivalent to a negative
3576 CONST_INT, see if we can find a register equivalent to the
3577 positive constant. Make a MINUS if so. Don't do this for
3578 a non-negative constant since we might then alternate between
3579 choosing positive and negative constants. Having the positive
3580 constant previously-used is the more common case. Be sure
3581 the resulting constant is non-negative; if const_arg1 were
3582 the smallest negative number this would overflow: depending
3583 on the mode, this would either just be the same value (and
3584 hence not save anything) or be incorrect. */
3585 if (const_arg1 != 0 && CONST_INT_P (const_arg1)
3586 && INTVAL (const_arg1) < 0
3587 /* This used to test
3589 -INTVAL (const_arg1) >= 0
3591 But The Sun V5.0 compilers mis-compiled that test. So
3592 instead we test for the problematic value in a more direct
3593 manner and hope the Sun compilers get it correct. */
3594 && INTVAL (const_arg1) !=
3595 ((HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT - 1))
3596 && REG_P (folded_arg1))
3598 rtx new_const = GEN_INT (-INTVAL (const_arg1));
3599 struct table_elt *p
3600 = lookup (new_const, SAFE_HASH (new_const, mode), mode);
3602 if (p)
3603 for (p = p->first_same_value; p; p = p->next_same_value)
3604 if (REG_P (p->exp))
3605 return simplify_gen_binary (MINUS, mode, folded_arg0,
3606 canon_reg (p->exp, NULL));
3608 goto from_plus;
3610 case MINUS:
3611 /* If we have (MINUS Y C), see if Y is known to be (PLUS Z C2).
3612 If so, produce (PLUS Z C2-C). */
3613 if (const_arg1 != 0 && CONST_INT_P (const_arg1))
3615 rtx y = lookup_as_function (XEXP (x, 0), PLUS);
3616 if (y && CONST_INT_P (XEXP (y, 1)))
3617 return fold_rtx (plus_constant (mode, copy_rtx (y),
3618 -INTVAL (const_arg1)),
3619 NULL);
3622 /* Fall through. */
3624 from_plus:
3625 case SMIN: case SMAX: case UMIN: case UMAX:
3626 case IOR: case AND: case XOR:
3627 case MULT:
3628 case ASHIFT: case LSHIFTRT: case ASHIFTRT:
3629 /* If we have (<op> <reg> <const_int>) for an associative OP and REG
3630 is known to be of similar form, we may be able to replace the
3631 operation with a combined operation. This may eliminate the
3632 intermediate operation if every use is simplified in this way.
3633 Note that the similar optimization done by combine.c only works
3634 if the intermediate operation's result has only one reference. */
3636 if (REG_P (folded_arg0)
3637 && const_arg1 && CONST_INT_P (const_arg1))
3639 int is_shift
3640 = (code == ASHIFT || code == ASHIFTRT || code == LSHIFTRT);
3641 rtx y, inner_const, new_const;
3642 rtx canon_const_arg1 = const_arg1;
3643 enum rtx_code associate_code;
3645 if (is_shift
3646 && (INTVAL (const_arg1) >= GET_MODE_PRECISION (mode)
3647 || INTVAL (const_arg1) < 0))
3649 if (SHIFT_COUNT_TRUNCATED)
3650 canon_const_arg1 = GEN_INT (INTVAL (const_arg1)
3651 & (GET_MODE_BITSIZE (mode)
3652 - 1));
3653 else
3654 break;
3657 y = lookup_as_function (folded_arg0, code);
3658 if (y == 0)
3659 break;
3661 /* If we have compiled a statement like
3662 "if (x == (x & mask1))", and now are looking at
3663 "x & mask2", we will have a case where the first operand
3664 of Y is the same as our first operand. Unless we detect
3665 this case, an infinite loop will result. */
3666 if (XEXP (y, 0) == folded_arg0)
3667 break;
3669 inner_const = equiv_constant (fold_rtx (XEXP (y, 1), 0));
3670 if (!inner_const || !CONST_INT_P (inner_const))
3671 break;
3673 /* Don't associate these operations if they are a PLUS with the
3674 same constant and it is a power of two. These might be doable
3675 with a pre- or post-increment. Similarly for two subtracts of
3676 identical powers of two with post decrement. */
3678 if (code == PLUS && const_arg1 == inner_const
3679 && ((HAVE_PRE_INCREMENT
3680 && exact_log2 (INTVAL (const_arg1)) >= 0)
3681 || (HAVE_POST_INCREMENT
3682 && exact_log2 (INTVAL (const_arg1)) >= 0)
3683 || (HAVE_PRE_DECREMENT
3684 && exact_log2 (- INTVAL (const_arg1)) >= 0)
3685 || (HAVE_POST_DECREMENT
3686 && exact_log2 (- INTVAL (const_arg1)) >= 0)))
3687 break;
3689 /* ??? Vector mode shifts by scalar
3690 shift operand are not supported yet. */
3691 if (is_shift && VECTOR_MODE_P (mode))
3692 break;
3694 if (is_shift
3695 && (INTVAL (inner_const) >= GET_MODE_PRECISION (mode)
3696 || INTVAL (inner_const) < 0))
3698 if (SHIFT_COUNT_TRUNCATED)
3699 inner_const = GEN_INT (INTVAL (inner_const)
3700 & (GET_MODE_BITSIZE (mode) - 1));
3701 else
3702 break;
3705 /* Compute the code used to compose the constants. For example,
3706 A-C1-C2 is A-(C1 + C2), so if CODE == MINUS, we want PLUS. */
3708 associate_code = (is_shift || code == MINUS ? PLUS : code);
3710 new_const = simplify_binary_operation (associate_code, mode,
3711 canon_const_arg1,
3712 inner_const);
3714 if (new_const == 0)
3715 break;
3717 /* If we are associating shift operations, don't let this
3718 produce a shift of the size of the object or larger.
3719 This could occur when we follow a sign-extend by a right
3720 shift on a machine that does a sign-extend as a pair
3721 of shifts. */
3723 if (is_shift
3724 && CONST_INT_P (new_const)
3725 && INTVAL (new_const) >= GET_MODE_PRECISION (mode))
3727 /* As an exception, we can turn an ASHIFTRT of this
3728 form into a shift of the number of bits - 1. */
3729 if (code == ASHIFTRT)
3730 new_const = GEN_INT (GET_MODE_BITSIZE (mode) - 1);
3731 else if (!side_effects_p (XEXP (y, 0)))
3732 return CONST0_RTX (mode);
3733 else
3734 break;
3737 y = copy_rtx (XEXP (y, 0));
3739 /* If Y contains our first operand (the most common way this
3740 can happen is if Y is a MEM), we would do into an infinite
3741 loop if we tried to fold it. So don't in that case. */
3743 if (! reg_mentioned_p (folded_arg0, y))
3744 y = fold_rtx (y, insn);
3746 return simplify_gen_binary (code, mode, y, new_const);
3748 break;
3750 case DIV: case UDIV:
3751 /* ??? The associative optimization performed immediately above is
3752 also possible for DIV and UDIV using associate_code of MULT.
3753 However, we would need extra code to verify that the
3754 multiplication does not overflow, that is, there is no overflow
3755 in the calculation of new_const. */
3756 break;
3758 default:
3759 break;
3762 new_rtx = simplify_binary_operation (code, mode,
3763 const_arg0 ? const_arg0 : folded_arg0,
3764 const_arg1 ? const_arg1 : folded_arg1);
3765 break;
3767 case RTX_OBJ:
3768 /* (lo_sum (high X) X) is simply X. */
3769 if (code == LO_SUM && const_arg0 != 0
3770 && GET_CODE (const_arg0) == HIGH
3771 && rtx_equal_p (XEXP (const_arg0, 0), const_arg1))
3772 return const_arg1;
3773 break;
3775 case RTX_TERNARY:
3776 case RTX_BITFIELD_OPS:
3777 new_rtx = simplify_ternary_operation (code, mode, mode_arg0,
3778 const_arg0 ? const_arg0 : folded_arg0,
3779 const_arg1 ? const_arg1 : folded_arg1,
3780 const_arg2 ? const_arg2 : XEXP (x, 2));
3781 break;
3783 default:
3784 break;
3787 return new_rtx ? new_rtx : x;
3790 /* Return a constant value currently equivalent to X.
3791 Return 0 if we don't know one. */
3793 static rtx
3794 equiv_constant (rtx x)
3796 if (REG_P (x)
3797 && REGNO_QTY_VALID_P (REGNO (x)))
3799 int x_q = REG_QTY (REGNO (x));
3800 struct qty_table_elem *x_ent = &qty_table[x_q];
3802 if (x_ent->const_rtx)
3803 x = gen_lowpart (GET_MODE (x), x_ent->const_rtx);
3806 if (x == 0 || CONSTANT_P (x))
3807 return x;
3809 if (GET_CODE (x) == SUBREG)
3811 machine_mode mode = GET_MODE (x);
3812 machine_mode imode = GET_MODE (SUBREG_REG (x));
3813 rtx new_rtx;
3815 /* See if we previously assigned a constant value to this SUBREG. */
3816 if ((new_rtx = lookup_as_function (x, CONST_INT)) != 0
3817 || (new_rtx = lookup_as_function (x, CONST_WIDE_INT)) != 0
3818 || (new_rtx = lookup_as_function (x, CONST_DOUBLE)) != 0
3819 || (new_rtx = lookup_as_function (x, CONST_FIXED)) != 0)
3820 return new_rtx;
3822 /* If we didn't and if doing so makes sense, see if we previously
3823 assigned a constant value to the enclosing word mode SUBREG. */
3824 if (GET_MODE_SIZE (mode) < GET_MODE_SIZE (word_mode)
3825 && GET_MODE_SIZE (word_mode) < GET_MODE_SIZE (imode))
3827 int byte = SUBREG_BYTE (x) - subreg_lowpart_offset (mode, word_mode);
3828 if (byte >= 0 && (byte % UNITS_PER_WORD) == 0)
3830 rtx y = gen_rtx_SUBREG (word_mode, SUBREG_REG (x), byte);
3831 new_rtx = lookup_as_function (y, CONST_INT);
3832 if (new_rtx)
3833 return gen_lowpart (mode, new_rtx);
3837 /* Otherwise see if we already have a constant for the inner REG,
3838 and if that is enough to calculate an equivalent constant for
3839 the subreg. Note that the upper bits of paradoxical subregs
3840 are undefined, so they cannot be said to equal anything. */
3841 if (REG_P (SUBREG_REG (x))
3842 && GET_MODE_SIZE (mode) <= GET_MODE_SIZE (imode)
3843 && (new_rtx = equiv_constant (SUBREG_REG (x))) != 0)
3844 return simplify_subreg (mode, new_rtx, imode, SUBREG_BYTE (x));
3846 return 0;
3849 /* If X is a MEM, see if it is a constant-pool reference, or look it up in
3850 the hash table in case its value was seen before. */
3852 if (MEM_P (x))
3854 struct table_elt *elt;
3856 x = avoid_constant_pool_reference (x);
3857 if (CONSTANT_P (x))
3858 return x;
3860 elt = lookup (x, SAFE_HASH (x, GET_MODE (x)), GET_MODE (x));
3861 if (elt == 0)
3862 return 0;
3864 for (elt = elt->first_same_value; elt; elt = elt->next_same_value)
3865 if (elt->is_const && CONSTANT_P (elt->exp))
3866 return elt->exp;
3869 return 0;
3872 /* Given INSN, a jump insn, TAKEN indicates if we are following the
3873 "taken" branch.
3875 In certain cases, this can cause us to add an equivalence. For example,
3876 if we are following the taken case of
3877 if (i == 2)
3878 we can add the fact that `i' and '2' are now equivalent.
3880 In any case, we can record that this comparison was passed. If the same
3881 comparison is seen later, we will know its value. */
3883 static void
3884 record_jump_equiv (rtx_insn *insn, bool taken)
3886 int cond_known_true;
3887 rtx op0, op1;
3888 rtx set;
3889 machine_mode mode, mode0, mode1;
3890 int reversed_nonequality = 0;
3891 enum rtx_code code;
3893 /* Ensure this is the right kind of insn. */
3894 gcc_assert (any_condjump_p (insn));
3896 set = pc_set (insn);
3898 /* See if this jump condition is known true or false. */
3899 if (taken)
3900 cond_known_true = (XEXP (SET_SRC (set), 2) == pc_rtx);
3901 else
3902 cond_known_true = (XEXP (SET_SRC (set), 1) == pc_rtx);
3904 /* Get the type of comparison being done and the operands being compared.
3905 If we had to reverse a non-equality condition, record that fact so we
3906 know that it isn't valid for floating-point. */
3907 code = GET_CODE (XEXP (SET_SRC (set), 0));
3908 op0 = fold_rtx (XEXP (XEXP (SET_SRC (set), 0), 0), insn);
3909 op1 = fold_rtx (XEXP (XEXP (SET_SRC (set), 0), 1), insn);
3911 code = find_comparison_args (code, &op0, &op1, &mode0, &mode1);
3912 if (! cond_known_true)
3914 code = reversed_comparison_code_parts (code, op0, op1, insn);
3916 /* Don't remember if we can't find the inverse. */
3917 if (code == UNKNOWN)
3918 return;
3921 /* The mode is the mode of the non-constant. */
3922 mode = mode0;
3923 if (mode1 != VOIDmode)
3924 mode = mode1;
3926 record_jump_cond (code, mode, op0, op1, reversed_nonequality);
3929 /* Yet another form of subreg creation. In this case, we want something in
3930 MODE, and we should assume OP has MODE iff it is naturally modeless. */
3932 static rtx
3933 record_jump_cond_subreg (machine_mode mode, rtx op)
3935 machine_mode op_mode = GET_MODE (op);
3936 if (op_mode == mode || op_mode == VOIDmode)
3937 return op;
3938 return lowpart_subreg (mode, op, op_mode);
3941 /* We know that comparison CODE applied to OP0 and OP1 in MODE is true.
3942 REVERSED_NONEQUALITY is nonzero if CODE had to be swapped.
3943 Make any useful entries we can with that information. Called from
3944 above function and called recursively. */
3946 static void
3947 record_jump_cond (enum rtx_code code, machine_mode mode, rtx op0,
3948 rtx op1, int reversed_nonequality)
3950 unsigned op0_hash, op1_hash;
3951 int op0_in_memory, op1_in_memory;
3952 struct table_elt *op0_elt, *op1_elt;
3954 /* If OP0 and OP1 are known equal, and either is a paradoxical SUBREG,
3955 we know that they are also equal in the smaller mode (this is also
3956 true for all smaller modes whether or not there is a SUBREG, but
3957 is not worth testing for with no SUBREG). */
3959 /* Note that GET_MODE (op0) may not equal MODE. */
3960 if (code == EQ && paradoxical_subreg_p (op0))
3962 machine_mode inner_mode = GET_MODE (SUBREG_REG (op0));
3963 rtx tem = record_jump_cond_subreg (inner_mode, op1);
3964 if (tem)
3965 record_jump_cond (code, mode, SUBREG_REG (op0), tem,
3966 reversed_nonequality);
3969 if (code == EQ && paradoxical_subreg_p (op1))
3971 machine_mode inner_mode = GET_MODE (SUBREG_REG (op1));
3972 rtx tem = record_jump_cond_subreg (inner_mode, op0);
3973 if (tem)
3974 record_jump_cond (code, mode, SUBREG_REG (op1), tem,
3975 reversed_nonequality);
3978 /* Similarly, if this is an NE comparison, and either is a SUBREG
3979 making a smaller mode, we know the whole thing is also NE. */
3981 /* Note that GET_MODE (op0) may not equal MODE;
3982 if we test MODE instead, we can get an infinite recursion
3983 alternating between two modes each wider than MODE. */
3985 if (code == NE && GET_CODE (op0) == SUBREG
3986 && subreg_lowpart_p (op0)
3987 && (GET_MODE_SIZE (GET_MODE (op0))
3988 < GET_MODE_SIZE (GET_MODE (SUBREG_REG (op0)))))
3990 machine_mode inner_mode = GET_MODE (SUBREG_REG (op0));
3991 rtx tem = record_jump_cond_subreg (inner_mode, op1);
3992 if (tem)
3993 record_jump_cond (code, mode, SUBREG_REG (op0), tem,
3994 reversed_nonequality);
3997 if (code == NE && GET_CODE (op1) == SUBREG
3998 && subreg_lowpart_p (op1)
3999 && (GET_MODE_SIZE (GET_MODE (op1))
4000 < GET_MODE_SIZE (GET_MODE (SUBREG_REG (op1)))))
4002 machine_mode inner_mode = GET_MODE (SUBREG_REG (op1));
4003 rtx tem = record_jump_cond_subreg (inner_mode, op0);
4004 if (tem)
4005 record_jump_cond (code, mode, SUBREG_REG (op1), tem,
4006 reversed_nonequality);
4009 /* Hash both operands. */
4011 do_not_record = 0;
4012 hash_arg_in_memory = 0;
4013 op0_hash = HASH (op0, mode);
4014 op0_in_memory = hash_arg_in_memory;
4016 if (do_not_record)
4017 return;
4019 do_not_record = 0;
4020 hash_arg_in_memory = 0;
4021 op1_hash = HASH (op1, mode);
4022 op1_in_memory = hash_arg_in_memory;
4024 if (do_not_record)
4025 return;
4027 /* Look up both operands. */
4028 op0_elt = lookup (op0, op0_hash, mode);
4029 op1_elt = lookup (op1, op1_hash, mode);
4031 /* If both operands are already equivalent or if they are not in the
4032 table but are identical, do nothing. */
4033 if ((op0_elt != 0 && op1_elt != 0
4034 && op0_elt->first_same_value == op1_elt->first_same_value)
4035 || op0 == op1 || rtx_equal_p (op0, op1))
4036 return;
4038 /* If we aren't setting two things equal all we can do is save this
4039 comparison. Similarly if this is floating-point. In the latter
4040 case, OP1 might be zero and both -0.0 and 0.0 are equal to it.
4041 If we record the equality, we might inadvertently delete code
4042 whose intent was to change -0 to +0. */
4044 if (code != EQ || FLOAT_MODE_P (GET_MODE (op0)))
4046 struct qty_table_elem *ent;
4047 int qty;
4049 /* If we reversed a floating-point comparison, if OP0 is not a
4050 register, or if OP1 is neither a register or constant, we can't
4051 do anything. */
4053 if (!REG_P (op1))
4054 op1 = equiv_constant (op1);
4056 if ((reversed_nonequality && FLOAT_MODE_P (mode))
4057 || !REG_P (op0) || op1 == 0)
4058 return;
4060 /* Put OP0 in the hash table if it isn't already. This gives it a
4061 new quantity number. */
4062 if (op0_elt == 0)
4064 if (insert_regs (op0, NULL, 0))
4066 rehash_using_reg (op0);
4067 op0_hash = HASH (op0, mode);
4069 /* If OP0 is contained in OP1, this changes its hash code
4070 as well. Faster to rehash than to check, except
4071 for the simple case of a constant. */
4072 if (! CONSTANT_P (op1))
4073 op1_hash = HASH (op1,mode);
4076 op0_elt = insert (op0, NULL, op0_hash, mode);
4077 op0_elt->in_memory = op0_in_memory;
4080 qty = REG_QTY (REGNO (op0));
4081 ent = &qty_table[qty];
4083 ent->comparison_code = code;
4084 if (REG_P (op1))
4086 /* Look it up again--in case op0 and op1 are the same. */
4087 op1_elt = lookup (op1, op1_hash, mode);
4089 /* Put OP1 in the hash table so it gets a new quantity number. */
4090 if (op1_elt == 0)
4092 if (insert_regs (op1, NULL, 0))
4094 rehash_using_reg (op1);
4095 op1_hash = HASH (op1, mode);
4098 op1_elt = insert (op1, NULL, op1_hash, mode);
4099 op1_elt->in_memory = op1_in_memory;
4102 ent->comparison_const = NULL_RTX;
4103 ent->comparison_qty = REG_QTY (REGNO (op1));
4105 else
4107 ent->comparison_const = op1;
4108 ent->comparison_qty = -1;
4111 return;
4114 /* If either side is still missing an equivalence, make it now,
4115 then merge the equivalences. */
4117 if (op0_elt == 0)
4119 if (insert_regs (op0, NULL, 0))
4121 rehash_using_reg (op0);
4122 op0_hash = HASH (op0, mode);
4125 op0_elt = insert (op0, NULL, op0_hash, mode);
4126 op0_elt->in_memory = op0_in_memory;
4129 if (op1_elt == 0)
4131 if (insert_regs (op1, NULL, 0))
4133 rehash_using_reg (op1);
4134 op1_hash = HASH (op1, mode);
4137 op1_elt = insert (op1, NULL, op1_hash, mode);
4138 op1_elt->in_memory = op1_in_memory;
4141 merge_equiv_classes (op0_elt, op1_elt);
4144 /* CSE processing for one instruction.
4146 Most "true" common subexpressions are mostly optimized away in GIMPLE,
4147 but the few that "leak through" are cleaned up by cse_insn, and complex
4148 addressing modes are often formed here.
4150 The main function is cse_insn, and between here and that function
4151 a couple of helper functions is defined to keep the size of cse_insn
4152 within reasonable proportions.
4154 Data is shared between the main and helper functions via STRUCT SET,
4155 that contains all data related for every set in the instruction that
4156 is being processed.
4158 Note that cse_main processes all sets in the instruction. Most
4159 passes in GCC only process simple SET insns or single_set insns, but
4160 CSE processes insns with multiple sets as well. */
4162 /* Data on one SET contained in the instruction. */
4164 struct set
4166 /* The SET rtx itself. */
4167 rtx rtl;
4168 /* The SET_SRC of the rtx (the original value, if it is changing). */
4169 rtx src;
4170 /* The hash-table element for the SET_SRC of the SET. */
4171 struct table_elt *src_elt;
4172 /* Hash value for the SET_SRC. */
4173 unsigned src_hash;
4174 /* Hash value for the SET_DEST. */
4175 unsigned dest_hash;
4176 /* The SET_DEST, with SUBREG, etc., stripped. */
4177 rtx inner_dest;
4178 /* Nonzero if the SET_SRC is in memory. */
4179 char src_in_memory;
4180 /* Nonzero if the SET_SRC contains something
4181 whose value cannot be predicted and understood. */
4182 char src_volatile;
4183 /* Original machine mode, in case it becomes a CONST_INT.
4184 The size of this field should match the size of the mode
4185 field of struct rtx_def (see rtl.h). */
4186 ENUM_BITFIELD(machine_mode) mode : 8;
4187 /* A constant equivalent for SET_SRC, if any. */
4188 rtx src_const;
4189 /* Hash value of constant equivalent for SET_SRC. */
4190 unsigned src_const_hash;
4191 /* Table entry for constant equivalent for SET_SRC, if any. */
4192 struct table_elt *src_const_elt;
4193 /* Table entry for the destination address. */
4194 struct table_elt *dest_addr_elt;
4197 /* Special handling for (set REG0 REG1) where REG0 is the
4198 "cheapest", cheaper than REG1. After cse, REG1 will probably not
4199 be used in the sequel, so (if easily done) change this insn to
4200 (set REG1 REG0) and replace REG1 with REG0 in the previous insn
4201 that computed their value. Then REG1 will become a dead store
4202 and won't cloud the situation for later optimizations.
4204 Do not make this change if REG1 is a hard register, because it will
4205 then be used in the sequel and we may be changing a two-operand insn
4206 into a three-operand insn.
4208 This is the last transformation that cse_insn will try to do. */
4210 static void
4211 try_back_substitute_reg (rtx set, rtx_insn *insn)
4213 rtx dest = SET_DEST (set);
4214 rtx src = SET_SRC (set);
4216 if (REG_P (dest)
4217 && REG_P (src) && ! HARD_REGISTER_P (src)
4218 && REGNO_QTY_VALID_P (REGNO (src)))
4220 int src_q = REG_QTY (REGNO (src));
4221 struct qty_table_elem *src_ent = &qty_table[src_q];
4223 if (src_ent->first_reg == REGNO (dest))
4225 /* Scan for the previous nonnote insn, but stop at a basic
4226 block boundary. */
4227 rtx_insn *prev = insn;
4228 rtx_insn *bb_head = BB_HEAD (BLOCK_FOR_INSN (insn));
4231 prev = PREV_INSN (prev);
4233 while (prev != bb_head && (NOTE_P (prev) || DEBUG_INSN_P (prev)));
4235 /* Do not swap the registers around if the previous instruction
4236 attaches a REG_EQUIV note to REG1.
4238 ??? It's not entirely clear whether we can transfer a REG_EQUIV
4239 from the pseudo that originally shadowed an incoming argument
4240 to another register. Some uses of REG_EQUIV might rely on it
4241 being attached to REG1 rather than REG2.
4243 This section previously turned the REG_EQUIV into a REG_EQUAL
4244 note. We cannot do that because REG_EQUIV may provide an
4245 uninitialized stack slot when REG_PARM_STACK_SPACE is used. */
4246 if (NONJUMP_INSN_P (prev)
4247 && GET_CODE (PATTERN (prev)) == SET
4248 && SET_DEST (PATTERN (prev)) == src
4249 && ! find_reg_note (prev, REG_EQUIV, NULL_RTX))
4251 rtx note;
4253 validate_change (prev, &SET_DEST (PATTERN (prev)), dest, 1);
4254 validate_change (insn, &SET_DEST (set), src, 1);
4255 validate_change (insn, &SET_SRC (set), dest, 1);
4256 apply_change_group ();
4258 /* If INSN has a REG_EQUAL note, and this note mentions
4259 REG0, then we must delete it, because the value in
4260 REG0 has changed. If the note's value is REG1, we must
4261 also delete it because that is now this insn's dest. */
4262 note = find_reg_note (insn, REG_EQUAL, NULL_RTX);
4263 if (note != 0
4264 && (reg_mentioned_p (dest, XEXP (note, 0))
4265 || rtx_equal_p (src, XEXP (note, 0))))
4266 remove_note (insn, note);
4272 /* Record all the SETs in this instruction into SETS_PTR,
4273 and return the number of recorded sets. */
4274 static int
4275 find_sets_in_insn (rtx_insn *insn, struct set **psets)
4277 struct set *sets = *psets;
4278 int n_sets = 0;
4279 rtx x = PATTERN (insn);
4281 if (GET_CODE (x) == SET)
4283 /* Ignore SETs that are unconditional jumps.
4284 They never need cse processing, so this does not hurt.
4285 The reason is not efficiency but rather
4286 so that we can test at the end for instructions
4287 that have been simplified to unconditional jumps
4288 and not be misled by unchanged instructions
4289 that were unconditional jumps to begin with. */
4290 if (SET_DEST (x) == pc_rtx
4291 && GET_CODE (SET_SRC (x)) == LABEL_REF)
4293 /* Don't count call-insns, (set (reg 0) (call ...)), as a set.
4294 The hard function value register is used only once, to copy to
4295 someplace else, so it isn't worth cse'ing. */
4296 else if (GET_CODE (SET_SRC (x)) == CALL)
4298 else
4299 sets[n_sets++].rtl = x;
4301 else if (GET_CODE (x) == PARALLEL)
4303 int i, lim = XVECLEN (x, 0);
4305 /* Go over the expressions of the PARALLEL in forward order, to
4306 put them in the same order in the SETS array. */
4307 for (i = 0; i < lim; i++)
4309 rtx y = XVECEXP (x, 0, i);
4310 if (GET_CODE (y) == SET)
4312 /* As above, we ignore unconditional jumps and call-insns and
4313 ignore the result of apply_change_group. */
4314 if (SET_DEST (y) == pc_rtx
4315 && GET_CODE (SET_SRC (y)) == LABEL_REF)
4317 else if (GET_CODE (SET_SRC (y)) == CALL)
4319 else
4320 sets[n_sets++].rtl = y;
4325 return n_sets;
4328 /* Where possible, substitute every register reference in the N_SETS
4329 number of SETS in INSN with the the canonical register.
4331 Register canonicalization propagatest the earliest register (i.e.
4332 one that is set before INSN) with the same value. This is a very
4333 useful, simple form of CSE, to clean up warts from expanding GIMPLE
4334 to RTL. For instance, a CONST for an address is usually expanded
4335 multiple times to loads into different registers, thus creating many
4336 subexpressions of the form:
4338 (set (reg1) (some_const))
4339 (set (mem (... reg1 ...) (thing)))
4340 (set (reg2) (some_const))
4341 (set (mem (... reg2 ...) (thing)))
4343 After canonicalizing, the code takes the following form:
4345 (set (reg1) (some_const))
4346 (set (mem (... reg1 ...) (thing)))
4347 (set (reg2) (some_const))
4348 (set (mem (... reg1 ...) (thing)))
4350 The set to reg2 is now trivially dead, and the memory reference (or
4351 address, or whatever) may be a candidate for further CSEing.
4353 In this function, the result of apply_change_group can be ignored;
4354 see canon_reg. */
4356 static void
4357 canonicalize_insn (rtx_insn *insn, struct set **psets, int n_sets)
4359 struct set *sets = *psets;
4360 rtx tem;
4361 rtx x = PATTERN (insn);
4362 int i;
4364 if (CALL_P (insn))
4366 for (tem = CALL_INSN_FUNCTION_USAGE (insn); tem; tem = XEXP (tem, 1))
4367 if (GET_CODE (XEXP (tem, 0)) != SET)
4368 XEXP (tem, 0) = canon_reg (XEXP (tem, 0), insn);
4371 if (GET_CODE (x) == SET && GET_CODE (SET_SRC (x)) == CALL)
4373 canon_reg (SET_SRC (x), insn);
4374 apply_change_group ();
4375 fold_rtx (SET_SRC (x), insn);
4377 else if (GET_CODE (x) == CLOBBER)
4379 /* If we clobber memory, canon the address.
4380 This does nothing when a register is clobbered
4381 because we have already invalidated the reg. */
4382 if (MEM_P (XEXP (x, 0)))
4383 canon_reg (XEXP (x, 0), insn);
4385 else if (GET_CODE (x) == USE
4386 && ! (REG_P (XEXP (x, 0))
4387 && REGNO (XEXP (x, 0)) < FIRST_PSEUDO_REGISTER))
4388 /* Canonicalize a USE of a pseudo register or memory location. */
4389 canon_reg (x, insn);
4390 else if (GET_CODE (x) == ASM_OPERANDS)
4392 for (i = ASM_OPERANDS_INPUT_LENGTH (x) - 1; i >= 0; i--)
4394 rtx input = ASM_OPERANDS_INPUT (x, i);
4395 if (!(REG_P (input) && REGNO (input) < FIRST_PSEUDO_REGISTER))
4397 input = canon_reg (input, insn);
4398 validate_change (insn, &ASM_OPERANDS_INPUT (x, i), input, 1);
4402 else if (GET_CODE (x) == CALL)
4404 canon_reg (x, insn);
4405 apply_change_group ();
4406 fold_rtx (x, insn);
4408 else if (DEBUG_INSN_P (insn))
4409 canon_reg (PATTERN (insn), insn);
4410 else if (GET_CODE (x) == PARALLEL)
4412 for (i = XVECLEN (x, 0) - 1; i >= 0; i--)
4414 rtx y = XVECEXP (x, 0, i);
4415 if (GET_CODE (y) == SET && GET_CODE (SET_SRC (y)) == CALL)
4417 canon_reg (SET_SRC (y), insn);
4418 apply_change_group ();
4419 fold_rtx (SET_SRC (y), insn);
4421 else if (GET_CODE (y) == CLOBBER)
4423 if (MEM_P (XEXP (y, 0)))
4424 canon_reg (XEXP (y, 0), insn);
4426 else if (GET_CODE (y) == USE
4427 && ! (REG_P (XEXP (y, 0))
4428 && REGNO (XEXP (y, 0)) < FIRST_PSEUDO_REGISTER))
4429 canon_reg (y, insn);
4430 else if (GET_CODE (y) == CALL)
4432 canon_reg (y, insn);
4433 apply_change_group ();
4434 fold_rtx (y, insn);
4439 if (n_sets == 1 && REG_NOTES (insn) != 0
4440 && (tem = find_reg_note (insn, REG_EQUAL, NULL_RTX)) != 0)
4442 /* We potentially will process this insn many times. Therefore,
4443 drop the REG_EQUAL note if it is equal to the SET_SRC of the
4444 unique set in INSN.
4446 Do not do so if the REG_EQUAL note is for a STRICT_LOW_PART,
4447 because cse_insn handles those specially. */
4448 if (GET_CODE (SET_DEST (sets[0].rtl)) != STRICT_LOW_PART
4449 && rtx_equal_p (XEXP (tem, 0), SET_SRC (sets[0].rtl)))
4450 remove_note (insn, tem);
4451 else
4453 canon_reg (XEXP (tem, 0), insn);
4454 apply_change_group ();
4455 XEXP (tem, 0) = fold_rtx (XEXP (tem, 0), insn);
4456 df_notes_rescan (insn);
4460 /* Canonicalize sources and addresses of destinations.
4461 We do this in a separate pass to avoid problems when a MATCH_DUP is
4462 present in the insn pattern. In that case, we want to ensure that
4463 we don't break the duplicate nature of the pattern. So we will replace
4464 both operands at the same time. Otherwise, we would fail to find an
4465 equivalent substitution in the loop calling validate_change below.
4467 We used to suppress canonicalization of DEST if it appears in SRC,
4468 but we don't do this any more. */
4470 for (i = 0; i < n_sets; i++)
4472 rtx dest = SET_DEST (sets[i].rtl);
4473 rtx src = SET_SRC (sets[i].rtl);
4474 rtx new_rtx = canon_reg (src, insn);
4476 validate_change (insn, &SET_SRC (sets[i].rtl), new_rtx, 1);
4478 if (GET_CODE (dest) == ZERO_EXTRACT)
4480 validate_change (insn, &XEXP (dest, 1),
4481 canon_reg (XEXP (dest, 1), insn), 1);
4482 validate_change (insn, &XEXP (dest, 2),
4483 canon_reg (XEXP (dest, 2), insn), 1);
4486 while (GET_CODE (dest) == SUBREG
4487 || GET_CODE (dest) == ZERO_EXTRACT
4488 || GET_CODE (dest) == STRICT_LOW_PART)
4489 dest = XEXP (dest, 0);
4491 if (MEM_P (dest))
4492 canon_reg (dest, insn);
4495 /* Now that we have done all the replacements, we can apply the change
4496 group and see if they all work. Note that this will cause some
4497 canonicalizations that would have worked individually not to be applied
4498 because some other canonicalization didn't work, but this should not
4499 occur often.
4501 The result of apply_change_group can be ignored; see canon_reg. */
4503 apply_change_group ();
4506 /* Main function of CSE.
4507 First simplify sources and addresses of all assignments
4508 in the instruction, using previously-computed equivalents values.
4509 Then install the new sources and destinations in the table
4510 of available values. */
4512 static void
4513 cse_insn (rtx_insn *insn)
4515 rtx x = PATTERN (insn);
4516 int i;
4517 rtx tem;
4518 int n_sets = 0;
4520 rtx src_eqv = 0;
4521 struct table_elt *src_eqv_elt = 0;
4522 int src_eqv_volatile = 0;
4523 int src_eqv_in_memory = 0;
4524 unsigned src_eqv_hash = 0;
4526 struct set *sets = (struct set *) 0;
4528 if (GET_CODE (x) == SET)
4529 sets = XALLOCA (struct set);
4530 else if (GET_CODE (x) == PARALLEL)
4531 sets = XALLOCAVEC (struct set, XVECLEN (x, 0));
4533 this_insn = insn;
4534 #ifdef HAVE_cc0
4535 /* Records what this insn does to set CC0. */
4536 this_insn_cc0 = 0;
4537 this_insn_cc0_mode = VOIDmode;
4538 #endif
4540 /* Find all regs explicitly clobbered in this insn,
4541 to ensure they are not replaced with any other regs
4542 elsewhere in this insn. */
4543 invalidate_from_sets_and_clobbers (insn);
4545 /* Record all the SETs in this instruction. */
4546 n_sets = find_sets_in_insn (insn, &sets);
4548 /* Substitute the canonical register where possible. */
4549 canonicalize_insn (insn, &sets, n_sets);
4551 /* If this insn has a REG_EQUAL note, store the equivalent value in SRC_EQV,
4552 if different, or if the DEST is a STRICT_LOW_PART. The latter condition
4553 is necessary because SRC_EQV is handled specially for this case, and if
4554 it isn't set, then there will be no equivalence for the destination. */
4555 if (n_sets == 1 && REG_NOTES (insn) != 0
4556 && (tem = find_reg_note (insn, REG_EQUAL, NULL_RTX)) != 0
4557 && (! rtx_equal_p (XEXP (tem, 0), SET_SRC (sets[0].rtl))
4558 || GET_CODE (SET_DEST (sets[0].rtl)) == STRICT_LOW_PART))
4559 src_eqv = copy_rtx (XEXP (tem, 0));
4561 /* Set sets[i].src_elt to the class each source belongs to.
4562 Detect assignments from or to volatile things
4563 and set set[i] to zero so they will be ignored
4564 in the rest of this function.
4566 Nothing in this loop changes the hash table or the register chains. */
4568 for (i = 0; i < n_sets; i++)
4570 bool repeat = false;
4571 rtx src, dest;
4572 rtx src_folded;
4573 struct table_elt *elt = 0, *p;
4574 machine_mode mode;
4575 rtx src_eqv_here;
4576 rtx src_const = 0;
4577 rtx src_related = 0;
4578 bool src_related_is_const_anchor = false;
4579 struct table_elt *src_const_elt = 0;
4580 int src_cost = MAX_COST;
4581 int src_eqv_cost = MAX_COST;
4582 int src_folded_cost = MAX_COST;
4583 int src_related_cost = MAX_COST;
4584 int src_elt_cost = MAX_COST;
4585 int src_regcost = MAX_COST;
4586 int src_eqv_regcost = MAX_COST;
4587 int src_folded_regcost = MAX_COST;
4588 int src_related_regcost = MAX_COST;
4589 int src_elt_regcost = MAX_COST;
4590 /* Set nonzero if we need to call force_const_mem on with the
4591 contents of src_folded before using it. */
4592 int src_folded_force_flag = 0;
4594 dest = SET_DEST (sets[i].rtl);
4595 src = SET_SRC (sets[i].rtl);
4597 /* If SRC is a constant that has no machine mode,
4598 hash it with the destination's machine mode.
4599 This way we can keep different modes separate. */
4601 mode = GET_MODE (src) == VOIDmode ? GET_MODE (dest) : GET_MODE (src);
4602 sets[i].mode = mode;
4604 if (src_eqv)
4606 machine_mode eqvmode = mode;
4607 if (GET_CODE (dest) == STRICT_LOW_PART)
4608 eqvmode = GET_MODE (SUBREG_REG (XEXP (dest, 0)));
4609 do_not_record = 0;
4610 hash_arg_in_memory = 0;
4611 src_eqv_hash = HASH (src_eqv, eqvmode);
4613 /* Find the equivalence class for the equivalent expression. */
4615 if (!do_not_record)
4616 src_eqv_elt = lookup (src_eqv, src_eqv_hash, eqvmode);
4618 src_eqv_volatile = do_not_record;
4619 src_eqv_in_memory = hash_arg_in_memory;
4622 /* If this is a STRICT_LOW_PART assignment, src_eqv corresponds to the
4623 value of the INNER register, not the destination. So it is not
4624 a valid substitution for the source. But save it for later. */
4625 if (GET_CODE (dest) == STRICT_LOW_PART)
4626 src_eqv_here = 0;
4627 else
4628 src_eqv_here = src_eqv;
4630 /* Simplify and foldable subexpressions in SRC. Then get the fully-
4631 simplified result, which may not necessarily be valid. */
4632 src_folded = fold_rtx (src, insn);
4634 #if 0
4635 /* ??? This caused bad code to be generated for the m68k port with -O2.
4636 Suppose src is (CONST_INT -1), and that after truncation src_folded
4637 is (CONST_INT 3). Suppose src_folded is then used for src_const.
4638 At the end we will add src and src_const to the same equivalence
4639 class. We now have 3 and -1 on the same equivalence class. This
4640 causes later instructions to be mis-optimized. */
4641 /* If storing a constant in a bitfield, pre-truncate the constant
4642 so we will be able to record it later. */
4643 if (GET_CODE (SET_DEST (sets[i].rtl)) == ZERO_EXTRACT)
4645 rtx width = XEXP (SET_DEST (sets[i].rtl), 1);
4647 if (CONST_INT_P (src)
4648 && CONST_INT_P (width)
4649 && INTVAL (width) < HOST_BITS_PER_WIDE_INT
4650 && (INTVAL (src) & ((HOST_WIDE_INT) (-1) << INTVAL (width))))
4651 src_folded
4652 = GEN_INT (INTVAL (src) & (((HOST_WIDE_INT) 1
4653 << INTVAL (width)) - 1));
4655 #endif
4657 /* Compute SRC's hash code, and also notice if it
4658 should not be recorded at all. In that case,
4659 prevent any further processing of this assignment. */
4660 do_not_record = 0;
4661 hash_arg_in_memory = 0;
4663 sets[i].src = src;
4664 sets[i].src_hash = HASH (src, mode);
4665 sets[i].src_volatile = do_not_record;
4666 sets[i].src_in_memory = hash_arg_in_memory;
4668 /* If SRC is a MEM, there is a REG_EQUIV note for SRC, and DEST is
4669 a pseudo, do not record SRC. Using SRC as a replacement for
4670 anything else will be incorrect in that situation. Note that
4671 this usually occurs only for stack slots, in which case all the
4672 RTL would be referring to SRC, so we don't lose any optimization
4673 opportunities by not having SRC in the hash table. */
4675 if (MEM_P (src)
4676 && find_reg_note (insn, REG_EQUIV, NULL_RTX) != 0
4677 && REG_P (dest)
4678 && REGNO (dest) >= FIRST_PSEUDO_REGISTER)
4679 sets[i].src_volatile = 1;
4681 else if (GET_CODE (src) == ASM_OPERANDS
4682 && GET_CODE (x) == PARALLEL)
4684 /* Do not record result of a non-volatile inline asm with
4685 more than one result. */
4686 if (n_sets > 1)
4687 sets[i].src_volatile = 1;
4689 int j, lim = XVECLEN (x, 0);
4690 for (j = 0; j < lim; j++)
4692 rtx y = XVECEXP (x, 0, j);
4693 /* And do not record result of a non-volatile inline asm
4694 with "memory" clobber. */
4695 if (GET_CODE (y) == CLOBBER && MEM_P (XEXP (y, 0)))
4697 sets[i].src_volatile = 1;
4698 break;
4703 #if 0
4704 /* It is no longer clear why we used to do this, but it doesn't
4705 appear to still be needed. So let's try without it since this
4706 code hurts cse'ing widened ops. */
4707 /* If source is a paradoxical subreg (such as QI treated as an SI),
4708 treat it as volatile. It may do the work of an SI in one context
4709 where the extra bits are not being used, but cannot replace an SI
4710 in general. */
4711 if (paradoxical_subreg_p (src))
4712 sets[i].src_volatile = 1;
4713 #endif
4715 /* Locate all possible equivalent forms for SRC. Try to replace
4716 SRC in the insn with each cheaper equivalent.
4718 We have the following types of equivalents: SRC itself, a folded
4719 version, a value given in a REG_EQUAL note, or a value related
4720 to a constant.
4722 Each of these equivalents may be part of an additional class
4723 of equivalents (if more than one is in the table, they must be in
4724 the same class; we check for this).
4726 If the source is volatile, we don't do any table lookups.
4728 We note any constant equivalent for possible later use in a
4729 REG_NOTE. */
4731 if (!sets[i].src_volatile)
4732 elt = lookup (src, sets[i].src_hash, mode);
4734 sets[i].src_elt = elt;
4736 if (elt && src_eqv_here && src_eqv_elt)
4738 if (elt->first_same_value != src_eqv_elt->first_same_value)
4740 /* The REG_EQUAL is indicating that two formerly distinct
4741 classes are now equivalent. So merge them. */
4742 merge_equiv_classes (elt, src_eqv_elt);
4743 src_eqv_hash = HASH (src_eqv, elt->mode);
4744 src_eqv_elt = lookup (src_eqv, src_eqv_hash, elt->mode);
4747 src_eqv_here = 0;
4750 else if (src_eqv_elt)
4751 elt = src_eqv_elt;
4753 /* Try to find a constant somewhere and record it in `src_const'.
4754 Record its table element, if any, in `src_const_elt'. Look in
4755 any known equivalences first. (If the constant is not in the
4756 table, also set `sets[i].src_const_hash'). */
4757 if (elt)
4758 for (p = elt->first_same_value; p; p = p->next_same_value)
4759 if (p->is_const)
4761 src_const = p->exp;
4762 src_const_elt = elt;
4763 break;
4766 if (src_const == 0
4767 && (CONSTANT_P (src_folded)
4768 /* Consider (minus (label_ref L1) (label_ref L2)) as
4769 "constant" here so we will record it. This allows us
4770 to fold switch statements when an ADDR_DIFF_VEC is used. */
4771 || (GET_CODE (src_folded) == MINUS
4772 && GET_CODE (XEXP (src_folded, 0)) == LABEL_REF
4773 && GET_CODE (XEXP (src_folded, 1)) == LABEL_REF)))
4774 src_const = src_folded, src_const_elt = elt;
4775 else if (src_const == 0 && src_eqv_here && CONSTANT_P (src_eqv_here))
4776 src_const = src_eqv_here, src_const_elt = src_eqv_elt;
4778 /* If we don't know if the constant is in the table, get its
4779 hash code and look it up. */
4780 if (src_const && src_const_elt == 0)
4782 sets[i].src_const_hash = HASH (src_const, mode);
4783 src_const_elt = lookup (src_const, sets[i].src_const_hash, mode);
4786 sets[i].src_const = src_const;
4787 sets[i].src_const_elt = src_const_elt;
4789 /* If the constant and our source are both in the table, mark them as
4790 equivalent. Otherwise, if a constant is in the table but the source
4791 isn't, set ELT to it. */
4792 if (src_const_elt && elt
4793 && src_const_elt->first_same_value != elt->first_same_value)
4794 merge_equiv_classes (elt, src_const_elt);
4795 else if (src_const_elt && elt == 0)
4796 elt = src_const_elt;
4798 /* See if there is a register linearly related to a constant
4799 equivalent of SRC. */
4800 if (src_const
4801 && (GET_CODE (src_const) == CONST
4802 || (src_const_elt && src_const_elt->related_value != 0)))
4804 src_related = use_related_value (src_const, src_const_elt);
4805 if (src_related)
4807 struct table_elt *src_related_elt
4808 = lookup (src_related, HASH (src_related, mode), mode);
4809 if (src_related_elt && elt)
4811 if (elt->first_same_value
4812 != src_related_elt->first_same_value)
4813 /* This can occur when we previously saw a CONST
4814 involving a SYMBOL_REF and then see the SYMBOL_REF
4815 twice. Merge the involved classes. */
4816 merge_equiv_classes (elt, src_related_elt);
4818 src_related = 0;
4819 src_related_elt = 0;
4821 else if (src_related_elt && elt == 0)
4822 elt = src_related_elt;
4826 /* See if we have a CONST_INT that is already in a register in a
4827 wider mode. */
4829 if (src_const && src_related == 0 && CONST_INT_P (src_const)
4830 && GET_MODE_CLASS (mode) == MODE_INT
4831 && GET_MODE_PRECISION (mode) < BITS_PER_WORD)
4833 machine_mode wider_mode;
4835 for (wider_mode = GET_MODE_WIDER_MODE (mode);
4836 wider_mode != VOIDmode
4837 && GET_MODE_PRECISION (wider_mode) <= BITS_PER_WORD
4838 && src_related == 0;
4839 wider_mode = GET_MODE_WIDER_MODE (wider_mode))
4841 struct table_elt *const_elt
4842 = lookup (src_const, HASH (src_const, wider_mode), wider_mode);
4844 if (const_elt == 0)
4845 continue;
4847 for (const_elt = const_elt->first_same_value;
4848 const_elt; const_elt = const_elt->next_same_value)
4849 if (REG_P (const_elt->exp))
4851 src_related = gen_lowpart (mode, const_elt->exp);
4852 break;
4857 /* Another possibility is that we have an AND with a constant in
4858 a mode narrower than a word. If so, it might have been generated
4859 as part of an "if" which would narrow the AND. If we already
4860 have done the AND in a wider mode, we can use a SUBREG of that
4861 value. */
4863 if (flag_expensive_optimizations && ! src_related
4864 && GET_CODE (src) == AND && CONST_INT_P (XEXP (src, 1))
4865 && GET_MODE_SIZE (mode) < UNITS_PER_WORD)
4867 machine_mode tmode;
4868 rtx new_and = gen_rtx_AND (VOIDmode, NULL_RTX, XEXP (src, 1));
4870 for (tmode = GET_MODE_WIDER_MODE (mode);
4871 GET_MODE_SIZE (tmode) <= UNITS_PER_WORD;
4872 tmode = GET_MODE_WIDER_MODE (tmode))
4874 rtx inner = gen_lowpart (tmode, XEXP (src, 0));
4875 struct table_elt *larger_elt;
4877 if (inner)
4879 PUT_MODE (new_and, tmode);
4880 XEXP (new_and, 0) = inner;
4881 larger_elt = lookup (new_and, HASH (new_and, tmode), tmode);
4882 if (larger_elt == 0)
4883 continue;
4885 for (larger_elt = larger_elt->first_same_value;
4886 larger_elt; larger_elt = larger_elt->next_same_value)
4887 if (REG_P (larger_elt->exp))
4889 src_related
4890 = gen_lowpart (mode, larger_elt->exp);
4891 break;
4894 if (src_related)
4895 break;
4900 #ifdef LOAD_EXTEND_OP
4901 /* See if a MEM has already been loaded with a widening operation;
4902 if it has, we can use a subreg of that. Many CISC machines
4903 also have such operations, but this is only likely to be
4904 beneficial on these machines. */
4906 if (flag_expensive_optimizations && src_related == 0
4907 && (GET_MODE_SIZE (mode) < UNITS_PER_WORD)
4908 && GET_MODE_CLASS (mode) == MODE_INT
4909 && MEM_P (src) && ! do_not_record
4910 && LOAD_EXTEND_OP (mode) != UNKNOWN)
4912 struct rtx_def memory_extend_buf;
4913 rtx memory_extend_rtx = &memory_extend_buf;
4914 machine_mode tmode;
4916 /* Set what we are trying to extend and the operation it might
4917 have been extended with. */
4918 memset (memory_extend_rtx, 0, sizeof (*memory_extend_rtx));
4919 PUT_CODE (memory_extend_rtx, LOAD_EXTEND_OP (mode));
4920 XEXP (memory_extend_rtx, 0) = src;
4922 for (tmode = GET_MODE_WIDER_MODE (mode);
4923 GET_MODE_SIZE (tmode) <= UNITS_PER_WORD;
4924 tmode = GET_MODE_WIDER_MODE (tmode))
4926 struct table_elt *larger_elt;
4928 PUT_MODE (memory_extend_rtx, tmode);
4929 larger_elt = lookup (memory_extend_rtx,
4930 HASH (memory_extend_rtx, tmode), tmode);
4931 if (larger_elt == 0)
4932 continue;
4934 for (larger_elt = larger_elt->first_same_value;
4935 larger_elt; larger_elt = larger_elt->next_same_value)
4936 if (REG_P (larger_elt->exp))
4938 src_related = gen_lowpart (mode, larger_elt->exp);
4939 break;
4942 if (src_related)
4943 break;
4946 #endif /* LOAD_EXTEND_OP */
4948 /* Try to express the constant using a register+offset expression
4949 derived from a constant anchor. */
4951 if (targetm.const_anchor
4952 && !src_related
4953 && src_const
4954 && GET_CODE (src_const) == CONST_INT)
4956 src_related = try_const_anchors (src_const, mode);
4957 src_related_is_const_anchor = src_related != NULL_RTX;
4961 if (src == src_folded)
4962 src_folded = 0;
4964 /* At this point, ELT, if nonzero, points to a class of expressions
4965 equivalent to the source of this SET and SRC, SRC_EQV, SRC_FOLDED,
4966 and SRC_RELATED, if nonzero, each contain additional equivalent
4967 expressions. Prune these latter expressions by deleting expressions
4968 already in the equivalence class.
4970 Check for an equivalent identical to the destination. If found,
4971 this is the preferred equivalent since it will likely lead to
4972 elimination of the insn. Indicate this by placing it in
4973 `src_related'. */
4975 if (elt)
4976 elt = elt->first_same_value;
4977 for (p = elt; p; p = p->next_same_value)
4979 enum rtx_code code = GET_CODE (p->exp);
4981 /* If the expression is not valid, ignore it. Then we do not
4982 have to check for validity below. In most cases, we can use
4983 `rtx_equal_p', since canonicalization has already been done. */
4984 if (code != REG && ! exp_equiv_p (p->exp, p->exp, 1, false))
4985 continue;
4987 /* Also skip paradoxical subregs, unless that's what we're
4988 looking for. */
4989 if (paradoxical_subreg_p (p->exp)
4990 && ! (src != 0
4991 && GET_CODE (src) == SUBREG
4992 && GET_MODE (src) == GET_MODE (p->exp)
4993 && (GET_MODE_SIZE (GET_MODE (SUBREG_REG (src)))
4994 < GET_MODE_SIZE (GET_MODE (SUBREG_REG (p->exp))))))
4995 continue;
4997 if (src && GET_CODE (src) == code && rtx_equal_p (src, p->exp))
4998 src = 0;
4999 else if (src_folded && GET_CODE (src_folded) == code
5000 && rtx_equal_p (src_folded, p->exp))
5001 src_folded = 0;
5002 else if (src_eqv_here && GET_CODE (src_eqv_here) == code
5003 && rtx_equal_p (src_eqv_here, p->exp))
5004 src_eqv_here = 0;
5005 else if (src_related && GET_CODE (src_related) == code
5006 && rtx_equal_p (src_related, p->exp))
5007 src_related = 0;
5009 /* This is the same as the destination of the insns, we want
5010 to prefer it. Copy it to src_related. The code below will
5011 then give it a negative cost. */
5012 if (GET_CODE (dest) == code && rtx_equal_p (p->exp, dest))
5013 src_related = dest;
5016 /* Find the cheapest valid equivalent, trying all the available
5017 possibilities. Prefer items not in the hash table to ones
5018 that are when they are equal cost. Note that we can never
5019 worsen an insn as the current contents will also succeed.
5020 If we find an equivalent identical to the destination, use it as best,
5021 since this insn will probably be eliminated in that case. */
5022 if (src)
5024 if (rtx_equal_p (src, dest))
5025 src_cost = src_regcost = -1;
5026 else
5028 src_cost = COST (src);
5029 src_regcost = approx_reg_cost (src);
5033 if (src_eqv_here)
5035 if (rtx_equal_p (src_eqv_here, dest))
5036 src_eqv_cost = src_eqv_regcost = -1;
5037 else
5039 src_eqv_cost = COST (src_eqv_here);
5040 src_eqv_regcost = approx_reg_cost (src_eqv_here);
5044 if (src_folded)
5046 if (rtx_equal_p (src_folded, dest))
5047 src_folded_cost = src_folded_regcost = -1;
5048 else
5050 src_folded_cost = COST (src_folded);
5051 src_folded_regcost = approx_reg_cost (src_folded);
5055 if (src_related)
5057 if (rtx_equal_p (src_related, dest))
5058 src_related_cost = src_related_regcost = -1;
5059 else
5061 src_related_cost = COST (src_related);
5062 src_related_regcost = approx_reg_cost (src_related);
5064 /* If a const-anchor is used to synthesize a constant that
5065 normally requires multiple instructions then slightly prefer
5066 it over the original sequence. These instructions are likely
5067 to become redundant now. We can't compare against the cost
5068 of src_eqv_here because, on MIPS for example, multi-insn
5069 constants have zero cost; they are assumed to be hoisted from
5070 loops. */
5071 if (src_related_is_const_anchor
5072 && src_related_cost == src_cost
5073 && src_eqv_here)
5074 src_related_cost--;
5078 /* If this was an indirect jump insn, a known label will really be
5079 cheaper even though it looks more expensive. */
5080 if (dest == pc_rtx && src_const && GET_CODE (src_const) == LABEL_REF)
5081 src_folded = src_const, src_folded_cost = src_folded_regcost = -1;
5083 /* Terminate loop when replacement made. This must terminate since
5084 the current contents will be tested and will always be valid. */
5085 while (1)
5087 rtx trial;
5089 /* Skip invalid entries. */
5090 while (elt && !REG_P (elt->exp)
5091 && ! exp_equiv_p (elt->exp, elt->exp, 1, false))
5092 elt = elt->next_same_value;
5094 /* A paradoxical subreg would be bad here: it'll be the right
5095 size, but later may be adjusted so that the upper bits aren't
5096 what we want. So reject it. */
5097 if (elt != 0
5098 && paradoxical_subreg_p (elt->exp)
5099 /* It is okay, though, if the rtx we're trying to match
5100 will ignore any of the bits we can't predict. */
5101 && ! (src != 0
5102 && GET_CODE (src) == SUBREG
5103 && GET_MODE (src) == GET_MODE (elt->exp)
5104 && (GET_MODE_SIZE (GET_MODE (SUBREG_REG (src)))
5105 < GET_MODE_SIZE (GET_MODE (SUBREG_REG (elt->exp))))))
5107 elt = elt->next_same_value;
5108 continue;
5111 if (elt)
5113 src_elt_cost = elt->cost;
5114 src_elt_regcost = elt->regcost;
5117 /* Find cheapest and skip it for the next time. For items
5118 of equal cost, use this order:
5119 src_folded, src, src_eqv, src_related and hash table entry. */
5120 if (src_folded
5121 && preferable (src_folded_cost, src_folded_regcost,
5122 src_cost, src_regcost) <= 0
5123 && preferable (src_folded_cost, src_folded_regcost,
5124 src_eqv_cost, src_eqv_regcost) <= 0
5125 && preferable (src_folded_cost, src_folded_regcost,
5126 src_related_cost, src_related_regcost) <= 0
5127 && preferable (src_folded_cost, src_folded_regcost,
5128 src_elt_cost, src_elt_regcost) <= 0)
5130 trial = src_folded, src_folded_cost = MAX_COST;
5131 if (src_folded_force_flag)
5133 rtx forced = force_const_mem (mode, trial);
5134 if (forced)
5135 trial = forced;
5138 else if (src
5139 && preferable (src_cost, src_regcost,
5140 src_eqv_cost, src_eqv_regcost) <= 0
5141 && preferable (src_cost, src_regcost,
5142 src_related_cost, src_related_regcost) <= 0
5143 && preferable (src_cost, src_regcost,
5144 src_elt_cost, src_elt_regcost) <= 0)
5145 trial = src, src_cost = MAX_COST;
5146 else if (src_eqv_here
5147 && preferable (src_eqv_cost, src_eqv_regcost,
5148 src_related_cost, src_related_regcost) <= 0
5149 && preferable (src_eqv_cost, src_eqv_regcost,
5150 src_elt_cost, src_elt_regcost) <= 0)
5151 trial = src_eqv_here, src_eqv_cost = MAX_COST;
5152 else if (src_related
5153 && preferable (src_related_cost, src_related_regcost,
5154 src_elt_cost, src_elt_regcost) <= 0)
5155 trial = src_related, src_related_cost = MAX_COST;
5156 else
5158 trial = elt->exp;
5159 elt = elt->next_same_value;
5160 src_elt_cost = MAX_COST;
5163 /* Avoid creation of overlapping memory moves. */
5164 if (MEM_P (trial) && MEM_P (SET_DEST (sets[i].rtl)))
5166 rtx src, dest;
5168 /* BLKmode moves are not handled by cse anyway. */
5169 if (GET_MODE (trial) == BLKmode)
5170 break;
5172 src = canon_rtx (trial);
5173 dest = canon_rtx (SET_DEST (sets[i].rtl));
5175 if (!MEM_P (src) || !MEM_P (dest)
5176 || !nonoverlapping_memrefs_p (src, dest, false))
5177 break;
5180 /* Try to optimize
5181 (set (reg:M N) (const_int A))
5182 (set (reg:M2 O) (const_int B))
5183 (set (zero_extract:M2 (reg:M N) (const_int C) (const_int D))
5184 (reg:M2 O)). */
5185 if (GET_CODE (SET_DEST (sets[i].rtl)) == ZERO_EXTRACT
5186 && CONST_INT_P (trial)
5187 && CONST_INT_P (XEXP (SET_DEST (sets[i].rtl), 1))
5188 && CONST_INT_P (XEXP (SET_DEST (sets[i].rtl), 2))
5189 && REG_P (XEXP (SET_DEST (sets[i].rtl), 0))
5190 && (GET_MODE_PRECISION (GET_MODE (SET_DEST (sets[i].rtl)))
5191 >= INTVAL (XEXP (SET_DEST (sets[i].rtl), 1)))
5192 && ((unsigned) INTVAL (XEXP (SET_DEST (sets[i].rtl), 1))
5193 + (unsigned) INTVAL (XEXP (SET_DEST (sets[i].rtl), 2))
5194 <= HOST_BITS_PER_WIDE_INT))
5196 rtx dest_reg = XEXP (SET_DEST (sets[i].rtl), 0);
5197 rtx width = XEXP (SET_DEST (sets[i].rtl), 1);
5198 rtx pos = XEXP (SET_DEST (sets[i].rtl), 2);
5199 unsigned int dest_hash = HASH (dest_reg, GET_MODE (dest_reg));
5200 struct table_elt *dest_elt
5201 = lookup (dest_reg, dest_hash, GET_MODE (dest_reg));
5202 rtx dest_cst = NULL;
5204 if (dest_elt)
5205 for (p = dest_elt->first_same_value; p; p = p->next_same_value)
5206 if (p->is_const && CONST_INT_P (p->exp))
5208 dest_cst = p->exp;
5209 break;
5211 if (dest_cst)
5213 HOST_WIDE_INT val = INTVAL (dest_cst);
5214 HOST_WIDE_INT mask;
5215 unsigned int shift;
5216 if (BITS_BIG_ENDIAN)
5217 shift = GET_MODE_PRECISION (GET_MODE (dest_reg))
5218 - INTVAL (pos) - INTVAL (width);
5219 else
5220 shift = INTVAL (pos);
5221 if (INTVAL (width) == HOST_BITS_PER_WIDE_INT)
5222 mask = ~(HOST_WIDE_INT) 0;
5223 else
5224 mask = ((HOST_WIDE_INT) 1 << INTVAL (width)) - 1;
5225 val &= ~(mask << shift);
5226 val |= (INTVAL (trial) & mask) << shift;
5227 val = trunc_int_for_mode (val, GET_MODE (dest_reg));
5228 validate_unshare_change (insn, &SET_DEST (sets[i].rtl),
5229 dest_reg, 1);
5230 validate_unshare_change (insn, &SET_SRC (sets[i].rtl),
5231 GEN_INT (val), 1);
5232 if (apply_change_group ())
5234 rtx note = find_reg_note (insn, REG_EQUAL, NULL_RTX);
5235 if (note)
5237 remove_note (insn, note);
5238 df_notes_rescan (insn);
5240 src_eqv = NULL_RTX;
5241 src_eqv_elt = NULL;
5242 src_eqv_volatile = 0;
5243 src_eqv_in_memory = 0;
5244 src_eqv_hash = 0;
5245 repeat = true;
5246 break;
5251 /* We don't normally have an insn matching (set (pc) (pc)), so
5252 check for this separately here. We will delete such an
5253 insn below.
5255 For other cases such as a table jump or conditional jump
5256 where we know the ultimate target, go ahead and replace the
5257 operand. While that may not make a valid insn, we will
5258 reemit the jump below (and also insert any necessary
5259 barriers). */
5260 if (n_sets == 1 && dest == pc_rtx
5261 && (trial == pc_rtx
5262 || (GET_CODE (trial) == LABEL_REF
5263 && ! condjump_p (insn))))
5265 /* Don't substitute non-local labels, this confuses CFG. */
5266 if (GET_CODE (trial) == LABEL_REF
5267 && LABEL_REF_NONLOCAL_P (trial))
5268 continue;
5270 SET_SRC (sets[i].rtl) = trial;
5271 cse_jumps_altered = true;
5272 break;
5275 /* Reject certain invalid forms of CONST that we create. */
5276 else if (CONSTANT_P (trial)
5277 && GET_CODE (trial) == CONST
5278 /* Reject cases that will cause decode_rtx_const to
5279 die. On the alpha when simplifying a switch, we
5280 get (const (truncate (minus (label_ref)
5281 (label_ref)))). */
5282 && (GET_CODE (XEXP (trial, 0)) == TRUNCATE
5283 /* Likewise on IA-64, except without the
5284 truncate. */
5285 || (GET_CODE (XEXP (trial, 0)) == MINUS
5286 && GET_CODE (XEXP (XEXP (trial, 0), 0)) == LABEL_REF
5287 && GET_CODE (XEXP (XEXP (trial, 0), 1)) == LABEL_REF)))
5288 /* Do nothing for this case. */
5291 /* Look for a substitution that makes a valid insn. */
5292 else if (validate_unshare_change (insn, &SET_SRC (sets[i].rtl),
5293 trial, 0))
5295 rtx new_rtx = canon_reg (SET_SRC (sets[i].rtl), insn);
5297 /* The result of apply_change_group can be ignored; see
5298 canon_reg. */
5300 validate_change (insn, &SET_SRC (sets[i].rtl), new_rtx, 1);
5301 apply_change_group ();
5303 break;
5306 /* If we previously found constant pool entries for
5307 constants and this is a constant, try making a
5308 pool entry. Put it in src_folded unless we already have done
5309 this since that is where it likely came from. */
5311 else if (constant_pool_entries_cost
5312 && CONSTANT_P (trial)
5313 && (src_folded == 0
5314 || (!MEM_P (src_folded)
5315 && ! src_folded_force_flag))
5316 && GET_MODE_CLASS (mode) != MODE_CC
5317 && mode != VOIDmode)
5319 src_folded_force_flag = 1;
5320 src_folded = trial;
5321 src_folded_cost = constant_pool_entries_cost;
5322 src_folded_regcost = constant_pool_entries_regcost;
5326 /* If we changed the insn too much, handle this set from scratch. */
5327 if (repeat)
5329 i--;
5330 continue;
5333 src = SET_SRC (sets[i].rtl);
5335 /* In general, it is good to have a SET with SET_SRC == SET_DEST.
5336 However, there is an important exception: If both are registers
5337 that are not the head of their equivalence class, replace SET_SRC
5338 with the head of the class. If we do not do this, we will have
5339 both registers live over a portion of the basic block. This way,
5340 their lifetimes will likely abut instead of overlapping. */
5341 if (REG_P (dest)
5342 && REGNO_QTY_VALID_P (REGNO (dest)))
5344 int dest_q = REG_QTY (REGNO (dest));
5345 struct qty_table_elem *dest_ent = &qty_table[dest_q];
5347 if (dest_ent->mode == GET_MODE (dest)
5348 && dest_ent->first_reg != REGNO (dest)
5349 && REG_P (src) && REGNO (src) == REGNO (dest)
5350 /* Don't do this if the original insn had a hard reg as
5351 SET_SRC or SET_DEST. */
5352 && (!REG_P (sets[i].src)
5353 || REGNO (sets[i].src) >= FIRST_PSEUDO_REGISTER)
5354 && (!REG_P (dest) || REGNO (dest) >= FIRST_PSEUDO_REGISTER))
5355 /* We can't call canon_reg here because it won't do anything if
5356 SRC is a hard register. */
5358 int src_q = REG_QTY (REGNO (src));
5359 struct qty_table_elem *src_ent = &qty_table[src_q];
5360 int first = src_ent->first_reg;
5361 rtx new_src
5362 = (first >= FIRST_PSEUDO_REGISTER
5363 ? regno_reg_rtx[first] : gen_rtx_REG (GET_MODE (src), first));
5365 /* We must use validate-change even for this, because this
5366 might be a special no-op instruction, suitable only to
5367 tag notes onto. */
5368 if (validate_change (insn, &SET_SRC (sets[i].rtl), new_src, 0))
5370 src = new_src;
5371 /* If we had a constant that is cheaper than what we are now
5372 setting SRC to, use that constant. We ignored it when we
5373 thought we could make this into a no-op. */
5374 if (src_const && COST (src_const) < COST (src)
5375 && validate_change (insn, &SET_SRC (sets[i].rtl),
5376 src_const, 0))
5377 src = src_const;
5382 /* If we made a change, recompute SRC values. */
5383 if (src != sets[i].src)
5385 do_not_record = 0;
5386 hash_arg_in_memory = 0;
5387 sets[i].src = src;
5388 sets[i].src_hash = HASH (src, mode);
5389 sets[i].src_volatile = do_not_record;
5390 sets[i].src_in_memory = hash_arg_in_memory;
5391 sets[i].src_elt = lookup (src, sets[i].src_hash, mode);
5394 /* If this is a single SET, we are setting a register, and we have an
5395 equivalent constant, we want to add a REG_EQUAL note if the constant
5396 is different from the source. We don't want to do it for a constant
5397 pseudo since verifying that this pseudo hasn't been eliminated is a
5398 pain; moreover such a note won't help anything.
5400 Avoid a REG_EQUAL note for (CONST (MINUS (LABEL_REF) (LABEL_REF)))
5401 which can be created for a reference to a compile time computable
5402 entry in a jump table. */
5403 if (n_sets == 1
5404 && REG_P (dest)
5405 && src_const
5406 && !REG_P (src_const)
5407 && !(GET_CODE (src_const) == SUBREG
5408 && REG_P (SUBREG_REG (src_const)))
5409 && !(GET_CODE (src_const) == CONST
5410 && GET_CODE (XEXP (src_const, 0)) == MINUS
5411 && GET_CODE (XEXP (XEXP (src_const, 0), 0)) == LABEL_REF
5412 && GET_CODE (XEXP (XEXP (src_const, 0), 1)) == LABEL_REF)
5413 && !rtx_equal_p (src, src_const))
5415 /* Make sure that the rtx is not shared. */
5416 src_const = copy_rtx (src_const);
5418 /* Record the actual constant value in a REG_EQUAL note,
5419 making a new one if one does not already exist. */
5420 set_unique_reg_note (insn, REG_EQUAL, src_const);
5421 df_notes_rescan (insn);
5424 /* Now deal with the destination. */
5425 do_not_record = 0;
5427 /* Look within any ZERO_EXTRACT to the MEM or REG within it. */
5428 while (GET_CODE (dest) == SUBREG
5429 || GET_CODE (dest) == ZERO_EXTRACT
5430 || GET_CODE (dest) == STRICT_LOW_PART)
5431 dest = XEXP (dest, 0);
5433 sets[i].inner_dest = dest;
5435 if (MEM_P (dest))
5437 #ifdef PUSH_ROUNDING
5438 /* Stack pushes invalidate the stack pointer. */
5439 rtx addr = XEXP (dest, 0);
5440 if (GET_RTX_CLASS (GET_CODE (addr)) == RTX_AUTOINC
5441 && XEXP (addr, 0) == stack_pointer_rtx)
5442 invalidate (stack_pointer_rtx, VOIDmode);
5443 #endif
5444 dest = fold_rtx (dest, insn);
5447 /* Compute the hash code of the destination now,
5448 before the effects of this instruction are recorded,
5449 since the register values used in the address computation
5450 are those before this instruction. */
5451 sets[i].dest_hash = HASH (dest, mode);
5453 /* Don't enter a bit-field in the hash table
5454 because the value in it after the store
5455 may not equal what was stored, due to truncation. */
5457 if (GET_CODE (SET_DEST (sets[i].rtl)) == ZERO_EXTRACT)
5459 rtx width = XEXP (SET_DEST (sets[i].rtl), 1);
5461 if (src_const != 0 && CONST_INT_P (src_const)
5462 && CONST_INT_P (width)
5463 && INTVAL (width) < HOST_BITS_PER_WIDE_INT
5464 && ! (INTVAL (src_const)
5465 & (HOST_WIDE_INT_M1U << INTVAL (width))))
5466 /* Exception: if the value is constant,
5467 and it won't be truncated, record it. */
5469 else
5471 /* This is chosen so that the destination will be invalidated
5472 but no new value will be recorded.
5473 We must invalidate because sometimes constant
5474 values can be recorded for bitfields. */
5475 sets[i].src_elt = 0;
5476 sets[i].src_volatile = 1;
5477 src_eqv = 0;
5478 src_eqv_elt = 0;
5482 /* If only one set in a JUMP_INSN and it is now a no-op, we can delete
5483 the insn. */
5484 else if (n_sets == 1 && dest == pc_rtx && src == pc_rtx)
5486 /* One less use of the label this insn used to jump to. */
5487 delete_insn_and_edges (insn);
5488 cse_jumps_altered = true;
5489 /* No more processing for this set. */
5490 sets[i].rtl = 0;
5493 /* If this SET is now setting PC to a label, we know it used to
5494 be a conditional or computed branch. */
5495 else if (dest == pc_rtx && GET_CODE (src) == LABEL_REF
5496 && !LABEL_REF_NONLOCAL_P (src))
5498 /* We reemit the jump in as many cases as possible just in
5499 case the form of an unconditional jump is significantly
5500 different than a computed jump or conditional jump.
5502 If this insn has multiple sets, then reemitting the
5503 jump is nontrivial. So instead we just force rerecognition
5504 and hope for the best. */
5505 if (n_sets == 1)
5507 rtx_insn *new_rtx;
5508 rtx note;
5510 new_rtx = emit_jump_insn_before (gen_jump (XEXP (src, 0)), insn);
5511 JUMP_LABEL (new_rtx) = XEXP (src, 0);
5512 LABEL_NUSES (XEXP (src, 0))++;
5514 /* Make sure to copy over REG_NON_LOCAL_GOTO. */
5515 note = find_reg_note (insn, REG_NON_LOCAL_GOTO, 0);
5516 if (note)
5518 XEXP (note, 1) = NULL_RTX;
5519 REG_NOTES (new_rtx) = note;
5522 delete_insn_and_edges (insn);
5523 insn = new_rtx;
5525 else
5526 INSN_CODE (insn) = -1;
5528 /* Do not bother deleting any unreachable code, let jump do it. */
5529 cse_jumps_altered = true;
5530 sets[i].rtl = 0;
5533 /* If destination is volatile, invalidate it and then do no further
5534 processing for this assignment. */
5536 else if (do_not_record)
5538 invalidate_dest (dest);
5539 sets[i].rtl = 0;
5542 if (sets[i].rtl != 0 && dest != SET_DEST (sets[i].rtl))
5544 do_not_record = 0;
5545 sets[i].dest_hash = HASH (SET_DEST (sets[i].rtl), mode);
5546 if (do_not_record)
5548 invalidate_dest (SET_DEST (sets[i].rtl));
5549 sets[i].rtl = 0;
5553 #ifdef HAVE_cc0
5554 /* If setting CC0, record what it was set to, or a constant, if it
5555 is equivalent to a constant. If it is being set to a floating-point
5556 value, make a COMPARE with the appropriate constant of 0. If we
5557 don't do this, later code can interpret this as a test against
5558 const0_rtx, which can cause problems if we try to put it into an
5559 insn as a floating-point operand. */
5560 if (dest == cc0_rtx)
5562 this_insn_cc0 = src_const && mode != VOIDmode ? src_const : src;
5563 this_insn_cc0_mode = mode;
5564 if (FLOAT_MODE_P (mode))
5565 this_insn_cc0 = gen_rtx_COMPARE (VOIDmode, this_insn_cc0,
5566 CONST0_RTX (mode));
5568 #endif
5571 /* Now enter all non-volatile source expressions in the hash table
5572 if they are not already present.
5573 Record their equivalence classes in src_elt.
5574 This way we can insert the corresponding destinations into
5575 the same classes even if the actual sources are no longer in them
5576 (having been invalidated). */
5578 if (src_eqv && src_eqv_elt == 0 && sets[0].rtl != 0 && ! src_eqv_volatile
5579 && ! rtx_equal_p (src_eqv, SET_DEST (sets[0].rtl)))
5581 struct table_elt *elt;
5582 struct table_elt *classp = sets[0].src_elt;
5583 rtx dest = SET_DEST (sets[0].rtl);
5584 machine_mode eqvmode = GET_MODE (dest);
5586 if (GET_CODE (dest) == STRICT_LOW_PART)
5588 eqvmode = GET_MODE (SUBREG_REG (XEXP (dest, 0)));
5589 classp = 0;
5591 if (insert_regs (src_eqv, classp, 0))
5593 rehash_using_reg (src_eqv);
5594 src_eqv_hash = HASH (src_eqv, eqvmode);
5596 elt = insert (src_eqv, classp, src_eqv_hash, eqvmode);
5597 elt->in_memory = src_eqv_in_memory;
5598 src_eqv_elt = elt;
5600 /* Check to see if src_eqv_elt is the same as a set source which
5601 does not yet have an elt, and if so set the elt of the set source
5602 to src_eqv_elt. */
5603 for (i = 0; i < n_sets; i++)
5604 if (sets[i].rtl && sets[i].src_elt == 0
5605 && rtx_equal_p (SET_SRC (sets[i].rtl), src_eqv))
5606 sets[i].src_elt = src_eqv_elt;
5609 for (i = 0; i < n_sets; i++)
5610 if (sets[i].rtl && ! sets[i].src_volatile
5611 && ! rtx_equal_p (SET_SRC (sets[i].rtl), SET_DEST (sets[i].rtl)))
5613 if (GET_CODE (SET_DEST (sets[i].rtl)) == STRICT_LOW_PART)
5615 /* REG_EQUAL in setting a STRICT_LOW_PART
5616 gives an equivalent for the entire destination register,
5617 not just for the subreg being stored in now.
5618 This is a more interesting equivalence, so we arrange later
5619 to treat the entire reg as the destination. */
5620 sets[i].src_elt = src_eqv_elt;
5621 sets[i].src_hash = src_eqv_hash;
5623 else
5625 /* Insert source and constant equivalent into hash table, if not
5626 already present. */
5627 struct table_elt *classp = src_eqv_elt;
5628 rtx src = sets[i].src;
5629 rtx dest = SET_DEST (sets[i].rtl);
5630 machine_mode mode
5631 = GET_MODE (src) == VOIDmode ? GET_MODE (dest) : GET_MODE (src);
5633 /* It's possible that we have a source value known to be
5634 constant but don't have a REG_EQUAL note on the insn.
5635 Lack of a note will mean src_eqv_elt will be NULL. This
5636 can happen where we've generated a SUBREG to access a
5637 CONST_INT that is already in a register in a wider mode.
5638 Ensure that the source expression is put in the proper
5639 constant class. */
5640 if (!classp)
5641 classp = sets[i].src_const_elt;
5643 if (sets[i].src_elt == 0)
5645 struct table_elt *elt;
5647 /* Note that these insert_regs calls cannot remove
5648 any of the src_elt's, because they would have failed to
5649 match if not still valid. */
5650 if (insert_regs (src, classp, 0))
5652 rehash_using_reg (src);
5653 sets[i].src_hash = HASH (src, mode);
5655 elt = insert (src, classp, sets[i].src_hash, mode);
5656 elt->in_memory = sets[i].src_in_memory;
5657 /* If inline asm has any clobbers, ensure we only reuse
5658 existing inline asms and never try to put the ASM_OPERANDS
5659 into an insn that isn't inline asm. */
5660 if (GET_CODE (src) == ASM_OPERANDS
5661 && GET_CODE (x) == PARALLEL)
5662 elt->cost = MAX_COST;
5663 sets[i].src_elt = classp = elt;
5665 if (sets[i].src_const && sets[i].src_const_elt == 0
5666 && src != sets[i].src_const
5667 && ! rtx_equal_p (sets[i].src_const, src))
5668 sets[i].src_elt = insert (sets[i].src_const, classp,
5669 sets[i].src_const_hash, mode);
5672 else if (sets[i].src_elt == 0)
5673 /* If we did not insert the source into the hash table (e.g., it was
5674 volatile), note the equivalence class for the REG_EQUAL value, if any,
5675 so that the destination goes into that class. */
5676 sets[i].src_elt = src_eqv_elt;
5678 /* Record destination addresses in the hash table. This allows us to
5679 check if they are invalidated by other sets. */
5680 for (i = 0; i < n_sets; i++)
5682 if (sets[i].rtl)
5684 rtx x = sets[i].inner_dest;
5685 struct table_elt *elt;
5686 machine_mode mode;
5687 unsigned hash;
5689 if (MEM_P (x))
5691 x = XEXP (x, 0);
5692 mode = GET_MODE (x);
5693 hash = HASH (x, mode);
5694 elt = lookup (x, hash, mode);
5695 if (!elt)
5697 if (insert_regs (x, NULL, 0))
5699 rtx dest = SET_DEST (sets[i].rtl);
5701 rehash_using_reg (x);
5702 hash = HASH (x, mode);
5703 sets[i].dest_hash = HASH (dest, GET_MODE (dest));
5705 elt = insert (x, NULL, hash, mode);
5708 sets[i].dest_addr_elt = elt;
5710 else
5711 sets[i].dest_addr_elt = NULL;
5715 invalidate_from_clobbers (insn);
5717 /* Some registers are invalidated by subroutine calls. Memory is
5718 invalidated by non-constant calls. */
5720 if (CALL_P (insn))
5722 if (!(RTL_CONST_OR_PURE_CALL_P (insn)))
5723 invalidate_memory ();
5724 invalidate_for_call ();
5727 /* Now invalidate everything set by this instruction.
5728 If a SUBREG or other funny destination is being set,
5729 sets[i].rtl is still nonzero, so here we invalidate the reg
5730 a part of which is being set. */
5732 for (i = 0; i < n_sets; i++)
5733 if (sets[i].rtl)
5735 /* We can't use the inner dest, because the mode associated with
5736 a ZERO_EXTRACT is significant. */
5737 rtx dest = SET_DEST (sets[i].rtl);
5739 /* Needed for registers to remove the register from its
5740 previous quantity's chain.
5741 Needed for memory if this is a nonvarying address, unless
5742 we have just done an invalidate_memory that covers even those. */
5743 if (REG_P (dest) || GET_CODE (dest) == SUBREG)
5744 invalidate (dest, VOIDmode);
5745 else if (MEM_P (dest))
5746 invalidate (dest, VOIDmode);
5747 else if (GET_CODE (dest) == STRICT_LOW_PART
5748 || GET_CODE (dest) == ZERO_EXTRACT)
5749 invalidate (XEXP (dest, 0), GET_MODE (dest));
5752 /* Don't cse over a call to setjmp; on some machines (eg VAX)
5753 the regs restored by the longjmp come from a later time
5754 than the setjmp. */
5755 if (CALL_P (insn) && find_reg_note (insn, REG_SETJMP, NULL))
5757 flush_hash_table ();
5758 goto done;
5761 /* Make sure registers mentioned in destinations
5762 are safe for use in an expression to be inserted.
5763 This removes from the hash table
5764 any invalid entry that refers to one of these registers.
5766 We don't care about the return value from mention_regs because
5767 we are going to hash the SET_DEST values unconditionally. */
5769 for (i = 0; i < n_sets; i++)
5771 if (sets[i].rtl)
5773 rtx x = SET_DEST (sets[i].rtl);
5775 if (!REG_P (x))
5776 mention_regs (x);
5777 else
5779 /* We used to rely on all references to a register becoming
5780 inaccessible when a register changes to a new quantity,
5781 since that changes the hash code. However, that is not
5782 safe, since after HASH_SIZE new quantities we get a
5783 hash 'collision' of a register with its own invalid
5784 entries. And since SUBREGs have been changed not to
5785 change their hash code with the hash code of the register,
5786 it wouldn't work any longer at all. So we have to check
5787 for any invalid references lying around now.
5788 This code is similar to the REG case in mention_regs,
5789 but it knows that reg_tick has been incremented, and
5790 it leaves reg_in_table as -1 . */
5791 unsigned int regno = REGNO (x);
5792 unsigned int endregno = END_REGNO (x);
5793 unsigned int i;
5795 for (i = regno; i < endregno; i++)
5797 if (REG_IN_TABLE (i) >= 0)
5799 remove_invalid_refs (i);
5800 REG_IN_TABLE (i) = -1;
5807 /* We may have just removed some of the src_elt's from the hash table.
5808 So replace each one with the current head of the same class.
5809 Also check if destination addresses have been removed. */
5811 for (i = 0; i < n_sets; i++)
5812 if (sets[i].rtl)
5814 if (sets[i].dest_addr_elt
5815 && sets[i].dest_addr_elt->first_same_value == 0)
5817 /* The elt was removed, which means this destination is not
5818 valid after this instruction. */
5819 sets[i].rtl = NULL_RTX;
5821 else if (sets[i].src_elt && sets[i].src_elt->first_same_value == 0)
5822 /* If elt was removed, find current head of same class,
5823 or 0 if nothing remains of that class. */
5825 struct table_elt *elt = sets[i].src_elt;
5827 while (elt && elt->prev_same_value)
5828 elt = elt->prev_same_value;
5830 while (elt && elt->first_same_value == 0)
5831 elt = elt->next_same_value;
5832 sets[i].src_elt = elt ? elt->first_same_value : 0;
5836 /* Now insert the destinations into their equivalence classes. */
5838 for (i = 0; i < n_sets; i++)
5839 if (sets[i].rtl)
5841 rtx dest = SET_DEST (sets[i].rtl);
5842 struct table_elt *elt;
5844 /* Don't record value if we are not supposed to risk allocating
5845 floating-point values in registers that might be wider than
5846 memory. */
5847 if ((flag_float_store
5848 && MEM_P (dest)
5849 && FLOAT_MODE_P (GET_MODE (dest)))
5850 /* Don't record BLKmode values, because we don't know the
5851 size of it, and can't be sure that other BLKmode values
5852 have the same or smaller size. */
5853 || GET_MODE (dest) == BLKmode
5854 /* If we didn't put a REG_EQUAL value or a source into the hash
5855 table, there is no point is recording DEST. */
5856 || sets[i].src_elt == 0
5857 /* If DEST is a paradoxical SUBREG and SRC is a ZERO_EXTEND
5858 or SIGN_EXTEND, don't record DEST since it can cause
5859 some tracking to be wrong.
5861 ??? Think about this more later. */
5862 || (paradoxical_subreg_p (dest)
5863 && (GET_CODE (sets[i].src) == SIGN_EXTEND
5864 || GET_CODE (sets[i].src) == ZERO_EXTEND)))
5865 continue;
5867 /* STRICT_LOW_PART isn't part of the value BEING set,
5868 and neither is the SUBREG inside it.
5869 Note that in this case SETS[I].SRC_ELT is really SRC_EQV_ELT. */
5870 if (GET_CODE (dest) == STRICT_LOW_PART)
5871 dest = SUBREG_REG (XEXP (dest, 0));
5873 if (REG_P (dest) || GET_CODE (dest) == SUBREG)
5874 /* Registers must also be inserted into chains for quantities. */
5875 if (insert_regs (dest, sets[i].src_elt, 1))
5877 /* If `insert_regs' changes something, the hash code must be
5878 recalculated. */
5879 rehash_using_reg (dest);
5880 sets[i].dest_hash = HASH (dest, GET_MODE (dest));
5883 elt = insert (dest, sets[i].src_elt,
5884 sets[i].dest_hash, GET_MODE (dest));
5886 /* If this is a constant, insert the constant anchors with the
5887 equivalent register-offset expressions using register DEST. */
5888 if (targetm.const_anchor
5889 && REG_P (dest)
5890 && SCALAR_INT_MODE_P (GET_MODE (dest))
5891 && GET_CODE (sets[i].src_elt->exp) == CONST_INT)
5892 insert_const_anchors (dest, sets[i].src_elt->exp, GET_MODE (dest));
5894 elt->in_memory = (MEM_P (sets[i].inner_dest)
5895 && !MEM_READONLY_P (sets[i].inner_dest));
5897 /* If we have (set (subreg:m1 (reg:m2 foo) 0) (bar:m1)), M1 is no
5898 narrower than M2, and both M1 and M2 are the same number of words,
5899 we are also doing (set (reg:m2 foo) (subreg:m2 (bar:m1) 0)) so
5900 make that equivalence as well.
5902 However, BAR may have equivalences for which gen_lowpart
5903 will produce a simpler value than gen_lowpart applied to
5904 BAR (e.g., if BAR was ZERO_EXTENDed from M2), so we will scan all
5905 BAR's equivalences. If we don't get a simplified form, make
5906 the SUBREG. It will not be used in an equivalence, but will
5907 cause two similar assignments to be detected.
5909 Note the loop below will find SUBREG_REG (DEST) since we have
5910 already entered SRC and DEST of the SET in the table. */
5912 if (GET_CODE (dest) == SUBREG
5913 && (((GET_MODE_SIZE (GET_MODE (SUBREG_REG (dest))) - 1)
5914 / UNITS_PER_WORD)
5915 == (GET_MODE_SIZE (GET_MODE (dest)) - 1) / UNITS_PER_WORD)
5916 && (GET_MODE_SIZE (GET_MODE (dest))
5917 >= GET_MODE_SIZE (GET_MODE (SUBREG_REG (dest))))
5918 && sets[i].src_elt != 0)
5920 machine_mode new_mode = GET_MODE (SUBREG_REG (dest));
5921 struct table_elt *elt, *classp = 0;
5923 for (elt = sets[i].src_elt->first_same_value; elt;
5924 elt = elt->next_same_value)
5926 rtx new_src = 0;
5927 unsigned src_hash;
5928 struct table_elt *src_elt;
5929 int byte = 0;
5931 /* Ignore invalid entries. */
5932 if (!REG_P (elt->exp)
5933 && ! exp_equiv_p (elt->exp, elt->exp, 1, false))
5934 continue;
5936 /* We may have already been playing subreg games. If the
5937 mode is already correct for the destination, use it. */
5938 if (GET_MODE (elt->exp) == new_mode)
5939 new_src = elt->exp;
5940 else
5942 /* Calculate big endian correction for the SUBREG_BYTE.
5943 We have already checked that M1 (GET_MODE (dest))
5944 is not narrower than M2 (new_mode). */
5945 if (BYTES_BIG_ENDIAN)
5946 byte = (GET_MODE_SIZE (GET_MODE (dest))
5947 - GET_MODE_SIZE (new_mode));
5949 new_src = simplify_gen_subreg (new_mode, elt->exp,
5950 GET_MODE (dest), byte);
5953 /* The call to simplify_gen_subreg fails if the value
5954 is VOIDmode, yet we can't do any simplification, e.g.
5955 for EXPR_LISTs denoting function call results.
5956 It is invalid to construct a SUBREG with a VOIDmode
5957 SUBREG_REG, hence a zero new_src means we can't do
5958 this substitution. */
5959 if (! new_src)
5960 continue;
5962 src_hash = HASH (new_src, new_mode);
5963 src_elt = lookup (new_src, src_hash, new_mode);
5965 /* Put the new source in the hash table is if isn't
5966 already. */
5967 if (src_elt == 0)
5969 if (insert_regs (new_src, classp, 0))
5971 rehash_using_reg (new_src);
5972 src_hash = HASH (new_src, new_mode);
5974 src_elt = insert (new_src, classp, src_hash, new_mode);
5975 src_elt->in_memory = elt->in_memory;
5976 if (GET_CODE (new_src) == ASM_OPERANDS
5977 && elt->cost == MAX_COST)
5978 src_elt->cost = MAX_COST;
5980 else if (classp && classp != src_elt->first_same_value)
5981 /* Show that two things that we've seen before are
5982 actually the same. */
5983 merge_equiv_classes (src_elt, classp);
5985 classp = src_elt->first_same_value;
5986 /* Ignore invalid entries. */
5987 while (classp
5988 && !REG_P (classp->exp)
5989 && ! exp_equiv_p (classp->exp, classp->exp, 1, false))
5990 classp = classp->next_same_value;
5995 /* Special handling for (set REG0 REG1) where REG0 is the
5996 "cheapest", cheaper than REG1. After cse, REG1 will probably not
5997 be used in the sequel, so (if easily done) change this insn to
5998 (set REG1 REG0) and replace REG1 with REG0 in the previous insn
5999 that computed their value. Then REG1 will become a dead store
6000 and won't cloud the situation for later optimizations.
6002 Do not make this change if REG1 is a hard register, because it will
6003 then be used in the sequel and we may be changing a two-operand insn
6004 into a three-operand insn.
6006 Also do not do this if we are operating on a copy of INSN. */
6008 if (n_sets == 1 && sets[0].rtl)
6009 try_back_substitute_reg (sets[0].rtl, insn);
6011 done:;
6014 /* Remove from the hash table all expressions that reference memory. */
6016 static void
6017 invalidate_memory (void)
6019 int i;
6020 struct table_elt *p, *next;
6022 for (i = 0; i < HASH_SIZE; i++)
6023 for (p = table[i]; p; p = next)
6025 next = p->next_same_hash;
6026 if (p->in_memory)
6027 remove_from_table (p, i);
6031 /* Perform invalidation on the basis of everything about INSN,
6032 except for invalidating the actual places that are SET in it.
6033 This includes the places CLOBBERed, and anything that might
6034 alias with something that is SET or CLOBBERed. */
6036 static void
6037 invalidate_from_clobbers (rtx_insn *insn)
6039 rtx x = PATTERN (insn);
6041 if (GET_CODE (x) == CLOBBER)
6043 rtx ref = XEXP (x, 0);
6044 if (ref)
6046 if (REG_P (ref) || GET_CODE (ref) == SUBREG
6047 || MEM_P (ref))
6048 invalidate (ref, VOIDmode);
6049 else if (GET_CODE (ref) == STRICT_LOW_PART
6050 || GET_CODE (ref) == ZERO_EXTRACT)
6051 invalidate (XEXP (ref, 0), GET_MODE (ref));
6054 else if (GET_CODE (x) == PARALLEL)
6056 int i;
6057 for (i = XVECLEN (x, 0) - 1; i >= 0; i--)
6059 rtx y = XVECEXP (x, 0, i);
6060 if (GET_CODE (y) == CLOBBER)
6062 rtx ref = XEXP (y, 0);
6063 if (REG_P (ref) || GET_CODE (ref) == SUBREG
6064 || MEM_P (ref))
6065 invalidate (ref, VOIDmode);
6066 else if (GET_CODE (ref) == STRICT_LOW_PART
6067 || GET_CODE (ref) == ZERO_EXTRACT)
6068 invalidate (XEXP (ref, 0), GET_MODE (ref));
6074 /* Perform invalidation on the basis of everything about INSN.
6075 This includes the places CLOBBERed, and anything that might
6076 alias with something that is SET or CLOBBERed. */
6078 static void
6079 invalidate_from_sets_and_clobbers (rtx_insn *insn)
6081 rtx tem;
6082 rtx x = PATTERN (insn);
6084 if (CALL_P (insn))
6086 for (tem = CALL_INSN_FUNCTION_USAGE (insn); tem; tem = XEXP (tem, 1))
6087 if (GET_CODE (XEXP (tem, 0)) == CLOBBER)
6088 invalidate (SET_DEST (XEXP (tem, 0)), VOIDmode);
6091 /* Ensure we invalidate the destination register of a CALL insn.
6092 This is necessary for machines where this register is a fixed_reg,
6093 because no other code would invalidate it. */
6094 if (GET_CODE (x) == SET && GET_CODE (SET_SRC (x)) == CALL)
6095 invalidate (SET_DEST (x), VOIDmode);
6097 else if (GET_CODE (x) == PARALLEL)
6099 int i;
6101 for (i = XVECLEN (x, 0) - 1; i >= 0; i--)
6103 rtx y = XVECEXP (x, 0, i);
6104 if (GET_CODE (y) == CLOBBER)
6106 rtx clobbered = XEXP (y, 0);
6108 if (REG_P (clobbered)
6109 || GET_CODE (clobbered) == SUBREG)
6110 invalidate (clobbered, VOIDmode);
6111 else if (GET_CODE (clobbered) == STRICT_LOW_PART
6112 || GET_CODE (clobbered) == ZERO_EXTRACT)
6113 invalidate (XEXP (clobbered, 0), GET_MODE (clobbered));
6115 else if (GET_CODE (y) == SET && GET_CODE (SET_SRC (y)) == CALL)
6116 invalidate (SET_DEST (y), VOIDmode);
6121 /* Process X, part of the REG_NOTES of an insn. Look at any REG_EQUAL notes
6122 and replace any registers in them with either an equivalent constant
6123 or the canonical form of the register. If we are inside an address,
6124 only do this if the address remains valid.
6126 OBJECT is 0 except when within a MEM in which case it is the MEM.
6128 Return the replacement for X. */
6130 static rtx
6131 cse_process_notes_1 (rtx x, rtx object, bool *changed)
6133 enum rtx_code code = GET_CODE (x);
6134 const char *fmt = GET_RTX_FORMAT (code);
6135 int i;
6137 switch (code)
6139 case CONST:
6140 case SYMBOL_REF:
6141 case LABEL_REF:
6142 CASE_CONST_ANY:
6143 case PC:
6144 case CC0:
6145 case LO_SUM:
6146 return x;
6148 case MEM:
6149 validate_change (x, &XEXP (x, 0),
6150 cse_process_notes (XEXP (x, 0), x, changed), 0);
6151 return x;
6153 case EXPR_LIST:
6154 if (REG_NOTE_KIND (x) == REG_EQUAL)
6155 XEXP (x, 0) = cse_process_notes (XEXP (x, 0), NULL_RTX, changed);
6156 /* Fall through. */
6158 case INSN_LIST:
6159 case INT_LIST:
6160 if (XEXP (x, 1))
6161 XEXP (x, 1) = cse_process_notes (XEXP (x, 1), NULL_RTX, changed);
6162 return x;
6164 case SIGN_EXTEND:
6165 case ZERO_EXTEND:
6166 case SUBREG:
6168 rtx new_rtx = cse_process_notes (XEXP (x, 0), object, changed);
6169 /* We don't substitute VOIDmode constants into these rtx,
6170 since they would impede folding. */
6171 if (GET_MODE (new_rtx) != VOIDmode)
6172 validate_change (object, &XEXP (x, 0), new_rtx, 0);
6173 return x;
6176 case UNSIGNED_FLOAT:
6178 rtx new_rtx = cse_process_notes (XEXP (x, 0), object, changed);
6179 /* We don't substitute negative VOIDmode constants into these rtx,
6180 since they would impede folding. */
6181 if (GET_MODE (new_rtx) != VOIDmode
6182 || (CONST_INT_P (new_rtx) && INTVAL (new_rtx) >= 0)
6183 || (CONST_DOUBLE_P (new_rtx) && CONST_DOUBLE_HIGH (new_rtx) >= 0))
6184 validate_change (object, &XEXP (x, 0), new_rtx, 0);
6185 return x;
6188 case REG:
6189 i = REG_QTY (REGNO (x));
6191 /* Return a constant or a constant register. */
6192 if (REGNO_QTY_VALID_P (REGNO (x)))
6194 struct qty_table_elem *ent = &qty_table[i];
6196 if (ent->const_rtx != NULL_RTX
6197 && (CONSTANT_P (ent->const_rtx)
6198 || REG_P (ent->const_rtx)))
6200 rtx new_rtx = gen_lowpart (GET_MODE (x), ent->const_rtx);
6201 if (new_rtx)
6202 return copy_rtx (new_rtx);
6206 /* Otherwise, canonicalize this register. */
6207 return canon_reg (x, NULL);
6209 default:
6210 break;
6213 for (i = 0; i < GET_RTX_LENGTH (code); i++)
6214 if (fmt[i] == 'e')
6215 validate_change (object, &XEXP (x, i),
6216 cse_process_notes (XEXP (x, i), object, changed), 0);
6218 return x;
6221 static rtx
6222 cse_process_notes (rtx x, rtx object, bool *changed)
6224 rtx new_rtx = cse_process_notes_1 (x, object, changed);
6225 if (new_rtx != x)
6226 *changed = true;
6227 return new_rtx;
6231 /* Find a path in the CFG, starting with FIRST_BB to perform CSE on.
6233 DATA is a pointer to a struct cse_basic_block_data, that is used to
6234 describe the path.
6235 It is filled with a queue of basic blocks, starting with FIRST_BB
6236 and following a trace through the CFG.
6238 If all paths starting at FIRST_BB have been followed, or no new path
6239 starting at FIRST_BB can be constructed, this function returns FALSE.
6240 Otherwise, DATA->path is filled and the function returns TRUE indicating
6241 that a path to follow was found.
6243 If FOLLOW_JUMPS is false, the maximum path length is 1 and the only
6244 block in the path will be FIRST_BB. */
6246 static bool
6247 cse_find_path (basic_block first_bb, struct cse_basic_block_data *data,
6248 int follow_jumps)
6250 basic_block bb;
6251 edge e;
6252 int path_size;
6254 bitmap_set_bit (cse_visited_basic_blocks, first_bb->index);
6256 /* See if there is a previous path. */
6257 path_size = data->path_size;
6259 /* There is a previous path. Make sure it started with FIRST_BB. */
6260 if (path_size)
6261 gcc_assert (data->path[0].bb == first_bb);
6263 /* There was only one basic block in the last path. Clear the path and
6264 return, so that paths starting at another basic block can be tried. */
6265 if (path_size == 1)
6267 path_size = 0;
6268 goto done;
6271 /* If the path was empty from the beginning, construct a new path. */
6272 if (path_size == 0)
6273 data->path[path_size++].bb = first_bb;
6274 else
6276 /* Otherwise, path_size must be equal to or greater than 2, because
6277 a previous path exists that is at least two basic blocks long.
6279 Update the previous branch path, if any. If the last branch was
6280 previously along the branch edge, take the fallthrough edge now. */
6281 while (path_size >= 2)
6283 basic_block last_bb_in_path, previous_bb_in_path;
6284 edge e;
6286 --path_size;
6287 last_bb_in_path = data->path[path_size].bb;
6288 previous_bb_in_path = data->path[path_size - 1].bb;
6290 /* If we previously followed a path along the branch edge, try
6291 the fallthru edge now. */
6292 if (EDGE_COUNT (previous_bb_in_path->succs) == 2
6293 && any_condjump_p (BB_END (previous_bb_in_path))
6294 && (e = find_edge (previous_bb_in_path, last_bb_in_path))
6295 && e == BRANCH_EDGE (previous_bb_in_path))
6297 bb = FALLTHRU_EDGE (previous_bb_in_path)->dest;
6298 if (bb != EXIT_BLOCK_PTR_FOR_FN (cfun)
6299 && single_pred_p (bb)
6300 /* We used to assert here that we would only see blocks
6301 that we have not visited yet. But we may end up
6302 visiting basic blocks twice if the CFG has changed
6303 in this run of cse_main, because when the CFG changes
6304 the topological sort of the CFG also changes. A basic
6305 blocks that previously had more than two predecessors
6306 may now have a single predecessor, and become part of
6307 a path that starts at another basic block.
6309 We still want to visit each basic block only once, so
6310 halt the path here if we have already visited BB. */
6311 && !bitmap_bit_p (cse_visited_basic_blocks, bb->index))
6313 bitmap_set_bit (cse_visited_basic_blocks, bb->index);
6314 data->path[path_size++].bb = bb;
6315 break;
6319 data->path[path_size].bb = NULL;
6322 /* If only one block remains in the path, bail. */
6323 if (path_size == 1)
6325 path_size = 0;
6326 goto done;
6330 /* Extend the path if possible. */
6331 if (follow_jumps)
6333 bb = data->path[path_size - 1].bb;
6334 while (bb && path_size < PARAM_VALUE (PARAM_MAX_CSE_PATH_LENGTH))
6336 if (single_succ_p (bb))
6337 e = single_succ_edge (bb);
6338 else if (EDGE_COUNT (bb->succs) == 2
6339 && any_condjump_p (BB_END (bb)))
6341 /* First try to follow the branch. If that doesn't lead
6342 to a useful path, follow the fallthru edge. */
6343 e = BRANCH_EDGE (bb);
6344 if (!single_pred_p (e->dest))
6345 e = FALLTHRU_EDGE (bb);
6347 else
6348 e = NULL;
6350 if (e
6351 && !((e->flags & EDGE_ABNORMAL_CALL) && cfun->has_nonlocal_label)
6352 && e->dest != EXIT_BLOCK_PTR_FOR_FN (cfun)
6353 && single_pred_p (e->dest)
6354 /* Avoid visiting basic blocks twice. The large comment
6355 above explains why this can happen. */
6356 && !bitmap_bit_p (cse_visited_basic_blocks, e->dest->index))
6358 basic_block bb2 = e->dest;
6359 bitmap_set_bit (cse_visited_basic_blocks, bb2->index);
6360 data->path[path_size++].bb = bb2;
6361 bb = bb2;
6363 else
6364 bb = NULL;
6368 done:
6369 data->path_size = path_size;
6370 return path_size != 0;
6373 /* Dump the path in DATA to file F. NSETS is the number of sets
6374 in the path. */
6376 static void
6377 cse_dump_path (struct cse_basic_block_data *data, int nsets, FILE *f)
6379 int path_entry;
6381 fprintf (f, ";; Following path with %d sets: ", nsets);
6382 for (path_entry = 0; path_entry < data->path_size; path_entry++)
6383 fprintf (f, "%d ", (data->path[path_entry].bb)->index);
6384 fputc ('\n', dump_file);
6385 fflush (f);
6389 /* Return true if BB has exception handling successor edges. */
6391 static bool
6392 have_eh_succ_edges (basic_block bb)
6394 edge e;
6395 edge_iterator ei;
6397 FOR_EACH_EDGE (e, ei, bb->succs)
6398 if (e->flags & EDGE_EH)
6399 return true;
6401 return false;
6405 /* Scan to the end of the path described by DATA. Return an estimate of
6406 the total number of SETs of all insns in the path. */
6408 static void
6409 cse_prescan_path (struct cse_basic_block_data *data)
6411 int nsets = 0;
6412 int path_size = data->path_size;
6413 int path_entry;
6415 /* Scan to end of each basic block in the path. */
6416 for (path_entry = 0; path_entry < path_size; path_entry++)
6418 basic_block bb;
6419 rtx_insn *insn;
6421 bb = data->path[path_entry].bb;
6423 FOR_BB_INSNS (bb, insn)
6425 if (!INSN_P (insn))
6426 continue;
6428 /* A PARALLEL can have lots of SETs in it,
6429 especially if it is really an ASM_OPERANDS. */
6430 if (GET_CODE (PATTERN (insn)) == PARALLEL)
6431 nsets += XVECLEN (PATTERN (insn), 0);
6432 else
6433 nsets += 1;
6437 data->nsets = nsets;
6440 /* Return true if the pattern of INSN uses a LABEL_REF for which
6441 there isn't a REG_LABEL_OPERAND note. */
6443 static bool
6444 check_for_label_ref (rtx_insn *insn)
6446 /* If this insn uses a LABEL_REF and there isn't a REG_LABEL_OPERAND
6447 note for it, we must rerun jump since it needs to place the note. If
6448 this is a LABEL_REF for a CODE_LABEL that isn't in the insn chain,
6449 don't do this since no REG_LABEL_OPERAND will be added. */
6450 subrtx_iterator::array_type array;
6451 FOR_EACH_SUBRTX (iter, array, PATTERN (insn), ALL)
6453 const_rtx x = *iter;
6454 if (GET_CODE (x) == LABEL_REF
6455 && !LABEL_REF_NONLOCAL_P (x)
6456 && (!JUMP_P (insn)
6457 || !label_is_jump_target_p (LABEL_REF_LABEL (x), insn))
6458 && LABEL_P (LABEL_REF_LABEL (x))
6459 && INSN_UID (LABEL_REF_LABEL (x)) != 0
6460 && !find_reg_note (insn, REG_LABEL_OPERAND, LABEL_REF_LABEL (x)))
6461 return true;
6463 return false;
6466 /* Process a single extended basic block described by EBB_DATA. */
6468 static void
6469 cse_extended_basic_block (struct cse_basic_block_data *ebb_data)
6471 int path_size = ebb_data->path_size;
6472 int path_entry;
6473 int num_insns = 0;
6475 /* Allocate the space needed by qty_table. */
6476 qty_table = XNEWVEC (struct qty_table_elem, max_qty);
6478 new_basic_block ();
6479 cse_ebb_live_in = df_get_live_in (ebb_data->path[0].bb);
6480 cse_ebb_live_out = df_get_live_out (ebb_data->path[path_size - 1].bb);
6481 for (path_entry = 0; path_entry < path_size; path_entry++)
6483 basic_block bb;
6484 rtx_insn *insn;
6486 bb = ebb_data->path[path_entry].bb;
6488 /* Invalidate recorded information for eh regs if there is an EH
6489 edge pointing to that bb. */
6490 if (bb_has_eh_pred (bb))
6492 df_ref def;
6494 FOR_EACH_ARTIFICIAL_DEF (def, bb->index)
6495 if (DF_REF_FLAGS (def) & DF_REF_AT_TOP)
6496 invalidate (DF_REF_REG (def), GET_MODE (DF_REF_REG (def)));
6499 optimize_this_for_speed_p = optimize_bb_for_speed_p (bb);
6500 FOR_BB_INSNS (bb, insn)
6502 /* If we have processed 1,000 insns, flush the hash table to
6503 avoid extreme quadratic behavior. We must not include NOTEs
6504 in the count since there may be more of them when generating
6505 debugging information. If we clear the table at different
6506 times, code generated with -g -O might be different than code
6507 generated with -O but not -g.
6509 FIXME: This is a real kludge and needs to be done some other
6510 way. */
6511 if (NONDEBUG_INSN_P (insn)
6512 && num_insns++ > PARAM_VALUE (PARAM_MAX_CSE_INSNS))
6514 flush_hash_table ();
6515 num_insns = 0;
6518 if (INSN_P (insn))
6520 /* Process notes first so we have all notes in canonical forms
6521 when looking for duplicate operations. */
6522 if (REG_NOTES (insn))
6524 bool changed = false;
6525 REG_NOTES (insn) = cse_process_notes (REG_NOTES (insn),
6526 NULL_RTX, &changed);
6527 if (changed)
6528 df_notes_rescan (insn);
6531 cse_insn (insn);
6533 /* If we haven't already found an insn where we added a LABEL_REF,
6534 check this one. */
6535 if (INSN_P (insn) && !recorded_label_ref
6536 && check_for_label_ref (insn))
6537 recorded_label_ref = true;
6539 #ifdef HAVE_cc0
6540 if (NONDEBUG_INSN_P (insn))
6542 /* If the previous insn sets CC0 and this insn no
6543 longer references CC0, delete the previous insn.
6544 Here we use fact that nothing expects CC0 to be
6545 valid over an insn, which is true until the final
6546 pass. */
6547 rtx_insn *prev_insn;
6548 rtx tem;
6550 prev_insn = prev_nonnote_nondebug_insn (insn);
6551 if (prev_insn && NONJUMP_INSN_P (prev_insn)
6552 && (tem = single_set (prev_insn)) != NULL_RTX
6553 && SET_DEST (tem) == cc0_rtx
6554 && ! reg_mentioned_p (cc0_rtx, PATTERN (insn)))
6555 delete_insn (prev_insn);
6557 /* If this insn is not the last insn in the basic
6558 block, it will be PREV_INSN(insn) in the next
6559 iteration. If we recorded any CC0-related
6560 information for this insn, remember it. */
6561 if (insn != BB_END (bb))
6563 prev_insn_cc0 = this_insn_cc0;
6564 prev_insn_cc0_mode = this_insn_cc0_mode;
6567 #endif
6571 /* With non-call exceptions, we are not always able to update
6572 the CFG properly inside cse_insn. So clean up possibly
6573 redundant EH edges here. */
6574 if (cfun->can_throw_non_call_exceptions && have_eh_succ_edges (bb))
6575 cse_cfg_altered |= purge_dead_edges (bb);
6577 /* If we changed a conditional jump, we may have terminated
6578 the path we are following. Check that by verifying that
6579 the edge we would take still exists. If the edge does
6580 not exist anymore, purge the remainder of the path.
6581 Note that this will cause us to return to the caller. */
6582 if (path_entry < path_size - 1)
6584 basic_block next_bb = ebb_data->path[path_entry + 1].bb;
6585 if (!find_edge (bb, next_bb))
6589 path_size--;
6591 /* If we truncate the path, we must also reset the
6592 visited bit on the remaining blocks in the path,
6593 or we will never visit them at all. */
6594 bitmap_clear_bit (cse_visited_basic_blocks,
6595 ebb_data->path[path_size].bb->index);
6596 ebb_data->path[path_size].bb = NULL;
6598 while (path_size - 1 != path_entry);
6599 ebb_data->path_size = path_size;
6603 /* If this is a conditional jump insn, record any known
6604 equivalences due to the condition being tested. */
6605 insn = BB_END (bb);
6606 if (path_entry < path_size - 1
6607 && JUMP_P (insn)
6608 && single_set (insn)
6609 && any_condjump_p (insn))
6611 basic_block next_bb = ebb_data->path[path_entry + 1].bb;
6612 bool taken = (next_bb == BRANCH_EDGE (bb)->dest);
6613 record_jump_equiv (insn, taken);
6616 #ifdef HAVE_cc0
6617 /* Clear the CC0-tracking related insns, they can't provide
6618 useful information across basic block boundaries. */
6619 prev_insn_cc0 = 0;
6620 #endif
6623 gcc_assert (next_qty <= max_qty);
6625 free (qty_table);
6629 /* Perform cse on the instructions of a function.
6630 F is the first instruction.
6631 NREGS is one plus the highest pseudo-reg number used in the instruction.
6633 Return 2 if jump optimizations should be redone due to simplifications
6634 in conditional jump instructions.
6635 Return 1 if the CFG should be cleaned up because it has been modified.
6636 Return 0 otherwise. */
6638 static int
6639 cse_main (rtx_insn *f ATTRIBUTE_UNUSED, int nregs)
6641 struct cse_basic_block_data ebb_data;
6642 basic_block bb;
6643 int *rc_order = XNEWVEC (int, last_basic_block_for_fn (cfun));
6644 int i, n_blocks;
6646 df_set_flags (DF_LR_RUN_DCE);
6647 df_note_add_problem ();
6648 df_analyze ();
6649 df_set_flags (DF_DEFER_INSN_RESCAN);
6651 reg_scan (get_insns (), max_reg_num ());
6652 init_cse_reg_info (nregs);
6654 ebb_data.path = XNEWVEC (struct branch_path,
6655 PARAM_VALUE (PARAM_MAX_CSE_PATH_LENGTH));
6657 cse_cfg_altered = false;
6658 cse_jumps_altered = false;
6659 recorded_label_ref = false;
6660 constant_pool_entries_cost = 0;
6661 constant_pool_entries_regcost = 0;
6662 ebb_data.path_size = 0;
6663 ebb_data.nsets = 0;
6664 rtl_hooks = cse_rtl_hooks;
6666 init_recog ();
6667 init_alias_analysis ();
6669 reg_eqv_table = XNEWVEC (struct reg_eqv_elem, nregs);
6671 /* Set up the table of already visited basic blocks. */
6672 cse_visited_basic_blocks = sbitmap_alloc (last_basic_block_for_fn (cfun));
6673 bitmap_clear (cse_visited_basic_blocks);
6675 /* Loop over basic blocks in reverse completion order (RPO),
6676 excluding the ENTRY and EXIT blocks. */
6677 n_blocks = pre_and_rev_post_order_compute (NULL, rc_order, false);
6678 i = 0;
6679 while (i < n_blocks)
6681 /* Find the first block in the RPO queue that we have not yet
6682 processed before. */
6685 bb = BASIC_BLOCK_FOR_FN (cfun, rc_order[i++]);
6687 while (bitmap_bit_p (cse_visited_basic_blocks, bb->index)
6688 && i < n_blocks);
6690 /* Find all paths starting with BB, and process them. */
6691 while (cse_find_path (bb, &ebb_data, flag_cse_follow_jumps))
6693 /* Pre-scan the path. */
6694 cse_prescan_path (&ebb_data);
6696 /* If this basic block has no sets, skip it. */
6697 if (ebb_data.nsets == 0)
6698 continue;
6700 /* Get a reasonable estimate for the maximum number of qty's
6701 needed for this path. For this, we take the number of sets
6702 and multiply that by MAX_RECOG_OPERANDS. */
6703 max_qty = ebb_data.nsets * MAX_RECOG_OPERANDS;
6705 /* Dump the path we're about to process. */
6706 if (dump_file)
6707 cse_dump_path (&ebb_data, ebb_data.nsets, dump_file);
6709 cse_extended_basic_block (&ebb_data);
6713 /* Clean up. */
6714 end_alias_analysis ();
6715 free (reg_eqv_table);
6716 free (ebb_data.path);
6717 sbitmap_free (cse_visited_basic_blocks);
6718 free (rc_order);
6719 rtl_hooks = general_rtl_hooks;
6721 if (cse_jumps_altered || recorded_label_ref)
6722 return 2;
6723 else if (cse_cfg_altered)
6724 return 1;
6725 else
6726 return 0;
6729 /* Count the number of times registers are used (not set) in X.
6730 COUNTS is an array in which we accumulate the count, INCR is how much
6731 we count each register usage.
6733 Don't count a usage of DEST, which is the SET_DEST of a SET which
6734 contains X in its SET_SRC. This is because such a SET does not
6735 modify the liveness of DEST.
6736 DEST is set to pc_rtx for a trapping insn, or for an insn with side effects.
6737 We must then count uses of a SET_DEST regardless, because the insn can't be
6738 deleted here. */
6740 static void
6741 count_reg_usage (rtx x, int *counts, rtx dest, int incr)
6743 enum rtx_code code;
6744 rtx note;
6745 const char *fmt;
6746 int i, j;
6748 if (x == 0)
6749 return;
6751 switch (code = GET_CODE (x))
6753 case REG:
6754 if (x != dest)
6755 counts[REGNO (x)] += incr;
6756 return;
6758 case PC:
6759 case CC0:
6760 case CONST:
6761 CASE_CONST_ANY:
6762 case SYMBOL_REF:
6763 case LABEL_REF:
6764 return;
6766 case CLOBBER:
6767 /* If we are clobbering a MEM, mark any registers inside the address
6768 as being used. */
6769 if (MEM_P (XEXP (x, 0)))
6770 count_reg_usage (XEXP (XEXP (x, 0), 0), counts, NULL_RTX, incr);
6771 return;
6773 case SET:
6774 /* Unless we are setting a REG, count everything in SET_DEST. */
6775 if (!REG_P (SET_DEST (x)))
6776 count_reg_usage (SET_DEST (x), counts, NULL_RTX, incr);
6777 count_reg_usage (SET_SRC (x), counts,
6778 dest ? dest : SET_DEST (x),
6779 incr);
6780 return;
6782 case DEBUG_INSN:
6783 return;
6785 case CALL_INSN:
6786 case INSN:
6787 case JUMP_INSN:
6788 /* We expect dest to be NULL_RTX here. If the insn may throw,
6789 or if it cannot be deleted due to side-effects, mark this fact
6790 by setting DEST to pc_rtx. */
6791 if ((!cfun->can_delete_dead_exceptions && !insn_nothrow_p (x))
6792 || side_effects_p (PATTERN (x)))
6793 dest = pc_rtx;
6794 if (code == CALL_INSN)
6795 count_reg_usage (CALL_INSN_FUNCTION_USAGE (x), counts, dest, incr);
6796 count_reg_usage (PATTERN (x), counts, dest, incr);
6798 /* Things used in a REG_EQUAL note aren't dead since loop may try to
6799 use them. */
6801 note = find_reg_equal_equiv_note (x);
6802 if (note)
6804 rtx eqv = XEXP (note, 0);
6806 if (GET_CODE (eqv) == EXPR_LIST)
6807 /* This REG_EQUAL note describes the result of a function call.
6808 Process all the arguments. */
6811 count_reg_usage (XEXP (eqv, 0), counts, dest, incr);
6812 eqv = XEXP (eqv, 1);
6814 while (eqv && GET_CODE (eqv) == EXPR_LIST);
6815 else
6816 count_reg_usage (eqv, counts, dest, incr);
6818 return;
6820 case EXPR_LIST:
6821 if (REG_NOTE_KIND (x) == REG_EQUAL
6822 || (REG_NOTE_KIND (x) != REG_NONNEG && GET_CODE (XEXP (x,0)) == USE)
6823 /* FUNCTION_USAGE expression lists may include (CLOBBER (mem /u)),
6824 involving registers in the address. */
6825 || GET_CODE (XEXP (x, 0)) == CLOBBER)
6826 count_reg_usage (XEXP (x, 0), counts, NULL_RTX, incr);
6828 count_reg_usage (XEXP (x, 1), counts, NULL_RTX, incr);
6829 return;
6831 case ASM_OPERANDS:
6832 /* Iterate over just the inputs, not the constraints as well. */
6833 for (i = ASM_OPERANDS_INPUT_LENGTH (x) - 1; i >= 0; i--)
6834 count_reg_usage (ASM_OPERANDS_INPUT (x, i), counts, dest, incr);
6835 return;
6837 case INSN_LIST:
6838 case INT_LIST:
6839 gcc_unreachable ();
6841 default:
6842 break;
6845 fmt = GET_RTX_FORMAT (code);
6846 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
6848 if (fmt[i] == 'e')
6849 count_reg_usage (XEXP (x, i), counts, dest, incr);
6850 else if (fmt[i] == 'E')
6851 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
6852 count_reg_usage (XVECEXP (x, i, j), counts, dest, incr);
6856 /* Return true if X is a dead register. */
6858 static inline int
6859 is_dead_reg (const_rtx x, int *counts)
6861 return (REG_P (x)
6862 && REGNO (x) >= FIRST_PSEUDO_REGISTER
6863 && counts[REGNO (x)] == 0);
6866 /* Return true if set is live. */
6867 static bool
6868 set_live_p (rtx set, rtx_insn *insn ATTRIBUTE_UNUSED, /* Only used with HAVE_cc0. */
6869 int *counts)
6871 #ifdef HAVE_cc0
6872 rtx tem;
6873 #endif
6875 if (set_noop_p (set))
6878 #ifdef HAVE_cc0
6879 else if (GET_CODE (SET_DEST (set)) == CC0
6880 && !side_effects_p (SET_SRC (set))
6881 && ((tem = next_nonnote_nondebug_insn (insn)) == NULL_RTX
6882 || !INSN_P (tem)
6883 || !reg_referenced_p (cc0_rtx, PATTERN (tem))))
6884 return false;
6885 #endif
6886 else if (!is_dead_reg (SET_DEST (set), counts)
6887 || side_effects_p (SET_SRC (set)))
6888 return true;
6889 return false;
6892 /* Return true if insn is live. */
6894 static bool
6895 insn_live_p (rtx_insn *insn, int *counts)
6897 int i;
6898 if (!cfun->can_delete_dead_exceptions && !insn_nothrow_p (insn))
6899 return true;
6900 else if (GET_CODE (PATTERN (insn)) == SET)
6901 return set_live_p (PATTERN (insn), insn, counts);
6902 else if (GET_CODE (PATTERN (insn)) == PARALLEL)
6904 for (i = XVECLEN (PATTERN (insn), 0) - 1; i >= 0; i--)
6906 rtx elt = XVECEXP (PATTERN (insn), 0, i);
6908 if (GET_CODE (elt) == SET)
6910 if (set_live_p (elt, insn, counts))
6911 return true;
6913 else if (GET_CODE (elt) != CLOBBER && GET_CODE (elt) != USE)
6914 return true;
6916 return false;
6918 else if (DEBUG_INSN_P (insn))
6920 rtx_insn *next;
6922 for (next = NEXT_INSN (insn); next; next = NEXT_INSN (next))
6923 if (NOTE_P (next))
6924 continue;
6925 else if (!DEBUG_INSN_P (next))
6926 return true;
6927 else if (INSN_VAR_LOCATION_DECL (insn) == INSN_VAR_LOCATION_DECL (next))
6928 return false;
6930 return true;
6932 else
6933 return true;
6936 /* Count the number of stores into pseudo. Callback for note_stores. */
6938 static void
6939 count_stores (rtx x, const_rtx set ATTRIBUTE_UNUSED, void *data)
6941 int *counts = (int *) data;
6942 if (REG_P (x) && REGNO (x) >= FIRST_PSEUDO_REGISTER)
6943 counts[REGNO (x)]++;
6946 /* Return if DEBUG_INSN pattern PAT needs to be reset because some dead
6947 pseudo doesn't have a replacement. COUNTS[X] is zero if register X
6948 is dead and REPLACEMENTS[X] is null if it has no replacemenet.
6949 Set *SEEN_REPL to true if we see a dead register that does have
6950 a replacement. */
6952 static bool
6953 is_dead_debug_insn (const_rtx pat, int *counts, rtx *replacements,
6954 bool *seen_repl)
6956 subrtx_iterator::array_type array;
6957 FOR_EACH_SUBRTX (iter, array, pat, NONCONST)
6959 const_rtx x = *iter;
6960 if (is_dead_reg (x, counts))
6962 if (replacements && replacements[REGNO (x)] != NULL_RTX)
6963 *seen_repl = true;
6964 else
6965 return true;
6968 return false;
6971 /* Replace a dead pseudo in a DEBUG_INSN with replacement DEBUG_EXPR.
6972 Callback for simplify_replace_fn_rtx. */
6974 static rtx
6975 replace_dead_reg (rtx x, const_rtx old_rtx ATTRIBUTE_UNUSED, void *data)
6977 rtx *replacements = (rtx *) data;
6979 if (REG_P (x)
6980 && REGNO (x) >= FIRST_PSEUDO_REGISTER
6981 && replacements[REGNO (x)] != NULL_RTX)
6983 if (GET_MODE (x) == GET_MODE (replacements[REGNO (x)]))
6984 return replacements[REGNO (x)];
6985 return lowpart_subreg (GET_MODE (x), replacements[REGNO (x)],
6986 GET_MODE (replacements[REGNO (x)]));
6988 return NULL_RTX;
6991 /* Scan all the insns and delete any that are dead; i.e., they store a register
6992 that is never used or they copy a register to itself.
6994 This is used to remove insns made obviously dead by cse, loop or other
6995 optimizations. It improves the heuristics in loop since it won't try to
6996 move dead invariants out of loops or make givs for dead quantities. The
6997 remaining passes of the compilation are also sped up. */
7000 delete_trivially_dead_insns (rtx_insn *insns, int nreg)
7002 int *counts;
7003 rtx_insn *insn, *prev;
7004 rtx *replacements = NULL;
7005 int ndead = 0;
7007 timevar_push (TV_DELETE_TRIVIALLY_DEAD);
7008 /* First count the number of times each register is used. */
7009 if (MAY_HAVE_DEBUG_INSNS)
7011 counts = XCNEWVEC (int, nreg * 3);
7012 for (insn = insns; insn; insn = NEXT_INSN (insn))
7013 if (DEBUG_INSN_P (insn))
7014 count_reg_usage (INSN_VAR_LOCATION_LOC (insn), counts + nreg,
7015 NULL_RTX, 1);
7016 else if (INSN_P (insn))
7018 count_reg_usage (insn, counts, NULL_RTX, 1);
7019 note_stores (PATTERN (insn), count_stores, counts + nreg * 2);
7021 /* If there can be debug insns, COUNTS are 3 consecutive arrays.
7022 First one counts how many times each pseudo is used outside
7023 of debug insns, second counts how many times each pseudo is
7024 used in debug insns and third counts how many times a pseudo
7025 is stored. */
7027 else
7029 counts = XCNEWVEC (int, nreg);
7030 for (insn = insns; insn; insn = NEXT_INSN (insn))
7031 if (INSN_P (insn))
7032 count_reg_usage (insn, counts, NULL_RTX, 1);
7033 /* If no debug insns can be present, COUNTS is just an array
7034 which counts how many times each pseudo is used. */
7036 /* Pseudo PIC register should be considered as used due to possible
7037 new usages generated. */
7038 if (!reload_completed
7039 && pic_offset_table_rtx
7040 && REGNO (pic_offset_table_rtx) >= FIRST_PSEUDO_REGISTER)
7041 counts[REGNO (pic_offset_table_rtx)]++;
7042 /* Go from the last insn to the first and delete insns that only set unused
7043 registers or copy a register to itself. As we delete an insn, remove
7044 usage counts for registers it uses.
7046 The first jump optimization pass may leave a real insn as the last
7047 insn in the function. We must not skip that insn or we may end
7048 up deleting code that is not really dead.
7050 If some otherwise unused register is only used in DEBUG_INSNs,
7051 try to create a DEBUG_EXPR temporary and emit a DEBUG_INSN before
7052 the setter. Then go through DEBUG_INSNs and if a DEBUG_EXPR
7053 has been created for the unused register, replace it with
7054 the DEBUG_EXPR, otherwise reset the DEBUG_INSN. */
7055 for (insn = get_last_insn (); insn; insn = prev)
7057 int live_insn = 0;
7059 prev = PREV_INSN (insn);
7060 if (!INSN_P (insn))
7061 continue;
7063 live_insn = insn_live_p (insn, counts);
7065 /* If this is a dead insn, delete it and show registers in it aren't
7066 being used. */
7068 if (! live_insn && dbg_cnt (delete_trivial_dead))
7070 if (DEBUG_INSN_P (insn))
7071 count_reg_usage (INSN_VAR_LOCATION_LOC (insn), counts + nreg,
7072 NULL_RTX, -1);
7073 else
7075 rtx set;
7076 if (MAY_HAVE_DEBUG_INSNS
7077 && (set = single_set (insn)) != NULL_RTX
7078 && is_dead_reg (SET_DEST (set), counts)
7079 /* Used at least once in some DEBUG_INSN. */
7080 && counts[REGNO (SET_DEST (set)) + nreg] > 0
7081 /* And set exactly once. */
7082 && counts[REGNO (SET_DEST (set)) + nreg * 2] == 1
7083 && !side_effects_p (SET_SRC (set))
7084 && asm_noperands (PATTERN (insn)) < 0)
7086 rtx dval, bind_var_loc;
7087 rtx_insn *bind;
7089 /* Create DEBUG_EXPR (and DEBUG_EXPR_DECL). */
7090 dval = make_debug_expr_from_rtl (SET_DEST (set));
7092 /* Emit a debug bind insn before the insn in which
7093 reg dies. */
7094 bind_var_loc =
7095 gen_rtx_VAR_LOCATION (GET_MODE (SET_DEST (set)),
7096 DEBUG_EXPR_TREE_DECL (dval),
7097 SET_SRC (set),
7098 VAR_INIT_STATUS_INITIALIZED);
7099 count_reg_usage (bind_var_loc, counts + nreg, NULL_RTX, 1);
7101 bind = emit_debug_insn_before (bind_var_loc, insn);
7102 df_insn_rescan (bind);
7104 if (replacements == NULL)
7105 replacements = XCNEWVEC (rtx, nreg);
7106 replacements[REGNO (SET_DEST (set))] = dval;
7109 count_reg_usage (insn, counts, NULL_RTX, -1);
7110 ndead++;
7112 delete_insn_and_edges (insn);
7116 if (MAY_HAVE_DEBUG_INSNS)
7118 for (insn = get_last_insn (); insn; insn = PREV_INSN (insn))
7119 if (DEBUG_INSN_P (insn))
7121 /* If this debug insn references a dead register that wasn't replaced
7122 with an DEBUG_EXPR, reset the DEBUG_INSN. */
7123 bool seen_repl = false;
7124 if (is_dead_debug_insn (INSN_VAR_LOCATION_LOC (insn),
7125 counts, replacements, &seen_repl))
7127 INSN_VAR_LOCATION_LOC (insn) = gen_rtx_UNKNOWN_VAR_LOC ();
7128 df_insn_rescan (insn);
7130 else if (seen_repl)
7132 INSN_VAR_LOCATION_LOC (insn)
7133 = simplify_replace_fn_rtx (INSN_VAR_LOCATION_LOC (insn),
7134 NULL_RTX, replace_dead_reg,
7135 replacements);
7136 df_insn_rescan (insn);
7139 free (replacements);
7142 if (dump_file && ndead)
7143 fprintf (dump_file, "Deleted %i trivially dead insns\n",
7144 ndead);
7145 /* Clean up. */
7146 free (counts);
7147 timevar_pop (TV_DELETE_TRIVIALLY_DEAD);
7148 return ndead;
7151 /* If LOC contains references to NEWREG in a different mode, change them
7152 to use NEWREG instead. */
7154 static void
7155 cse_change_cc_mode (subrtx_ptr_iterator::array_type &array,
7156 rtx *loc, rtx insn, rtx newreg)
7158 FOR_EACH_SUBRTX_PTR (iter, array, loc, NONCONST)
7160 rtx *loc = *iter;
7161 rtx x = *loc;
7162 if (x
7163 && REG_P (x)
7164 && REGNO (x) == REGNO (newreg)
7165 && GET_MODE (x) != GET_MODE (newreg))
7167 validate_change (insn, loc, newreg, 1);
7168 iter.skip_subrtxes ();
7173 /* Change the mode of any reference to the register REGNO (NEWREG) to
7174 GET_MODE (NEWREG) in INSN. */
7176 static void
7177 cse_change_cc_mode_insn (rtx_insn *insn, rtx newreg)
7179 int success;
7181 if (!INSN_P (insn))
7182 return;
7184 subrtx_ptr_iterator::array_type array;
7185 cse_change_cc_mode (array, &PATTERN (insn), insn, newreg);
7186 cse_change_cc_mode (array, &REG_NOTES (insn), insn, newreg);
7188 /* If the following assertion was triggered, there is most probably
7189 something wrong with the cc_modes_compatible back end function.
7190 CC modes only can be considered compatible if the insn - with the mode
7191 replaced by any of the compatible modes - can still be recognized. */
7192 success = apply_change_group ();
7193 gcc_assert (success);
7196 /* Change the mode of any reference to the register REGNO (NEWREG) to
7197 GET_MODE (NEWREG), starting at START. Stop before END. Stop at
7198 any instruction which modifies NEWREG. */
7200 static void
7201 cse_change_cc_mode_insns (rtx_insn *start, rtx_insn *end, rtx newreg)
7203 rtx_insn *insn;
7205 for (insn = start; insn != end; insn = NEXT_INSN (insn))
7207 if (! INSN_P (insn))
7208 continue;
7210 if (reg_set_p (newreg, insn))
7211 return;
7213 cse_change_cc_mode_insn (insn, newreg);
7217 /* BB is a basic block which finishes with CC_REG as a condition code
7218 register which is set to CC_SRC. Look through the successors of BB
7219 to find blocks which have a single predecessor (i.e., this one),
7220 and look through those blocks for an assignment to CC_REG which is
7221 equivalent to CC_SRC. CAN_CHANGE_MODE indicates whether we are
7222 permitted to change the mode of CC_SRC to a compatible mode. This
7223 returns VOIDmode if no equivalent assignments were found.
7224 Otherwise it returns the mode which CC_SRC should wind up with.
7225 ORIG_BB should be the same as BB in the outermost cse_cc_succs call,
7226 but is passed unmodified down to recursive calls in order to prevent
7227 endless recursion.
7229 The main complexity in this function is handling the mode issues.
7230 We may have more than one duplicate which we can eliminate, and we
7231 try to find a mode which will work for multiple duplicates. */
7233 static machine_mode
7234 cse_cc_succs (basic_block bb, basic_block orig_bb, rtx cc_reg, rtx cc_src,
7235 bool can_change_mode)
7237 bool found_equiv;
7238 machine_mode mode;
7239 unsigned int insn_count;
7240 edge e;
7241 rtx_insn *insns[2];
7242 machine_mode modes[2];
7243 rtx_insn *last_insns[2];
7244 unsigned int i;
7245 rtx newreg;
7246 edge_iterator ei;
7248 /* We expect to have two successors. Look at both before picking
7249 the final mode for the comparison. If we have more successors
7250 (i.e., some sort of table jump, although that seems unlikely),
7251 then we require all beyond the first two to use the same
7252 mode. */
7254 found_equiv = false;
7255 mode = GET_MODE (cc_src);
7256 insn_count = 0;
7257 FOR_EACH_EDGE (e, ei, bb->succs)
7259 rtx_insn *insn;
7260 rtx_insn *end;
7262 if (e->flags & EDGE_COMPLEX)
7263 continue;
7265 if (EDGE_COUNT (e->dest->preds) != 1
7266 || e->dest == EXIT_BLOCK_PTR_FOR_FN (cfun)
7267 /* Avoid endless recursion on unreachable blocks. */
7268 || e->dest == orig_bb)
7269 continue;
7271 end = NEXT_INSN (BB_END (e->dest));
7272 for (insn = BB_HEAD (e->dest); insn != end; insn = NEXT_INSN (insn))
7274 rtx set;
7276 if (! INSN_P (insn))
7277 continue;
7279 /* If CC_SRC is modified, we have to stop looking for
7280 something which uses it. */
7281 if (modified_in_p (cc_src, insn))
7282 break;
7284 /* Check whether INSN sets CC_REG to CC_SRC. */
7285 set = single_set (insn);
7286 if (set
7287 && REG_P (SET_DEST (set))
7288 && REGNO (SET_DEST (set)) == REGNO (cc_reg))
7290 bool found;
7291 machine_mode set_mode;
7292 machine_mode comp_mode;
7294 found = false;
7295 set_mode = GET_MODE (SET_SRC (set));
7296 comp_mode = set_mode;
7297 if (rtx_equal_p (cc_src, SET_SRC (set)))
7298 found = true;
7299 else if (GET_CODE (cc_src) == COMPARE
7300 && GET_CODE (SET_SRC (set)) == COMPARE
7301 && mode != set_mode
7302 && rtx_equal_p (XEXP (cc_src, 0),
7303 XEXP (SET_SRC (set), 0))
7304 && rtx_equal_p (XEXP (cc_src, 1),
7305 XEXP (SET_SRC (set), 1)))
7308 comp_mode = targetm.cc_modes_compatible (mode, set_mode);
7309 if (comp_mode != VOIDmode
7310 && (can_change_mode || comp_mode == mode))
7311 found = true;
7314 if (found)
7316 found_equiv = true;
7317 if (insn_count < ARRAY_SIZE (insns))
7319 insns[insn_count] = insn;
7320 modes[insn_count] = set_mode;
7321 last_insns[insn_count] = end;
7322 ++insn_count;
7324 if (mode != comp_mode)
7326 gcc_assert (can_change_mode);
7327 mode = comp_mode;
7329 /* The modified insn will be re-recognized later. */
7330 PUT_MODE (cc_src, mode);
7333 else
7335 if (set_mode != mode)
7337 /* We found a matching expression in the
7338 wrong mode, but we don't have room to
7339 store it in the array. Punt. This case
7340 should be rare. */
7341 break;
7343 /* INSN sets CC_REG to a value equal to CC_SRC
7344 with the right mode. We can simply delete
7345 it. */
7346 delete_insn (insn);
7349 /* We found an instruction to delete. Keep looking,
7350 in the hopes of finding a three-way jump. */
7351 continue;
7354 /* We found an instruction which sets the condition
7355 code, so don't look any farther. */
7356 break;
7359 /* If INSN sets CC_REG in some other way, don't look any
7360 farther. */
7361 if (reg_set_p (cc_reg, insn))
7362 break;
7365 /* If we fell off the bottom of the block, we can keep looking
7366 through successors. We pass CAN_CHANGE_MODE as false because
7367 we aren't prepared to handle compatibility between the
7368 further blocks and this block. */
7369 if (insn == end)
7371 machine_mode submode;
7373 submode = cse_cc_succs (e->dest, orig_bb, cc_reg, cc_src, false);
7374 if (submode != VOIDmode)
7376 gcc_assert (submode == mode);
7377 found_equiv = true;
7378 can_change_mode = false;
7383 if (! found_equiv)
7384 return VOIDmode;
7386 /* Now INSN_COUNT is the number of instructions we found which set
7387 CC_REG to a value equivalent to CC_SRC. The instructions are in
7388 INSNS. The modes used by those instructions are in MODES. */
7390 newreg = NULL_RTX;
7391 for (i = 0; i < insn_count; ++i)
7393 if (modes[i] != mode)
7395 /* We need to change the mode of CC_REG in INSNS[i] and
7396 subsequent instructions. */
7397 if (! newreg)
7399 if (GET_MODE (cc_reg) == mode)
7400 newreg = cc_reg;
7401 else
7402 newreg = gen_rtx_REG (mode, REGNO (cc_reg));
7404 cse_change_cc_mode_insns (NEXT_INSN (insns[i]), last_insns[i],
7405 newreg);
7408 delete_insn_and_edges (insns[i]);
7411 return mode;
7414 /* If we have a fixed condition code register (or two), walk through
7415 the instructions and try to eliminate duplicate assignments. */
7417 static void
7418 cse_condition_code_reg (void)
7420 unsigned int cc_regno_1;
7421 unsigned int cc_regno_2;
7422 rtx cc_reg_1;
7423 rtx cc_reg_2;
7424 basic_block bb;
7426 if (! targetm.fixed_condition_code_regs (&cc_regno_1, &cc_regno_2))
7427 return;
7429 cc_reg_1 = gen_rtx_REG (CCmode, cc_regno_1);
7430 if (cc_regno_2 != INVALID_REGNUM)
7431 cc_reg_2 = gen_rtx_REG (CCmode, cc_regno_2);
7432 else
7433 cc_reg_2 = NULL_RTX;
7435 FOR_EACH_BB_FN (bb, cfun)
7437 rtx_insn *last_insn;
7438 rtx cc_reg;
7439 rtx_insn *insn;
7440 rtx_insn *cc_src_insn;
7441 rtx cc_src;
7442 machine_mode mode;
7443 machine_mode orig_mode;
7445 /* Look for blocks which end with a conditional jump based on a
7446 condition code register. Then look for the instruction which
7447 sets the condition code register. Then look through the
7448 successor blocks for instructions which set the condition
7449 code register to the same value. There are other possible
7450 uses of the condition code register, but these are by far the
7451 most common and the ones which we are most likely to be able
7452 to optimize. */
7454 last_insn = BB_END (bb);
7455 if (!JUMP_P (last_insn))
7456 continue;
7458 if (reg_referenced_p (cc_reg_1, PATTERN (last_insn)))
7459 cc_reg = cc_reg_1;
7460 else if (cc_reg_2 && reg_referenced_p (cc_reg_2, PATTERN (last_insn)))
7461 cc_reg = cc_reg_2;
7462 else
7463 continue;
7465 cc_src_insn = NULL;
7466 cc_src = NULL_RTX;
7467 for (insn = PREV_INSN (last_insn);
7468 insn && insn != PREV_INSN (BB_HEAD (bb));
7469 insn = PREV_INSN (insn))
7471 rtx set;
7473 if (! INSN_P (insn))
7474 continue;
7475 set = single_set (insn);
7476 if (set
7477 && REG_P (SET_DEST (set))
7478 && REGNO (SET_DEST (set)) == REGNO (cc_reg))
7480 cc_src_insn = insn;
7481 cc_src = SET_SRC (set);
7482 break;
7484 else if (reg_set_p (cc_reg, insn))
7485 break;
7488 if (! cc_src_insn)
7489 continue;
7491 if (modified_between_p (cc_src, cc_src_insn, NEXT_INSN (last_insn)))
7492 continue;
7494 /* Now CC_REG is a condition code register used for a
7495 conditional jump at the end of the block, and CC_SRC, in
7496 CC_SRC_INSN, is the value to which that condition code
7497 register is set, and CC_SRC is still meaningful at the end of
7498 the basic block. */
7500 orig_mode = GET_MODE (cc_src);
7501 mode = cse_cc_succs (bb, bb, cc_reg, cc_src, true);
7502 if (mode != VOIDmode)
7504 gcc_assert (mode == GET_MODE (cc_src));
7505 if (mode != orig_mode)
7507 rtx newreg = gen_rtx_REG (mode, REGNO (cc_reg));
7509 cse_change_cc_mode_insn (cc_src_insn, newreg);
7511 /* Do the same in the following insns that use the
7512 current value of CC_REG within BB. */
7513 cse_change_cc_mode_insns (NEXT_INSN (cc_src_insn),
7514 NEXT_INSN (last_insn),
7515 newreg);
7522 /* Perform common subexpression elimination. Nonzero value from
7523 `cse_main' means that jumps were simplified and some code may now
7524 be unreachable, so do jump optimization again. */
7525 static unsigned int
7526 rest_of_handle_cse (void)
7528 int tem;
7530 if (dump_file)
7531 dump_flow_info (dump_file, dump_flags);
7533 tem = cse_main (get_insns (), max_reg_num ());
7535 /* If we are not running more CSE passes, then we are no longer
7536 expecting CSE to be run. But always rerun it in a cheap mode. */
7537 cse_not_expected = !flag_rerun_cse_after_loop && !flag_gcse;
7539 if (tem == 2)
7541 timevar_push (TV_JUMP);
7542 rebuild_jump_labels (get_insns ());
7543 cleanup_cfg (CLEANUP_CFG_CHANGED);
7544 timevar_pop (TV_JUMP);
7546 else if (tem == 1 || optimize > 1)
7547 cleanup_cfg (0);
7549 return 0;
7552 namespace {
7554 const pass_data pass_data_cse =
7556 RTL_PASS, /* type */
7557 "cse1", /* name */
7558 OPTGROUP_NONE, /* optinfo_flags */
7559 TV_CSE, /* tv_id */
7560 0, /* properties_required */
7561 0, /* properties_provided */
7562 0, /* properties_destroyed */
7563 0, /* todo_flags_start */
7564 TODO_df_finish, /* todo_flags_finish */
7567 class pass_cse : public rtl_opt_pass
7569 public:
7570 pass_cse (gcc::context *ctxt)
7571 : rtl_opt_pass (pass_data_cse, ctxt)
7574 /* opt_pass methods: */
7575 virtual bool gate (function *) { return optimize > 0; }
7576 virtual unsigned int execute (function *) { return rest_of_handle_cse (); }
7578 }; // class pass_cse
7580 } // anon namespace
7582 rtl_opt_pass *
7583 make_pass_cse (gcc::context *ctxt)
7585 return new pass_cse (ctxt);
7589 /* Run second CSE pass after loop optimizations. */
7590 static unsigned int
7591 rest_of_handle_cse2 (void)
7593 int tem;
7595 if (dump_file)
7596 dump_flow_info (dump_file, dump_flags);
7598 tem = cse_main (get_insns (), max_reg_num ());
7600 /* Run a pass to eliminate duplicated assignments to condition code
7601 registers. We have to run this after bypass_jumps, because it
7602 makes it harder for that pass to determine whether a jump can be
7603 bypassed safely. */
7604 cse_condition_code_reg ();
7606 delete_trivially_dead_insns (get_insns (), max_reg_num ());
7608 if (tem == 2)
7610 timevar_push (TV_JUMP);
7611 rebuild_jump_labels (get_insns ());
7612 cleanup_cfg (CLEANUP_CFG_CHANGED);
7613 timevar_pop (TV_JUMP);
7615 else if (tem == 1)
7616 cleanup_cfg (0);
7618 cse_not_expected = 1;
7619 return 0;
7623 namespace {
7625 const pass_data pass_data_cse2 =
7627 RTL_PASS, /* type */
7628 "cse2", /* name */
7629 OPTGROUP_NONE, /* optinfo_flags */
7630 TV_CSE2, /* tv_id */
7631 0, /* properties_required */
7632 0, /* properties_provided */
7633 0, /* properties_destroyed */
7634 0, /* todo_flags_start */
7635 TODO_df_finish, /* todo_flags_finish */
7638 class pass_cse2 : public rtl_opt_pass
7640 public:
7641 pass_cse2 (gcc::context *ctxt)
7642 : rtl_opt_pass (pass_data_cse2, ctxt)
7645 /* opt_pass methods: */
7646 virtual bool gate (function *)
7648 return optimize > 0 && flag_rerun_cse_after_loop;
7651 virtual unsigned int execute (function *) { return rest_of_handle_cse2 (); }
7653 }; // class pass_cse2
7655 } // anon namespace
7657 rtl_opt_pass *
7658 make_pass_cse2 (gcc::context *ctxt)
7660 return new pass_cse2 (ctxt);
7663 /* Run second CSE pass after loop optimizations. */
7664 static unsigned int
7665 rest_of_handle_cse_after_global_opts (void)
7667 int save_cfj;
7668 int tem;
7670 /* We only want to do local CSE, so don't follow jumps. */
7671 save_cfj = flag_cse_follow_jumps;
7672 flag_cse_follow_jumps = 0;
7674 rebuild_jump_labels (get_insns ());
7675 tem = cse_main (get_insns (), max_reg_num ());
7676 purge_all_dead_edges ();
7677 delete_trivially_dead_insns (get_insns (), max_reg_num ());
7679 cse_not_expected = !flag_rerun_cse_after_loop;
7681 /* If cse altered any jumps, rerun jump opts to clean things up. */
7682 if (tem == 2)
7684 timevar_push (TV_JUMP);
7685 rebuild_jump_labels (get_insns ());
7686 cleanup_cfg (CLEANUP_CFG_CHANGED);
7687 timevar_pop (TV_JUMP);
7689 else if (tem == 1)
7690 cleanup_cfg (0);
7692 flag_cse_follow_jumps = save_cfj;
7693 return 0;
7696 namespace {
7698 const pass_data pass_data_cse_after_global_opts =
7700 RTL_PASS, /* type */
7701 "cse_local", /* name */
7702 OPTGROUP_NONE, /* optinfo_flags */
7703 TV_CSE, /* tv_id */
7704 0, /* properties_required */
7705 0, /* properties_provided */
7706 0, /* properties_destroyed */
7707 0, /* todo_flags_start */
7708 TODO_df_finish, /* todo_flags_finish */
7711 class pass_cse_after_global_opts : public rtl_opt_pass
7713 public:
7714 pass_cse_after_global_opts (gcc::context *ctxt)
7715 : rtl_opt_pass (pass_data_cse_after_global_opts, ctxt)
7718 /* opt_pass methods: */
7719 virtual bool gate (function *)
7721 return optimize > 0 && flag_rerun_cse_after_global_opts;
7724 virtual unsigned int execute (function *)
7726 return rest_of_handle_cse_after_global_opts ();
7729 }; // class pass_cse_after_global_opts
7731 } // anon namespace
7733 rtl_opt_pass *
7734 make_pass_cse_after_global_opts (gcc::context *ctxt)
7736 return new pass_cse_after_global_opts (ctxt);