2007-01-19 Vladimir Makarov <vmakarov@redhat.com>
[official-gcc.git] / gcc / cse.c
blob86e0c77aea79a4ee8a032aaffb14d609acce8479
1 /* Common subexpression elimination for GNU compiler.
2 Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998
3 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 2, or (at your option) any later
10 version.
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 for more details.
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING. If not, write to the Free
19 Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
20 02110-1301, USA. */
22 #include "config.h"
23 /* stdio.h must precede rtl.h for FFS. */
24 #include "system.h"
25 #include "coretypes.h"
26 #include "tm.h"
27 #include "rtl.h"
28 #include "tm_p.h"
29 #include "hard-reg-set.h"
30 #include "regs.h"
31 #include "basic-block.h"
32 #include "flags.h"
33 #include "real.h"
34 #include "insn-config.h"
35 #include "recog.h"
36 #include "function.h"
37 #include "expr.h"
38 #include "toplev.h"
39 #include "output.h"
40 #include "ggc.h"
41 #include "timevar.h"
42 #include "except.h"
43 #include "target.h"
44 #include "params.h"
45 #include "rtlhooks-def.h"
46 #include "tree-pass.h"
48 /* The basic idea of common subexpression elimination is to go
49 through the code, keeping a record of expressions that would
50 have the same value at the current scan point, and replacing
51 expressions encountered with the cheapest equivalent expression.
53 It is too complicated to keep track of the different possibilities
54 when control paths merge in this code; so, at each label, we forget all
55 that is known and start fresh. This can be described as processing each
56 extended basic block separately. We have a separate pass to perform
57 global CSE.
59 Note CSE can turn a conditional or computed jump into a nop or
60 an unconditional jump. When this occurs we arrange to run the jump
61 optimizer after CSE to delete the unreachable code.
63 We use two data structures to record the equivalent expressions:
64 a hash table for most expressions, and a vector of "quantity
65 numbers" to record equivalent (pseudo) registers.
67 The use of the special data structure for registers is desirable
68 because it is faster. It is possible because registers references
69 contain a fairly small number, the register number, taken from
70 a contiguously allocated series, and two register references are
71 identical if they have the same number. General expressions
72 do not have any such thing, so the only way to retrieve the
73 information recorded on an expression other than a register
74 is to keep it in a hash table.
76 Registers and "quantity numbers":
78 At the start of each basic block, all of the (hardware and pseudo)
79 registers used in the function are given distinct quantity
80 numbers to indicate their contents. During scan, when the code
81 copies one register into another, we copy the quantity number.
82 When a register is loaded in any other way, we allocate a new
83 quantity number to describe the value generated by this operation.
84 `REG_QTY (N)' records what quantity register N is currently thought
85 of as containing.
87 All real quantity numbers are greater than or equal to zero.
88 If register N has not been assigned a quantity, `REG_QTY (N)' will
89 equal -N - 1, which is always negative.
91 Quantity numbers below zero do not exist and none of the `qty_table'
92 entries should be referenced with a negative index.
94 We also maintain a bidirectional chain of registers for each
95 quantity number. The `qty_table` members `first_reg' and `last_reg',
96 and `reg_eqv_table' members `next' and `prev' hold these chains.
98 The first register in a chain is the one whose lifespan is least local.
99 Among equals, it is the one that was seen first.
100 We replace any equivalent register with that one.
102 If two registers have the same quantity number, it must be true that
103 REG expressions with qty_table `mode' must be in the hash table for both
104 registers and must be in the same class.
106 The converse is not true. Since hard registers may be referenced in
107 any mode, two REG expressions might be equivalent in the hash table
108 but not have the same quantity number if the quantity number of one
109 of the registers is not the same mode as those expressions.
111 Constants and quantity numbers
113 When a quantity has a known constant value, that value is stored
114 in the appropriate qty_table `const_rtx'. This is in addition to
115 putting the constant in the hash table as is usual for non-regs.
117 Whether a reg or a constant is preferred is determined by the configuration
118 macro CONST_COSTS and will often depend on the constant value. In any
119 event, expressions containing constants can be simplified, by fold_rtx.
121 When a quantity has a known nearly constant value (such as an address
122 of a stack slot), that value is stored in the appropriate qty_table
123 `const_rtx'.
125 Integer constants don't have a machine mode. However, cse
126 determines the intended machine mode from the destination
127 of the instruction that moves the constant. The machine mode
128 is recorded in the hash table along with the actual RTL
129 constant expression so that different modes are kept separate.
131 Other expressions:
133 To record known equivalences among expressions in general
134 we use a hash table called `table'. It has a fixed number of buckets
135 that contain chains of `struct table_elt' elements for expressions.
136 These chains connect the elements whose expressions have the same
137 hash codes.
139 Other chains through the same elements connect the elements which
140 currently have equivalent values.
142 Register references in an expression are canonicalized before hashing
143 the expression. This is done using `reg_qty' and qty_table `first_reg'.
144 The hash code of a register reference is computed using the quantity
145 number, not the register number.
147 When the value of an expression changes, it is necessary to remove from the
148 hash table not just that expression but all expressions whose values
149 could be different as a result.
151 1. If the value changing is in memory, except in special cases
152 ANYTHING referring to memory could be changed. That is because
153 nobody knows where a pointer does not point.
154 The function `invalidate_memory' removes what is necessary.
156 The special cases are when the address is constant or is
157 a constant plus a fixed register such as the frame pointer
158 or a static chain pointer. When such addresses are stored in,
159 we can tell exactly which other such addresses must be invalidated
160 due to overlap. `invalidate' does this.
161 All expressions that refer to non-constant
162 memory addresses are also invalidated. `invalidate_memory' does this.
164 2. If the value changing is a register, all expressions
165 containing references to that register, and only those,
166 must be removed.
168 Because searching the entire hash table for expressions that contain
169 a register is very slow, we try to figure out when it isn't necessary.
170 Precisely, this is necessary only when expressions have been
171 entered in the hash table using this register, and then the value has
172 changed, and then another expression wants to be added to refer to
173 the register's new value. This sequence of circumstances is rare
174 within any one basic block.
176 `REG_TICK' and `REG_IN_TABLE', accessors for members of
177 cse_reg_info, are used to detect this case. REG_TICK (i) is
178 incremented whenever a value is stored in register i.
179 REG_IN_TABLE (i) holds -1 if no references to register i have been
180 entered in the table; otherwise, it contains the value REG_TICK (i)
181 had when the references were entered. If we want to enter a
182 reference and REG_IN_TABLE (i) != REG_TICK (i), we must scan and
183 remove old references. Until we want to enter a new entry, the
184 mere fact that the two vectors don't match makes the entries be
185 ignored if anyone tries to match them.
187 Registers themselves are entered in the hash table as well as in
188 the equivalent-register chains. However, `REG_TICK' and
189 `REG_IN_TABLE' do not apply to expressions which are simple
190 register references. These expressions are removed from the table
191 immediately when they become invalid, and this can be done even if
192 we do not immediately search for all the expressions that refer to
193 the register.
195 A CLOBBER rtx in an instruction invalidates its operand for further
196 reuse. A CLOBBER or SET rtx whose operand is a MEM:BLK
197 invalidates everything that resides in memory.
199 Related expressions:
201 Constant expressions that differ only by an additive integer
202 are called related. When a constant expression is put in
203 the table, the related expression with no constant term
204 is also entered. These are made to point at each other
205 so that it is possible to find out if there exists any
206 register equivalent to an expression related to a given expression. */
208 /* Length of qty_table vector. We know in advance we will not need
209 a quantity number this big. */
211 static int max_qty;
213 /* Next quantity number to be allocated.
214 This is 1 + the largest number needed so far. */
216 static int next_qty;
218 /* Per-qty information tracking.
220 `first_reg' and `last_reg' track the head and tail of the
221 chain of registers which currently contain this quantity.
223 `mode' contains the machine mode of this quantity.
225 `const_rtx' holds the rtx of the constant value of this
226 quantity, if known. A summations of the frame/arg pointer
227 and a constant can also be entered here. When this holds
228 a known value, `const_insn' is the insn which stored the
229 constant value.
231 `comparison_{code,const,qty}' are used to track when a
232 comparison between a quantity and some constant or register has
233 been passed. In such a case, we know the results of the comparison
234 in case we see it again. These members record a comparison that
235 is known to be true. `comparison_code' holds the rtx code of such
236 a comparison, else it is set to UNKNOWN and the other two
237 comparison members are undefined. `comparison_const' holds
238 the constant being compared against, or zero if the comparison
239 is not against a constant. `comparison_qty' holds the quantity
240 being compared against when the result is known. If the comparison
241 is not with a register, `comparison_qty' is -1. */
243 struct qty_table_elem
245 rtx const_rtx;
246 rtx const_insn;
247 rtx comparison_const;
248 int comparison_qty;
249 unsigned int first_reg, last_reg;
250 /* The sizes of these fields should match the sizes of the
251 code and mode fields of struct rtx_def (see rtl.h). */
252 ENUM_BITFIELD(rtx_code) comparison_code : 16;
253 ENUM_BITFIELD(machine_mode) mode : 8;
256 /* The table of all qtys, indexed by qty number. */
257 static struct qty_table_elem *qty_table;
259 /* Structure used to pass arguments via for_each_rtx to function
260 cse_change_cc_mode. */
261 struct change_cc_mode_args
263 rtx insn;
264 rtx newreg;
267 #ifdef HAVE_cc0
268 /* For machines that have a CC0, we do not record its value in the hash
269 table since its use is guaranteed to be the insn immediately following
270 its definition and any other insn is presumed to invalidate it.
272 Instead, we store below the value last assigned to CC0. If it should
273 happen to be a constant, it is stored in preference to the actual
274 assigned value. In case it is a constant, we store the mode in which
275 the constant should be interpreted. */
277 static rtx prev_insn_cc0;
278 static enum machine_mode prev_insn_cc0_mode;
280 /* Previous actual insn. 0 if at first insn of basic block. */
282 static rtx prev_insn;
283 #endif
285 /* Insn being scanned. */
287 static rtx this_insn;
289 /* Index by register number, gives the number of the next (or
290 previous) register in the chain of registers sharing the same
291 value.
293 Or -1 if this register is at the end of the chain.
295 If REG_QTY (N) == -N - 1, reg_eqv_table[N].next is undefined. */
297 /* Per-register equivalence chain. */
298 struct reg_eqv_elem
300 int next, prev;
303 /* The table of all register equivalence chains. */
304 static struct reg_eqv_elem *reg_eqv_table;
306 struct cse_reg_info
308 /* The timestamp at which this register is initialized. */
309 unsigned int timestamp;
311 /* The quantity number of the register's current contents. */
312 int reg_qty;
314 /* The number of times the register has been altered in the current
315 basic block. */
316 int reg_tick;
318 /* The REG_TICK value at which rtx's containing this register are
319 valid in the hash table. If this does not equal the current
320 reg_tick value, such expressions existing in the hash table are
321 invalid. */
322 int reg_in_table;
324 /* The SUBREG that was set when REG_TICK was last incremented. Set
325 to -1 if the last store was to the whole register, not a subreg. */
326 unsigned int subreg_ticked;
329 /* A table of cse_reg_info indexed by register numbers. */
330 static struct cse_reg_info *cse_reg_info_table;
332 /* The size of the above table. */
333 static unsigned int cse_reg_info_table_size;
335 /* The index of the first entry that has not been initialized. */
336 static unsigned int cse_reg_info_table_first_uninitialized;
338 /* The timestamp at the beginning of the current run of
339 cse_extended_basic_block. We increment this variable at the beginning of
340 the current run of cse_extended_basic_block. The timestamp field of a
341 cse_reg_info entry matches the value of this variable if and only
342 if the entry has been initialized during the current run of
343 cse_extended_basic_block. */
344 static unsigned int cse_reg_info_timestamp;
346 /* A HARD_REG_SET containing all the hard registers for which there is
347 currently a REG expression in the hash table. Note the difference
348 from the above variables, which indicate if the REG is mentioned in some
349 expression in the table. */
351 static HARD_REG_SET hard_regs_in_table;
353 /* CUID of insn that starts the basic block currently being cse-processed. */
355 static int cse_basic_block_start;
357 /* CUID of insn that ends the basic block currently being cse-processed. */
359 static int cse_basic_block_end;
361 /* Vector mapping INSN_UIDs to cuids.
362 The cuids are like uids but increase monotonically always.
363 We use them to see whether a reg is used outside a given basic block. */
365 static int *uid_cuid;
367 /* Highest UID in UID_CUID. */
368 static int max_uid;
370 /* Get the cuid of an insn. */
372 #define INSN_CUID(INSN) (uid_cuid[INSN_UID (INSN)])
374 /* Nonzero if cse has altered conditional jump insns
375 in such a way that jump optimization should be redone. */
377 static int cse_jumps_altered;
379 /* Nonzero if we put a LABEL_REF into the hash table for an INSN without a
380 REG_LABEL, we have to rerun jump after CSE to put in the note. */
381 static int recorded_label_ref;
383 /* canon_hash stores 1 in do_not_record
384 if it notices a reference to CC0, PC, or some other volatile
385 subexpression. */
387 static int do_not_record;
389 /* canon_hash stores 1 in hash_arg_in_memory
390 if it notices a reference to memory within the expression being hashed. */
392 static int hash_arg_in_memory;
394 /* The hash table contains buckets which are chains of `struct table_elt's,
395 each recording one expression's information.
396 That expression is in the `exp' field.
398 The canon_exp field contains a canonical (from the point of view of
399 alias analysis) version of the `exp' field.
401 Those elements with the same hash code are chained in both directions
402 through the `next_same_hash' and `prev_same_hash' fields.
404 Each set of expressions with equivalent values
405 are on a two-way chain through the `next_same_value'
406 and `prev_same_value' fields, and all point with
407 the `first_same_value' field at the first element in
408 that chain. The chain is in order of increasing cost.
409 Each element's cost value is in its `cost' field.
411 The `in_memory' field is nonzero for elements that
412 involve any reference to memory. These elements are removed
413 whenever a write is done to an unidentified location in memory.
414 To be safe, we assume that a memory address is unidentified unless
415 the address is either a symbol constant or a constant plus
416 the frame pointer or argument pointer.
418 The `related_value' field is used to connect related expressions
419 (that differ by adding an integer).
420 The related expressions are chained in a circular fashion.
421 `related_value' is zero for expressions for which this
422 chain is not useful.
424 The `cost' field stores the cost of this element's expression.
425 The `regcost' field stores the value returned by approx_reg_cost for
426 this element's expression.
428 The `is_const' flag is set if the element is a constant (including
429 a fixed address).
431 The `flag' field is used as a temporary during some search routines.
433 The `mode' field is usually the same as GET_MODE (`exp'), but
434 if `exp' is a CONST_INT and has no machine mode then the `mode'
435 field is the mode it was being used as. Each constant is
436 recorded separately for each mode it is used with. */
438 struct table_elt
440 rtx exp;
441 rtx canon_exp;
442 struct table_elt *next_same_hash;
443 struct table_elt *prev_same_hash;
444 struct table_elt *next_same_value;
445 struct table_elt *prev_same_value;
446 struct table_elt *first_same_value;
447 struct table_elt *related_value;
448 int cost;
449 int regcost;
450 /* The size of this field should match the size
451 of the mode field of struct rtx_def (see rtl.h). */
452 ENUM_BITFIELD(machine_mode) mode : 8;
453 char in_memory;
454 char is_const;
455 char flag;
458 /* We don't want a lot of buckets, because we rarely have very many
459 things stored in the hash table, and a lot of buckets slows
460 down a lot of loops that happen frequently. */
461 #define HASH_SHIFT 5
462 #define HASH_SIZE (1 << HASH_SHIFT)
463 #define HASH_MASK (HASH_SIZE - 1)
465 /* Compute hash code of X in mode M. Special-case case where X is a pseudo
466 register (hard registers may require `do_not_record' to be set). */
468 #define HASH(X, M) \
469 ((REG_P (X) && REGNO (X) >= FIRST_PSEUDO_REGISTER \
470 ? (((unsigned) REG << 7) + (unsigned) REG_QTY (REGNO (X))) \
471 : canon_hash (X, M)) & HASH_MASK)
473 /* Like HASH, but without side-effects. */
474 #define SAFE_HASH(X, M) \
475 ((REG_P (X) && REGNO (X) >= FIRST_PSEUDO_REGISTER \
476 ? (((unsigned) REG << 7) + (unsigned) REG_QTY (REGNO (X))) \
477 : safe_hash (X, M)) & HASH_MASK)
479 /* Determine whether register number N is considered a fixed register for the
480 purpose of approximating register costs.
481 It is desirable to replace other regs with fixed regs, to reduce need for
482 non-fixed hard regs.
483 A reg wins if it is either the frame pointer or designated as fixed. */
484 #define FIXED_REGNO_P(N) \
485 ((N) == FRAME_POINTER_REGNUM || (N) == HARD_FRAME_POINTER_REGNUM \
486 || fixed_regs[N] || global_regs[N])
488 /* Compute cost of X, as stored in the `cost' field of a table_elt. Fixed
489 hard registers and pointers into the frame are the cheapest with a cost
490 of 0. Next come pseudos with a cost of one and other hard registers with
491 a cost of 2. Aside from these special cases, call `rtx_cost'. */
493 #define CHEAP_REGNO(N) \
494 (REGNO_PTR_FRAME_P(N) \
495 || (HARD_REGISTER_NUM_P (N) \
496 && FIXED_REGNO_P (N) && REGNO_REG_CLASS (N) != NO_REGS))
498 #define COST(X) (REG_P (X) ? 0 : notreg_cost (X, SET))
499 #define COST_IN(X,OUTER) (REG_P (X) ? 0 : notreg_cost (X, OUTER))
501 /* Get the number of times this register has been updated in this
502 basic block. */
504 #define REG_TICK(N) (get_cse_reg_info (N)->reg_tick)
506 /* Get the point at which REG was recorded in the table. */
508 #define REG_IN_TABLE(N) (get_cse_reg_info (N)->reg_in_table)
510 /* Get the SUBREG set at the last increment to REG_TICK (-1 if not a
511 SUBREG). */
513 #define SUBREG_TICKED(N) (get_cse_reg_info (N)->subreg_ticked)
515 /* Get the quantity number for REG. */
517 #define REG_QTY(N) (get_cse_reg_info (N)->reg_qty)
519 /* Determine if the quantity number for register X represents a valid index
520 into the qty_table. */
522 #define REGNO_QTY_VALID_P(N) (REG_QTY (N) >= 0)
524 static struct table_elt *table[HASH_SIZE];
526 /* Chain of `struct table_elt's made so far for this function
527 but currently removed from the table. */
529 static struct table_elt *free_element_chain;
531 /* Set to the cost of a constant pool reference if one was found for a
532 symbolic constant. If this was found, it means we should try to
533 convert constants into constant pool entries if they don't fit in
534 the insn. */
536 static int constant_pool_entries_cost;
537 static int constant_pool_entries_regcost;
539 /* This data describes a block that will be processed by
540 cse_extended_basic_block. */
542 struct cse_basic_block_data
544 /* Lowest CUID value of insns in block. */
545 int low_cuid;
546 /* Highest CUID value of insns in block. */
547 int high_cuid;
548 /* Total number of SETs in block. */
549 int nsets;
550 /* Size of current branch path, if any. */
551 int path_size;
552 /* Current path, indicating which basic_blocks will be processed. */
553 struct branch_path
555 /* The basic block for this path entry. */
556 basic_block bb;
557 } *path;
560 /* A simple bitmap to track which basic blocks have been visited
561 already as part of an already processed extended basic block. */
562 static sbitmap cse_visited_basic_blocks;
564 static bool fixed_base_plus_p (rtx x);
565 static int notreg_cost (rtx, enum rtx_code);
566 static int approx_reg_cost_1 (rtx *, void *);
567 static int approx_reg_cost (rtx);
568 static int preferable (int, int, int, int);
569 static void new_basic_block (void);
570 static void make_new_qty (unsigned int, enum machine_mode);
571 static void make_regs_eqv (unsigned int, unsigned int);
572 static void delete_reg_equiv (unsigned int);
573 static int mention_regs (rtx);
574 static int insert_regs (rtx, struct table_elt *, int);
575 static void remove_from_table (struct table_elt *, unsigned);
576 static struct table_elt *lookup (rtx, unsigned, enum machine_mode);
577 static struct table_elt *lookup_for_remove (rtx, unsigned, enum machine_mode);
578 static rtx lookup_as_function (rtx, enum rtx_code);
579 static struct table_elt *insert (rtx, struct table_elt *, unsigned,
580 enum machine_mode);
581 static void merge_equiv_classes (struct table_elt *, struct table_elt *);
582 static void invalidate (rtx, enum machine_mode);
583 static int cse_rtx_varies_p (rtx, int);
584 static void remove_invalid_refs (unsigned int);
585 static void remove_invalid_subreg_refs (unsigned int, unsigned int,
586 enum machine_mode);
587 static void rehash_using_reg (rtx);
588 static void invalidate_memory (void);
589 static void invalidate_for_call (rtx);
590 static rtx use_related_value (rtx, struct table_elt *);
592 static inline unsigned canon_hash (rtx, enum machine_mode);
593 static inline unsigned safe_hash (rtx, enum machine_mode);
594 static unsigned hash_rtx_string (const char *);
596 static rtx canon_reg (rtx, rtx);
597 static enum rtx_code find_comparison_args (enum rtx_code, rtx *, rtx *,
598 enum machine_mode *,
599 enum machine_mode *);
600 static rtx fold_rtx (rtx, rtx);
601 static rtx equiv_constant (rtx);
602 static void record_jump_equiv (rtx, bool);
603 static void record_jump_cond (enum rtx_code, enum machine_mode, rtx, rtx,
604 int);
605 static void cse_insn (rtx, rtx);
606 static void cse_prescan_path (struct cse_basic_block_data *);
607 static void invalidate_from_clobbers (rtx);
608 static rtx cse_process_notes (rtx, rtx);
609 static void cse_extended_basic_block (struct cse_basic_block_data *);
610 static void count_reg_usage (rtx, int *, rtx, int);
611 static int check_for_label_ref (rtx *, void *);
612 extern void dump_class (struct table_elt*);
613 static void get_cse_reg_info_1 (unsigned int regno);
614 static struct cse_reg_info * get_cse_reg_info (unsigned int regno);
615 static int check_dependence (rtx *, void *);
617 static void flush_hash_table (void);
618 static bool insn_live_p (rtx, int *);
619 static bool set_live_p (rtx, rtx, int *);
620 static bool dead_libcall_p (rtx, int *);
621 static int cse_change_cc_mode (rtx *, void *);
622 static void cse_change_cc_mode_insn (rtx, rtx);
623 static void cse_change_cc_mode_insns (rtx, rtx, rtx);
624 static enum machine_mode cse_cc_succs (basic_block, rtx, rtx, bool);
627 #undef RTL_HOOKS_GEN_LOWPART
628 #define RTL_HOOKS_GEN_LOWPART gen_lowpart_if_possible
630 static const struct rtl_hooks cse_rtl_hooks = RTL_HOOKS_INITIALIZER;
632 /* Nonzero if X has the form (PLUS frame-pointer integer). We check for
633 virtual regs here because the simplify_*_operation routines are called
634 by integrate.c, which is called before virtual register instantiation. */
636 static bool
637 fixed_base_plus_p (rtx x)
639 switch (GET_CODE (x))
641 case REG:
642 if (x == frame_pointer_rtx || x == hard_frame_pointer_rtx)
643 return true;
644 if (x == arg_pointer_rtx && fixed_regs[ARG_POINTER_REGNUM])
645 return true;
646 if (REGNO (x) >= FIRST_VIRTUAL_REGISTER
647 && REGNO (x) <= LAST_VIRTUAL_REGISTER)
648 return true;
649 return false;
651 case PLUS:
652 if (GET_CODE (XEXP (x, 1)) != CONST_INT)
653 return false;
654 return fixed_base_plus_p (XEXP (x, 0));
656 default:
657 return false;
661 /* Dump the expressions in the equivalence class indicated by CLASSP.
662 This function is used only for debugging. */
663 void
664 dump_class (struct table_elt *classp)
666 struct table_elt *elt;
668 fprintf (stderr, "Equivalence chain for ");
669 print_rtl (stderr, classp->exp);
670 fprintf (stderr, ": \n");
672 for (elt = classp->first_same_value; elt; elt = elt->next_same_value)
674 print_rtl (stderr, elt->exp);
675 fprintf (stderr, "\n");
679 /* Subroutine of approx_reg_cost; called through for_each_rtx. */
681 static int
682 approx_reg_cost_1 (rtx *xp, void *data)
684 rtx x = *xp;
685 int *cost_p = data;
687 if (x && REG_P (x))
689 unsigned int regno = REGNO (x);
691 if (! CHEAP_REGNO (regno))
693 if (regno < FIRST_PSEUDO_REGISTER)
695 if (SMALL_REGISTER_CLASSES)
696 return 1;
697 *cost_p += 2;
699 else
700 *cost_p += 1;
704 return 0;
707 /* Return an estimate of the cost of the registers used in an rtx.
708 This is mostly the number of different REG expressions in the rtx;
709 however for some exceptions like fixed registers we use a cost of
710 0. If any other hard register reference occurs, return MAX_COST. */
712 static int
713 approx_reg_cost (rtx x)
715 int cost = 0;
717 if (for_each_rtx (&x, approx_reg_cost_1, (void *) &cost))
718 return MAX_COST;
720 return cost;
723 /* Return a negative value if an rtx A, whose costs are given by COST_A
724 and REGCOST_A, is more desirable than an rtx B.
725 Return a positive value if A is less desirable, or 0 if the two are
726 equally good. */
727 static int
728 preferable (int cost_a, int regcost_a, int cost_b, int regcost_b)
730 /* First, get rid of cases involving expressions that are entirely
731 unwanted. */
732 if (cost_a != cost_b)
734 if (cost_a == MAX_COST)
735 return 1;
736 if (cost_b == MAX_COST)
737 return -1;
740 /* Avoid extending lifetimes of hardregs. */
741 if (regcost_a != regcost_b)
743 if (regcost_a == MAX_COST)
744 return 1;
745 if (regcost_b == MAX_COST)
746 return -1;
749 /* Normal operation costs take precedence. */
750 if (cost_a != cost_b)
751 return cost_a - cost_b;
752 /* Only if these are identical consider effects on register pressure. */
753 if (regcost_a != regcost_b)
754 return regcost_a - regcost_b;
755 return 0;
758 /* Internal function, to compute cost when X is not a register; called
759 from COST macro to keep it simple. */
761 static int
762 notreg_cost (rtx x, enum rtx_code outer)
764 return ((GET_CODE (x) == SUBREG
765 && REG_P (SUBREG_REG (x))
766 && GET_MODE_CLASS (GET_MODE (x)) == MODE_INT
767 && GET_MODE_CLASS (GET_MODE (SUBREG_REG (x))) == MODE_INT
768 && (GET_MODE_SIZE (GET_MODE (x))
769 < GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))))
770 && subreg_lowpart_p (x)
771 && TRULY_NOOP_TRUNCATION (GET_MODE_BITSIZE (GET_MODE (x)),
772 GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (x)))))
774 : rtx_cost (x, outer) * 2);
778 /* Initialize CSE_REG_INFO_TABLE. */
780 static void
781 init_cse_reg_info (unsigned int nregs)
783 /* Do we need to grow the table? */
784 if (nregs > cse_reg_info_table_size)
786 unsigned int new_size;
788 if (cse_reg_info_table_size < 2048)
790 /* Compute a new size that is a power of 2 and no smaller
791 than the large of NREGS and 64. */
792 new_size = (cse_reg_info_table_size
793 ? cse_reg_info_table_size : 64);
795 while (new_size < nregs)
796 new_size *= 2;
798 else
800 /* If we need a big table, allocate just enough to hold
801 NREGS registers. */
802 new_size = nregs;
805 /* Reallocate the table with NEW_SIZE entries. */
806 if (cse_reg_info_table)
807 free (cse_reg_info_table);
808 cse_reg_info_table = XNEWVEC (struct cse_reg_info, new_size);
809 cse_reg_info_table_size = new_size;
810 cse_reg_info_table_first_uninitialized = 0;
813 /* Do we have all of the first NREGS entries initialized? */
814 if (cse_reg_info_table_first_uninitialized < nregs)
816 unsigned int old_timestamp = cse_reg_info_timestamp - 1;
817 unsigned int i;
819 /* Put the old timestamp on newly allocated entries so that they
820 will all be considered out of date. We do not touch those
821 entries beyond the first NREGS entries to be nice to the
822 virtual memory. */
823 for (i = cse_reg_info_table_first_uninitialized; i < nregs; i++)
824 cse_reg_info_table[i].timestamp = old_timestamp;
826 cse_reg_info_table_first_uninitialized = nregs;
830 /* Given REGNO, initialize the cse_reg_info entry for REGNO. */
832 static void
833 get_cse_reg_info_1 (unsigned int regno)
835 /* Set TIMESTAMP field to CSE_REG_INFO_TIMESTAMP so that this
836 entry will be considered to have been initialized. */
837 cse_reg_info_table[regno].timestamp = cse_reg_info_timestamp;
839 /* Initialize the rest of the entry. */
840 cse_reg_info_table[regno].reg_tick = 1;
841 cse_reg_info_table[regno].reg_in_table = -1;
842 cse_reg_info_table[regno].subreg_ticked = -1;
843 cse_reg_info_table[regno].reg_qty = -regno - 1;
846 /* Find a cse_reg_info entry for REGNO. */
848 static inline struct cse_reg_info *
849 get_cse_reg_info (unsigned int regno)
851 struct cse_reg_info *p = &cse_reg_info_table[regno];
853 /* If this entry has not been initialized, go ahead and initialize
854 it. */
855 if (p->timestamp != cse_reg_info_timestamp)
856 get_cse_reg_info_1 (regno);
858 return p;
861 /* Clear the hash table and initialize each register with its own quantity,
862 for a new basic block. */
864 static void
865 new_basic_block (void)
867 int i;
869 next_qty = 0;
871 /* Invalidate cse_reg_info_table. */
872 cse_reg_info_timestamp++;
874 /* Clear out hash table state for this pass. */
875 CLEAR_HARD_REG_SET (hard_regs_in_table);
877 /* The per-quantity values used to be initialized here, but it is
878 much faster to initialize each as it is made in `make_new_qty'. */
880 for (i = 0; i < HASH_SIZE; i++)
882 struct table_elt *first;
884 first = table[i];
885 if (first != NULL)
887 struct table_elt *last = first;
889 table[i] = NULL;
891 while (last->next_same_hash != NULL)
892 last = last->next_same_hash;
894 /* Now relink this hash entire chain into
895 the free element list. */
897 last->next_same_hash = free_element_chain;
898 free_element_chain = first;
902 #ifdef HAVE_cc0
903 prev_insn = 0;
904 prev_insn_cc0 = 0;
905 #endif
908 /* Say that register REG contains a quantity in mode MODE not in any
909 register before and initialize that quantity. */
911 static void
912 make_new_qty (unsigned int reg, enum machine_mode mode)
914 int q;
915 struct qty_table_elem *ent;
916 struct reg_eqv_elem *eqv;
918 gcc_assert (next_qty < max_qty);
920 q = REG_QTY (reg) = next_qty++;
921 ent = &qty_table[q];
922 ent->first_reg = reg;
923 ent->last_reg = reg;
924 ent->mode = mode;
925 ent->const_rtx = ent->const_insn = NULL_RTX;
926 ent->comparison_code = UNKNOWN;
928 eqv = &reg_eqv_table[reg];
929 eqv->next = eqv->prev = -1;
932 /* Make reg NEW equivalent to reg OLD.
933 OLD is not changing; NEW is. */
935 static void
936 make_regs_eqv (unsigned int new, unsigned int old)
938 unsigned int lastr, firstr;
939 int q = REG_QTY (old);
940 struct qty_table_elem *ent;
942 ent = &qty_table[q];
944 /* Nothing should become eqv until it has a "non-invalid" qty number. */
945 gcc_assert (REGNO_QTY_VALID_P (old));
947 REG_QTY (new) = q;
948 firstr = ent->first_reg;
949 lastr = ent->last_reg;
951 /* Prefer fixed hard registers to anything. Prefer pseudo regs to other
952 hard regs. Among pseudos, if NEW will live longer than any other reg
953 of the same qty, and that is beyond the current basic block,
954 make it the new canonical replacement for this qty. */
955 if (! (firstr < FIRST_PSEUDO_REGISTER && FIXED_REGNO_P (firstr))
956 /* Certain fixed registers might be of the class NO_REGS. This means
957 that not only can they not be allocated by the compiler, but
958 they cannot be used in substitutions or canonicalizations
959 either. */
960 && (new >= FIRST_PSEUDO_REGISTER || REGNO_REG_CLASS (new) != NO_REGS)
961 && ((new < FIRST_PSEUDO_REGISTER && FIXED_REGNO_P (new))
962 || (new >= FIRST_PSEUDO_REGISTER
963 && (firstr < FIRST_PSEUDO_REGISTER
964 || ((uid_cuid[REGNO_LAST_UID (new)] > cse_basic_block_end
965 || (uid_cuid[REGNO_FIRST_UID (new)]
966 < cse_basic_block_start))
967 && (uid_cuid[REGNO_LAST_UID (new)]
968 > uid_cuid[REGNO_LAST_UID (firstr)]))))))
970 reg_eqv_table[firstr].prev = new;
971 reg_eqv_table[new].next = firstr;
972 reg_eqv_table[new].prev = -1;
973 ent->first_reg = new;
975 else
977 /* If NEW is a hard reg (known to be non-fixed), insert at end.
978 Otherwise, insert before any non-fixed hard regs that are at the
979 end. Registers of class NO_REGS cannot be used as an
980 equivalent for anything. */
981 while (lastr < FIRST_PSEUDO_REGISTER && reg_eqv_table[lastr].prev >= 0
982 && (REGNO_REG_CLASS (lastr) == NO_REGS || ! FIXED_REGNO_P (lastr))
983 && new >= FIRST_PSEUDO_REGISTER)
984 lastr = reg_eqv_table[lastr].prev;
985 reg_eqv_table[new].next = reg_eqv_table[lastr].next;
986 if (reg_eqv_table[lastr].next >= 0)
987 reg_eqv_table[reg_eqv_table[lastr].next].prev = new;
988 else
989 qty_table[q].last_reg = new;
990 reg_eqv_table[lastr].next = new;
991 reg_eqv_table[new].prev = lastr;
995 /* Remove REG from its equivalence class. */
997 static void
998 delete_reg_equiv (unsigned int reg)
1000 struct qty_table_elem *ent;
1001 int q = REG_QTY (reg);
1002 int p, n;
1004 /* If invalid, do nothing. */
1005 if (! REGNO_QTY_VALID_P (reg))
1006 return;
1008 ent = &qty_table[q];
1010 p = reg_eqv_table[reg].prev;
1011 n = reg_eqv_table[reg].next;
1013 if (n != -1)
1014 reg_eqv_table[n].prev = p;
1015 else
1016 ent->last_reg = p;
1017 if (p != -1)
1018 reg_eqv_table[p].next = n;
1019 else
1020 ent->first_reg = n;
1022 REG_QTY (reg) = -reg - 1;
1025 /* Remove any invalid expressions from the hash table
1026 that refer to any of the registers contained in expression X.
1028 Make sure that newly inserted references to those registers
1029 as subexpressions will be considered valid.
1031 mention_regs is not called when a register itself
1032 is being stored in the table.
1034 Return 1 if we have done something that may have changed the hash code
1035 of X. */
1037 static int
1038 mention_regs (rtx x)
1040 enum rtx_code code;
1041 int i, j;
1042 const char *fmt;
1043 int changed = 0;
1045 if (x == 0)
1046 return 0;
1048 code = GET_CODE (x);
1049 if (code == REG)
1051 unsigned int regno = REGNO (x);
1052 unsigned int endregno
1053 = regno + (regno >= FIRST_PSEUDO_REGISTER ? 1
1054 : hard_regno_nregs[regno][GET_MODE (x)]);
1055 unsigned int i;
1057 for (i = regno; i < endregno; i++)
1059 if (REG_IN_TABLE (i) >= 0 && REG_IN_TABLE (i) != REG_TICK (i))
1060 remove_invalid_refs (i);
1062 REG_IN_TABLE (i) = REG_TICK (i);
1063 SUBREG_TICKED (i) = -1;
1066 return 0;
1069 /* If this is a SUBREG, we don't want to discard other SUBREGs of the same
1070 pseudo if they don't use overlapping words. We handle only pseudos
1071 here for simplicity. */
1072 if (code == SUBREG && REG_P (SUBREG_REG (x))
1073 && REGNO (SUBREG_REG (x)) >= FIRST_PSEUDO_REGISTER)
1075 unsigned int i = REGNO (SUBREG_REG (x));
1077 if (REG_IN_TABLE (i) >= 0 && REG_IN_TABLE (i) != REG_TICK (i))
1079 /* If REG_IN_TABLE (i) differs from REG_TICK (i) by one, and
1080 the last store to this register really stored into this
1081 subreg, then remove the memory of this subreg.
1082 Otherwise, remove any memory of the entire register and
1083 all its subregs from the table. */
1084 if (REG_TICK (i) - REG_IN_TABLE (i) > 1
1085 || SUBREG_TICKED (i) != REGNO (SUBREG_REG (x)))
1086 remove_invalid_refs (i);
1087 else
1088 remove_invalid_subreg_refs (i, SUBREG_BYTE (x), GET_MODE (x));
1091 REG_IN_TABLE (i) = REG_TICK (i);
1092 SUBREG_TICKED (i) = REGNO (SUBREG_REG (x));
1093 return 0;
1096 /* If X is a comparison or a COMPARE and either operand is a register
1097 that does not have a quantity, give it one. This is so that a later
1098 call to record_jump_equiv won't cause X to be assigned a different
1099 hash code and not found in the table after that call.
1101 It is not necessary to do this here, since rehash_using_reg can
1102 fix up the table later, but doing this here eliminates the need to
1103 call that expensive function in the most common case where the only
1104 use of the register is in the comparison. */
1106 if (code == COMPARE || COMPARISON_P (x))
1108 if (REG_P (XEXP (x, 0))
1109 && ! REGNO_QTY_VALID_P (REGNO (XEXP (x, 0))))
1110 if (insert_regs (XEXP (x, 0), NULL, 0))
1112 rehash_using_reg (XEXP (x, 0));
1113 changed = 1;
1116 if (REG_P (XEXP (x, 1))
1117 && ! REGNO_QTY_VALID_P (REGNO (XEXP (x, 1))))
1118 if (insert_regs (XEXP (x, 1), NULL, 0))
1120 rehash_using_reg (XEXP (x, 1));
1121 changed = 1;
1125 fmt = GET_RTX_FORMAT (code);
1126 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1127 if (fmt[i] == 'e')
1128 changed |= mention_regs (XEXP (x, i));
1129 else if (fmt[i] == 'E')
1130 for (j = 0; j < XVECLEN (x, i); j++)
1131 changed |= mention_regs (XVECEXP (x, i, j));
1133 return changed;
1136 /* Update the register quantities for inserting X into the hash table
1137 with a value equivalent to CLASSP.
1138 (If the class does not contain a REG, it is irrelevant.)
1139 If MODIFIED is nonzero, X is a destination; it is being modified.
1140 Note that delete_reg_equiv should be called on a register
1141 before insert_regs is done on that register with MODIFIED != 0.
1143 Nonzero value means that elements of reg_qty have changed
1144 so X's hash code may be different. */
1146 static int
1147 insert_regs (rtx x, struct table_elt *classp, int modified)
1149 if (REG_P (x))
1151 unsigned int regno = REGNO (x);
1152 int qty_valid;
1154 /* If REGNO is in the equivalence table already but is of the
1155 wrong mode for that equivalence, don't do anything here. */
1157 qty_valid = REGNO_QTY_VALID_P (regno);
1158 if (qty_valid)
1160 struct qty_table_elem *ent = &qty_table[REG_QTY (regno)];
1162 if (ent->mode != GET_MODE (x))
1163 return 0;
1166 if (modified || ! qty_valid)
1168 if (classp)
1169 for (classp = classp->first_same_value;
1170 classp != 0;
1171 classp = classp->next_same_value)
1172 if (REG_P (classp->exp)
1173 && GET_MODE (classp->exp) == GET_MODE (x))
1175 unsigned c_regno = REGNO (classp->exp);
1177 gcc_assert (REGNO_QTY_VALID_P (c_regno));
1179 /* Suppose that 5 is hard reg and 100 and 101 are
1180 pseudos. Consider
1182 (set (reg:si 100) (reg:si 5))
1183 (set (reg:si 5) (reg:si 100))
1184 (set (reg:di 101) (reg:di 5))
1186 We would now set REG_QTY (101) = REG_QTY (5), but the
1187 entry for 5 is in SImode. When we use this later in
1188 copy propagation, we get the register in wrong mode. */
1189 if (qty_table[REG_QTY (c_regno)].mode != GET_MODE (x))
1190 continue;
1192 make_regs_eqv (regno, c_regno);
1193 return 1;
1196 /* Mention_regs for a SUBREG checks if REG_TICK is exactly one larger
1197 than REG_IN_TABLE to find out if there was only a single preceding
1198 invalidation - for the SUBREG - or another one, which would be
1199 for the full register. However, if we find here that REG_TICK
1200 indicates that the register is invalid, it means that it has
1201 been invalidated in a separate operation. The SUBREG might be used
1202 now (then this is a recursive call), or we might use the full REG
1203 now and a SUBREG of it later. So bump up REG_TICK so that
1204 mention_regs will do the right thing. */
1205 if (! modified
1206 && REG_IN_TABLE (regno) >= 0
1207 && REG_TICK (regno) == REG_IN_TABLE (regno) + 1)
1208 REG_TICK (regno)++;
1209 make_new_qty (regno, GET_MODE (x));
1210 return 1;
1213 return 0;
1216 /* If X is a SUBREG, we will likely be inserting the inner register in the
1217 table. If that register doesn't have an assigned quantity number at
1218 this point but does later, the insertion that we will be doing now will
1219 not be accessible because its hash code will have changed. So assign
1220 a quantity number now. */
1222 else if (GET_CODE (x) == SUBREG && REG_P (SUBREG_REG (x))
1223 && ! REGNO_QTY_VALID_P (REGNO (SUBREG_REG (x))))
1225 insert_regs (SUBREG_REG (x), NULL, 0);
1226 mention_regs (x);
1227 return 1;
1229 else
1230 return mention_regs (x);
1233 /* Look in or update the hash table. */
1235 /* Remove table element ELT from use in the table.
1236 HASH is its hash code, made using the HASH macro.
1237 It's an argument because often that is known in advance
1238 and we save much time not recomputing it. */
1240 static void
1241 remove_from_table (struct table_elt *elt, unsigned int hash)
1243 if (elt == 0)
1244 return;
1246 /* Mark this element as removed. See cse_insn. */
1247 elt->first_same_value = 0;
1249 /* Remove the table element from its equivalence class. */
1252 struct table_elt *prev = elt->prev_same_value;
1253 struct table_elt *next = elt->next_same_value;
1255 if (next)
1256 next->prev_same_value = prev;
1258 if (prev)
1259 prev->next_same_value = next;
1260 else
1262 struct table_elt *newfirst = next;
1263 while (next)
1265 next->first_same_value = newfirst;
1266 next = next->next_same_value;
1271 /* Remove the table element from its hash bucket. */
1274 struct table_elt *prev = elt->prev_same_hash;
1275 struct table_elt *next = elt->next_same_hash;
1277 if (next)
1278 next->prev_same_hash = prev;
1280 if (prev)
1281 prev->next_same_hash = next;
1282 else if (table[hash] == elt)
1283 table[hash] = next;
1284 else
1286 /* This entry is not in the proper hash bucket. This can happen
1287 when two classes were merged by `merge_equiv_classes'. Search
1288 for the hash bucket that it heads. This happens only very
1289 rarely, so the cost is acceptable. */
1290 for (hash = 0; hash < HASH_SIZE; hash++)
1291 if (table[hash] == elt)
1292 table[hash] = next;
1296 /* Remove the table element from its related-value circular chain. */
1298 if (elt->related_value != 0 && elt->related_value != elt)
1300 struct table_elt *p = elt->related_value;
1302 while (p->related_value != elt)
1303 p = p->related_value;
1304 p->related_value = elt->related_value;
1305 if (p->related_value == p)
1306 p->related_value = 0;
1309 /* Now add it to the free element chain. */
1310 elt->next_same_hash = free_element_chain;
1311 free_element_chain = elt;
1314 /* Look up X in the hash table and return its table element,
1315 or 0 if X is not in the table.
1317 MODE is the machine-mode of X, or if X is an integer constant
1318 with VOIDmode then MODE is the mode with which X will be used.
1320 Here we are satisfied to find an expression whose tree structure
1321 looks like X. */
1323 static struct table_elt *
1324 lookup (rtx x, unsigned int hash, enum machine_mode mode)
1326 struct table_elt *p;
1328 for (p = table[hash]; p; p = p->next_same_hash)
1329 if (mode == p->mode && ((x == p->exp && REG_P (x))
1330 || exp_equiv_p (x, p->exp, !REG_P (x), false)))
1331 return p;
1333 return 0;
1336 /* Like `lookup' but don't care whether the table element uses invalid regs.
1337 Also ignore discrepancies in the machine mode of a register. */
1339 static struct table_elt *
1340 lookup_for_remove (rtx x, unsigned int hash, enum machine_mode mode)
1342 struct table_elt *p;
1344 if (REG_P (x))
1346 unsigned int regno = REGNO (x);
1348 /* Don't check the machine mode when comparing registers;
1349 invalidating (REG:SI 0) also invalidates (REG:DF 0). */
1350 for (p = table[hash]; p; p = p->next_same_hash)
1351 if (REG_P (p->exp)
1352 && REGNO (p->exp) == regno)
1353 return p;
1355 else
1357 for (p = table[hash]; p; p = p->next_same_hash)
1358 if (mode == p->mode
1359 && (x == p->exp || exp_equiv_p (x, p->exp, 0, false)))
1360 return p;
1363 return 0;
1366 /* Look for an expression equivalent to X and with code CODE.
1367 If one is found, return that expression. */
1369 static rtx
1370 lookup_as_function (rtx x, enum rtx_code code)
1372 struct table_elt *p
1373 = lookup (x, SAFE_HASH (x, VOIDmode), GET_MODE (x));
1375 /* If we are looking for a CONST_INT, the mode doesn't really matter, as
1376 long as we are narrowing. So if we looked in vain for a mode narrower
1377 than word_mode before, look for word_mode now. */
1378 if (p == 0 && code == CONST_INT
1379 && GET_MODE_SIZE (GET_MODE (x)) < GET_MODE_SIZE (word_mode))
1381 x = copy_rtx (x);
1382 PUT_MODE (x, word_mode);
1383 p = lookup (x, SAFE_HASH (x, VOIDmode), word_mode);
1386 if (p == 0)
1387 return 0;
1389 for (p = p->first_same_value; p; p = p->next_same_value)
1390 if (GET_CODE (p->exp) == code
1391 /* Make sure this is a valid entry in the table. */
1392 && exp_equiv_p (p->exp, p->exp, 1, false))
1393 return p->exp;
1395 return 0;
1398 /* Insert X in the hash table, assuming HASH is its hash code
1399 and CLASSP is an element of the class it should go in
1400 (or 0 if a new class should be made).
1401 It is inserted at the proper position to keep the class in
1402 the order cheapest first.
1404 MODE is the machine-mode of X, or if X is an integer constant
1405 with VOIDmode then MODE is the mode with which X will be used.
1407 For elements of equal cheapness, the most recent one
1408 goes in front, except that the first element in the list
1409 remains first unless a cheaper element is added. The order of
1410 pseudo-registers does not matter, as canon_reg will be called to
1411 find the cheapest when a register is retrieved from the table.
1413 The in_memory field in the hash table element is set to 0.
1414 The caller must set it nonzero if appropriate.
1416 You should call insert_regs (X, CLASSP, MODIFY) before calling here,
1417 and if insert_regs returns a nonzero value
1418 you must then recompute its hash code before calling here.
1420 If necessary, update table showing constant values of quantities. */
1422 #define CHEAPER(X, Y) \
1423 (preferable ((X)->cost, (X)->regcost, (Y)->cost, (Y)->regcost) < 0)
1425 static struct table_elt *
1426 insert (rtx x, struct table_elt *classp, unsigned int hash, enum machine_mode mode)
1428 struct table_elt *elt;
1430 /* If X is a register and we haven't made a quantity for it,
1431 something is wrong. */
1432 gcc_assert (!REG_P (x) || REGNO_QTY_VALID_P (REGNO (x)));
1434 /* If X is a hard register, show it is being put in the table. */
1435 if (REG_P (x) && REGNO (x) < FIRST_PSEUDO_REGISTER)
1437 unsigned int regno = REGNO (x);
1438 unsigned int endregno = regno + hard_regno_nregs[regno][GET_MODE (x)];
1439 unsigned int i;
1441 for (i = regno; i < endregno; i++)
1442 SET_HARD_REG_BIT (hard_regs_in_table, i);
1445 /* Put an element for X into the right hash bucket. */
1447 elt = free_element_chain;
1448 if (elt)
1449 free_element_chain = elt->next_same_hash;
1450 else
1451 elt = XNEW (struct table_elt);
1453 elt->exp = x;
1454 elt->canon_exp = NULL_RTX;
1455 elt->cost = COST (x);
1456 elt->regcost = approx_reg_cost (x);
1457 elt->next_same_value = 0;
1458 elt->prev_same_value = 0;
1459 elt->next_same_hash = table[hash];
1460 elt->prev_same_hash = 0;
1461 elt->related_value = 0;
1462 elt->in_memory = 0;
1463 elt->mode = mode;
1464 elt->is_const = (CONSTANT_P (x) || fixed_base_plus_p (x));
1466 if (table[hash])
1467 table[hash]->prev_same_hash = elt;
1468 table[hash] = elt;
1470 /* Put it into the proper value-class. */
1471 if (classp)
1473 classp = classp->first_same_value;
1474 if (CHEAPER (elt, classp))
1475 /* Insert at the head of the class. */
1477 struct table_elt *p;
1478 elt->next_same_value = classp;
1479 classp->prev_same_value = elt;
1480 elt->first_same_value = elt;
1482 for (p = classp; p; p = p->next_same_value)
1483 p->first_same_value = elt;
1485 else
1487 /* Insert not at head of the class. */
1488 /* Put it after the last element cheaper than X. */
1489 struct table_elt *p, *next;
1491 for (p = classp; (next = p->next_same_value) && CHEAPER (next, elt);
1492 p = next);
1494 /* Put it after P and before NEXT. */
1495 elt->next_same_value = next;
1496 if (next)
1497 next->prev_same_value = elt;
1499 elt->prev_same_value = p;
1500 p->next_same_value = elt;
1501 elt->first_same_value = classp;
1504 else
1505 elt->first_same_value = elt;
1507 /* If this is a constant being set equivalent to a register or a register
1508 being set equivalent to a constant, note the constant equivalence.
1510 If this is a constant, it cannot be equivalent to a different constant,
1511 and a constant is the only thing that can be cheaper than a register. So
1512 we know the register is the head of the class (before the constant was
1513 inserted).
1515 If this is a register that is not already known equivalent to a
1516 constant, we must check the entire class.
1518 If this is a register that is already known equivalent to an insn,
1519 update the qtys `const_insn' to show that `this_insn' is the latest
1520 insn making that quantity equivalent to the constant. */
1522 if (elt->is_const && classp && REG_P (classp->exp)
1523 && !REG_P (x))
1525 int exp_q = REG_QTY (REGNO (classp->exp));
1526 struct qty_table_elem *exp_ent = &qty_table[exp_q];
1528 exp_ent->const_rtx = gen_lowpart (exp_ent->mode, x);
1529 exp_ent->const_insn = this_insn;
1532 else if (REG_P (x)
1533 && classp
1534 && ! qty_table[REG_QTY (REGNO (x))].const_rtx
1535 && ! elt->is_const)
1537 struct table_elt *p;
1539 for (p = classp; p != 0; p = p->next_same_value)
1541 if (p->is_const && !REG_P (p->exp))
1543 int x_q = REG_QTY (REGNO (x));
1544 struct qty_table_elem *x_ent = &qty_table[x_q];
1546 x_ent->const_rtx
1547 = gen_lowpart (GET_MODE (x), p->exp);
1548 x_ent->const_insn = this_insn;
1549 break;
1554 else if (REG_P (x)
1555 && qty_table[REG_QTY (REGNO (x))].const_rtx
1556 && GET_MODE (x) == qty_table[REG_QTY (REGNO (x))].mode)
1557 qty_table[REG_QTY (REGNO (x))].const_insn = this_insn;
1559 /* If this is a constant with symbolic value,
1560 and it has a term with an explicit integer value,
1561 link it up with related expressions. */
1562 if (GET_CODE (x) == CONST)
1564 rtx subexp = get_related_value (x);
1565 unsigned subhash;
1566 struct table_elt *subelt, *subelt_prev;
1568 if (subexp != 0)
1570 /* Get the integer-free subexpression in the hash table. */
1571 subhash = SAFE_HASH (subexp, mode);
1572 subelt = lookup (subexp, subhash, mode);
1573 if (subelt == 0)
1574 subelt = insert (subexp, NULL, subhash, mode);
1575 /* Initialize SUBELT's circular chain if it has none. */
1576 if (subelt->related_value == 0)
1577 subelt->related_value = subelt;
1578 /* Find the element in the circular chain that precedes SUBELT. */
1579 subelt_prev = subelt;
1580 while (subelt_prev->related_value != subelt)
1581 subelt_prev = subelt_prev->related_value;
1582 /* Put new ELT into SUBELT's circular chain just before SUBELT.
1583 This way the element that follows SUBELT is the oldest one. */
1584 elt->related_value = subelt_prev->related_value;
1585 subelt_prev->related_value = elt;
1589 return elt;
1592 /* Given two equivalence classes, CLASS1 and CLASS2, put all the entries from
1593 CLASS2 into CLASS1. This is done when we have reached an insn which makes
1594 the two classes equivalent.
1596 CLASS1 will be the surviving class; CLASS2 should not be used after this
1597 call.
1599 Any invalid entries in CLASS2 will not be copied. */
1601 static void
1602 merge_equiv_classes (struct table_elt *class1, struct table_elt *class2)
1604 struct table_elt *elt, *next, *new;
1606 /* Ensure we start with the head of the classes. */
1607 class1 = class1->first_same_value;
1608 class2 = class2->first_same_value;
1610 /* If they were already equal, forget it. */
1611 if (class1 == class2)
1612 return;
1614 for (elt = class2; elt; elt = next)
1616 unsigned int hash;
1617 rtx exp = elt->exp;
1618 enum machine_mode mode = elt->mode;
1620 next = elt->next_same_value;
1622 /* Remove old entry, make a new one in CLASS1's class.
1623 Don't do this for invalid entries as we cannot find their
1624 hash code (it also isn't necessary). */
1625 if (REG_P (exp) || exp_equiv_p (exp, exp, 1, false))
1627 bool need_rehash = false;
1629 hash_arg_in_memory = 0;
1630 hash = HASH (exp, mode);
1632 if (REG_P (exp))
1634 need_rehash = REGNO_QTY_VALID_P (REGNO (exp));
1635 delete_reg_equiv (REGNO (exp));
1638 remove_from_table (elt, hash);
1640 if (insert_regs (exp, class1, 0) || need_rehash)
1642 rehash_using_reg (exp);
1643 hash = HASH (exp, mode);
1645 new = insert (exp, class1, hash, mode);
1646 new->in_memory = hash_arg_in_memory;
1651 /* Flush the entire hash table. */
1653 static void
1654 flush_hash_table (void)
1656 int i;
1657 struct table_elt *p;
1659 for (i = 0; i < HASH_SIZE; i++)
1660 for (p = table[i]; p; p = table[i])
1662 /* Note that invalidate can remove elements
1663 after P in the current hash chain. */
1664 if (REG_P (p->exp))
1665 invalidate (p->exp, VOIDmode);
1666 else
1667 remove_from_table (p, i);
1671 /* Function called for each rtx to check whether true dependence exist. */
1672 struct check_dependence_data
1674 enum machine_mode mode;
1675 rtx exp;
1676 rtx addr;
1679 static int
1680 check_dependence (rtx *x, void *data)
1682 struct check_dependence_data *d = (struct check_dependence_data *) data;
1683 if (*x && MEM_P (*x))
1684 return canon_true_dependence (d->exp, d->mode, d->addr, *x,
1685 cse_rtx_varies_p);
1686 else
1687 return 0;
1690 /* Remove from the hash table, or mark as invalid, all expressions whose
1691 values could be altered by storing in X. X is a register, a subreg, or
1692 a memory reference with nonvarying address (because, when a memory
1693 reference with a varying address is stored in, all memory references are
1694 removed by invalidate_memory so specific invalidation is superfluous).
1695 FULL_MODE, if not VOIDmode, indicates that this much should be
1696 invalidated instead of just the amount indicated by the mode of X. This
1697 is only used for bitfield stores into memory.
1699 A nonvarying address may be just a register or just a symbol reference,
1700 or it may be either of those plus a numeric offset. */
1702 static void
1703 invalidate (rtx x, enum machine_mode full_mode)
1705 int i;
1706 struct table_elt *p;
1707 rtx addr;
1709 switch (GET_CODE (x))
1711 case REG:
1713 /* If X is a register, dependencies on its contents are recorded
1714 through the qty number mechanism. Just change the qty number of
1715 the register, mark it as invalid for expressions that refer to it,
1716 and remove it itself. */
1717 unsigned int regno = REGNO (x);
1718 unsigned int hash = HASH (x, GET_MODE (x));
1720 /* Remove REGNO from any quantity list it might be on and indicate
1721 that its value might have changed. If it is a pseudo, remove its
1722 entry from the hash table.
1724 For a hard register, we do the first two actions above for any
1725 additional hard registers corresponding to X. Then, if any of these
1726 registers are in the table, we must remove any REG entries that
1727 overlap these registers. */
1729 delete_reg_equiv (regno);
1730 REG_TICK (regno)++;
1731 SUBREG_TICKED (regno) = -1;
1733 if (regno >= FIRST_PSEUDO_REGISTER)
1735 /* Because a register can be referenced in more than one mode,
1736 we might have to remove more than one table entry. */
1737 struct table_elt *elt;
1739 while ((elt = lookup_for_remove (x, hash, GET_MODE (x))))
1740 remove_from_table (elt, hash);
1742 else
1744 HOST_WIDE_INT in_table
1745 = TEST_HARD_REG_BIT (hard_regs_in_table, regno);
1746 unsigned int endregno
1747 = regno + hard_regno_nregs[regno][GET_MODE (x)];
1748 unsigned int tregno, tendregno, rn;
1749 struct table_elt *p, *next;
1751 CLEAR_HARD_REG_BIT (hard_regs_in_table, regno);
1753 for (rn = regno + 1; rn < endregno; rn++)
1755 in_table |= TEST_HARD_REG_BIT (hard_regs_in_table, rn);
1756 CLEAR_HARD_REG_BIT (hard_regs_in_table, rn);
1757 delete_reg_equiv (rn);
1758 REG_TICK (rn)++;
1759 SUBREG_TICKED (rn) = -1;
1762 if (in_table)
1763 for (hash = 0; hash < HASH_SIZE; hash++)
1764 for (p = table[hash]; p; p = next)
1766 next = p->next_same_hash;
1768 if (!REG_P (p->exp)
1769 || REGNO (p->exp) >= FIRST_PSEUDO_REGISTER)
1770 continue;
1772 tregno = REGNO (p->exp);
1773 tendregno
1774 = tregno + hard_regno_nregs[tregno][GET_MODE (p->exp)];
1775 if (tendregno > regno && tregno < endregno)
1776 remove_from_table (p, hash);
1780 return;
1782 case SUBREG:
1783 invalidate (SUBREG_REG (x), VOIDmode);
1784 return;
1786 case PARALLEL:
1787 for (i = XVECLEN (x, 0) - 1; i >= 0; --i)
1788 invalidate (XVECEXP (x, 0, i), VOIDmode);
1789 return;
1791 case EXPR_LIST:
1792 /* This is part of a disjoint return value; extract the location in
1793 question ignoring the offset. */
1794 invalidate (XEXP (x, 0), VOIDmode);
1795 return;
1797 case MEM:
1798 addr = canon_rtx (get_addr (XEXP (x, 0)));
1799 /* Calculate the canonical version of X here so that
1800 true_dependence doesn't generate new RTL for X on each call. */
1801 x = canon_rtx (x);
1803 /* Remove all hash table elements that refer to overlapping pieces of
1804 memory. */
1805 if (full_mode == VOIDmode)
1806 full_mode = GET_MODE (x);
1808 for (i = 0; i < HASH_SIZE; i++)
1810 struct table_elt *next;
1812 for (p = table[i]; p; p = next)
1814 next = p->next_same_hash;
1815 if (p->in_memory)
1817 struct check_dependence_data d;
1819 /* Just canonicalize the expression once;
1820 otherwise each time we call invalidate
1821 true_dependence will canonicalize the
1822 expression again. */
1823 if (!p->canon_exp)
1824 p->canon_exp = canon_rtx (p->exp);
1825 d.exp = x;
1826 d.addr = addr;
1827 d.mode = full_mode;
1828 if (for_each_rtx (&p->canon_exp, check_dependence, &d))
1829 remove_from_table (p, i);
1833 return;
1835 default:
1836 gcc_unreachable ();
1840 /* Remove all expressions that refer to register REGNO,
1841 since they are already invalid, and we are about to
1842 mark that register valid again and don't want the old
1843 expressions to reappear as valid. */
1845 static void
1846 remove_invalid_refs (unsigned int regno)
1848 unsigned int i;
1849 struct table_elt *p, *next;
1851 for (i = 0; i < HASH_SIZE; i++)
1852 for (p = table[i]; p; p = next)
1854 next = p->next_same_hash;
1855 if (!REG_P (p->exp)
1856 && refers_to_regno_p (regno, regno + 1, p->exp, (rtx *) 0))
1857 remove_from_table (p, i);
1861 /* Likewise for a subreg with subreg_reg REGNO, subreg_byte OFFSET,
1862 and mode MODE. */
1863 static void
1864 remove_invalid_subreg_refs (unsigned int regno, unsigned int offset,
1865 enum machine_mode mode)
1867 unsigned int i;
1868 struct table_elt *p, *next;
1869 unsigned int end = offset + (GET_MODE_SIZE (mode) - 1);
1871 for (i = 0; i < HASH_SIZE; i++)
1872 for (p = table[i]; p; p = next)
1874 rtx exp = p->exp;
1875 next = p->next_same_hash;
1877 if (!REG_P (exp)
1878 && (GET_CODE (exp) != SUBREG
1879 || !REG_P (SUBREG_REG (exp))
1880 || REGNO (SUBREG_REG (exp)) != regno
1881 || (((SUBREG_BYTE (exp)
1882 + (GET_MODE_SIZE (GET_MODE (exp)) - 1)) >= offset)
1883 && SUBREG_BYTE (exp) <= end))
1884 && refers_to_regno_p (regno, regno + 1, p->exp, (rtx *) 0))
1885 remove_from_table (p, i);
1889 /* Recompute the hash codes of any valid entries in the hash table that
1890 reference X, if X is a register, or SUBREG_REG (X) if X is a SUBREG.
1892 This is called when we make a jump equivalence. */
1894 static void
1895 rehash_using_reg (rtx x)
1897 unsigned int i;
1898 struct table_elt *p, *next;
1899 unsigned hash;
1901 if (GET_CODE (x) == SUBREG)
1902 x = SUBREG_REG (x);
1904 /* If X is not a register or if the register is known not to be in any
1905 valid entries in the table, we have no work to do. */
1907 if (!REG_P (x)
1908 || REG_IN_TABLE (REGNO (x)) < 0
1909 || REG_IN_TABLE (REGNO (x)) != REG_TICK (REGNO (x)))
1910 return;
1912 /* Scan all hash chains looking for valid entries that mention X.
1913 If we find one and it is in the wrong hash chain, move it. */
1915 for (i = 0; i < HASH_SIZE; i++)
1916 for (p = table[i]; p; p = next)
1918 next = p->next_same_hash;
1919 if (reg_mentioned_p (x, p->exp)
1920 && exp_equiv_p (p->exp, p->exp, 1, false)
1921 && i != (hash = SAFE_HASH (p->exp, p->mode)))
1923 if (p->next_same_hash)
1924 p->next_same_hash->prev_same_hash = p->prev_same_hash;
1926 if (p->prev_same_hash)
1927 p->prev_same_hash->next_same_hash = p->next_same_hash;
1928 else
1929 table[i] = p->next_same_hash;
1931 p->next_same_hash = table[hash];
1932 p->prev_same_hash = 0;
1933 if (table[hash])
1934 table[hash]->prev_same_hash = p;
1935 table[hash] = p;
1940 /* Remove from the hash table any expression that is a call-clobbered
1941 register. Also update their TICK values. */
1943 static void
1944 invalidate_for_call (rtx call_insn)
1946 unsigned int regno, endregno;
1947 unsigned int i;
1948 unsigned hash;
1949 struct table_elt *p, *next;
1950 int in_table = 0;
1951 HARD_REG_SET clobbered_regs;
1953 /* Go through all the hard registers. For each that is clobbered in
1954 a CALL_INSN, remove the register from quantity chains and update
1955 reg_tick if defined. Also see if any of these registers is currently
1956 in the table. */
1958 get_call_invalidated_used_regs (call_insn, &clobbered_regs, true);
1959 for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
1960 if (TEST_HARD_REG_BIT (clobbered_regs, regno))
1962 delete_reg_equiv (regno);
1963 if (REG_TICK (regno) >= 0)
1965 REG_TICK (regno)++;
1966 SUBREG_TICKED (regno) = -1;
1969 in_table |= (TEST_HARD_REG_BIT (hard_regs_in_table, regno) != 0);
1972 /* In the case where we have no call-clobbered hard registers in the
1973 table, we are done. Otherwise, scan the table and remove any
1974 entry that overlaps a call-clobbered register. */
1976 if (in_table)
1977 for (hash = 0; hash < HASH_SIZE; hash++)
1978 for (p = table[hash]; p; p = next)
1980 next = p->next_same_hash;
1982 if (!REG_P (p->exp)
1983 || REGNO (p->exp) >= FIRST_PSEUDO_REGISTER)
1984 continue;
1986 regno = REGNO (p->exp);
1987 endregno = regno + hard_regno_nregs[regno][GET_MODE (p->exp)];
1989 for (i = regno; i < endregno; i++)
1990 if (TEST_HARD_REG_BIT (clobbered_regs, i))
1992 remove_from_table (p, hash);
1993 break;
1998 /* Given an expression X of type CONST,
1999 and ELT which is its table entry (or 0 if it
2000 is not in the hash table),
2001 return an alternate expression for X as a register plus integer.
2002 If none can be found, return 0. */
2004 static rtx
2005 use_related_value (rtx x, struct table_elt *elt)
2007 struct table_elt *relt = 0;
2008 struct table_elt *p, *q;
2009 HOST_WIDE_INT offset;
2011 /* First, is there anything related known?
2012 If we have a table element, we can tell from that.
2013 Otherwise, must look it up. */
2015 if (elt != 0 && elt->related_value != 0)
2016 relt = elt;
2017 else if (elt == 0 && GET_CODE (x) == CONST)
2019 rtx subexp = get_related_value (x);
2020 if (subexp != 0)
2021 relt = lookup (subexp,
2022 SAFE_HASH (subexp, GET_MODE (subexp)),
2023 GET_MODE (subexp));
2026 if (relt == 0)
2027 return 0;
2029 /* Search all related table entries for one that has an
2030 equivalent register. */
2032 p = relt;
2033 while (1)
2035 /* This loop is strange in that it is executed in two different cases.
2036 The first is when X is already in the table. Then it is searching
2037 the RELATED_VALUE list of X's class (RELT). The second case is when
2038 X is not in the table. Then RELT points to a class for the related
2039 value.
2041 Ensure that, whatever case we are in, that we ignore classes that have
2042 the same value as X. */
2044 if (rtx_equal_p (x, p->exp))
2045 q = 0;
2046 else
2047 for (q = p->first_same_value; q; q = q->next_same_value)
2048 if (REG_P (q->exp))
2049 break;
2051 if (q)
2052 break;
2054 p = p->related_value;
2056 /* We went all the way around, so there is nothing to be found.
2057 Alternatively, perhaps RELT was in the table for some other reason
2058 and it has no related values recorded. */
2059 if (p == relt || p == 0)
2060 break;
2063 if (q == 0)
2064 return 0;
2066 offset = (get_integer_term (x) - get_integer_term (p->exp));
2067 /* Note: OFFSET may be 0 if P->xexp and X are related by commutativity. */
2068 return plus_constant (q->exp, offset);
2071 /* Hash a string. Just add its bytes up. */
2072 static inline unsigned
2073 hash_rtx_string (const char *ps)
2075 unsigned hash = 0;
2076 const unsigned char *p = (const unsigned char *) ps;
2078 if (p)
2079 while (*p)
2080 hash += *p++;
2082 return hash;
2085 /* Hash an rtx. We are careful to make sure the value is never negative.
2086 Equivalent registers hash identically.
2087 MODE is used in hashing for CONST_INTs only;
2088 otherwise the mode of X is used.
2090 Store 1 in DO_NOT_RECORD_P if any subexpression is volatile.
2092 If HASH_ARG_IN_MEMORY_P is not NULL, store 1 in it if X contains
2093 a MEM rtx which does not have the RTX_UNCHANGING_P bit set.
2095 Note that cse_insn knows that the hash code of a MEM expression
2096 is just (int) MEM plus the hash code of the address. */
2098 unsigned
2099 hash_rtx (rtx x, enum machine_mode mode, int *do_not_record_p,
2100 int *hash_arg_in_memory_p, bool have_reg_qty)
2102 int i, j;
2103 unsigned hash = 0;
2104 enum rtx_code code;
2105 const char *fmt;
2107 /* Used to turn recursion into iteration. We can't rely on GCC's
2108 tail-recursion elimination since we need to keep accumulating values
2109 in HASH. */
2110 repeat:
2111 if (x == 0)
2112 return hash;
2114 code = GET_CODE (x);
2115 switch (code)
2117 case REG:
2119 unsigned int regno = REGNO (x);
2121 if (!reload_completed)
2123 /* On some machines, we can't record any non-fixed hard register,
2124 because extending its life will cause reload problems. We
2125 consider ap, fp, sp, gp to be fixed for this purpose.
2127 We also consider CCmode registers to be fixed for this purpose;
2128 failure to do so leads to failure to simplify 0<100 type of
2129 conditionals.
2131 On all machines, we can't record any global registers.
2132 Nor should we record any register that is in a small
2133 class, as defined by CLASS_LIKELY_SPILLED_P. */
2134 bool record;
2136 if (regno >= FIRST_PSEUDO_REGISTER)
2137 record = true;
2138 else if (x == frame_pointer_rtx
2139 || x == hard_frame_pointer_rtx
2140 || x == arg_pointer_rtx
2141 || x == stack_pointer_rtx
2142 || x == pic_offset_table_rtx)
2143 record = true;
2144 else if (global_regs[regno])
2145 record = false;
2146 else if (fixed_regs[regno])
2147 record = true;
2148 else if (GET_MODE_CLASS (GET_MODE (x)) == MODE_CC)
2149 record = true;
2150 else if (SMALL_REGISTER_CLASSES)
2151 record = false;
2152 else if (CLASS_LIKELY_SPILLED_P (REGNO_REG_CLASS (regno)))
2153 record = false;
2154 else
2155 record = true;
2157 if (!record)
2159 *do_not_record_p = 1;
2160 return 0;
2164 hash += ((unsigned int) REG << 7);
2165 hash += (have_reg_qty ? (unsigned) REG_QTY (regno) : regno);
2166 return hash;
2169 /* We handle SUBREG of a REG specially because the underlying
2170 reg changes its hash value with every value change; we don't
2171 want to have to forget unrelated subregs when one subreg changes. */
2172 case SUBREG:
2174 if (REG_P (SUBREG_REG (x)))
2176 hash += (((unsigned int) SUBREG << 7)
2177 + REGNO (SUBREG_REG (x))
2178 + (SUBREG_BYTE (x) / UNITS_PER_WORD));
2179 return hash;
2181 break;
2184 case CONST_INT:
2185 hash += (((unsigned int) CONST_INT << 7) + (unsigned int) mode
2186 + (unsigned int) INTVAL (x));
2187 return hash;
2189 case CONST_DOUBLE:
2190 /* This is like the general case, except that it only counts
2191 the integers representing the constant. */
2192 hash += (unsigned int) code + (unsigned int) GET_MODE (x);
2193 if (GET_MODE (x) != VOIDmode)
2194 hash += real_hash (CONST_DOUBLE_REAL_VALUE (x));
2195 else
2196 hash += ((unsigned int) CONST_DOUBLE_LOW (x)
2197 + (unsigned int) CONST_DOUBLE_HIGH (x));
2198 return hash;
2200 case CONST_VECTOR:
2202 int units;
2203 rtx elt;
2205 units = CONST_VECTOR_NUNITS (x);
2207 for (i = 0; i < units; ++i)
2209 elt = CONST_VECTOR_ELT (x, i);
2210 hash += hash_rtx (elt, GET_MODE (elt), do_not_record_p,
2211 hash_arg_in_memory_p, have_reg_qty);
2214 return hash;
2217 /* Assume there is only one rtx object for any given label. */
2218 case LABEL_REF:
2219 /* We don't hash on the address of the CODE_LABEL to avoid bootstrap
2220 differences and differences between each stage's debugging dumps. */
2221 hash += (((unsigned int) LABEL_REF << 7)
2222 + CODE_LABEL_NUMBER (XEXP (x, 0)));
2223 return hash;
2225 case SYMBOL_REF:
2227 /* Don't hash on the symbol's address to avoid bootstrap differences.
2228 Different hash values may cause expressions to be recorded in
2229 different orders and thus different registers to be used in the
2230 final assembler. This also avoids differences in the dump files
2231 between various stages. */
2232 unsigned int h = 0;
2233 const unsigned char *p = (const unsigned char *) XSTR (x, 0);
2235 while (*p)
2236 h += (h << 7) + *p++; /* ??? revisit */
2238 hash += ((unsigned int) SYMBOL_REF << 7) + h;
2239 return hash;
2242 case MEM:
2243 /* We don't record if marked volatile or if BLKmode since we don't
2244 know the size of the move. */
2245 if (MEM_VOLATILE_P (x) || GET_MODE (x) == BLKmode)
2247 *do_not_record_p = 1;
2248 return 0;
2250 if (hash_arg_in_memory_p && !MEM_READONLY_P (x))
2251 *hash_arg_in_memory_p = 1;
2253 /* Now that we have already found this special case,
2254 might as well speed it up as much as possible. */
2255 hash += (unsigned) MEM;
2256 x = XEXP (x, 0);
2257 goto repeat;
2259 case USE:
2260 /* A USE that mentions non-volatile memory needs special
2261 handling since the MEM may be BLKmode which normally
2262 prevents an entry from being made. Pure calls are
2263 marked by a USE which mentions BLKmode memory.
2264 See calls.c:emit_call_1. */
2265 if (MEM_P (XEXP (x, 0))
2266 && ! MEM_VOLATILE_P (XEXP (x, 0)))
2268 hash += (unsigned) USE;
2269 x = XEXP (x, 0);
2271 if (hash_arg_in_memory_p && !MEM_READONLY_P (x))
2272 *hash_arg_in_memory_p = 1;
2274 /* Now that we have already found this special case,
2275 might as well speed it up as much as possible. */
2276 hash += (unsigned) MEM;
2277 x = XEXP (x, 0);
2278 goto repeat;
2280 break;
2282 case PRE_DEC:
2283 case PRE_INC:
2284 case POST_DEC:
2285 case POST_INC:
2286 case PRE_MODIFY:
2287 case POST_MODIFY:
2288 case PC:
2289 case CC0:
2290 case CALL:
2291 case UNSPEC_VOLATILE:
2292 *do_not_record_p = 1;
2293 return 0;
2295 case ASM_OPERANDS:
2296 if (MEM_VOLATILE_P (x))
2298 *do_not_record_p = 1;
2299 return 0;
2301 else
2303 /* We don't want to take the filename and line into account. */
2304 hash += (unsigned) code + (unsigned) GET_MODE (x)
2305 + hash_rtx_string (ASM_OPERANDS_TEMPLATE (x))
2306 + hash_rtx_string (ASM_OPERANDS_OUTPUT_CONSTRAINT (x))
2307 + (unsigned) ASM_OPERANDS_OUTPUT_IDX (x);
2309 if (ASM_OPERANDS_INPUT_LENGTH (x))
2311 for (i = 1; i < ASM_OPERANDS_INPUT_LENGTH (x); i++)
2313 hash += (hash_rtx (ASM_OPERANDS_INPUT (x, i),
2314 GET_MODE (ASM_OPERANDS_INPUT (x, i)),
2315 do_not_record_p, hash_arg_in_memory_p,
2316 have_reg_qty)
2317 + hash_rtx_string
2318 (ASM_OPERANDS_INPUT_CONSTRAINT (x, i)));
2321 hash += hash_rtx_string (ASM_OPERANDS_INPUT_CONSTRAINT (x, 0));
2322 x = ASM_OPERANDS_INPUT (x, 0);
2323 mode = GET_MODE (x);
2324 goto repeat;
2327 return hash;
2329 break;
2331 default:
2332 break;
2335 i = GET_RTX_LENGTH (code) - 1;
2336 hash += (unsigned) code + (unsigned) GET_MODE (x);
2337 fmt = GET_RTX_FORMAT (code);
2338 for (; i >= 0; i--)
2340 switch (fmt[i])
2342 case 'e':
2343 /* If we are about to do the last recursive call
2344 needed at this level, change it into iteration.
2345 This function is called enough to be worth it. */
2346 if (i == 0)
2348 x = XEXP (x, i);
2349 goto repeat;
2352 hash += hash_rtx (XEXP (x, i), 0, do_not_record_p,
2353 hash_arg_in_memory_p, have_reg_qty);
2354 break;
2356 case 'E':
2357 for (j = 0; j < XVECLEN (x, i); j++)
2358 hash += hash_rtx (XVECEXP (x, i, j), 0, do_not_record_p,
2359 hash_arg_in_memory_p, have_reg_qty);
2360 break;
2362 case 's':
2363 hash += hash_rtx_string (XSTR (x, i));
2364 break;
2366 case 'i':
2367 hash += (unsigned int) XINT (x, i);
2368 break;
2370 case '0': case 't':
2371 /* Unused. */
2372 break;
2374 default:
2375 gcc_unreachable ();
2379 return hash;
2382 /* Hash an rtx X for cse via hash_rtx.
2383 Stores 1 in do_not_record if any subexpression is volatile.
2384 Stores 1 in hash_arg_in_memory if X contains a mem rtx which
2385 does not have the RTX_UNCHANGING_P bit set. */
2387 static inline unsigned
2388 canon_hash (rtx x, enum machine_mode mode)
2390 return hash_rtx (x, mode, &do_not_record, &hash_arg_in_memory, true);
2393 /* Like canon_hash but with no side effects, i.e. do_not_record
2394 and hash_arg_in_memory are not changed. */
2396 static inline unsigned
2397 safe_hash (rtx x, enum machine_mode mode)
2399 int dummy_do_not_record;
2400 return hash_rtx (x, mode, &dummy_do_not_record, NULL, true);
2403 /* Return 1 iff X and Y would canonicalize into the same thing,
2404 without actually constructing the canonicalization of either one.
2405 If VALIDATE is nonzero,
2406 we assume X is an expression being processed from the rtl
2407 and Y was found in the hash table. We check register refs
2408 in Y for being marked as valid.
2410 If FOR_GCSE is true, we compare X and Y for equivalence for GCSE. */
2413 exp_equiv_p (rtx x, rtx y, int validate, bool for_gcse)
2415 int i, j;
2416 enum rtx_code code;
2417 const char *fmt;
2419 /* Note: it is incorrect to assume an expression is equivalent to itself
2420 if VALIDATE is nonzero. */
2421 if (x == y && !validate)
2422 return 1;
2424 if (x == 0 || y == 0)
2425 return x == y;
2427 code = GET_CODE (x);
2428 if (code != GET_CODE (y))
2429 return 0;
2431 /* (MULT:SI x y) and (MULT:HI x y) are NOT equivalent. */
2432 if (GET_MODE (x) != GET_MODE (y))
2433 return 0;
2435 switch (code)
2437 case PC:
2438 case CC0:
2439 case CONST_INT:
2440 case CONST_DOUBLE:
2441 return x == y;
2443 case LABEL_REF:
2444 return XEXP (x, 0) == XEXP (y, 0);
2446 case SYMBOL_REF:
2447 return XSTR (x, 0) == XSTR (y, 0);
2449 case REG:
2450 if (for_gcse)
2451 return REGNO (x) == REGNO (y);
2452 else
2454 unsigned int regno = REGNO (y);
2455 unsigned int i;
2456 unsigned int endregno
2457 = regno + (regno >= FIRST_PSEUDO_REGISTER ? 1
2458 : hard_regno_nregs[regno][GET_MODE (y)]);
2460 /* If the quantities are not the same, the expressions are not
2461 equivalent. If there are and we are not to validate, they
2462 are equivalent. Otherwise, ensure all regs are up-to-date. */
2464 if (REG_QTY (REGNO (x)) != REG_QTY (regno))
2465 return 0;
2467 if (! validate)
2468 return 1;
2470 for (i = regno; i < endregno; i++)
2471 if (REG_IN_TABLE (i) != REG_TICK (i))
2472 return 0;
2474 return 1;
2477 case MEM:
2478 if (for_gcse)
2480 /* A volatile mem should not be considered equivalent to any
2481 other. */
2482 if (MEM_VOLATILE_P (x) || MEM_VOLATILE_P (y))
2483 return 0;
2485 /* Can't merge two expressions in different alias sets, since we
2486 can decide that the expression is transparent in a block when
2487 it isn't, due to it being set with the different alias set.
2489 Also, can't merge two expressions with different MEM_ATTRS.
2490 They could e.g. be two different entities allocated into the
2491 same space on the stack (see e.g. PR25130). In that case, the
2492 MEM addresses can be the same, even though the two MEMs are
2493 absolutely not equivalent.
2495 But because really all MEM attributes should be the same for
2496 equivalent MEMs, we just use the invariant that MEMs that have
2497 the same attributes share the same mem_attrs data structure. */
2498 if (MEM_ATTRS (x) != MEM_ATTRS (y))
2499 return 0;
2501 break;
2503 /* For commutative operations, check both orders. */
2504 case PLUS:
2505 case MULT:
2506 case AND:
2507 case IOR:
2508 case XOR:
2509 case NE:
2510 case EQ:
2511 return ((exp_equiv_p (XEXP (x, 0), XEXP (y, 0),
2512 validate, for_gcse)
2513 && exp_equiv_p (XEXP (x, 1), XEXP (y, 1),
2514 validate, for_gcse))
2515 || (exp_equiv_p (XEXP (x, 0), XEXP (y, 1),
2516 validate, for_gcse)
2517 && exp_equiv_p (XEXP (x, 1), XEXP (y, 0),
2518 validate, for_gcse)));
2520 case ASM_OPERANDS:
2521 /* We don't use the generic code below because we want to
2522 disregard filename and line numbers. */
2524 /* A volatile asm isn't equivalent to any other. */
2525 if (MEM_VOLATILE_P (x) || MEM_VOLATILE_P (y))
2526 return 0;
2528 if (GET_MODE (x) != GET_MODE (y)
2529 || strcmp (ASM_OPERANDS_TEMPLATE (x), ASM_OPERANDS_TEMPLATE (y))
2530 || strcmp (ASM_OPERANDS_OUTPUT_CONSTRAINT (x),
2531 ASM_OPERANDS_OUTPUT_CONSTRAINT (y))
2532 || ASM_OPERANDS_OUTPUT_IDX (x) != ASM_OPERANDS_OUTPUT_IDX (y)
2533 || ASM_OPERANDS_INPUT_LENGTH (x) != ASM_OPERANDS_INPUT_LENGTH (y))
2534 return 0;
2536 if (ASM_OPERANDS_INPUT_LENGTH (x))
2538 for (i = ASM_OPERANDS_INPUT_LENGTH (x) - 1; i >= 0; i--)
2539 if (! exp_equiv_p (ASM_OPERANDS_INPUT (x, i),
2540 ASM_OPERANDS_INPUT (y, i),
2541 validate, for_gcse)
2542 || strcmp (ASM_OPERANDS_INPUT_CONSTRAINT (x, i),
2543 ASM_OPERANDS_INPUT_CONSTRAINT (y, i)))
2544 return 0;
2547 return 1;
2549 default:
2550 break;
2553 /* Compare the elements. If any pair of corresponding elements
2554 fail to match, return 0 for the whole thing. */
2556 fmt = GET_RTX_FORMAT (code);
2557 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
2559 switch (fmt[i])
2561 case 'e':
2562 if (! exp_equiv_p (XEXP (x, i), XEXP (y, i),
2563 validate, for_gcse))
2564 return 0;
2565 break;
2567 case 'E':
2568 if (XVECLEN (x, i) != XVECLEN (y, i))
2569 return 0;
2570 for (j = 0; j < XVECLEN (x, i); j++)
2571 if (! exp_equiv_p (XVECEXP (x, i, j), XVECEXP (y, i, j),
2572 validate, for_gcse))
2573 return 0;
2574 break;
2576 case 's':
2577 if (strcmp (XSTR (x, i), XSTR (y, i)))
2578 return 0;
2579 break;
2581 case 'i':
2582 if (XINT (x, i) != XINT (y, i))
2583 return 0;
2584 break;
2586 case 'w':
2587 if (XWINT (x, i) != XWINT (y, i))
2588 return 0;
2589 break;
2591 case '0':
2592 case 't':
2593 break;
2595 default:
2596 gcc_unreachable ();
2600 return 1;
2603 /* Return 1 if X has a value that can vary even between two
2604 executions of the program. 0 means X can be compared reliably
2605 against certain constants or near-constants. */
2607 static int
2608 cse_rtx_varies_p (rtx x, int from_alias)
2610 /* We need not check for X and the equivalence class being of the same
2611 mode because if X is equivalent to a constant in some mode, it
2612 doesn't vary in any mode. */
2614 if (REG_P (x)
2615 && REGNO_QTY_VALID_P (REGNO (x)))
2617 int x_q = REG_QTY (REGNO (x));
2618 struct qty_table_elem *x_ent = &qty_table[x_q];
2620 if (GET_MODE (x) == x_ent->mode
2621 && x_ent->const_rtx != NULL_RTX)
2622 return 0;
2625 if (GET_CODE (x) == PLUS
2626 && GET_CODE (XEXP (x, 1)) == CONST_INT
2627 && REG_P (XEXP (x, 0))
2628 && REGNO_QTY_VALID_P (REGNO (XEXP (x, 0))))
2630 int x0_q = REG_QTY (REGNO (XEXP (x, 0)));
2631 struct qty_table_elem *x0_ent = &qty_table[x0_q];
2633 if ((GET_MODE (XEXP (x, 0)) == x0_ent->mode)
2634 && x0_ent->const_rtx != NULL_RTX)
2635 return 0;
2638 /* This can happen as the result of virtual register instantiation, if
2639 the initial constant is too large to be a valid address. This gives
2640 us a three instruction sequence, load large offset into a register,
2641 load fp minus a constant into a register, then a MEM which is the
2642 sum of the two `constant' registers. */
2643 if (GET_CODE (x) == PLUS
2644 && REG_P (XEXP (x, 0))
2645 && REG_P (XEXP (x, 1))
2646 && REGNO_QTY_VALID_P (REGNO (XEXP (x, 0)))
2647 && REGNO_QTY_VALID_P (REGNO (XEXP (x, 1))))
2649 int x0_q = REG_QTY (REGNO (XEXP (x, 0)));
2650 int x1_q = REG_QTY (REGNO (XEXP (x, 1)));
2651 struct qty_table_elem *x0_ent = &qty_table[x0_q];
2652 struct qty_table_elem *x1_ent = &qty_table[x1_q];
2654 if ((GET_MODE (XEXP (x, 0)) == x0_ent->mode)
2655 && x0_ent->const_rtx != NULL_RTX
2656 && (GET_MODE (XEXP (x, 1)) == x1_ent->mode)
2657 && x1_ent->const_rtx != NULL_RTX)
2658 return 0;
2661 return rtx_varies_p (x, from_alias);
2664 /* Subroutine of canon_reg. Pass *XLOC through canon_reg, and validate
2665 the result if necessary. INSN is as for canon_reg. */
2667 static void
2668 validate_canon_reg (rtx *xloc, rtx insn)
2670 rtx new = canon_reg (*xloc, insn);
2672 /* If replacing pseudo with hard reg or vice versa, ensure the
2673 insn remains valid. Likewise if the insn has MATCH_DUPs. */
2674 if (insn != 0 && new != 0)
2675 validate_change (insn, xloc, new, 1);
2676 else
2677 *xloc = new;
2680 /* Canonicalize an expression:
2681 replace each register reference inside it
2682 with the "oldest" equivalent register.
2684 If INSN is nonzero validate_change is used to ensure that INSN remains valid
2685 after we make our substitution. The calls are made with IN_GROUP nonzero
2686 so apply_change_group must be called upon the outermost return from this
2687 function (unless INSN is zero). The result of apply_change_group can
2688 generally be discarded since the changes we are making are optional. */
2690 static rtx
2691 canon_reg (rtx x, rtx insn)
2693 int i;
2694 enum rtx_code code;
2695 const char *fmt;
2697 if (x == 0)
2698 return x;
2700 code = GET_CODE (x);
2701 switch (code)
2703 case PC:
2704 case CC0:
2705 case CONST:
2706 case CONST_INT:
2707 case CONST_DOUBLE:
2708 case CONST_VECTOR:
2709 case SYMBOL_REF:
2710 case LABEL_REF:
2711 case ADDR_VEC:
2712 case ADDR_DIFF_VEC:
2713 return x;
2715 case REG:
2717 int first;
2718 int q;
2719 struct qty_table_elem *ent;
2721 /* Never replace a hard reg, because hard regs can appear
2722 in more than one machine mode, and we must preserve the mode
2723 of each occurrence. Also, some hard regs appear in
2724 MEMs that are shared and mustn't be altered. Don't try to
2725 replace any reg that maps to a reg of class NO_REGS. */
2726 if (REGNO (x) < FIRST_PSEUDO_REGISTER
2727 || ! REGNO_QTY_VALID_P (REGNO (x)))
2728 return x;
2730 q = REG_QTY (REGNO (x));
2731 ent = &qty_table[q];
2732 first = ent->first_reg;
2733 return (first >= FIRST_PSEUDO_REGISTER ? regno_reg_rtx[first]
2734 : REGNO_REG_CLASS (first) == NO_REGS ? x
2735 : gen_rtx_REG (ent->mode, first));
2738 default:
2739 break;
2742 fmt = GET_RTX_FORMAT (code);
2743 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
2745 int j;
2747 if (fmt[i] == 'e')
2748 validate_canon_reg (&XEXP (x, i), insn);
2749 else if (fmt[i] == 'E')
2750 for (j = 0; j < XVECLEN (x, i); j++)
2751 validate_canon_reg (&XVECEXP (x, i, j), insn);
2754 return x;
2757 /* Given an operation (CODE, *PARG1, *PARG2), where code is a comparison
2758 operation (EQ, NE, GT, etc.), follow it back through the hash table and
2759 what values are being compared.
2761 *PARG1 and *PARG2 are updated to contain the rtx representing the values
2762 actually being compared. For example, if *PARG1 was (cc0) and *PARG2
2763 was (const_int 0), *PARG1 and *PARG2 will be set to the objects that were
2764 compared to produce cc0.
2766 The return value is the comparison operator and is either the code of
2767 A or the code corresponding to the inverse of the comparison. */
2769 static enum rtx_code
2770 find_comparison_args (enum rtx_code code, rtx *parg1, rtx *parg2,
2771 enum machine_mode *pmode1, enum machine_mode *pmode2)
2773 rtx arg1, arg2;
2775 arg1 = *parg1, arg2 = *parg2;
2777 /* If ARG2 is const0_rtx, see what ARG1 is equivalent to. */
2779 while (arg2 == CONST0_RTX (GET_MODE (arg1)))
2781 /* Set nonzero when we find something of interest. */
2782 rtx x = 0;
2783 int reverse_code = 0;
2784 struct table_elt *p = 0;
2786 /* If arg1 is a COMPARE, extract the comparison arguments from it.
2787 On machines with CC0, this is the only case that can occur, since
2788 fold_rtx will return the COMPARE or item being compared with zero
2789 when given CC0. */
2791 if (GET_CODE (arg1) == COMPARE && arg2 == const0_rtx)
2792 x = arg1;
2794 /* If ARG1 is a comparison operator and CODE is testing for
2795 STORE_FLAG_VALUE, get the inner arguments. */
2797 else if (COMPARISON_P (arg1))
2799 #ifdef FLOAT_STORE_FLAG_VALUE
2800 REAL_VALUE_TYPE fsfv;
2801 #endif
2803 if (code == NE
2804 || (GET_MODE_CLASS (GET_MODE (arg1)) == MODE_INT
2805 && code == LT && STORE_FLAG_VALUE == -1)
2806 #ifdef FLOAT_STORE_FLAG_VALUE
2807 || (SCALAR_FLOAT_MODE_P (GET_MODE (arg1))
2808 && (fsfv = FLOAT_STORE_FLAG_VALUE (GET_MODE (arg1)),
2809 REAL_VALUE_NEGATIVE (fsfv)))
2810 #endif
2812 x = arg1;
2813 else if (code == EQ
2814 || (GET_MODE_CLASS (GET_MODE (arg1)) == MODE_INT
2815 && code == GE && STORE_FLAG_VALUE == -1)
2816 #ifdef FLOAT_STORE_FLAG_VALUE
2817 || (SCALAR_FLOAT_MODE_P (GET_MODE (arg1))
2818 && (fsfv = FLOAT_STORE_FLAG_VALUE (GET_MODE (arg1)),
2819 REAL_VALUE_NEGATIVE (fsfv)))
2820 #endif
2822 x = arg1, reverse_code = 1;
2825 /* ??? We could also check for
2827 (ne (and (eq (...) (const_int 1))) (const_int 0))
2829 and related forms, but let's wait until we see them occurring. */
2831 if (x == 0)
2832 /* Look up ARG1 in the hash table and see if it has an equivalence
2833 that lets us see what is being compared. */
2834 p = lookup (arg1, SAFE_HASH (arg1, GET_MODE (arg1)), GET_MODE (arg1));
2835 if (p)
2837 p = p->first_same_value;
2839 /* If what we compare is already known to be constant, that is as
2840 good as it gets.
2841 We need to break the loop in this case, because otherwise we
2842 can have an infinite loop when looking at a reg that is known
2843 to be a constant which is the same as a comparison of a reg
2844 against zero which appears later in the insn stream, which in
2845 turn is constant and the same as the comparison of the first reg
2846 against zero... */
2847 if (p->is_const)
2848 break;
2851 for (; p; p = p->next_same_value)
2853 enum machine_mode inner_mode = GET_MODE (p->exp);
2854 #ifdef FLOAT_STORE_FLAG_VALUE
2855 REAL_VALUE_TYPE fsfv;
2856 #endif
2858 /* If the entry isn't valid, skip it. */
2859 if (! exp_equiv_p (p->exp, p->exp, 1, false))
2860 continue;
2862 if (GET_CODE (p->exp) == COMPARE
2863 /* Another possibility is that this machine has a compare insn
2864 that includes the comparison code. In that case, ARG1 would
2865 be equivalent to a comparison operation that would set ARG1 to
2866 either STORE_FLAG_VALUE or zero. If this is an NE operation,
2867 ORIG_CODE is the actual comparison being done; if it is an EQ,
2868 we must reverse ORIG_CODE. On machine with a negative value
2869 for STORE_FLAG_VALUE, also look at LT and GE operations. */
2870 || ((code == NE
2871 || (code == LT
2872 && GET_MODE_CLASS (inner_mode) == MODE_INT
2873 && (GET_MODE_BITSIZE (inner_mode)
2874 <= HOST_BITS_PER_WIDE_INT)
2875 && (STORE_FLAG_VALUE
2876 & ((HOST_WIDE_INT) 1
2877 << (GET_MODE_BITSIZE (inner_mode) - 1))))
2878 #ifdef FLOAT_STORE_FLAG_VALUE
2879 || (code == LT
2880 && SCALAR_FLOAT_MODE_P (inner_mode)
2881 && (fsfv = FLOAT_STORE_FLAG_VALUE (GET_MODE (arg1)),
2882 REAL_VALUE_NEGATIVE (fsfv)))
2883 #endif
2885 && COMPARISON_P (p->exp)))
2887 x = p->exp;
2888 break;
2890 else if ((code == EQ
2891 || (code == GE
2892 && GET_MODE_CLASS (inner_mode) == MODE_INT
2893 && (GET_MODE_BITSIZE (inner_mode)
2894 <= HOST_BITS_PER_WIDE_INT)
2895 && (STORE_FLAG_VALUE
2896 & ((HOST_WIDE_INT) 1
2897 << (GET_MODE_BITSIZE (inner_mode) - 1))))
2898 #ifdef FLOAT_STORE_FLAG_VALUE
2899 || (code == GE
2900 && SCALAR_FLOAT_MODE_P (inner_mode)
2901 && (fsfv = FLOAT_STORE_FLAG_VALUE (GET_MODE (arg1)),
2902 REAL_VALUE_NEGATIVE (fsfv)))
2903 #endif
2905 && COMPARISON_P (p->exp))
2907 reverse_code = 1;
2908 x = p->exp;
2909 break;
2912 /* If this non-trapping address, e.g. fp + constant, the
2913 equivalent is a better operand since it may let us predict
2914 the value of the comparison. */
2915 else if (!rtx_addr_can_trap_p (p->exp))
2917 arg1 = p->exp;
2918 continue;
2922 /* If we didn't find a useful equivalence for ARG1, we are done.
2923 Otherwise, set up for the next iteration. */
2924 if (x == 0)
2925 break;
2927 /* If we need to reverse the comparison, make sure that that is
2928 possible -- we can't necessarily infer the value of GE from LT
2929 with floating-point operands. */
2930 if (reverse_code)
2932 enum rtx_code reversed = reversed_comparison_code (x, NULL_RTX);
2933 if (reversed == UNKNOWN)
2934 break;
2935 else
2936 code = reversed;
2938 else if (COMPARISON_P (x))
2939 code = GET_CODE (x);
2940 arg1 = XEXP (x, 0), arg2 = XEXP (x, 1);
2943 /* Return our results. Return the modes from before fold_rtx
2944 because fold_rtx might produce const_int, and then it's too late. */
2945 *pmode1 = GET_MODE (arg1), *pmode2 = GET_MODE (arg2);
2946 *parg1 = fold_rtx (arg1, 0), *parg2 = fold_rtx (arg2, 0);
2948 return code;
2951 /* If X is a nontrivial arithmetic operation on an argument for which
2952 a constant value can be determined, return the result of operating
2953 on that value, as a constant. Otherwise, return X, possibly with
2954 one or more operands changed to a forward-propagated constant.
2956 If X is a register whose contents are known, we do NOT return
2957 those contents here; equiv_constant is called to perform that task.
2958 For SUBREGs and MEMs, we do that both here and in equiv_constant.
2960 INSN is the insn that we may be modifying. If it is 0, make a copy
2961 of X before modifying it. */
2963 static rtx
2964 fold_rtx (rtx x, rtx insn)
2966 enum rtx_code code;
2967 enum machine_mode mode;
2968 const char *fmt;
2969 int i;
2970 rtx new = 0;
2971 int changed = 0;
2973 /* Operands of X. */
2974 rtx folded_arg0;
2975 rtx folded_arg1;
2977 /* Constant equivalents of first three operands of X;
2978 0 when no such equivalent is known. */
2979 rtx const_arg0;
2980 rtx const_arg1;
2981 rtx const_arg2;
2983 /* The mode of the first operand of X. We need this for sign and zero
2984 extends. */
2985 enum machine_mode mode_arg0;
2987 if (x == 0)
2988 return x;
2990 /* Try to perform some initial simplifications on X. */
2991 code = GET_CODE (x);
2992 switch (code)
2994 case MEM:
2995 case SUBREG:
2996 if ((new = equiv_constant (x)) != NULL_RTX)
2997 return new;
2998 return x;
3000 case CONST:
3001 case CONST_INT:
3002 case CONST_DOUBLE:
3003 case CONST_VECTOR:
3004 case SYMBOL_REF:
3005 case LABEL_REF:
3006 case REG:
3007 case PC:
3008 /* No use simplifying an EXPR_LIST
3009 since they are used only for lists of args
3010 in a function call's REG_EQUAL note. */
3011 case EXPR_LIST:
3012 return x;
3014 #ifdef HAVE_cc0
3015 case CC0:
3016 return prev_insn_cc0;
3017 #endif
3019 case ASM_OPERANDS:
3020 if (insn)
3022 for (i = ASM_OPERANDS_INPUT_LENGTH (x) - 1; i >= 0; i--)
3023 validate_change (insn, &ASM_OPERANDS_INPUT (x, i),
3024 fold_rtx (ASM_OPERANDS_INPUT (x, i), insn), 0);
3026 return x;
3028 #ifdef NO_FUNCTION_CSE
3029 case CALL:
3030 if (CONSTANT_P (XEXP (XEXP (x, 0), 0)))
3031 return x;
3032 break;
3033 #endif
3035 /* Anything else goes through the loop below. */
3036 default:
3037 break;
3040 mode = GET_MODE (x);
3041 const_arg0 = 0;
3042 const_arg1 = 0;
3043 const_arg2 = 0;
3044 mode_arg0 = VOIDmode;
3046 /* Try folding our operands.
3047 Then see which ones have constant values known. */
3049 fmt = GET_RTX_FORMAT (code);
3050 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
3051 if (fmt[i] == 'e')
3053 rtx folded_arg = XEXP (x, i), const_arg;
3054 enum machine_mode mode_arg = GET_MODE (folded_arg);
3055 #ifdef HAVE_cc0
3056 if (CC0_P (folded_arg))
3057 folded_arg = prev_insn_cc0, mode_arg = prev_insn_cc0_mode;
3058 #endif
3059 const_arg = equiv_constant (folded_arg);
3061 /* For the first three operands, see if the operand
3062 is constant or equivalent to a constant. */
3063 switch (i)
3065 case 0:
3066 folded_arg0 = folded_arg;
3067 const_arg0 = const_arg;
3068 mode_arg0 = mode_arg;
3069 break;
3070 case 1:
3071 folded_arg1 = folded_arg;
3072 const_arg1 = const_arg;
3073 break;
3074 case 2:
3075 const_arg2 = const_arg;
3076 break;
3079 /* Pick the least expensive of the argument and an equivalent constant
3080 argument. */
3081 if (const_arg != 0
3082 && const_arg != folded_arg
3083 && COST_IN (const_arg, code) <= COST_IN (folded_arg, code)
3085 /* It's not safe to substitute the operand of a conversion
3086 operator with a constant, as the conversion's identity
3087 depends upon the mode of its operand. This optimization
3088 is handled by the call to simplify_unary_operation. */
3089 && (GET_RTX_CLASS (code) != RTX_UNARY
3090 || GET_MODE (const_arg) == mode_arg0
3091 || (code != ZERO_EXTEND
3092 && code != SIGN_EXTEND
3093 && code != TRUNCATE
3094 && code != FLOAT_TRUNCATE
3095 && code != FLOAT_EXTEND
3096 && code != FLOAT
3097 && code != FIX
3098 && code != UNSIGNED_FLOAT
3099 && code != UNSIGNED_FIX)))
3100 folded_arg = const_arg;
3102 if (folded_arg == XEXP (x, i))
3103 continue;
3105 if (insn == NULL_RTX && !changed)
3106 x = copy_rtx (x);
3107 changed = 1;
3108 validate_change (insn, &XEXP (x, i), folded_arg, 1);
3111 if (changed)
3113 /* Canonicalize X if necessary, and keep const_argN and folded_argN
3114 consistent with the order in X. */
3115 if (canonicalize_change_group (insn, x))
3117 rtx tem;
3118 tem = const_arg0, const_arg0 = const_arg1, const_arg1 = tem;
3119 tem = folded_arg0, folded_arg0 = folded_arg1, folded_arg1 = tem;
3122 apply_change_group ();
3125 /* If X is an arithmetic operation, see if we can simplify it. */
3127 switch (GET_RTX_CLASS (code))
3129 case RTX_UNARY:
3131 int is_const = 0;
3133 /* We can't simplify extension ops unless we know the
3134 original mode. */
3135 if ((code == ZERO_EXTEND || code == SIGN_EXTEND)
3136 && mode_arg0 == VOIDmode)
3137 break;
3139 /* If we had a CONST, strip it off and put it back later if we
3140 fold. */
3141 if (const_arg0 != 0 && GET_CODE (const_arg0) == CONST)
3142 is_const = 1, const_arg0 = XEXP (const_arg0, 0);
3144 new = simplify_unary_operation (code, mode,
3145 const_arg0 ? const_arg0 : folded_arg0,
3146 mode_arg0);
3147 /* NEG of PLUS could be converted into MINUS, but that causes
3148 expressions of the form
3149 (CONST (MINUS (CONST_INT) (SYMBOL_REF)))
3150 which many ports mistakenly treat as LEGITIMATE_CONSTANT_P.
3151 FIXME: those ports should be fixed. */
3152 if (new != 0 && is_const
3153 && GET_CODE (new) == PLUS
3154 && (GET_CODE (XEXP (new, 0)) == SYMBOL_REF
3155 || GET_CODE (XEXP (new, 0)) == LABEL_REF)
3156 && GET_CODE (XEXP (new, 1)) == CONST_INT)
3157 new = gen_rtx_CONST (mode, new);
3159 break;
3161 case RTX_COMPARE:
3162 case RTX_COMM_COMPARE:
3163 /* See what items are actually being compared and set FOLDED_ARG[01]
3164 to those values and CODE to the actual comparison code. If any are
3165 constant, set CONST_ARG0 and CONST_ARG1 appropriately. We needn't
3166 do anything if both operands are already known to be constant. */
3168 /* ??? Vector mode comparisons are not supported yet. */
3169 if (VECTOR_MODE_P (mode))
3170 break;
3172 if (const_arg0 == 0 || const_arg1 == 0)
3174 struct table_elt *p0, *p1;
3175 rtx true_rtx = const_true_rtx, false_rtx = const0_rtx;
3176 enum machine_mode mode_arg1;
3178 #ifdef FLOAT_STORE_FLAG_VALUE
3179 if (SCALAR_FLOAT_MODE_P (mode))
3181 true_rtx = (CONST_DOUBLE_FROM_REAL_VALUE
3182 (FLOAT_STORE_FLAG_VALUE (mode), mode));
3183 false_rtx = CONST0_RTX (mode);
3185 #endif
3187 code = find_comparison_args (code, &folded_arg0, &folded_arg1,
3188 &mode_arg0, &mode_arg1);
3190 /* If the mode is VOIDmode or a MODE_CC mode, we don't know
3191 what kinds of things are being compared, so we can't do
3192 anything with this comparison. */
3194 if (mode_arg0 == VOIDmode || GET_MODE_CLASS (mode_arg0) == MODE_CC)
3195 break;
3197 const_arg0 = equiv_constant (folded_arg0);
3198 const_arg1 = equiv_constant (folded_arg1);
3200 /* If we do not now have two constants being compared, see
3201 if we can nevertheless deduce some things about the
3202 comparison. */
3203 if (const_arg0 == 0 || const_arg1 == 0)
3205 if (const_arg1 != NULL)
3207 rtx cheapest_simplification;
3208 int cheapest_cost;
3209 rtx simp_result;
3210 struct table_elt *p;
3212 /* See if we can find an equivalent of folded_arg0
3213 that gets us a cheaper expression, possibly a
3214 constant through simplifications. */
3215 p = lookup (folded_arg0, SAFE_HASH (folded_arg0, mode_arg0),
3216 mode_arg0);
3218 if (p != NULL)
3220 cheapest_simplification = x;
3221 cheapest_cost = COST (x);
3223 for (p = p->first_same_value; p != NULL; p = p->next_same_value)
3225 int cost;
3227 /* If the entry isn't valid, skip it. */
3228 if (! exp_equiv_p (p->exp, p->exp, 1, false))
3229 continue;
3231 /* Try to simplify using this equivalence. */
3232 simp_result
3233 = simplify_relational_operation (code, mode,
3234 mode_arg0,
3235 p->exp,
3236 const_arg1);
3238 if (simp_result == NULL)
3239 continue;
3241 cost = COST (simp_result);
3242 if (cost < cheapest_cost)
3244 cheapest_cost = cost;
3245 cheapest_simplification = simp_result;
3249 /* If we have a cheaper expression now, use that
3250 and try folding it further, from the top. */
3251 if (cheapest_simplification != x)
3252 return fold_rtx (cheapest_simplification, insn);
3256 /* Some addresses are known to be nonzero. We don't know
3257 their sign, but equality comparisons are known. */
3258 if (const_arg1 == const0_rtx
3259 && nonzero_address_p (folded_arg0))
3261 if (code == EQ)
3262 return false_rtx;
3263 else if (code == NE)
3264 return true_rtx;
3267 /* See if the two operands are the same. */
3269 if (folded_arg0 == folded_arg1
3270 || (REG_P (folded_arg0)
3271 && REG_P (folded_arg1)
3272 && (REG_QTY (REGNO (folded_arg0))
3273 == REG_QTY (REGNO (folded_arg1))))
3274 || ((p0 = lookup (folded_arg0,
3275 SAFE_HASH (folded_arg0, mode_arg0),
3276 mode_arg0))
3277 && (p1 = lookup (folded_arg1,
3278 SAFE_HASH (folded_arg1, mode_arg0),
3279 mode_arg0))
3280 && p0->first_same_value == p1->first_same_value))
3282 /* Sadly two equal NaNs are not equivalent. */
3283 if (!HONOR_NANS (mode_arg0))
3284 return ((code == EQ || code == LE || code == GE
3285 || code == LEU || code == GEU || code == UNEQ
3286 || code == UNLE || code == UNGE
3287 || code == ORDERED)
3288 ? true_rtx : false_rtx);
3289 /* Take care for the FP compares we can resolve. */
3290 if (code == UNEQ || code == UNLE || code == UNGE)
3291 return true_rtx;
3292 if (code == LTGT || code == LT || code == GT)
3293 return false_rtx;
3296 /* If FOLDED_ARG0 is a register, see if the comparison we are
3297 doing now is either the same as we did before or the reverse
3298 (we only check the reverse if not floating-point). */
3299 else if (REG_P (folded_arg0))
3301 int qty = REG_QTY (REGNO (folded_arg0));
3303 if (REGNO_QTY_VALID_P (REGNO (folded_arg0)))
3305 struct qty_table_elem *ent = &qty_table[qty];
3307 if ((comparison_dominates_p (ent->comparison_code, code)
3308 || (! FLOAT_MODE_P (mode_arg0)
3309 && comparison_dominates_p (ent->comparison_code,
3310 reverse_condition (code))))
3311 && (rtx_equal_p (ent->comparison_const, folded_arg1)
3312 || (const_arg1
3313 && rtx_equal_p (ent->comparison_const,
3314 const_arg1))
3315 || (REG_P (folded_arg1)
3316 && (REG_QTY (REGNO (folded_arg1)) == ent->comparison_qty))))
3317 return (comparison_dominates_p (ent->comparison_code, code)
3318 ? true_rtx : false_rtx);
3324 /* If we are comparing against zero, see if the first operand is
3325 equivalent to an IOR with a constant. If so, we may be able to
3326 determine the result of this comparison. */
3328 if (const_arg1 == const0_rtx)
3330 rtx y = lookup_as_function (folded_arg0, IOR);
3331 rtx inner_const;
3333 if (y != 0
3334 && (inner_const = equiv_constant (XEXP (y, 1))) != 0
3335 && GET_CODE (inner_const) == CONST_INT
3336 && INTVAL (inner_const) != 0)
3338 int sign_bitnum = GET_MODE_BITSIZE (mode_arg0) - 1;
3339 int has_sign = (HOST_BITS_PER_WIDE_INT >= sign_bitnum
3340 && (INTVAL (inner_const)
3341 & ((HOST_WIDE_INT) 1 << sign_bitnum)));
3342 rtx true_rtx = const_true_rtx, false_rtx = const0_rtx;
3344 #ifdef FLOAT_STORE_FLAG_VALUE
3345 if (SCALAR_FLOAT_MODE_P (mode))
3347 true_rtx = (CONST_DOUBLE_FROM_REAL_VALUE
3348 (FLOAT_STORE_FLAG_VALUE (mode), mode));
3349 false_rtx = CONST0_RTX (mode);
3351 #endif
3353 switch (code)
3355 case EQ:
3356 return false_rtx;
3357 case NE:
3358 return true_rtx;
3359 case LT: case LE:
3360 if (has_sign)
3361 return true_rtx;
3362 break;
3363 case GT: case GE:
3364 if (has_sign)
3365 return false_rtx;
3366 break;
3367 default:
3368 break;
3374 rtx op0 = const_arg0 ? const_arg0 : folded_arg0;
3375 rtx op1 = const_arg1 ? const_arg1 : folded_arg1;
3376 new = simplify_relational_operation (code, mode, mode_arg0, op0, op1);
3378 break;
3380 case RTX_BIN_ARITH:
3381 case RTX_COMM_ARITH:
3382 switch (code)
3384 case PLUS:
3385 /* If the second operand is a LABEL_REF, see if the first is a MINUS
3386 with that LABEL_REF as its second operand. If so, the result is
3387 the first operand of that MINUS. This handles switches with an
3388 ADDR_DIFF_VEC table. */
3389 if (const_arg1 && GET_CODE (const_arg1) == LABEL_REF)
3391 rtx y
3392 = GET_CODE (folded_arg0) == MINUS ? folded_arg0
3393 : lookup_as_function (folded_arg0, MINUS);
3395 if (y != 0 && GET_CODE (XEXP (y, 1)) == LABEL_REF
3396 && XEXP (XEXP (y, 1), 0) == XEXP (const_arg1, 0))
3397 return XEXP (y, 0);
3399 /* Now try for a CONST of a MINUS like the above. */
3400 if ((y = (GET_CODE (folded_arg0) == CONST ? folded_arg0
3401 : lookup_as_function (folded_arg0, CONST))) != 0
3402 && GET_CODE (XEXP (y, 0)) == MINUS
3403 && GET_CODE (XEXP (XEXP (y, 0), 1)) == LABEL_REF
3404 && XEXP (XEXP (XEXP (y, 0), 1), 0) == XEXP (const_arg1, 0))
3405 return XEXP (XEXP (y, 0), 0);
3408 /* Likewise if the operands are in the other order. */
3409 if (const_arg0 && GET_CODE (const_arg0) == LABEL_REF)
3411 rtx y
3412 = GET_CODE (folded_arg1) == MINUS ? folded_arg1
3413 : lookup_as_function (folded_arg1, MINUS);
3415 if (y != 0 && GET_CODE (XEXP (y, 1)) == LABEL_REF
3416 && XEXP (XEXP (y, 1), 0) == XEXP (const_arg0, 0))
3417 return XEXP (y, 0);
3419 /* Now try for a CONST of a MINUS like the above. */
3420 if ((y = (GET_CODE (folded_arg1) == CONST ? folded_arg1
3421 : lookup_as_function (folded_arg1, CONST))) != 0
3422 && GET_CODE (XEXP (y, 0)) == MINUS
3423 && GET_CODE (XEXP (XEXP (y, 0), 1)) == LABEL_REF
3424 && XEXP (XEXP (XEXP (y, 0), 1), 0) == XEXP (const_arg0, 0))
3425 return XEXP (XEXP (y, 0), 0);
3428 /* If second operand is a register equivalent to a negative
3429 CONST_INT, see if we can find a register equivalent to the
3430 positive constant. Make a MINUS if so. Don't do this for
3431 a non-negative constant since we might then alternate between
3432 choosing positive and negative constants. Having the positive
3433 constant previously-used is the more common case. Be sure
3434 the resulting constant is non-negative; if const_arg1 were
3435 the smallest negative number this would overflow: depending
3436 on the mode, this would either just be the same value (and
3437 hence not save anything) or be incorrect. */
3438 if (const_arg1 != 0 && GET_CODE (const_arg1) == CONST_INT
3439 && INTVAL (const_arg1) < 0
3440 /* This used to test
3442 -INTVAL (const_arg1) >= 0
3444 But The Sun V5.0 compilers mis-compiled that test. So
3445 instead we test for the problematic value in a more direct
3446 manner and hope the Sun compilers get it correct. */
3447 && INTVAL (const_arg1) !=
3448 ((HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT - 1))
3449 && REG_P (folded_arg1))
3451 rtx new_const = GEN_INT (-INTVAL (const_arg1));
3452 struct table_elt *p
3453 = lookup (new_const, SAFE_HASH (new_const, mode), mode);
3455 if (p)
3456 for (p = p->first_same_value; p; p = p->next_same_value)
3457 if (REG_P (p->exp))
3458 return simplify_gen_binary (MINUS, mode, folded_arg0,
3459 canon_reg (p->exp, NULL_RTX));
3461 goto from_plus;
3463 case MINUS:
3464 /* If we have (MINUS Y C), see if Y is known to be (PLUS Z C2).
3465 If so, produce (PLUS Z C2-C). */
3466 if (const_arg1 != 0 && GET_CODE (const_arg1) == CONST_INT)
3468 rtx y = lookup_as_function (XEXP (x, 0), PLUS);
3469 if (y && GET_CODE (XEXP (y, 1)) == CONST_INT)
3470 return fold_rtx (plus_constant (copy_rtx (y),
3471 -INTVAL (const_arg1)),
3472 NULL_RTX);
3475 /* Fall through. */
3477 from_plus:
3478 case SMIN: case SMAX: case UMIN: case UMAX:
3479 case IOR: case AND: case XOR:
3480 case MULT:
3481 case ASHIFT: case LSHIFTRT: case ASHIFTRT:
3482 /* If we have (<op> <reg> <const_int>) for an associative OP and REG
3483 is known to be of similar form, we may be able to replace the
3484 operation with a combined operation. This may eliminate the
3485 intermediate operation if every use is simplified in this way.
3486 Note that the similar optimization done by combine.c only works
3487 if the intermediate operation's result has only one reference. */
3489 if (REG_P (folded_arg0)
3490 && const_arg1 && GET_CODE (const_arg1) == CONST_INT)
3492 int is_shift
3493 = (code == ASHIFT || code == ASHIFTRT || code == LSHIFTRT);
3494 rtx y, inner_const, new_const;
3495 enum rtx_code associate_code;
3497 if (is_shift
3498 && (INTVAL (const_arg1) >= GET_MODE_BITSIZE (mode)
3499 || INTVAL (const_arg1) < 0))
3501 if (SHIFT_COUNT_TRUNCATED)
3502 const_arg1 = GEN_INT (INTVAL (const_arg1)
3503 & (GET_MODE_BITSIZE (mode) - 1));
3504 else
3505 break;
3508 y = lookup_as_function (folded_arg0, code);
3509 if (y == 0)
3510 break;
3512 /* If we have compiled a statement like
3513 "if (x == (x & mask1))", and now are looking at
3514 "x & mask2", we will have a case where the first operand
3515 of Y is the same as our first operand. Unless we detect
3516 this case, an infinite loop will result. */
3517 if (XEXP (y, 0) == folded_arg0)
3518 break;
3520 inner_const = equiv_constant (fold_rtx (XEXP (y, 1), 0));
3521 if (!inner_const || GET_CODE (inner_const) != CONST_INT)
3522 break;
3524 /* Don't associate these operations if they are a PLUS with the
3525 same constant and it is a power of two. These might be doable
3526 with a pre- or post-increment. Similarly for two subtracts of
3527 identical powers of two with post decrement. */
3529 if (code == PLUS && const_arg1 == inner_const
3530 && ((HAVE_PRE_INCREMENT
3531 && exact_log2 (INTVAL (const_arg1)) >= 0)
3532 || (HAVE_POST_INCREMENT
3533 && exact_log2 (INTVAL (const_arg1)) >= 0)
3534 || (HAVE_PRE_DECREMENT
3535 && exact_log2 (- INTVAL (const_arg1)) >= 0)
3536 || (HAVE_POST_DECREMENT
3537 && exact_log2 (- INTVAL (const_arg1)) >= 0)))
3538 break;
3540 if (is_shift
3541 && (INTVAL (inner_const) >= GET_MODE_BITSIZE (mode)
3542 || INTVAL (inner_const) < 0))
3544 if (SHIFT_COUNT_TRUNCATED)
3545 inner_const = GEN_INT (INTVAL (inner_const)
3546 & (GET_MODE_BITSIZE (mode) - 1));
3547 else
3548 break;
3551 /* Compute the code used to compose the constants. For example,
3552 A-C1-C2 is A-(C1 + C2), so if CODE == MINUS, we want PLUS. */
3554 associate_code = (is_shift || code == MINUS ? PLUS : code);
3556 new_const = simplify_binary_operation (associate_code, mode,
3557 const_arg1, inner_const);
3559 if (new_const == 0)
3560 break;
3562 /* If we are associating shift operations, don't let this
3563 produce a shift of the size of the object or larger.
3564 This could occur when we follow a sign-extend by a right
3565 shift on a machine that does a sign-extend as a pair
3566 of shifts. */
3568 if (is_shift
3569 && GET_CODE (new_const) == CONST_INT
3570 && INTVAL (new_const) >= GET_MODE_BITSIZE (mode))
3572 /* As an exception, we can turn an ASHIFTRT of this
3573 form into a shift of the number of bits - 1. */
3574 if (code == ASHIFTRT)
3575 new_const = GEN_INT (GET_MODE_BITSIZE (mode) - 1);
3576 else if (!side_effects_p (XEXP (y, 0)))
3577 return CONST0_RTX (mode);
3578 else
3579 break;
3582 y = copy_rtx (XEXP (y, 0));
3584 /* If Y contains our first operand (the most common way this
3585 can happen is if Y is a MEM), we would do into an infinite
3586 loop if we tried to fold it. So don't in that case. */
3588 if (! reg_mentioned_p (folded_arg0, y))
3589 y = fold_rtx (y, insn);
3591 return simplify_gen_binary (code, mode, y, new_const);
3593 break;
3595 case DIV: case UDIV:
3596 /* ??? The associative optimization performed immediately above is
3597 also possible for DIV and UDIV using associate_code of MULT.
3598 However, we would need extra code to verify that the
3599 multiplication does not overflow, that is, there is no overflow
3600 in the calculation of new_const. */
3601 break;
3603 default:
3604 break;
3607 new = simplify_binary_operation (code, mode,
3608 const_arg0 ? const_arg0 : folded_arg0,
3609 const_arg1 ? const_arg1 : folded_arg1);
3610 break;
3612 case RTX_OBJ:
3613 /* (lo_sum (high X) X) is simply X. */
3614 if (code == LO_SUM && const_arg0 != 0
3615 && GET_CODE (const_arg0) == HIGH
3616 && rtx_equal_p (XEXP (const_arg0, 0), const_arg1))
3617 return const_arg1;
3618 break;
3620 case RTX_TERNARY:
3621 case RTX_BITFIELD_OPS:
3622 new = simplify_ternary_operation (code, mode, mode_arg0,
3623 const_arg0 ? const_arg0 : folded_arg0,
3624 const_arg1 ? const_arg1 : folded_arg1,
3625 const_arg2 ? const_arg2 : XEXP (x, 2));
3626 break;
3628 default:
3629 break;
3632 return new ? new : x;
3635 /* Return a constant value currently equivalent to X.
3636 Return 0 if we don't know one. */
3638 static rtx
3639 equiv_constant (rtx x)
3641 if (REG_P (x)
3642 && REGNO_QTY_VALID_P (REGNO (x)))
3644 int x_q = REG_QTY (REGNO (x));
3645 struct qty_table_elem *x_ent = &qty_table[x_q];
3647 if (x_ent->const_rtx)
3648 x = gen_lowpart (GET_MODE (x), x_ent->const_rtx);
3651 if (x == 0 || CONSTANT_P (x))
3652 return x;
3654 if (GET_CODE (x) == SUBREG)
3656 rtx new;
3658 /* See if we previously assigned a constant value to this SUBREG. */
3659 if ((new = lookup_as_function (x, CONST_INT)) != 0
3660 || (new = lookup_as_function (x, CONST_DOUBLE)) != 0)
3661 return new;
3663 if (REG_P (SUBREG_REG (x))
3664 && (new = equiv_constant (SUBREG_REG (x))) != 0)
3665 return simplify_subreg (GET_MODE (x), SUBREG_REG (x),
3666 GET_MODE (SUBREG_REG (x)), SUBREG_BYTE (x));
3668 return 0;
3671 /* If X is a MEM, see if it is a constant-pool reference, or look it up in
3672 the hash table in case its value was seen before. */
3674 if (MEM_P (x))
3676 struct table_elt *elt;
3678 x = avoid_constant_pool_reference (x);
3679 if (CONSTANT_P (x))
3680 return x;
3682 elt = lookup (x, SAFE_HASH (x, GET_MODE (x)), GET_MODE (x));
3683 if (elt == 0)
3684 return 0;
3686 for (elt = elt->first_same_value; elt; elt = elt->next_same_value)
3687 if (elt->is_const && CONSTANT_P (elt->exp))
3688 return elt->exp;
3691 return 0;
3694 /* Given INSN, a jump insn, TAKEN indicates if we are following the
3695 "taken" branch.
3697 In certain cases, this can cause us to add an equivalence. For example,
3698 if we are following the taken case of
3699 if (i == 2)
3700 we can add the fact that `i' and '2' are now equivalent.
3702 In any case, we can record that this comparison was passed. If the same
3703 comparison is seen later, we will know its value. */
3705 static void
3706 record_jump_equiv (rtx insn, bool taken)
3708 int cond_known_true;
3709 rtx op0, op1;
3710 rtx set;
3711 enum machine_mode mode, mode0, mode1;
3712 int reversed_nonequality = 0;
3713 enum rtx_code code;
3715 /* Ensure this is the right kind of insn. */
3716 gcc_assert (any_condjump_p (insn));
3718 set = pc_set (insn);
3720 /* See if this jump condition is known true or false. */
3721 if (taken)
3722 cond_known_true = (XEXP (SET_SRC (set), 2) == pc_rtx);
3723 else
3724 cond_known_true = (XEXP (SET_SRC (set), 1) == pc_rtx);
3726 /* Get the type of comparison being done and the operands being compared.
3727 If we had to reverse a non-equality condition, record that fact so we
3728 know that it isn't valid for floating-point. */
3729 code = GET_CODE (XEXP (SET_SRC (set), 0));
3730 op0 = fold_rtx (XEXP (XEXP (SET_SRC (set), 0), 0), insn);
3731 op1 = fold_rtx (XEXP (XEXP (SET_SRC (set), 0), 1), insn);
3733 code = find_comparison_args (code, &op0, &op1, &mode0, &mode1);
3734 if (! cond_known_true)
3736 code = reversed_comparison_code_parts (code, op0, op1, insn);
3738 /* Don't remember if we can't find the inverse. */
3739 if (code == UNKNOWN)
3740 return;
3743 /* The mode is the mode of the non-constant. */
3744 mode = mode0;
3745 if (mode1 != VOIDmode)
3746 mode = mode1;
3748 record_jump_cond (code, mode, op0, op1, reversed_nonequality);
3751 /* Yet another form of subreg creation. In this case, we want something in
3752 MODE, and we should assume OP has MODE iff it is naturally modeless. */
3754 static rtx
3755 record_jump_cond_subreg (enum machine_mode mode, rtx op)
3757 enum machine_mode op_mode = GET_MODE (op);
3758 if (op_mode == mode || op_mode == VOIDmode)
3759 return op;
3760 return lowpart_subreg (mode, op, op_mode);
3763 /* We know that comparison CODE applied to OP0 and OP1 in MODE is true.
3764 REVERSED_NONEQUALITY is nonzero if CODE had to be swapped.
3765 Make any useful entries we can with that information. Called from
3766 above function and called recursively. */
3768 static void
3769 record_jump_cond (enum rtx_code code, enum machine_mode mode, rtx op0,
3770 rtx op1, int reversed_nonequality)
3772 unsigned op0_hash, op1_hash;
3773 int op0_in_memory, op1_in_memory;
3774 struct table_elt *op0_elt, *op1_elt;
3776 /* If OP0 and OP1 are known equal, and either is a paradoxical SUBREG,
3777 we know that they are also equal in the smaller mode (this is also
3778 true for all smaller modes whether or not there is a SUBREG, but
3779 is not worth testing for with no SUBREG). */
3781 /* Note that GET_MODE (op0) may not equal MODE. */
3782 if (code == EQ && GET_CODE (op0) == SUBREG
3783 && (GET_MODE_SIZE (GET_MODE (op0))
3784 > GET_MODE_SIZE (GET_MODE (SUBREG_REG (op0)))))
3786 enum machine_mode inner_mode = GET_MODE (SUBREG_REG (op0));
3787 rtx tem = record_jump_cond_subreg (inner_mode, op1);
3788 if (tem)
3789 record_jump_cond (code, mode, SUBREG_REG (op0), tem,
3790 reversed_nonequality);
3793 if (code == EQ && GET_CODE (op1) == SUBREG
3794 && (GET_MODE_SIZE (GET_MODE (op1))
3795 > GET_MODE_SIZE (GET_MODE (SUBREG_REG (op1)))))
3797 enum machine_mode inner_mode = GET_MODE (SUBREG_REG (op1));
3798 rtx tem = record_jump_cond_subreg (inner_mode, op0);
3799 if (tem)
3800 record_jump_cond (code, mode, SUBREG_REG (op1), tem,
3801 reversed_nonequality);
3804 /* Similarly, if this is an NE comparison, and either is a SUBREG
3805 making a smaller mode, we know the whole thing is also NE. */
3807 /* Note that GET_MODE (op0) may not equal MODE;
3808 if we test MODE instead, we can get an infinite recursion
3809 alternating between two modes each wider than MODE. */
3811 if (code == NE && GET_CODE (op0) == SUBREG
3812 && subreg_lowpart_p (op0)
3813 && (GET_MODE_SIZE (GET_MODE (op0))
3814 < GET_MODE_SIZE (GET_MODE (SUBREG_REG (op0)))))
3816 enum machine_mode inner_mode = GET_MODE (SUBREG_REG (op0));
3817 rtx tem = record_jump_cond_subreg (inner_mode, op1);
3818 if (tem)
3819 record_jump_cond (code, mode, SUBREG_REG (op0), tem,
3820 reversed_nonequality);
3823 if (code == NE && GET_CODE (op1) == SUBREG
3824 && subreg_lowpart_p (op1)
3825 && (GET_MODE_SIZE (GET_MODE (op1))
3826 < GET_MODE_SIZE (GET_MODE (SUBREG_REG (op1)))))
3828 enum machine_mode inner_mode = GET_MODE (SUBREG_REG (op1));
3829 rtx tem = record_jump_cond_subreg (inner_mode, op0);
3830 if (tem)
3831 record_jump_cond (code, mode, SUBREG_REG (op1), tem,
3832 reversed_nonequality);
3835 /* Hash both operands. */
3837 do_not_record = 0;
3838 hash_arg_in_memory = 0;
3839 op0_hash = HASH (op0, mode);
3840 op0_in_memory = hash_arg_in_memory;
3842 if (do_not_record)
3843 return;
3845 do_not_record = 0;
3846 hash_arg_in_memory = 0;
3847 op1_hash = HASH (op1, mode);
3848 op1_in_memory = hash_arg_in_memory;
3850 if (do_not_record)
3851 return;
3853 /* Look up both operands. */
3854 op0_elt = lookup (op0, op0_hash, mode);
3855 op1_elt = lookup (op1, op1_hash, mode);
3857 /* If both operands are already equivalent or if they are not in the
3858 table but are identical, do nothing. */
3859 if ((op0_elt != 0 && op1_elt != 0
3860 && op0_elt->first_same_value == op1_elt->first_same_value)
3861 || op0 == op1 || rtx_equal_p (op0, op1))
3862 return;
3864 /* If we aren't setting two things equal all we can do is save this
3865 comparison. Similarly if this is floating-point. In the latter
3866 case, OP1 might be zero and both -0.0 and 0.0 are equal to it.
3867 If we record the equality, we might inadvertently delete code
3868 whose intent was to change -0 to +0. */
3870 if (code != EQ || FLOAT_MODE_P (GET_MODE (op0)))
3872 struct qty_table_elem *ent;
3873 int qty;
3875 /* If we reversed a floating-point comparison, if OP0 is not a
3876 register, or if OP1 is neither a register or constant, we can't
3877 do anything. */
3879 if (!REG_P (op1))
3880 op1 = equiv_constant (op1);
3882 if ((reversed_nonequality && FLOAT_MODE_P (mode))
3883 || !REG_P (op0) || op1 == 0)
3884 return;
3886 /* Put OP0 in the hash table if it isn't already. This gives it a
3887 new quantity number. */
3888 if (op0_elt == 0)
3890 if (insert_regs (op0, NULL, 0))
3892 rehash_using_reg (op0);
3893 op0_hash = HASH (op0, mode);
3895 /* If OP0 is contained in OP1, this changes its hash code
3896 as well. Faster to rehash than to check, except
3897 for the simple case of a constant. */
3898 if (! CONSTANT_P (op1))
3899 op1_hash = HASH (op1,mode);
3902 op0_elt = insert (op0, NULL, op0_hash, mode);
3903 op0_elt->in_memory = op0_in_memory;
3906 qty = REG_QTY (REGNO (op0));
3907 ent = &qty_table[qty];
3909 ent->comparison_code = code;
3910 if (REG_P (op1))
3912 /* Look it up again--in case op0 and op1 are the same. */
3913 op1_elt = lookup (op1, op1_hash, mode);
3915 /* Put OP1 in the hash table so it gets a new quantity number. */
3916 if (op1_elt == 0)
3918 if (insert_regs (op1, NULL, 0))
3920 rehash_using_reg (op1);
3921 op1_hash = HASH (op1, mode);
3924 op1_elt = insert (op1, NULL, op1_hash, mode);
3925 op1_elt->in_memory = op1_in_memory;
3928 ent->comparison_const = NULL_RTX;
3929 ent->comparison_qty = REG_QTY (REGNO (op1));
3931 else
3933 ent->comparison_const = op1;
3934 ent->comparison_qty = -1;
3937 return;
3940 /* If either side is still missing an equivalence, make it now,
3941 then merge the equivalences. */
3943 if (op0_elt == 0)
3945 if (insert_regs (op0, NULL, 0))
3947 rehash_using_reg (op0);
3948 op0_hash = HASH (op0, mode);
3951 op0_elt = insert (op0, NULL, op0_hash, mode);
3952 op0_elt->in_memory = op0_in_memory;
3955 if (op1_elt == 0)
3957 if (insert_regs (op1, NULL, 0))
3959 rehash_using_reg (op1);
3960 op1_hash = HASH (op1, mode);
3963 op1_elt = insert (op1, NULL, op1_hash, mode);
3964 op1_elt->in_memory = op1_in_memory;
3967 merge_equiv_classes (op0_elt, op1_elt);
3970 /* CSE processing for one instruction.
3971 First simplify sources and addresses of all assignments
3972 in the instruction, using previously-computed equivalents values.
3973 Then install the new sources and destinations in the table
3974 of available values.
3976 If LIBCALL_INSN is nonzero, don't record any equivalence made in
3977 the insn. It means that INSN is inside libcall block. In this
3978 case LIBCALL_INSN is the corresponding insn with REG_LIBCALL. */
3980 /* Data on one SET contained in the instruction. */
3982 struct set
3984 /* The SET rtx itself. */
3985 rtx rtl;
3986 /* The SET_SRC of the rtx (the original value, if it is changing). */
3987 rtx src;
3988 /* The hash-table element for the SET_SRC of the SET. */
3989 struct table_elt *src_elt;
3990 /* Hash value for the SET_SRC. */
3991 unsigned src_hash;
3992 /* Hash value for the SET_DEST. */
3993 unsigned dest_hash;
3994 /* The SET_DEST, with SUBREG, etc., stripped. */
3995 rtx inner_dest;
3996 /* Nonzero if the SET_SRC is in memory. */
3997 char src_in_memory;
3998 /* Nonzero if the SET_SRC contains something
3999 whose value cannot be predicted and understood. */
4000 char src_volatile;
4001 /* Original machine mode, in case it becomes a CONST_INT.
4002 The size of this field should match the size of the mode
4003 field of struct rtx_def (see rtl.h). */
4004 ENUM_BITFIELD(machine_mode) mode : 8;
4005 /* A constant equivalent for SET_SRC, if any. */
4006 rtx src_const;
4007 /* Original SET_SRC value used for libcall notes. */
4008 rtx orig_src;
4009 /* Hash value of constant equivalent for SET_SRC. */
4010 unsigned src_const_hash;
4011 /* Table entry for constant equivalent for SET_SRC, if any. */
4012 struct table_elt *src_const_elt;
4013 /* Table entry for the destination address. */
4014 struct table_elt *dest_addr_elt;
4017 static void
4018 cse_insn (rtx insn, rtx libcall_insn)
4020 rtx x = PATTERN (insn);
4021 int i;
4022 rtx tem;
4023 int n_sets = 0;
4025 #ifdef HAVE_cc0
4026 /* Records what this insn does to set CC0. */
4027 rtx this_insn_cc0 = 0;
4028 enum machine_mode this_insn_cc0_mode = VOIDmode;
4029 #endif
4031 rtx src_eqv = 0;
4032 struct table_elt *src_eqv_elt = 0;
4033 int src_eqv_volatile = 0;
4034 int src_eqv_in_memory = 0;
4035 unsigned src_eqv_hash = 0;
4037 struct set *sets = (struct set *) 0;
4039 this_insn = insn;
4041 /* Find all the SETs and CLOBBERs in this instruction.
4042 Record all the SETs in the array `set' and count them.
4043 Also determine whether there is a CLOBBER that invalidates
4044 all memory references, or all references at varying addresses. */
4046 if (CALL_P (insn))
4048 for (tem = CALL_INSN_FUNCTION_USAGE (insn); tem; tem = XEXP (tem, 1))
4050 if (GET_CODE (XEXP (tem, 0)) == CLOBBER)
4051 invalidate (SET_DEST (XEXP (tem, 0)), VOIDmode);
4052 XEXP (tem, 0) = canon_reg (XEXP (tem, 0), insn);
4056 if (GET_CODE (x) == SET)
4058 sets = alloca (sizeof (struct set));
4059 sets[0].rtl = x;
4061 /* Ignore SETs that are unconditional jumps.
4062 They never need cse processing, so this does not hurt.
4063 The reason is not efficiency but rather
4064 so that we can test at the end for instructions
4065 that have been simplified to unconditional jumps
4066 and not be misled by unchanged instructions
4067 that were unconditional jumps to begin with. */
4068 if (SET_DEST (x) == pc_rtx
4069 && GET_CODE (SET_SRC (x)) == LABEL_REF)
4072 /* Don't count call-insns, (set (reg 0) (call ...)), as a set.
4073 The hard function value register is used only once, to copy to
4074 someplace else, so it isn't worth cse'ing (and on 80386 is unsafe)!
4075 Ensure we invalidate the destination register. On the 80386 no
4076 other code would invalidate it since it is a fixed_reg.
4077 We need not check the return of apply_change_group; see canon_reg. */
4079 else if (GET_CODE (SET_SRC (x)) == CALL)
4081 canon_reg (SET_SRC (x), insn);
4082 apply_change_group ();
4083 fold_rtx (SET_SRC (x), insn);
4084 invalidate (SET_DEST (x), VOIDmode);
4086 else
4087 n_sets = 1;
4089 else if (GET_CODE (x) == PARALLEL)
4091 int lim = XVECLEN (x, 0);
4093 sets = alloca (lim * sizeof (struct set));
4095 /* Find all regs explicitly clobbered in this insn,
4096 and ensure they are not replaced with any other regs
4097 elsewhere in this insn.
4098 When a reg that is clobbered is also used for input,
4099 we should presume that that is for a reason,
4100 and we should not substitute some other register
4101 which is not supposed to be clobbered.
4102 Therefore, this loop cannot be merged into the one below
4103 because a CALL may precede a CLOBBER and refer to the
4104 value clobbered. We must not let a canonicalization do
4105 anything in that case. */
4106 for (i = 0; i < lim; i++)
4108 rtx y = XVECEXP (x, 0, i);
4109 if (GET_CODE (y) == CLOBBER)
4111 rtx clobbered = XEXP (y, 0);
4113 if (REG_P (clobbered)
4114 || GET_CODE (clobbered) == SUBREG)
4115 invalidate (clobbered, VOIDmode);
4116 else if (GET_CODE (clobbered) == STRICT_LOW_PART
4117 || GET_CODE (clobbered) == ZERO_EXTRACT)
4118 invalidate (XEXP (clobbered, 0), GET_MODE (clobbered));
4122 for (i = 0; i < lim; i++)
4124 rtx y = XVECEXP (x, 0, i);
4125 if (GET_CODE (y) == SET)
4127 /* As above, we ignore unconditional jumps and call-insns and
4128 ignore the result of apply_change_group. */
4129 if (GET_CODE (SET_SRC (y)) == CALL)
4131 canon_reg (SET_SRC (y), insn);
4132 apply_change_group ();
4133 fold_rtx (SET_SRC (y), insn);
4134 invalidate (SET_DEST (y), VOIDmode);
4136 else if (SET_DEST (y) == pc_rtx
4137 && GET_CODE (SET_SRC (y)) == LABEL_REF)
4139 else
4140 sets[n_sets++].rtl = y;
4142 else if (GET_CODE (y) == CLOBBER)
4144 /* If we clobber memory, canon the address.
4145 This does nothing when a register is clobbered
4146 because we have already invalidated the reg. */
4147 if (MEM_P (XEXP (y, 0)))
4148 canon_reg (XEXP (y, 0), NULL_RTX);
4150 else if (GET_CODE (y) == USE
4151 && ! (REG_P (XEXP (y, 0))
4152 && REGNO (XEXP (y, 0)) < FIRST_PSEUDO_REGISTER))
4153 canon_reg (y, NULL_RTX);
4154 else if (GET_CODE (y) == CALL)
4156 /* The result of apply_change_group can be ignored; see
4157 canon_reg. */
4158 canon_reg (y, insn);
4159 apply_change_group ();
4160 fold_rtx (y, insn);
4164 else if (GET_CODE (x) == CLOBBER)
4166 if (MEM_P (XEXP (x, 0)))
4167 canon_reg (XEXP (x, 0), NULL_RTX);
4170 /* Canonicalize a USE of a pseudo register or memory location. */
4171 else if (GET_CODE (x) == USE
4172 && ! (REG_P (XEXP (x, 0))
4173 && REGNO (XEXP (x, 0)) < FIRST_PSEUDO_REGISTER))
4174 canon_reg (XEXP (x, 0), NULL_RTX);
4175 else if (GET_CODE (x) == CALL)
4177 /* The result of apply_change_group can be ignored; see canon_reg. */
4178 canon_reg (x, insn);
4179 apply_change_group ();
4180 fold_rtx (x, insn);
4183 /* Store the equivalent value in SRC_EQV, if different, or if the DEST
4184 is a STRICT_LOW_PART. The latter condition is necessary because SRC_EQV
4185 is handled specially for this case, and if it isn't set, then there will
4186 be no equivalence for the destination. */
4187 if (n_sets == 1 && REG_NOTES (insn) != 0
4188 && (tem = find_reg_note (insn, REG_EQUAL, NULL_RTX)) != 0
4189 && (! rtx_equal_p (XEXP (tem, 0), SET_SRC (sets[0].rtl))
4190 || GET_CODE (SET_DEST (sets[0].rtl)) == STRICT_LOW_PART))
4192 src_eqv = fold_rtx (canon_reg (XEXP (tem, 0), NULL_RTX), insn);
4193 XEXP (tem, 0) = src_eqv;
4196 /* Canonicalize sources and addresses of destinations.
4197 We do this in a separate pass to avoid problems when a MATCH_DUP is
4198 present in the insn pattern. In that case, we want to ensure that
4199 we don't break the duplicate nature of the pattern. So we will replace
4200 both operands at the same time. Otherwise, we would fail to find an
4201 equivalent substitution in the loop calling validate_change below.
4203 We used to suppress canonicalization of DEST if it appears in SRC,
4204 but we don't do this any more. */
4206 for (i = 0; i < n_sets; i++)
4208 rtx dest = SET_DEST (sets[i].rtl);
4209 rtx src = SET_SRC (sets[i].rtl);
4210 rtx new = canon_reg (src, insn);
4212 sets[i].orig_src = src;
4213 validate_change (insn, &SET_SRC (sets[i].rtl), new, 1);
4215 if (GET_CODE (dest) == ZERO_EXTRACT)
4217 validate_change (insn, &XEXP (dest, 1),
4218 canon_reg (XEXP (dest, 1), insn), 1);
4219 validate_change (insn, &XEXP (dest, 2),
4220 canon_reg (XEXP (dest, 2), insn), 1);
4223 while (GET_CODE (dest) == SUBREG
4224 || GET_CODE (dest) == ZERO_EXTRACT
4225 || GET_CODE (dest) == STRICT_LOW_PART)
4226 dest = XEXP (dest, 0);
4228 if (MEM_P (dest))
4229 canon_reg (dest, insn);
4232 /* Now that we have done all the replacements, we can apply the change
4233 group and see if they all work. Note that this will cause some
4234 canonicalizations that would have worked individually not to be applied
4235 because some other canonicalization didn't work, but this should not
4236 occur often.
4238 The result of apply_change_group can be ignored; see canon_reg. */
4240 apply_change_group ();
4242 /* Set sets[i].src_elt to the class each source belongs to.
4243 Detect assignments from or to volatile things
4244 and set set[i] to zero so they will be ignored
4245 in the rest of this function.
4247 Nothing in this loop changes the hash table or the register chains. */
4249 for (i = 0; i < n_sets; i++)
4251 rtx src, dest;
4252 rtx src_folded;
4253 struct table_elt *elt = 0, *p;
4254 enum machine_mode mode;
4255 rtx src_eqv_here;
4256 rtx src_const = 0;
4257 rtx src_related = 0;
4258 struct table_elt *src_const_elt = 0;
4259 int src_cost = MAX_COST;
4260 int src_eqv_cost = MAX_COST;
4261 int src_folded_cost = MAX_COST;
4262 int src_related_cost = MAX_COST;
4263 int src_elt_cost = MAX_COST;
4264 int src_regcost = MAX_COST;
4265 int src_eqv_regcost = MAX_COST;
4266 int src_folded_regcost = MAX_COST;
4267 int src_related_regcost = MAX_COST;
4268 int src_elt_regcost = MAX_COST;
4269 /* Set nonzero if we need to call force_const_mem on with the
4270 contents of src_folded before using it. */
4271 int src_folded_force_flag = 0;
4273 dest = SET_DEST (sets[i].rtl);
4274 src = SET_SRC (sets[i].rtl);
4276 /* If SRC is a constant that has no machine mode,
4277 hash it with the destination's machine mode.
4278 This way we can keep different modes separate. */
4280 mode = GET_MODE (src) == VOIDmode ? GET_MODE (dest) : GET_MODE (src);
4281 sets[i].mode = mode;
4283 if (src_eqv)
4285 enum machine_mode eqvmode = mode;
4286 if (GET_CODE (dest) == STRICT_LOW_PART)
4287 eqvmode = GET_MODE (SUBREG_REG (XEXP (dest, 0)));
4288 do_not_record = 0;
4289 hash_arg_in_memory = 0;
4290 src_eqv_hash = HASH (src_eqv, eqvmode);
4292 /* Find the equivalence class for the equivalent expression. */
4294 if (!do_not_record)
4295 src_eqv_elt = lookup (src_eqv, src_eqv_hash, eqvmode);
4297 src_eqv_volatile = do_not_record;
4298 src_eqv_in_memory = hash_arg_in_memory;
4301 /* If this is a STRICT_LOW_PART assignment, src_eqv corresponds to the
4302 value of the INNER register, not the destination. So it is not
4303 a valid substitution for the source. But save it for later. */
4304 if (GET_CODE (dest) == STRICT_LOW_PART)
4305 src_eqv_here = 0;
4306 else
4307 src_eqv_here = src_eqv;
4309 /* Simplify and foldable subexpressions in SRC. Then get the fully-
4310 simplified result, which may not necessarily be valid. */
4311 src_folded = fold_rtx (src, insn);
4313 #if 0
4314 /* ??? This caused bad code to be generated for the m68k port with -O2.
4315 Suppose src is (CONST_INT -1), and that after truncation src_folded
4316 is (CONST_INT 3). Suppose src_folded is then used for src_const.
4317 At the end we will add src and src_const to the same equivalence
4318 class. We now have 3 and -1 on the same equivalence class. This
4319 causes later instructions to be mis-optimized. */
4320 /* If storing a constant in a bitfield, pre-truncate the constant
4321 so we will be able to record it later. */
4322 if (GET_CODE (SET_DEST (sets[i].rtl)) == ZERO_EXTRACT)
4324 rtx width = XEXP (SET_DEST (sets[i].rtl), 1);
4326 if (GET_CODE (src) == CONST_INT
4327 && GET_CODE (width) == CONST_INT
4328 && INTVAL (width) < HOST_BITS_PER_WIDE_INT
4329 && (INTVAL (src) & ((HOST_WIDE_INT) (-1) << INTVAL (width))))
4330 src_folded
4331 = GEN_INT (INTVAL (src) & (((HOST_WIDE_INT) 1
4332 << INTVAL (width)) - 1));
4334 #endif
4336 /* Compute SRC's hash code, and also notice if it
4337 should not be recorded at all. In that case,
4338 prevent any further processing of this assignment. */
4339 do_not_record = 0;
4340 hash_arg_in_memory = 0;
4342 sets[i].src = src;
4343 sets[i].src_hash = HASH (src, mode);
4344 sets[i].src_volatile = do_not_record;
4345 sets[i].src_in_memory = hash_arg_in_memory;
4347 /* If SRC is a MEM, there is a REG_EQUIV note for SRC, and DEST is
4348 a pseudo, do not record SRC. Using SRC as a replacement for
4349 anything else will be incorrect in that situation. Note that
4350 this usually occurs only for stack slots, in which case all the
4351 RTL would be referring to SRC, so we don't lose any optimization
4352 opportunities by not having SRC in the hash table. */
4354 if (MEM_P (src)
4355 && find_reg_note (insn, REG_EQUIV, NULL_RTX) != 0
4356 && REG_P (dest)
4357 && REGNO (dest) >= FIRST_PSEUDO_REGISTER)
4358 sets[i].src_volatile = 1;
4360 #if 0
4361 /* It is no longer clear why we used to do this, but it doesn't
4362 appear to still be needed. So let's try without it since this
4363 code hurts cse'ing widened ops. */
4364 /* If source is a paradoxical subreg (such as QI treated as an SI),
4365 treat it as volatile. It may do the work of an SI in one context
4366 where the extra bits are not being used, but cannot replace an SI
4367 in general. */
4368 if (GET_CODE (src) == SUBREG
4369 && (GET_MODE_SIZE (GET_MODE (src))
4370 > GET_MODE_SIZE (GET_MODE (SUBREG_REG (src)))))
4371 sets[i].src_volatile = 1;
4372 #endif
4374 /* Locate all possible equivalent forms for SRC. Try to replace
4375 SRC in the insn with each cheaper equivalent.
4377 We have the following types of equivalents: SRC itself, a folded
4378 version, a value given in a REG_EQUAL note, or a value related
4379 to a constant.
4381 Each of these equivalents may be part of an additional class
4382 of equivalents (if more than one is in the table, they must be in
4383 the same class; we check for this).
4385 If the source is volatile, we don't do any table lookups.
4387 We note any constant equivalent for possible later use in a
4388 REG_NOTE. */
4390 if (!sets[i].src_volatile)
4391 elt = lookup (src, sets[i].src_hash, mode);
4393 sets[i].src_elt = elt;
4395 if (elt && src_eqv_here && src_eqv_elt)
4397 if (elt->first_same_value != src_eqv_elt->first_same_value)
4399 /* The REG_EQUAL is indicating that two formerly distinct
4400 classes are now equivalent. So merge them. */
4401 merge_equiv_classes (elt, src_eqv_elt);
4402 src_eqv_hash = HASH (src_eqv, elt->mode);
4403 src_eqv_elt = lookup (src_eqv, src_eqv_hash, elt->mode);
4406 src_eqv_here = 0;
4409 else if (src_eqv_elt)
4410 elt = src_eqv_elt;
4412 /* Try to find a constant somewhere and record it in `src_const'.
4413 Record its table element, if any, in `src_const_elt'. Look in
4414 any known equivalences first. (If the constant is not in the
4415 table, also set `sets[i].src_const_hash'). */
4416 if (elt)
4417 for (p = elt->first_same_value; p; p = p->next_same_value)
4418 if (p->is_const)
4420 src_const = p->exp;
4421 src_const_elt = elt;
4422 break;
4425 if (src_const == 0
4426 && (CONSTANT_P (src_folded)
4427 /* Consider (minus (label_ref L1) (label_ref L2)) as
4428 "constant" here so we will record it. This allows us
4429 to fold switch statements when an ADDR_DIFF_VEC is used. */
4430 || (GET_CODE (src_folded) == MINUS
4431 && GET_CODE (XEXP (src_folded, 0)) == LABEL_REF
4432 && GET_CODE (XEXP (src_folded, 1)) == LABEL_REF)))
4433 src_const = src_folded, src_const_elt = elt;
4434 else if (src_const == 0 && src_eqv_here && CONSTANT_P (src_eqv_here))
4435 src_const = src_eqv_here, src_const_elt = src_eqv_elt;
4437 /* If we don't know if the constant is in the table, get its
4438 hash code and look it up. */
4439 if (src_const && src_const_elt == 0)
4441 sets[i].src_const_hash = HASH (src_const, mode);
4442 src_const_elt = lookup (src_const, sets[i].src_const_hash, mode);
4445 sets[i].src_const = src_const;
4446 sets[i].src_const_elt = src_const_elt;
4448 /* If the constant and our source are both in the table, mark them as
4449 equivalent. Otherwise, if a constant is in the table but the source
4450 isn't, set ELT to it. */
4451 if (src_const_elt && elt
4452 && src_const_elt->first_same_value != elt->first_same_value)
4453 merge_equiv_classes (elt, src_const_elt);
4454 else if (src_const_elt && elt == 0)
4455 elt = src_const_elt;
4457 /* See if there is a register linearly related to a constant
4458 equivalent of SRC. */
4459 if (src_const
4460 && (GET_CODE (src_const) == CONST
4461 || (src_const_elt && src_const_elt->related_value != 0)))
4463 src_related = use_related_value (src_const, src_const_elt);
4464 if (src_related)
4466 struct table_elt *src_related_elt
4467 = lookup (src_related, HASH (src_related, mode), mode);
4468 if (src_related_elt && elt)
4470 if (elt->first_same_value
4471 != src_related_elt->first_same_value)
4472 /* This can occur when we previously saw a CONST
4473 involving a SYMBOL_REF and then see the SYMBOL_REF
4474 twice. Merge the involved classes. */
4475 merge_equiv_classes (elt, src_related_elt);
4477 src_related = 0;
4478 src_related_elt = 0;
4480 else if (src_related_elt && elt == 0)
4481 elt = src_related_elt;
4485 /* See if we have a CONST_INT that is already in a register in a
4486 wider mode. */
4488 if (src_const && src_related == 0 && GET_CODE (src_const) == CONST_INT
4489 && GET_MODE_CLASS (mode) == MODE_INT
4490 && GET_MODE_BITSIZE (mode) < BITS_PER_WORD)
4492 enum machine_mode wider_mode;
4494 for (wider_mode = GET_MODE_WIDER_MODE (mode);
4495 GET_MODE_BITSIZE (wider_mode) <= BITS_PER_WORD
4496 && src_related == 0;
4497 wider_mode = GET_MODE_WIDER_MODE (wider_mode))
4499 struct table_elt *const_elt
4500 = lookup (src_const, HASH (src_const, wider_mode), wider_mode);
4502 if (const_elt == 0)
4503 continue;
4505 for (const_elt = const_elt->first_same_value;
4506 const_elt; const_elt = const_elt->next_same_value)
4507 if (REG_P (const_elt->exp))
4509 src_related = gen_lowpart (mode,
4510 const_elt->exp);
4511 break;
4516 /* Another possibility is that we have an AND with a constant in
4517 a mode narrower than a word. If so, it might have been generated
4518 as part of an "if" which would narrow the AND. If we already
4519 have done the AND in a wider mode, we can use a SUBREG of that
4520 value. */
4522 if (flag_expensive_optimizations && ! src_related
4523 && GET_CODE (src) == AND && GET_CODE (XEXP (src, 1)) == CONST_INT
4524 && GET_MODE_SIZE (mode) < UNITS_PER_WORD)
4526 enum machine_mode tmode;
4527 rtx new_and = gen_rtx_AND (VOIDmode, NULL_RTX, XEXP (src, 1));
4529 for (tmode = GET_MODE_WIDER_MODE (mode);
4530 GET_MODE_SIZE (tmode) <= UNITS_PER_WORD;
4531 tmode = GET_MODE_WIDER_MODE (tmode))
4533 rtx inner = gen_lowpart (tmode, XEXP (src, 0));
4534 struct table_elt *larger_elt;
4536 if (inner)
4538 PUT_MODE (new_and, tmode);
4539 XEXP (new_and, 0) = inner;
4540 larger_elt = lookup (new_and, HASH (new_and, tmode), tmode);
4541 if (larger_elt == 0)
4542 continue;
4544 for (larger_elt = larger_elt->first_same_value;
4545 larger_elt; larger_elt = larger_elt->next_same_value)
4546 if (REG_P (larger_elt->exp))
4548 src_related
4549 = gen_lowpart (mode, larger_elt->exp);
4550 break;
4553 if (src_related)
4554 break;
4559 #ifdef LOAD_EXTEND_OP
4560 /* See if a MEM has already been loaded with a widening operation;
4561 if it has, we can use a subreg of that. Many CISC machines
4562 also have such operations, but this is only likely to be
4563 beneficial on these machines. */
4565 if (flag_expensive_optimizations && src_related == 0
4566 && (GET_MODE_SIZE (mode) < UNITS_PER_WORD)
4567 && GET_MODE_CLASS (mode) == MODE_INT
4568 && MEM_P (src) && ! do_not_record
4569 && LOAD_EXTEND_OP (mode) != UNKNOWN)
4571 struct rtx_def memory_extend_buf;
4572 rtx memory_extend_rtx = &memory_extend_buf;
4573 enum machine_mode tmode;
4575 /* Set what we are trying to extend and the operation it might
4576 have been extended with. */
4577 memset (memory_extend_rtx, 0, sizeof(*memory_extend_rtx));
4578 PUT_CODE (memory_extend_rtx, LOAD_EXTEND_OP (mode));
4579 XEXP (memory_extend_rtx, 0) = src;
4581 for (tmode = GET_MODE_WIDER_MODE (mode);
4582 GET_MODE_SIZE (tmode) <= UNITS_PER_WORD;
4583 tmode = GET_MODE_WIDER_MODE (tmode))
4585 struct table_elt *larger_elt;
4587 PUT_MODE (memory_extend_rtx, tmode);
4588 larger_elt = lookup (memory_extend_rtx,
4589 HASH (memory_extend_rtx, tmode), tmode);
4590 if (larger_elt == 0)
4591 continue;
4593 for (larger_elt = larger_elt->first_same_value;
4594 larger_elt; larger_elt = larger_elt->next_same_value)
4595 if (REG_P (larger_elt->exp))
4597 src_related = gen_lowpart (mode,
4598 larger_elt->exp);
4599 break;
4602 if (src_related)
4603 break;
4606 #endif /* LOAD_EXTEND_OP */
4608 if (src == src_folded)
4609 src_folded = 0;
4611 /* At this point, ELT, if nonzero, points to a class of expressions
4612 equivalent to the source of this SET and SRC, SRC_EQV, SRC_FOLDED,
4613 and SRC_RELATED, if nonzero, each contain additional equivalent
4614 expressions. Prune these latter expressions by deleting expressions
4615 already in the equivalence class.
4617 Check for an equivalent identical to the destination. If found,
4618 this is the preferred equivalent since it will likely lead to
4619 elimination of the insn. Indicate this by placing it in
4620 `src_related'. */
4622 if (elt)
4623 elt = elt->first_same_value;
4624 for (p = elt; p; p = p->next_same_value)
4626 enum rtx_code code = GET_CODE (p->exp);
4628 /* If the expression is not valid, ignore it. Then we do not
4629 have to check for validity below. In most cases, we can use
4630 `rtx_equal_p', since canonicalization has already been done. */
4631 if (code != REG && ! exp_equiv_p (p->exp, p->exp, 1, false))
4632 continue;
4634 /* Also skip paradoxical subregs, unless that's what we're
4635 looking for. */
4636 if (code == SUBREG
4637 && (GET_MODE_SIZE (GET_MODE (p->exp))
4638 > GET_MODE_SIZE (GET_MODE (SUBREG_REG (p->exp))))
4639 && ! (src != 0
4640 && GET_CODE (src) == SUBREG
4641 && GET_MODE (src) == GET_MODE (p->exp)
4642 && (GET_MODE_SIZE (GET_MODE (SUBREG_REG (src)))
4643 < GET_MODE_SIZE (GET_MODE (SUBREG_REG (p->exp))))))
4644 continue;
4646 if (src && GET_CODE (src) == code && rtx_equal_p (src, p->exp))
4647 src = 0;
4648 else if (src_folded && GET_CODE (src_folded) == code
4649 && rtx_equal_p (src_folded, p->exp))
4650 src_folded = 0;
4651 else if (src_eqv_here && GET_CODE (src_eqv_here) == code
4652 && rtx_equal_p (src_eqv_here, p->exp))
4653 src_eqv_here = 0;
4654 else if (src_related && GET_CODE (src_related) == code
4655 && rtx_equal_p (src_related, p->exp))
4656 src_related = 0;
4658 /* This is the same as the destination of the insns, we want
4659 to prefer it. Copy it to src_related. The code below will
4660 then give it a negative cost. */
4661 if (GET_CODE (dest) == code && rtx_equal_p (p->exp, dest))
4662 src_related = dest;
4665 /* Find the cheapest valid equivalent, trying all the available
4666 possibilities. Prefer items not in the hash table to ones
4667 that are when they are equal cost. Note that we can never
4668 worsen an insn as the current contents will also succeed.
4669 If we find an equivalent identical to the destination, use it as best,
4670 since this insn will probably be eliminated in that case. */
4671 if (src)
4673 if (rtx_equal_p (src, dest))
4674 src_cost = src_regcost = -1;
4675 else
4677 src_cost = COST (src);
4678 src_regcost = approx_reg_cost (src);
4682 if (src_eqv_here)
4684 if (rtx_equal_p (src_eqv_here, dest))
4685 src_eqv_cost = src_eqv_regcost = -1;
4686 else
4688 src_eqv_cost = COST (src_eqv_here);
4689 src_eqv_regcost = approx_reg_cost (src_eqv_here);
4693 if (src_folded)
4695 if (rtx_equal_p (src_folded, dest))
4696 src_folded_cost = src_folded_regcost = -1;
4697 else
4699 src_folded_cost = COST (src_folded);
4700 src_folded_regcost = approx_reg_cost (src_folded);
4704 if (src_related)
4706 if (rtx_equal_p (src_related, dest))
4707 src_related_cost = src_related_regcost = -1;
4708 else
4710 src_related_cost = COST (src_related);
4711 src_related_regcost = approx_reg_cost (src_related);
4715 /* If this was an indirect jump insn, a known label will really be
4716 cheaper even though it looks more expensive. */
4717 if (dest == pc_rtx && src_const && GET_CODE (src_const) == LABEL_REF)
4718 src_folded = src_const, src_folded_cost = src_folded_regcost = -1;
4720 /* Terminate loop when replacement made. This must terminate since
4721 the current contents will be tested and will always be valid. */
4722 while (1)
4724 rtx trial;
4726 /* Skip invalid entries. */
4727 while (elt && !REG_P (elt->exp)
4728 && ! exp_equiv_p (elt->exp, elt->exp, 1, false))
4729 elt = elt->next_same_value;
4731 /* A paradoxical subreg would be bad here: it'll be the right
4732 size, but later may be adjusted so that the upper bits aren't
4733 what we want. So reject it. */
4734 if (elt != 0
4735 && GET_CODE (elt->exp) == SUBREG
4736 && (GET_MODE_SIZE (GET_MODE (elt->exp))
4737 > GET_MODE_SIZE (GET_MODE (SUBREG_REG (elt->exp))))
4738 /* It is okay, though, if the rtx we're trying to match
4739 will ignore any of the bits we can't predict. */
4740 && ! (src != 0
4741 && GET_CODE (src) == SUBREG
4742 && GET_MODE (src) == GET_MODE (elt->exp)
4743 && (GET_MODE_SIZE (GET_MODE (SUBREG_REG (src)))
4744 < GET_MODE_SIZE (GET_MODE (SUBREG_REG (elt->exp))))))
4746 elt = elt->next_same_value;
4747 continue;
4750 if (elt)
4752 src_elt_cost = elt->cost;
4753 src_elt_regcost = elt->regcost;
4756 /* Find cheapest and skip it for the next time. For items
4757 of equal cost, use this order:
4758 src_folded, src, src_eqv, src_related and hash table entry. */
4759 if (src_folded
4760 && preferable (src_folded_cost, src_folded_regcost,
4761 src_cost, src_regcost) <= 0
4762 && preferable (src_folded_cost, src_folded_regcost,
4763 src_eqv_cost, src_eqv_regcost) <= 0
4764 && preferable (src_folded_cost, src_folded_regcost,
4765 src_related_cost, src_related_regcost) <= 0
4766 && preferable (src_folded_cost, src_folded_regcost,
4767 src_elt_cost, src_elt_regcost) <= 0)
4769 trial = src_folded, src_folded_cost = MAX_COST;
4770 if (src_folded_force_flag)
4772 rtx forced = force_const_mem (mode, trial);
4773 if (forced)
4774 trial = forced;
4777 else if (src
4778 && preferable (src_cost, src_regcost,
4779 src_eqv_cost, src_eqv_regcost) <= 0
4780 && preferable (src_cost, src_regcost,
4781 src_related_cost, src_related_regcost) <= 0
4782 && preferable (src_cost, src_regcost,
4783 src_elt_cost, src_elt_regcost) <= 0)
4784 trial = src, src_cost = MAX_COST;
4785 else if (src_eqv_here
4786 && preferable (src_eqv_cost, src_eqv_regcost,
4787 src_related_cost, src_related_regcost) <= 0
4788 && preferable (src_eqv_cost, src_eqv_regcost,
4789 src_elt_cost, src_elt_regcost) <= 0)
4790 trial = copy_rtx (src_eqv_here), src_eqv_cost = MAX_COST;
4791 else if (src_related
4792 && preferable (src_related_cost, src_related_regcost,
4793 src_elt_cost, src_elt_regcost) <= 0)
4794 trial = copy_rtx (src_related), src_related_cost = MAX_COST;
4795 else
4797 trial = copy_rtx (elt->exp);
4798 elt = elt->next_same_value;
4799 src_elt_cost = MAX_COST;
4802 /* We don't normally have an insn matching (set (pc) (pc)), so
4803 check for this separately here. We will delete such an
4804 insn below.
4806 For other cases such as a table jump or conditional jump
4807 where we know the ultimate target, go ahead and replace the
4808 operand. While that may not make a valid insn, we will
4809 reemit the jump below (and also insert any necessary
4810 barriers). */
4811 if (n_sets == 1 && dest == pc_rtx
4812 && (trial == pc_rtx
4813 || (GET_CODE (trial) == LABEL_REF
4814 && ! condjump_p (insn))))
4816 /* Don't substitute non-local labels, this confuses CFG. */
4817 if (GET_CODE (trial) == LABEL_REF
4818 && LABEL_REF_NONLOCAL_P (trial))
4819 continue;
4821 SET_SRC (sets[i].rtl) = trial;
4822 cse_jumps_altered = 1;
4823 break;
4826 /* Reject certain invalid forms of CONST that we create. */
4827 else if (CONSTANT_P (trial)
4828 && GET_CODE (trial) == CONST
4829 /* Reject cases that will cause decode_rtx_const to
4830 die. On the alpha when simplifying a switch, we
4831 get (const (truncate (minus (label_ref)
4832 (label_ref)))). */
4833 && (GET_CODE (XEXP (trial, 0)) == TRUNCATE
4834 /* Likewise on IA-64, except without the
4835 truncate. */
4836 || (GET_CODE (XEXP (trial, 0)) == MINUS
4837 && GET_CODE (XEXP (XEXP (trial, 0), 0)) == LABEL_REF
4838 && GET_CODE (XEXP (XEXP (trial, 0), 1)) == LABEL_REF)))
4839 /* Do nothing for this case. */
4842 /* Look for a substitution that makes a valid insn. */
4843 else if (validate_change (insn, &SET_SRC (sets[i].rtl), trial, 0))
4845 rtx new = canon_reg (SET_SRC (sets[i].rtl), insn);
4847 /* If we just made a substitution inside a libcall, then we
4848 need to make the same substitution in any notes attached
4849 to the RETVAL insn. */
4850 if (libcall_insn
4851 && (REG_P (sets[i].orig_src)
4852 || GET_CODE (sets[i].orig_src) == SUBREG
4853 || MEM_P (sets[i].orig_src)))
4855 rtx note = find_reg_equal_equiv_note (libcall_insn);
4856 if (note != 0)
4857 XEXP (note, 0) = simplify_replace_rtx (XEXP (note, 0),
4858 sets[i].orig_src,
4859 copy_rtx (new));
4862 /* The result of apply_change_group can be ignored; see
4863 canon_reg. */
4865 validate_change (insn, &SET_SRC (sets[i].rtl), new, 1);
4866 apply_change_group ();
4868 /* With non-call exceptions, if this was an insn that could
4869 trap, we may have made it non-throwing now. For example
4870 we may have replaced a load with a register. */
4871 if (flag_non_call_exceptions
4872 && insn == BB_END (BLOCK_FOR_INSN (insn)))
4873 purge_dead_edges (BLOCK_FOR_INSN (insn));
4875 break;
4878 /* If we previously found constant pool entries for
4879 constants and this is a constant, try making a
4880 pool entry. Put it in src_folded unless we already have done
4881 this since that is where it likely came from. */
4883 else if (constant_pool_entries_cost
4884 && CONSTANT_P (trial)
4885 && (src_folded == 0
4886 || (!MEM_P (src_folded)
4887 && ! src_folded_force_flag))
4888 && GET_MODE_CLASS (mode) != MODE_CC
4889 && mode != VOIDmode)
4891 src_folded_force_flag = 1;
4892 src_folded = trial;
4893 src_folded_cost = constant_pool_entries_cost;
4894 src_folded_regcost = constant_pool_entries_regcost;
4898 src = SET_SRC (sets[i].rtl);
4900 /* In general, it is good to have a SET with SET_SRC == SET_DEST.
4901 However, there is an important exception: If both are registers
4902 that are not the head of their equivalence class, replace SET_SRC
4903 with the head of the class. If we do not do this, we will have
4904 both registers live over a portion of the basic block. This way,
4905 their lifetimes will likely abut instead of overlapping. */
4906 if (REG_P (dest)
4907 && REGNO_QTY_VALID_P (REGNO (dest)))
4909 int dest_q = REG_QTY (REGNO (dest));
4910 struct qty_table_elem *dest_ent = &qty_table[dest_q];
4912 if (dest_ent->mode == GET_MODE (dest)
4913 && dest_ent->first_reg != REGNO (dest)
4914 && REG_P (src) && REGNO (src) == REGNO (dest)
4915 /* Don't do this if the original insn had a hard reg as
4916 SET_SRC or SET_DEST. */
4917 && (!REG_P (sets[i].src)
4918 || REGNO (sets[i].src) >= FIRST_PSEUDO_REGISTER)
4919 && (!REG_P (dest) || REGNO (dest) >= FIRST_PSEUDO_REGISTER))
4920 /* We can't call canon_reg here because it won't do anything if
4921 SRC is a hard register. */
4923 int src_q = REG_QTY (REGNO (src));
4924 struct qty_table_elem *src_ent = &qty_table[src_q];
4925 int first = src_ent->first_reg;
4926 rtx new_src
4927 = (first >= FIRST_PSEUDO_REGISTER
4928 ? regno_reg_rtx[first] : gen_rtx_REG (GET_MODE (src), first));
4930 /* We must use validate-change even for this, because this
4931 might be a special no-op instruction, suitable only to
4932 tag notes onto. */
4933 if (validate_change (insn, &SET_SRC (sets[i].rtl), new_src, 0))
4935 src = new_src;
4936 /* If we had a constant that is cheaper than what we are now
4937 setting SRC to, use that constant. We ignored it when we
4938 thought we could make this into a no-op. */
4939 if (src_const && COST (src_const) < COST (src)
4940 && validate_change (insn, &SET_SRC (sets[i].rtl),
4941 src_const, 0))
4942 src = src_const;
4947 /* If we made a change, recompute SRC values. */
4948 if (src != sets[i].src)
4950 do_not_record = 0;
4951 hash_arg_in_memory = 0;
4952 sets[i].src = src;
4953 sets[i].src_hash = HASH (src, mode);
4954 sets[i].src_volatile = do_not_record;
4955 sets[i].src_in_memory = hash_arg_in_memory;
4956 sets[i].src_elt = lookup (src, sets[i].src_hash, mode);
4959 /* If this is a single SET, we are setting a register, and we have an
4960 equivalent constant, we want to add a REG_NOTE. We don't want
4961 to write a REG_EQUAL note for a constant pseudo since verifying that
4962 that pseudo hasn't been eliminated is a pain. Such a note also
4963 won't help anything.
4965 Avoid a REG_EQUAL note for (CONST (MINUS (LABEL_REF) (LABEL_REF)))
4966 which can be created for a reference to a compile time computable
4967 entry in a jump table. */
4969 if (n_sets == 1 && src_const && REG_P (dest)
4970 && !REG_P (src_const)
4971 && ! (GET_CODE (src_const) == CONST
4972 && GET_CODE (XEXP (src_const, 0)) == MINUS
4973 && GET_CODE (XEXP (XEXP (src_const, 0), 0)) == LABEL_REF
4974 && GET_CODE (XEXP (XEXP (src_const, 0), 1)) == LABEL_REF))
4976 /* We only want a REG_EQUAL note if src_const != src. */
4977 if (! rtx_equal_p (src, src_const))
4979 /* Make sure that the rtx is not shared. */
4980 src_const = copy_rtx (src_const);
4982 /* Record the actual constant value in a REG_EQUAL note,
4983 making a new one if one does not already exist. */
4984 set_unique_reg_note (insn, REG_EQUAL, src_const);
4988 /* Now deal with the destination. */
4989 do_not_record = 0;
4991 /* Look within any ZERO_EXTRACT to the MEM or REG within it. */
4992 while (GET_CODE (dest) == SUBREG
4993 || GET_CODE (dest) == ZERO_EXTRACT
4994 || GET_CODE (dest) == STRICT_LOW_PART)
4995 dest = XEXP (dest, 0);
4997 sets[i].inner_dest = dest;
4999 if (MEM_P (dest))
5001 #ifdef PUSH_ROUNDING
5002 /* Stack pushes invalidate the stack pointer. */
5003 rtx addr = XEXP (dest, 0);
5004 if (GET_RTX_CLASS (GET_CODE (addr)) == RTX_AUTOINC
5005 && XEXP (addr, 0) == stack_pointer_rtx)
5006 invalidate (stack_pointer_rtx, VOIDmode);
5007 #endif
5008 dest = fold_rtx (dest, insn);
5011 /* Compute the hash code of the destination now,
5012 before the effects of this instruction are recorded,
5013 since the register values used in the address computation
5014 are those before this instruction. */
5015 sets[i].dest_hash = HASH (dest, mode);
5017 /* Don't enter a bit-field in the hash table
5018 because the value in it after the store
5019 may not equal what was stored, due to truncation. */
5021 if (GET_CODE (SET_DEST (sets[i].rtl)) == ZERO_EXTRACT)
5023 rtx width = XEXP (SET_DEST (sets[i].rtl), 1);
5025 if (src_const != 0 && GET_CODE (src_const) == CONST_INT
5026 && GET_CODE (width) == CONST_INT
5027 && INTVAL (width) < HOST_BITS_PER_WIDE_INT
5028 && ! (INTVAL (src_const)
5029 & ((HOST_WIDE_INT) (-1) << INTVAL (width))))
5030 /* Exception: if the value is constant,
5031 and it won't be truncated, record it. */
5033 else
5035 /* This is chosen so that the destination will be invalidated
5036 but no new value will be recorded.
5037 We must invalidate because sometimes constant
5038 values can be recorded for bitfields. */
5039 sets[i].src_elt = 0;
5040 sets[i].src_volatile = 1;
5041 src_eqv = 0;
5042 src_eqv_elt = 0;
5046 /* If only one set in a JUMP_INSN and it is now a no-op, we can delete
5047 the insn. */
5048 else if (n_sets == 1 && dest == pc_rtx && src == pc_rtx)
5050 /* One less use of the label this insn used to jump to. */
5051 delete_insn_and_edges (insn);
5052 cse_jumps_altered = 1;
5053 /* No more processing for this set. */
5054 sets[i].rtl = 0;
5057 /* If this SET is now setting PC to a label, we know it used to
5058 be a conditional or computed branch. */
5059 else if (dest == pc_rtx && GET_CODE (src) == LABEL_REF
5060 && !LABEL_REF_NONLOCAL_P (src))
5062 /* Now emit a BARRIER after the unconditional jump. */
5063 if (NEXT_INSN (insn) == 0
5064 || !BARRIER_P (NEXT_INSN (insn)))
5065 emit_barrier_after (insn);
5067 /* We reemit the jump in as many cases as possible just in
5068 case the form of an unconditional jump is significantly
5069 different than a computed jump or conditional jump.
5071 If this insn has multiple sets, then reemitting the
5072 jump is nontrivial. So instead we just force rerecognition
5073 and hope for the best. */
5074 if (n_sets == 1)
5076 rtx new, note;
5078 new = emit_jump_insn_before (gen_jump (XEXP (src, 0)), insn);
5079 JUMP_LABEL (new) = XEXP (src, 0);
5080 LABEL_NUSES (XEXP (src, 0))++;
5082 /* Make sure to copy over REG_NON_LOCAL_GOTO. */
5083 note = find_reg_note (insn, REG_NON_LOCAL_GOTO, 0);
5084 if (note)
5086 XEXP (note, 1) = NULL_RTX;
5087 REG_NOTES (new) = note;
5090 delete_insn_and_edges (insn);
5091 insn = new;
5093 /* Now emit a BARRIER after the unconditional jump. */
5094 if (NEXT_INSN (insn) == 0
5095 || !BARRIER_P (NEXT_INSN (insn)))
5096 emit_barrier_after (insn);
5098 else
5099 INSN_CODE (insn) = -1;
5101 /* Do not bother deleting any unreachable code,
5102 let jump/flow do that. */
5104 cse_jumps_altered = 1;
5105 sets[i].rtl = 0;
5108 /* If destination is volatile, invalidate it and then do no further
5109 processing for this assignment. */
5111 else if (do_not_record)
5113 if (REG_P (dest) || GET_CODE (dest) == SUBREG)
5114 invalidate (dest, VOIDmode);
5115 else if (MEM_P (dest))
5116 invalidate (dest, VOIDmode);
5117 else if (GET_CODE (dest) == STRICT_LOW_PART
5118 || GET_CODE (dest) == ZERO_EXTRACT)
5119 invalidate (XEXP (dest, 0), GET_MODE (dest));
5120 sets[i].rtl = 0;
5123 if (sets[i].rtl != 0 && dest != SET_DEST (sets[i].rtl))
5124 sets[i].dest_hash = HASH (SET_DEST (sets[i].rtl), mode);
5126 #ifdef HAVE_cc0
5127 /* If setting CC0, record what it was set to, or a constant, if it
5128 is equivalent to a constant. If it is being set to a floating-point
5129 value, make a COMPARE with the appropriate constant of 0. If we
5130 don't do this, later code can interpret this as a test against
5131 const0_rtx, which can cause problems if we try to put it into an
5132 insn as a floating-point operand. */
5133 if (dest == cc0_rtx)
5135 this_insn_cc0 = src_const && mode != VOIDmode ? src_const : src;
5136 this_insn_cc0_mode = mode;
5137 if (FLOAT_MODE_P (mode))
5138 this_insn_cc0 = gen_rtx_COMPARE (VOIDmode, this_insn_cc0,
5139 CONST0_RTX (mode));
5141 #endif
5144 /* Now enter all non-volatile source expressions in the hash table
5145 if they are not already present.
5146 Record their equivalence classes in src_elt.
5147 This way we can insert the corresponding destinations into
5148 the same classes even if the actual sources are no longer in them
5149 (having been invalidated). */
5151 if (src_eqv && src_eqv_elt == 0 && sets[0].rtl != 0 && ! src_eqv_volatile
5152 && ! rtx_equal_p (src_eqv, SET_DEST (sets[0].rtl)))
5154 struct table_elt *elt;
5155 struct table_elt *classp = sets[0].src_elt;
5156 rtx dest = SET_DEST (sets[0].rtl);
5157 enum machine_mode eqvmode = GET_MODE (dest);
5159 if (GET_CODE (dest) == STRICT_LOW_PART)
5161 eqvmode = GET_MODE (SUBREG_REG (XEXP (dest, 0)));
5162 classp = 0;
5164 if (insert_regs (src_eqv, classp, 0))
5166 rehash_using_reg (src_eqv);
5167 src_eqv_hash = HASH (src_eqv, eqvmode);
5169 elt = insert (src_eqv, classp, src_eqv_hash, eqvmode);
5170 elt->in_memory = src_eqv_in_memory;
5171 src_eqv_elt = elt;
5173 /* Check to see if src_eqv_elt is the same as a set source which
5174 does not yet have an elt, and if so set the elt of the set source
5175 to src_eqv_elt. */
5176 for (i = 0; i < n_sets; i++)
5177 if (sets[i].rtl && sets[i].src_elt == 0
5178 && rtx_equal_p (SET_SRC (sets[i].rtl), src_eqv))
5179 sets[i].src_elt = src_eqv_elt;
5182 for (i = 0; i < n_sets; i++)
5183 if (sets[i].rtl && ! sets[i].src_volatile
5184 && ! rtx_equal_p (SET_SRC (sets[i].rtl), SET_DEST (sets[i].rtl)))
5186 if (GET_CODE (SET_DEST (sets[i].rtl)) == STRICT_LOW_PART)
5188 /* REG_EQUAL in setting a STRICT_LOW_PART
5189 gives an equivalent for the entire destination register,
5190 not just for the subreg being stored in now.
5191 This is a more interesting equivalence, so we arrange later
5192 to treat the entire reg as the destination. */
5193 sets[i].src_elt = src_eqv_elt;
5194 sets[i].src_hash = src_eqv_hash;
5196 else
5198 /* Insert source and constant equivalent into hash table, if not
5199 already present. */
5200 struct table_elt *classp = src_eqv_elt;
5201 rtx src = sets[i].src;
5202 rtx dest = SET_DEST (sets[i].rtl);
5203 enum machine_mode mode
5204 = GET_MODE (src) == VOIDmode ? GET_MODE (dest) : GET_MODE (src);
5206 /* It's possible that we have a source value known to be
5207 constant but don't have a REG_EQUAL note on the insn.
5208 Lack of a note will mean src_eqv_elt will be NULL. This
5209 can happen where we've generated a SUBREG to access a
5210 CONST_INT that is already in a register in a wider mode.
5211 Ensure that the source expression is put in the proper
5212 constant class. */
5213 if (!classp)
5214 classp = sets[i].src_const_elt;
5216 if (sets[i].src_elt == 0)
5218 /* Don't put a hard register source into the table if this is
5219 the last insn of a libcall. In this case, we only need
5220 to put src_eqv_elt in src_elt. */
5221 if (! find_reg_note (insn, REG_RETVAL, NULL_RTX))
5223 struct table_elt *elt;
5225 /* Note that these insert_regs calls cannot remove
5226 any of the src_elt's, because they would have failed to
5227 match if not still valid. */
5228 if (insert_regs (src, classp, 0))
5230 rehash_using_reg (src);
5231 sets[i].src_hash = HASH (src, mode);
5233 elt = insert (src, classp, sets[i].src_hash, mode);
5234 elt->in_memory = sets[i].src_in_memory;
5235 sets[i].src_elt = classp = elt;
5237 else
5238 sets[i].src_elt = classp;
5240 if (sets[i].src_const && sets[i].src_const_elt == 0
5241 && src != sets[i].src_const
5242 && ! rtx_equal_p (sets[i].src_const, src))
5243 sets[i].src_elt = insert (sets[i].src_const, classp,
5244 sets[i].src_const_hash, mode);
5247 else if (sets[i].src_elt == 0)
5248 /* If we did not insert the source into the hash table (e.g., it was
5249 volatile), note the equivalence class for the REG_EQUAL value, if any,
5250 so that the destination goes into that class. */
5251 sets[i].src_elt = src_eqv_elt;
5253 /* Record destination addresses in the hash table. This allows us to
5254 check if they are invalidated by other sets. */
5255 for (i = 0; i < n_sets; i++)
5257 if (sets[i].rtl)
5259 rtx x = sets[i].inner_dest;
5260 struct table_elt *elt;
5261 enum machine_mode mode;
5262 unsigned hash;
5264 if (MEM_P (x))
5266 x = XEXP (x, 0);
5267 mode = GET_MODE (x);
5268 hash = HASH (x, mode);
5269 elt = lookup (x, hash, mode);
5270 if (!elt)
5272 if (insert_regs (x, NULL, 0))
5274 rehash_using_reg (x);
5275 hash = HASH (x, mode);
5277 elt = insert (x, NULL, hash, mode);
5280 sets[i].dest_addr_elt = elt;
5282 else
5283 sets[i].dest_addr_elt = NULL;
5287 invalidate_from_clobbers (x);
5289 /* Some registers are invalidated by subroutine calls. Memory is
5290 invalidated by non-constant calls. */
5292 if (CALL_P (insn))
5294 if (! CONST_OR_PURE_CALL_P (insn))
5295 invalidate_memory ();
5296 invalidate_for_call (insn);
5299 /* Now invalidate everything set by this instruction.
5300 If a SUBREG or other funny destination is being set,
5301 sets[i].rtl is still nonzero, so here we invalidate the reg
5302 a part of which is being set. */
5304 for (i = 0; i < n_sets; i++)
5305 if (sets[i].rtl)
5307 /* We can't use the inner dest, because the mode associated with
5308 a ZERO_EXTRACT is significant. */
5309 rtx dest = SET_DEST (sets[i].rtl);
5311 /* Needed for registers to remove the register from its
5312 previous quantity's chain.
5313 Needed for memory if this is a nonvarying address, unless
5314 we have just done an invalidate_memory that covers even those. */
5315 if (REG_P (dest) || GET_CODE (dest) == SUBREG)
5316 invalidate (dest, VOIDmode);
5317 else if (MEM_P (dest))
5318 invalidate (dest, VOIDmode);
5319 else if (GET_CODE (dest) == STRICT_LOW_PART
5320 || GET_CODE (dest) == ZERO_EXTRACT)
5321 invalidate (XEXP (dest, 0), GET_MODE (dest));
5324 /* A volatile ASM invalidates everything. */
5325 if (NONJUMP_INSN_P (insn)
5326 && GET_CODE (PATTERN (insn)) == ASM_OPERANDS
5327 && MEM_VOLATILE_P (PATTERN (insn)))
5328 flush_hash_table ();
5330 /* Don't cse over a call to setjmp; on some machines (eg VAX)
5331 the regs restored by the longjmp come from a later time
5332 than the setjmp. */
5333 if (CALL_P (insn) && find_reg_note (insn, REG_SETJMP, NULL))
5335 flush_hash_table ();
5336 goto done;
5339 /* Make sure registers mentioned in destinations
5340 are safe for use in an expression to be inserted.
5341 This removes from the hash table
5342 any invalid entry that refers to one of these registers.
5344 We don't care about the return value from mention_regs because
5345 we are going to hash the SET_DEST values unconditionally. */
5347 for (i = 0; i < n_sets; i++)
5349 if (sets[i].rtl)
5351 rtx x = SET_DEST (sets[i].rtl);
5353 if (!REG_P (x))
5354 mention_regs (x);
5355 else
5357 /* We used to rely on all references to a register becoming
5358 inaccessible when a register changes to a new quantity,
5359 since that changes the hash code. However, that is not
5360 safe, since after HASH_SIZE new quantities we get a
5361 hash 'collision' of a register with its own invalid
5362 entries. And since SUBREGs have been changed not to
5363 change their hash code with the hash code of the register,
5364 it wouldn't work any longer at all. So we have to check
5365 for any invalid references lying around now.
5366 This code is similar to the REG case in mention_regs,
5367 but it knows that reg_tick has been incremented, and
5368 it leaves reg_in_table as -1 . */
5369 unsigned int regno = REGNO (x);
5370 unsigned int endregno
5371 = regno + (regno >= FIRST_PSEUDO_REGISTER ? 1
5372 : hard_regno_nregs[regno][GET_MODE (x)]);
5373 unsigned int i;
5375 for (i = regno; i < endregno; i++)
5377 if (REG_IN_TABLE (i) >= 0)
5379 remove_invalid_refs (i);
5380 REG_IN_TABLE (i) = -1;
5387 /* We may have just removed some of the src_elt's from the hash table.
5388 So replace each one with the current head of the same class.
5389 Also check if destination addresses have been removed. */
5391 for (i = 0; i < n_sets; i++)
5392 if (sets[i].rtl)
5394 if (sets[i].dest_addr_elt
5395 && sets[i].dest_addr_elt->first_same_value == 0)
5397 /* The elt was removed, which means this destination is not
5398 valid after this instruction. */
5399 sets[i].rtl = NULL_RTX;
5401 else if (sets[i].src_elt && sets[i].src_elt->first_same_value == 0)
5402 /* If elt was removed, find current head of same class,
5403 or 0 if nothing remains of that class. */
5405 struct table_elt *elt = sets[i].src_elt;
5407 while (elt && elt->prev_same_value)
5408 elt = elt->prev_same_value;
5410 while (elt && elt->first_same_value == 0)
5411 elt = elt->next_same_value;
5412 sets[i].src_elt = elt ? elt->first_same_value : 0;
5416 /* Now insert the destinations into their equivalence classes. */
5418 for (i = 0; i < n_sets; i++)
5419 if (sets[i].rtl)
5421 rtx dest = SET_DEST (sets[i].rtl);
5422 struct table_elt *elt;
5424 /* Don't record value if we are not supposed to risk allocating
5425 floating-point values in registers that might be wider than
5426 memory. */
5427 if ((flag_float_store
5428 && MEM_P (dest)
5429 && FLOAT_MODE_P (GET_MODE (dest)))
5430 /* Don't record BLKmode values, because we don't know the
5431 size of it, and can't be sure that other BLKmode values
5432 have the same or smaller size. */
5433 || GET_MODE (dest) == BLKmode
5434 /* Don't record values of destinations set inside a libcall block
5435 since we might delete the libcall. Things should have been set
5436 up so we won't want to reuse such a value, but we play it safe
5437 here. */
5438 || libcall_insn
5439 /* If we didn't put a REG_EQUAL value or a source into the hash
5440 table, there is no point is recording DEST. */
5441 || sets[i].src_elt == 0
5442 /* If DEST is a paradoxical SUBREG and SRC is a ZERO_EXTEND
5443 or SIGN_EXTEND, don't record DEST since it can cause
5444 some tracking to be wrong.
5446 ??? Think about this more later. */
5447 || (GET_CODE (dest) == SUBREG
5448 && (GET_MODE_SIZE (GET_MODE (dest))
5449 > GET_MODE_SIZE (GET_MODE (SUBREG_REG (dest))))
5450 && (GET_CODE (sets[i].src) == SIGN_EXTEND
5451 || GET_CODE (sets[i].src) == ZERO_EXTEND)))
5452 continue;
5454 /* STRICT_LOW_PART isn't part of the value BEING set,
5455 and neither is the SUBREG inside it.
5456 Note that in this case SETS[I].SRC_ELT is really SRC_EQV_ELT. */
5457 if (GET_CODE (dest) == STRICT_LOW_PART)
5458 dest = SUBREG_REG (XEXP (dest, 0));
5460 if (REG_P (dest) || GET_CODE (dest) == SUBREG)
5461 /* Registers must also be inserted into chains for quantities. */
5462 if (insert_regs (dest, sets[i].src_elt, 1))
5464 /* If `insert_regs' changes something, the hash code must be
5465 recalculated. */
5466 rehash_using_reg (dest);
5467 sets[i].dest_hash = HASH (dest, GET_MODE (dest));
5470 elt = insert (dest, sets[i].src_elt,
5471 sets[i].dest_hash, GET_MODE (dest));
5473 elt->in_memory = (MEM_P (sets[i].inner_dest)
5474 && !MEM_READONLY_P (sets[i].inner_dest));
5476 /* If we have (set (subreg:m1 (reg:m2 foo) 0) (bar:m1)), M1 is no
5477 narrower than M2, and both M1 and M2 are the same number of words,
5478 we are also doing (set (reg:m2 foo) (subreg:m2 (bar:m1) 0)) so
5479 make that equivalence as well.
5481 However, BAR may have equivalences for which gen_lowpart
5482 will produce a simpler value than gen_lowpart applied to
5483 BAR (e.g., if BAR was ZERO_EXTENDed from M2), so we will scan all
5484 BAR's equivalences. If we don't get a simplified form, make
5485 the SUBREG. It will not be used in an equivalence, but will
5486 cause two similar assignments to be detected.
5488 Note the loop below will find SUBREG_REG (DEST) since we have
5489 already entered SRC and DEST of the SET in the table. */
5491 if (GET_CODE (dest) == SUBREG
5492 && (((GET_MODE_SIZE (GET_MODE (SUBREG_REG (dest))) - 1)
5493 / UNITS_PER_WORD)
5494 == (GET_MODE_SIZE (GET_MODE (dest)) - 1) / UNITS_PER_WORD)
5495 && (GET_MODE_SIZE (GET_MODE (dest))
5496 >= GET_MODE_SIZE (GET_MODE (SUBREG_REG (dest))))
5497 && sets[i].src_elt != 0)
5499 enum machine_mode new_mode = GET_MODE (SUBREG_REG (dest));
5500 struct table_elt *elt, *classp = 0;
5502 for (elt = sets[i].src_elt->first_same_value; elt;
5503 elt = elt->next_same_value)
5505 rtx new_src = 0;
5506 unsigned src_hash;
5507 struct table_elt *src_elt;
5508 int byte = 0;
5510 /* Ignore invalid entries. */
5511 if (!REG_P (elt->exp)
5512 && ! exp_equiv_p (elt->exp, elt->exp, 1, false))
5513 continue;
5515 /* We may have already been playing subreg games. If the
5516 mode is already correct for the destination, use it. */
5517 if (GET_MODE (elt->exp) == new_mode)
5518 new_src = elt->exp;
5519 else
5521 /* Calculate big endian correction for the SUBREG_BYTE.
5522 We have already checked that M1 (GET_MODE (dest))
5523 is not narrower than M2 (new_mode). */
5524 if (BYTES_BIG_ENDIAN)
5525 byte = (GET_MODE_SIZE (GET_MODE (dest))
5526 - GET_MODE_SIZE (new_mode));
5528 new_src = simplify_gen_subreg (new_mode, elt->exp,
5529 GET_MODE (dest), byte);
5532 /* The call to simplify_gen_subreg fails if the value
5533 is VOIDmode, yet we can't do any simplification, e.g.
5534 for EXPR_LISTs denoting function call results.
5535 It is invalid to construct a SUBREG with a VOIDmode
5536 SUBREG_REG, hence a zero new_src means we can't do
5537 this substitution. */
5538 if (! new_src)
5539 continue;
5541 src_hash = HASH (new_src, new_mode);
5542 src_elt = lookup (new_src, src_hash, new_mode);
5544 /* Put the new source in the hash table is if isn't
5545 already. */
5546 if (src_elt == 0)
5548 if (insert_regs (new_src, classp, 0))
5550 rehash_using_reg (new_src);
5551 src_hash = HASH (new_src, new_mode);
5553 src_elt = insert (new_src, classp, src_hash, new_mode);
5554 src_elt->in_memory = elt->in_memory;
5556 else if (classp && classp != src_elt->first_same_value)
5557 /* Show that two things that we've seen before are
5558 actually the same. */
5559 merge_equiv_classes (src_elt, classp);
5561 classp = src_elt->first_same_value;
5562 /* Ignore invalid entries. */
5563 while (classp
5564 && !REG_P (classp->exp)
5565 && ! exp_equiv_p (classp->exp, classp->exp, 1, false))
5566 classp = classp->next_same_value;
5571 /* Special handling for (set REG0 REG1) where REG0 is the
5572 "cheapest", cheaper than REG1. After cse, REG1 will probably not
5573 be used in the sequel, so (if easily done) change this insn to
5574 (set REG1 REG0) and replace REG1 with REG0 in the previous insn
5575 that computed their value. Then REG1 will become a dead store
5576 and won't cloud the situation for later optimizations.
5578 Do not make this change if REG1 is a hard register, because it will
5579 then be used in the sequel and we may be changing a two-operand insn
5580 into a three-operand insn.
5582 Also do not do this if we are operating on a copy of INSN.
5584 Also don't do this if INSN ends a libcall; this would cause an unrelated
5585 register to be set in the middle of a libcall, and we then get bad code
5586 if the libcall is deleted. */
5588 if (n_sets == 1 && sets[0].rtl && REG_P (SET_DEST (sets[0].rtl))
5589 && NEXT_INSN (PREV_INSN (insn)) == insn
5590 && REG_P (SET_SRC (sets[0].rtl))
5591 && REGNO (SET_SRC (sets[0].rtl)) >= FIRST_PSEUDO_REGISTER
5592 && REGNO_QTY_VALID_P (REGNO (SET_SRC (sets[0].rtl))))
5594 int src_q = REG_QTY (REGNO (SET_SRC (sets[0].rtl)));
5595 struct qty_table_elem *src_ent = &qty_table[src_q];
5597 if ((src_ent->first_reg == REGNO (SET_DEST (sets[0].rtl)))
5598 && ! find_reg_note (insn, REG_RETVAL, NULL_RTX))
5600 /* Scan for the previous nonnote insn, but stop at a basic
5601 block boundary. */
5602 rtx prev = insn;
5603 rtx bb_head = BB_HEAD (BLOCK_FOR_INSN (insn));
5606 prev = PREV_INSN (prev);
5608 while (prev != bb_head && NOTE_P (prev));
5610 /* Do not swap the registers around if the previous instruction
5611 attaches a REG_EQUIV note to REG1.
5613 ??? It's not entirely clear whether we can transfer a REG_EQUIV
5614 from the pseudo that originally shadowed an incoming argument
5615 to another register. Some uses of REG_EQUIV might rely on it
5616 being attached to REG1 rather than REG2.
5618 This section previously turned the REG_EQUIV into a REG_EQUAL
5619 note. We cannot do that because REG_EQUIV may provide an
5620 uninitialized stack slot when REG_PARM_STACK_SPACE is used. */
5621 if (NONJUMP_INSN_P (prev)
5622 && GET_CODE (PATTERN (prev)) == SET
5623 && SET_DEST (PATTERN (prev)) == SET_SRC (sets[0].rtl)
5624 && ! find_reg_note (prev, REG_EQUIV, NULL_RTX))
5626 rtx dest = SET_DEST (sets[0].rtl);
5627 rtx src = SET_SRC (sets[0].rtl);
5628 rtx note;
5630 validate_change (prev, &SET_DEST (PATTERN (prev)), dest, 1);
5631 validate_change (insn, &SET_DEST (sets[0].rtl), src, 1);
5632 validate_change (insn, &SET_SRC (sets[0].rtl), dest, 1);
5633 apply_change_group ();
5635 /* If INSN has a REG_EQUAL note, and this note mentions
5636 REG0, then we must delete it, because the value in
5637 REG0 has changed. If the note's value is REG1, we must
5638 also delete it because that is now this insn's dest. */
5639 note = find_reg_note (insn, REG_EQUAL, NULL_RTX);
5640 if (note != 0
5641 && (reg_mentioned_p (dest, XEXP (note, 0))
5642 || rtx_equal_p (src, XEXP (note, 0))))
5643 remove_note (insn, note);
5648 done:;
5649 #ifdef HAVE_cc0
5650 /* If the previous insn set CC0 and this insn no longer references CC0,
5651 delete the previous insn. Here we use the fact that nothing expects CC0
5652 to be valid over an insn, which is true until the final pass. */
5653 if (prev_insn && NONJUMP_INSN_P (prev_insn)
5654 && (tem = single_set (prev_insn)) != 0
5655 && SET_DEST (tem) == cc0_rtx
5656 && ! reg_mentioned_p (cc0_rtx, x))
5657 delete_insn_and_edges (prev_insn);
5659 prev_insn_cc0 = this_insn_cc0;
5660 prev_insn_cc0_mode = this_insn_cc0_mode;
5661 prev_insn = insn;
5662 #endif
5665 /* Remove from the hash table all expressions that reference memory. */
5667 static void
5668 invalidate_memory (void)
5670 int i;
5671 struct table_elt *p, *next;
5673 for (i = 0; i < HASH_SIZE; i++)
5674 for (p = table[i]; p; p = next)
5676 next = p->next_same_hash;
5677 if (p->in_memory)
5678 remove_from_table (p, i);
5682 /* Perform invalidation on the basis of everything about an insn
5683 except for invalidating the actual places that are SET in it.
5684 This includes the places CLOBBERed, and anything that might
5685 alias with something that is SET or CLOBBERed.
5687 X is the pattern of the insn. */
5689 static void
5690 invalidate_from_clobbers (rtx x)
5692 if (GET_CODE (x) == CLOBBER)
5694 rtx ref = XEXP (x, 0);
5695 if (ref)
5697 if (REG_P (ref) || GET_CODE (ref) == SUBREG
5698 || MEM_P (ref))
5699 invalidate (ref, VOIDmode);
5700 else if (GET_CODE (ref) == STRICT_LOW_PART
5701 || GET_CODE (ref) == ZERO_EXTRACT)
5702 invalidate (XEXP (ref, 0), GET_MODE (ref));
5705 else if (GET_CODE (x) == PARALLEL)
5707 int i;
5708 for (i = XVECLEN (x, 0) - 1; i >= 0; i--)
5710 rtx y = XVECEXP (x, 0, i);
5711 if (GET_CODE (y) == CLOBBER)
5713 rtx ref = XEXP (y, 0);
5714 if (REG_P (ref) || GET_CODE (ref) == SUBREG
5715 || MEM_P (ref))
5716 invalidate (ref, VOIDmode);
5717 else if (GET_CODE (ref) == STRICT_LOW_PART
5718 || GET_CODE (ref) == ZERO_EXTRACT)
5719 invalidate (XEXP (ref, 0), GET_MODE (ref));
5725 /* Process X, part of the REG_NOTES of an insn. Look at any REG_EQUAL notes
5726 and replace any registers in them with either an equivalent constant
5727 or the canonical form of the register. If we are inside an address,
5728 only do this if the address remains valid.
5730 OBJECT is 0 except when within a MEM in which case it is the MEM.
5732 Return the replacement for X. */
5734 static rtx
5735 cse_process_notes (rtx x, rtx object)
5737 enum rtx_code code = GET_CODE (x);
5738 const char *fmt = GET_RTX_FORMAT (code);
5739 int i;
5741 switch (code)
5743 case CONST_INT:
5744 case CONST:
5745 case SYMBOL_REF:
5746 case LABEL_REF:
5747 case CONST_DOUBLE:
5748 case CONST_VECTOR:
5749 case PC:
5750 case CC0:
5751 case LO_SUM:
5752 return x;
5754 case MEM:
5755 validate_change (x, &XEXP (x, 0),
5756 cse_process_notes (XEXP (x, 0), x), 0);
5757 return x;
5759 case EXPR_LIST:
5760 case INSN_LIST:
5761 if (REG_NOTE_KIND (x) == REG_EQUAL)
5762 XEXP (x, 0) = cse_process_notes (XEXP (x, 0), NULL_RTX);
5763 if (XEXP (x, 1))
5764 XEXP (x, 1) = cse_process_notes (XEXP (x, 1), NULL_RTX);
5765 return x;
5767 case SIGN_EXTEND:
5768 case ZERO_EXTEND:
5769 case SUBREG:
5771 rtx new = cse_process_notes (XEXP (x, 0), object);
5772 /* We don't substitute VOIDmode constants into these rtx,
5773 since they would impede folding. */
5774 if (GET_MODE (new) != VOIDmode)
5775 validate_change (object, &XEXP (x, 0), new, 0);
5776 return x;
5779 case REG:
5780 i = REG_QTY (REGNO (x));
5782 /* Return a constant or a constant register. */
5783 if (REGNO_QTY_VALID_P (REGNO (x)))
5785 struct qty_table_elem *ent = &qty_table[i];
5787 if (ent->const_rtx != NULL_RTX
5788 && (CONSTANT_P (ent->const_rtx)
5789 || REG_P (ent->const_rtx)))
5791 rtx new = gen_lowpart (GET_MODE (x), ent->const_rtx);
5792 if (new)
5793 return copy_rtx (new);
5797 /* Otherwise, canonicalize this register. */
5798 return canon_reg (x, NULL_RTX);
5800 default:
5801 break;
5804 for (i = 0; i < GET_RTX_LENGTH (code); i++)
5805 if (fmt[i] == 'e')
5806 validate_change (object, &XEXP (x, i),
5807 cse_process_notes (XEXP (x, i), object), 0);
5809 return x;
5812 /* Find a path in the CFG, starting with FIRST_BB to perform CSE on.
5814 DATA is a pointer to a struct cse_basic_block_data, that is used to
5815 describe the path.
5816 It is filled with a queue of basic blocks, starting with FIRST_BB
5817 and following a trace through the CFG.
5819 If all paths starting at FIRST_BB have been followed, or no new path
5820 starting at FIRST_BB can be constructed, this function returns FALSE.
5821 Otherwise, DATA->path is filled and the function returns TRUE indicating
5822 that a path to follow was found.
5824 If FOLLOW_JUMPS is false, the maximum path lenghth is 1 and the only
5825 block in the path will be FIRST_BB. */
5827 static bool
5828 cse_find_path (basic_block first_bb, struct cse_basic_block_data *data,
5829 int follow_jumps)
5831 basic_block bb;
5832 edge e;
5833 int path_size;
5835 SET_BIT (cse_visited_basic_blocks, first_bb->index);
5837 /* See if there is a previous path. */
5838 path_size = data->path_size;
5840 /* There is a previous path. Make sure it started with FIRST_BB. */
5841 if (path_size)
5842 gcc_assert (data->path[0].bb == first_bb);
5844 /* There was only one basic block in the last path. Clear the path and
5845 return, so that paths starting at another basic block can be tried. */
5846 if (path_size == 1)
5848 path_size = 0;
5849 goto done;
5852 /* If the path was empty from the beginning, construct a new path. */
5853 if (path_size == 0)
5854 data->path[path_size++].bb = first_bb;
5855 else
5857 /* Otherwise, path_size must be equal to or greater than 2, because
5858 a previous path exists that is at least two basic blocks long.
5860 Update the previous branch path, if any. If the last branch was
5861 previously along the branch edge, take the fallthrough edge now. */
5862 while (path_size >= 2)
5864 basic_block last_bb_in_path, previous_bb_in_path;
5865 edge e;
5867 --path_size;
5868 last_bb_in_path = data->path[path_size].bb;
5869 previous_bb_in_path = data->path[path_size - 1].bb;
5871 /* If we previously followed a path along the branch edge, try
5872 the fallthru edge now. */
5873 if (EDGE_COUNT (previous_bb_in_path->succs) == 2
5874 && any_condjump_p (BB_END (previous_bb_in_path))
5875 && (e = find_edge (previous_bb_in_path, last_bb_in_path))
5876 && e == BRANCH_EDGE (previous_bb_in_path))
5878 bb = FALLTHRU_EDGE (previous_bb_in_path)->dest;
5879 if (bb != EXIT_BLOCK_PTR
5880 && single_pred_p (bb))
5882 #if ENABLE_CHECKING
5883 /* We should only see blocks here that we have not
5884 visited yet. */
5885 gcc_assert (!TEST_BIT (cse_visited_basic_blocks, bb->index));
5886 #endif
5887 SET_BIT (cse_visited_basic_blocks, bb->index);
5888 data->path[path_size++].bb = bb;
5889 break;
5893 data->path[path_size].bb = NULL;
5896 /* If only one block remains in the path, bail. */
5897 if (path_size == 1)
5899 path_size = 0;
5900 goto done;
5904 /* Extend the path if possible. */
5905 if (follow_jumps)
5907 bb = data->path[path_size - 1].bb;
5908 while (bb && path_size < PARAM_VALUE (PARAM_MAX_CSE_PATH_LENGTH))
5910 if (single_succ_p (bb))
5911 e = single_succ_edge (bb);
5912 else if (EDGE_COUNT (bb->succs) == 2
5913 && any_condjump_p (BB_END (bb)))
5915 /* First try to follow the branch. If that doesn't lead
5916 to a useful path, follow the fallthru edge. */
5917 e = BRANCH_EDGE (bb);
5918 if (!single_pred_p (e->dest))
5919 e = FALLTHRU_EDGE (bb);
5921 else
5922 e = NULL;
5924 if (e && e->dest != EXIT_BLOCK_PTR
5925 && single_pred_p (e->dest))
5927 basic_block bb2 = e->dest;
5929 #if ENABLE_CHECKING
5930 /* We should only see blocks here that we have not
5931 visited yet. */
5932 gcc_assert (!TEST_BIT (cse_visited_basic_blocks, bb2->index));
5933 #endif
5934 SET_BIT (cse_visited_basic_blocks, bb2->index);
5935 data->path[path_size++].bb = bb2;
5936 bb = bb2;
5938 else
5939 bb = NULL;
5943 done:
5944 data->path_size = path_size;
5945 return path_size != 0;
5948 /* Dump the path in DATA to file F. NSETS is the number of sets
5949 in the path. */
5951 static void
5952 cse_dump_path (struct cse_basic_block_data *data, int nsets, FILE *f)
5954 int path_entry;
5956 fprintf (f, ";; Following path with %d sets: ", nsets);
5957 for (path_entry = 0; path_entry < data->path_size; path_entry++)
5958 fprintf (f, "%d ", (data->path[path_entry].bb)->index);
5959 fputc ('\n', dump_file);
5960 fflush (f);
5964 /* Scan to the end of the path described by DATA. Return an estimate of
5965 the total number of SETs, and the lowest and highest insn CUID, of all
5966 insns in the path. */
5968 static void
5969 cse_prescan_path (struct cse_basic_block_data *data)
5971 int nsets = 0;
5972 int low_cuid = -1, high_cuid = -1; /* FIXME low_cuid not computed correctly */
5973 int path_size = data->path_size;
5974 int path_entry;
5976 /* Scan to end of each basic block in the path. */
5977 for (path_entry = 0; path_entry < path_size; path_entry++)
5979 basic_block bb;
5980 rtx insn;
5982 bb = data->path[path_entry].bb;
5984 FOR_BB_INSNS (bb, insn)
5986 if (!INSN_P (insn))
5987 continue;
5989 /* A PARALLEL can have lots of SETs in it,
5990 especially if it is really an ASM_OPERANDS. */
5991 if (GET_CODE (PATTERN (insn)) == PARALLEL)
5992 nsets += XVECLEN (PATTERN (insn), 0);
5993 else
5994 nsets += 1;
5996 /* Ignore insns made by CSE in a previous traversal of this
5997 basic block. They cannot affect the boundaries of the
5998 basic block.
5999 FIXME: When we only visit each basic block at most once,
6000 this can go away. */
6001 if (INSN_UID (insn) <= max_uid && INSN_CUID (insn) > high_cuid)
6002 high_cuid = INSN_CUID (insn);
6003 if (INSN_UID (insn) <= max_uid && INSN_CUID (insn) < low_cuid)
6004 low_cuid = INSN_CUID (insn);
6008 data->low_cuid = low_cuid;
6009 data->high_cuid = high_cuid;
6010 data->nsets = nsets;
6013 /* Process a single extended basic block described by EBB_DATA. */
6015 static void
6016 cse_extended_basic_block (struct cse_basic_block_data *ebb_data)
6018 int path_size = ebb_data->path_size;
6019 int path_entry;
6020 int num_insns = 0;
6022 /* Allocate the space needed by qty_table. */
6023 qty_table = XNEWVEC (struct qty_table_elem, max_qty);
6025 new_basic_block ();
6026 for (path_entry = 0; path_entry < path_size; path_entry++)
6028 basic_block bb;
6029 rtx insn;
6030 rtx libcall_insn = NULL_RTX;
6031 int no_conflict = 0;
6033 bb = ebb_data->path[path_entry].bb;
6034 FOR_BB_INSNS (bb, insn)
6036 /* If we have processed 1,000 insns, flush the hash table to
6037 avoid extreme quadratic behavior. We must not include NOTEs
6038 in the count since there may be more of them when generating
6039 debugging information. If we clear the table at different
6040 times, code generated with -g -O might be different than code
6041 generated with -O but not -g.
6043 FIXME: This is a real kludge and needs to be done some other
6044 way. */
6045 if (INSN_P (insn)
6046 && num_insns++ > PARAM_VALUE (PARAM_MAX_CSE_INSNS))
6048 flush_hash_table ();
6049 num_insns = 0;
6052 if (INSN_P (insn))
6054 /* Process notes first so we have all notes in canonical forms
6055 when looking for duplicate operations. */
6056 if (REG_NOTES (insn))
6057 REG_NOTES (insn) = cse_process_notes (REG_NOTES (insn),
6058 NULL_RTX);
6060 /* Track when we are inside in LIBCALL block. Inside such
6061 a block we do not want to record destinations. The last
6062 insn of a LIBCALL block is not considered to be part of
6063 the block, since its destination is the result of the
6064 block and hence should be recorded. */
6065 if (REG_NOTES (insn) != 0)
6067 rtx p;
6069 if ((p = find_reg_note (insn, REG_LIBCALL, NULL_RTX)))
6070 libcall_insn = XEXP (p, 0);
6071 else if (find_reg_note (insn, REG_RETVAL, NULL_RTX))
6073 /* Keep libcall_insn for the last SET insn of
6074 a no-conflict block to prevent changing the
6075 destination. */
6076 if (!no_conflict)
6077 libcall_insn = NULL_RTX;
6078 else
6079 no_conflict = -1;
6081 else if (find_reg_note (insn, REG_NO_CONFLICT, NULL_RTX))
6082 no_conflict = 1;
6085 cse_insn (insn, libcall_insn);
6087 /* If we kept libcall_insn for a no-conflict bock,
6088 clear it here. */
6089 if (no_conflict == -1)
6091 libcall_insn = NULL_RTX;
6092 no_conflict = 0;
6095 /* If we haven't already found an insn where we added a LABEL_REF,
6096 check this one. */
6097 if (NONJUMP_INSN_P (insn) && ! recorded_label_ref
6098 && for_each_rtx (&PATTERN (insn), check_for_label_ref,
6099 (void *) insn))
6100 recorded_label_ref = 1;
6104 /* Make sure that libcalls don't span multiple basic blocks. */
6105 gcc_assert (libcall_insn == NULL_RTX);
6107 #ifdef HAVE_cc0
6108 /* Clear the CC0-tracking related insns, they can't provide
6109 useful information across basic block boundaries. */
6110 prev_insn_cc0 = 0;
6111 prev_insn = 0;
6112 #endif
6114 /* If we changed a conditional jump, we may have terminated
6115 the path we are following. Check that by verifying that
6116 the edge we would take still exists. If the edge does
6117 not exist anymore, purge the remainder of the path.
6118 Note that this will cause us to return to the caller. */
6119 if (path_entry < path_size - 1)
6121 basic_block next_bb = ebb_data->path[path_entry + 1].bb;
6122 if (!find_edge (bb, next_bb))
6123 ebb_data->path_size = path_entry + 1;
6126 /* If this is a conditional jump insn, record any known
6127 equivalences due to the condition being tested. */
6128 insn = BB_END (bb);
6129 if (path_entry < path_size - 1
6130 && JUMP_P (insn)
6131 && single_set (insn)
6132 && any_condjump_p (insn))
6134 basic_block next_bb = ebb_data->path[path_entry + 1].bb;
6135 bool taken = (next_bb == BRANCH_EDGE (bb)->dest);
6136 record_jump_equiv (insn, taken);
6140 gcc_assert (next_qty <= max_qty);
6142 free (qty_table);
6145 /* Perform cse on the instructions of a function.
6146 F is the first instruction.
6147 NREGS is one plus the highest pseudo-reg number used in the instruction.
6149 Returns 1 if jump_optimize should be redone due to simplifications
6150 in conditional jump instructions. */
6153 cse_main (rtx f ATTRIBUTE_UNUSED, int nregs)
6155 struct cse_basic_block_data ebb_data;
6156 basic_block bb;
6157 int *dfs_order = XNEWVEC (int, last_basic_block);
6158 int i, n_blocks;
6160 init_cse_reg_info (nregs);
6162 ebb_data.path = XNEWVEC (struct branch_path,
6163 PARAM_VALUE (PARAM_MAX_CSE_PATH_LENGTH));
6165 cse_jumps_altered = 0;
6166 recorded_label_ref = 0;
6167 constant_pool_entries_cost = 0;
6168 constant_pool_entries_regcost = 0;
6169 ebb_data.path_size = 0;
6170 ebb_data.nsets = 0;
6171 rtl_hooks = cse_rtl_hooks;
6173 init_recog ();
6174 init_alias_analysis ();
6176 reg_eqv_table = XNEWVEC (struct reg_eqv_elem, nregs);
6178 /* Set up the table of already visited basic blocks. */
6179 cse_visited_basic_blocks = sbitmap_alloc (last_basic_block);
6180 sbitmap_zero (cse_visited_basic_blocks);
6182 /* Compute the mapping from uids to cuids.
6183 CUIDs are numbers assigned to insns, like uids, except that
6184 that cuids increase monotonically through the code. */
6185 max_uid = get_max_uid ();
6186 uid_cuid = XCNEWVEC (int, max_uid + 1);
6187 i = 0;
6188 FOR_EACH_BB (bb)
6190 rtx insn;
6191 FOR_BB_INSNS (bb, insn)
6192 INSN_CUID (insn) = ++i;
6195 /* Loop over basic blocks in DFS order,
6196 excluding the ENTRY and EXIT blocks. */
6197 n_blocks = pre_and_rev_post_order_compute (dfs_order, NULL, false);
6198 i = 0;
6199 while (i < n_blocks)
6201 /* Find the first block in the DFS queue that we have not yet
6202 processed before. */
6205 bb = BASIC_BLOCK (dfs_order[i++]);
6207 while (TEST_BIT (cse_visited_basic_blocks, bb->index)
6208 && i < n_blocks);
6210 /* Find all paths starting with BB, and process them. */
6211 while (cse_find_path (bb, &ebb_data, flag_cse_follow_jumps))
6213 /* Pre-scan the path. */
6214 cse_prescan_path (&ebb_data);
6216 /* If this basic block has no sets, skip it. */
6217 if (ebb_data.nsets == 0)
6218 continue;
6220 /* Get a reasonable extimate for the maximum number of qty's
6221 needed for this path. For this, we take the number of sets
6222 and multiply that by MAX_RECOG_OPERANDS. */
6223 max_qty = ebb_data.nsets * MAX_RECOG_OPERANDS;
6224 cse_basic_block_start = ebb_data.low_cuid;
6225 cse_basic_block_end = ebb_data.high_cuid;
6227 /* Dump the path we're about to process. */
6228 if (dump_file)
6229 cse_dump_path (&ebb_data, ebb_data.nsets, dump_file);
6231 cse_extended_basic_block (&ebb_data);
6235 /* Clean up. */
6236 end_alias_analysis ();
6237 free (uid_cuid);
6238 free (reg_eqv_table);
6239 free (ebb_data.path);
6240 sbitmap_free (cse_visited_basic_blocks);
6241 free (dfs_order);
6242 rtl_hooks = general_rtl_hooks;
6244 return cse_jumps_altered || recorded_label_ref;
6247 /* Called via for_each_rtx to see if an insn is using a LABEL_REF for which
6248 there isn't a REG_LABEL note. Return one if so. DATA is the insn. */
6250 static int
6251 check_for_label_ref (rtx *rtl, void *data)
6253 rtx insn = (rtx) data;
6255 /* If this insn uses a LABEL_REF and there isn't a REG_LABEL note for it,
6256 we must rerun jump since it needs to place the note. If this is a
6257 LABEL_REF for a CODE_LABEL that isn't in the insn chain, don't do this
6258 since no REG_LABEL will be added. */
6259 return (GET_CODE (*rtl) == LABEL_REF
6260 && ! LABEL_REF_NONLOCAL_P (*rtl)
6261 && LABEL_P (XEXP (*rtl, 0))
6262 && INSN_UID (XEXP (*rtl, 0)) != 0
6263 && ! find_reg_note (insn, REG_LABEL, XEXP (*rtl, 0)));
6266 /* Count the number of times registers are used (not set) in X.
6267 COUNTS is an array in which we accumulate the count, INCR is how much
6268 we count each register usage.
6270 Don't count a usage of DEST, which is the SET_DEST of a SET which
6271 contains X in its SET_SRC. This is because such a SET does not
6272 modify the liveness of DEST.
6273 DEST is set to pc_rtx for a trapping insn, which means that we must count
6274 uses of a SET_DEST regardless because the insn can't be deleted here. */
6276 static void
6277 count_reg_usage (rtx x, int *counts, rtx dest, int incr)
6279 enum rtx_code code;
6280 rtx note;
6281 const char *fmt;
6282 int i, j;
6284 if (x == 0)
6285 return;
6287 switch (code = GET_CODE (x))
6289 case REG:
6290 if (x != dest)
6291 counts[REGNO (x)] += incr;
6292 return;
6294 case PC:
6295 case CC0:
6296 case CONST:
6297 case CONST_INT:
6298 case CONST_DOUBLE:
6299 case CONST_VECTOR:
6300 case SYMBOL_REF:
6301 case LABEL_REF:
6302 return;
6304 case CLOBBER:
6305 /* If we are clobbering a MEM, mark any registers inside the address
6306 as being used. */
6307 if (MEM_P (XEXP (x, 0)))
6308 count_reg_usage (XEXP (XEXP (x, 0), 0), counts, NULL_RTX, incr);
6309 return;
6311 case SET:
6312 /* Unless we are setting a REG, count everything in SET_DEST. */
6313 if (!REG_P (SET_DEST (x)))
6314 count_reg_usage (SET_DEST (x), counts, NULL_RTX, incr);
6315 count_reg_usage (SET_SRC (x), counts,
6316 dest ? dest : SET_DEST (x),
6317 incr);
6318 return;
6320 case CALL_INSN:
6321 case INSN:
6322 case JUMP_INSN:
6323 /* We expect dest to be NULL_RTX here. If the insn may trap, mark
6324 this fact by setting DEST to pc_rtx. */
6325 if (flag_non_call_exceptions && may_trap_p (PATTERN (x)))
6326 dest = pc_rtx;
6327 if (code == CALL_INSN)
6328 count_reg_usage (CALL_INSN_FUNCTION_USAGE (x), counts, dest, incr);
6329 count_reg_usage (PATTERN (x), counts, dest, incr);
6331 /* Things used in a REG_EQUAL note aren't dead since loop may try to
6332 use them. */
6334 note = find_reg_equal_equiv_note (x);
6335 if (note)
6337 rtx eqv = XEXP (note, 0);
6339 if (GET_CODE (eqv) == EXPR_LIST)
6340 /* This REG_EQUAL note describes the result of a function call.
6341 Process all the arguments. */
6344 count_reg_usage (XEXP (eqv, 0), counts, dest, incr);
6345 eqv = XEXP (eqv, 1);
6347 while (eqv && GET_CODE (eqv) == EXPR_LIST);
6348 else
6349 count_reg_usage (eqv, counts, dest, incr);
6351 return;
6353 case EXPR_LIST:
6354 if (REG_NOTE_KIND (x) == REG_EQUAL
6355 || (REG_NOTE_KIND (x) != REG_NONNEG && GET_CODE (XEXP (x,0)) == USE)
6356 /* FUNCTION_USAGE expression lists may include (CLOBBER (mem /u)),
6357 involving registers in the address. */
6358 || GET_CODE (XEXP (x, 0)) == CLOBBER)
6359 count_reg_usage (XEXP (x, 0), counts, NULL_RTX, incr);
6361 count_reg_usage (XEXP (x, 1), counts, NULL_RTX, incr);
6362 return;
6364 case ASM_OPERANDS:
6365 /* If the asm is volatile, then this insn cannot be deleted,
6366 and so the inputs *must* be live. */
6367 if (MEM_VOLATILE_P (x))
6368 dest = NULL_RTX;
6369 /* Iterate over just the inputs, not the constraints as well. */
6370 for (i = ASM_OPERANDS_INPUT_LENGTH (x) - 1; i >= 0; i--)
6371 count_reg_usage (ASM_OPERANDS_INPUT (x, i), counts, dest, incr);
6372 return;
6374 case INSN_LIST:
6375 gcc_unreachable ();
6377 default:
6378 break;
6381 fmt = GET_RTX_FORMAT (code);
6382 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
6384 if (fmt[i] == 'e')
6385 count_reg_usage (XEXP (x, i), counts, dest, incr);
6386 else if (fmt[i] == 'E')
6387 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
6388 count_reg_usage (XVECEXP (x, i, j), counts, dest, incr);
6392 /* Return true if set is live. */
6393 static bool
6394 set_live_p (rtx set, rtx insn ATTRIBUTE_UNUSED, /* Only used with HAVE_cc0. */
6395 int *counts)
6397 #ifdef HAVE_cc0
6398 rtx tem;
6399 #endif
6401 if (set_noop_p (set))
6404 #ifdef HAVE_cc0
6405 else if (GET_CODE (SET_DEST (set)) == CC0
6406 && !side_effects_p (SET_SRC (set))
6407 && ((tem = next_nonnote_insn (insn)) == 0
6408 || !INSN_P (tem)
6409 || !reg_referenced_p (cc0_rtx, PATTERN (tem))))
6410 return false;
6411 #endif
6412 else if (!REG_P (SET_DEST (set))
6413 || REGNO (SET_DEST (set)) < FIRST_PSEUDO_REGISTER
6414 || counts[REGNO (SET_DEST (set))] != 0
6415 || side_effects_p (SET_SRC (set)))
6416 return true;
6417 return false;
6420 /* Return true if insn is live. */
6422 static bool
6423 insn_live_p (rtx insn, int *counts)
6425 int i;
6426 if (flag_non_call_exceptions && may_trap_p (PATTERN (insn)))
6427 return true;
6428 else if (GET_CODE (PATTERN (insn)) == SET)
6429 return set_live_p (PATTERN (insn), insn, counts);
6430 else if (GET_CODE (PATTERN (insn)) == PARALLEL)
6432 for (i = XVECLEN (PATTERN (insn), 0) - 1; i >= 0; i--)
6434 rtx elt = XVECEXP (PATTERN (insn), 0, i);
6436 if (GET_CODE (elt) == SET)
6438 if (set_live_p (elt, insn, counts))
6439 return true;
6441 else if (GET_CODE (elt) != CLOBBER && GET_CODE (elt) != USE)
6442 return true;
6444 return false;
6446 else
6447 return true;
6450 /* Return true if libcall is dead as a whole. */
6452 static bool
6453 dead_libcall_p (rtx insn, int *counts)
6455 rtx note, set, new;
6457 /* See if there's a REG_EQUAL note on this insn and try to
6458 replace the source with the REG_EQUAL expression.
6460 We assume that insns with REG_RETVALs can only be reg->reg
6461 copies at this point. */
6462 note = find_reg_note (insn, REG_EQUAL, NULL_RTX);
6463 if (!note)
6464 return false;
6466 set = single_set (insn);
6467 if (!set)
6468 return false;
6470 new = simplify_rtx (XEXP (note, 0));
6471 if (!new)
6472 new = XEXP (note, 0);
6474 /* While changing insn, we must update the counts accordingly. */
6475 count_reg_usage (insn, counts, NULL_RTX, -1);
6477 if (validate_change (insn, &SET_SRC (set), new, 0))
6479 count_reg_usage (insn, counts, NULL_RTX, 1);
6480 remove_note (insn, find_reg_note (insn, REG_RETVAL, NULL_RTX));
6481 remove_note (insn, note);
6482 return true;
6485 if (CONSTANT_P (new))
6487 new = force_const_mem (GET_MODE (SET_DEST (set)), new);
6488 if (new && validate_change (insn, &SET_SRC (set), new, 0))
6490 count_reg_usage (insn, counts, NULL_RTX, 1);
6491 remove_note (insn, find_reg_note (insn, REG_RETVAL, NULL_RTX));
6492 remove_note (insn, note);
6493 return true;
6497 count_reg_usage (insn, counts, NULL_RTX, 1);
6498 return false;
6501 /* Scan all the insns and delete any that are dead; i.e., they store a register
6502 that is never used or they copy a register to itself.
6504 This is used to remove insns made obviously dead by cse, loop or other
6505 optimizations. It improves the heuristics in loop since it won't try to
6506 move dead invariants out of loops or make givs for dead quantities. The
6507 remaining passes of the compilation are also sped up. */
6510 delete_trivially_dead_insns (rtx insns, int nreg)
6512 int *counts;
6513 rtx insn, prev;
6514 int in_libcall = 0, dead_libcall = 0;
6515 int ndead = 0;
6517 timevar_push (TV_DELETE_TRIVIALLY_DEAD);
6518 /* First count the number of times each register is used. */
6519 counts = XCNEWVEC (int, nreg);
6520 for (insn = insns; insn; insn = NEXT_INSN (insn))
6521 if (INSN_P (insn))
6522 count_reg_usage (insn, counts, NULL_RTX, 1);
6524 /* Go from the last insn to the first and delete insns that only set unused
6525 registers or copy a register to itself. As we delete an insn, remove
6526 usage counts for registers it uses.
6528 The first jump optimization pass may leave a real insn as the last
6529 insn in the function. We must not skip that insn or we may end
6530 up deleting code that is not really dead. */
6531 for (insn = get_last_insn (); insn; insn = prev)
6533 int live_insn = 0;
6535 prev = PREV_INSN (insn);
6536 if (!INSN_P (insn))
6537 continue;
6539 /* Don't delete any insns that are part of a libcall block unless
6540 we can delete the whole libcall block.
6542 Flow or loop might get confused if we did that. Remember
6543 that we are scanning backwards. */
6544 if (find_reg_note (insn, REG_RETVAL, NULL_RTX))
6546 in_libcall = 1;
6547 live_insn = 1;
6548 dead_libcall = dead_libcall_p (insn, counts);
6550 else if (in_libcall)
6551 live_insn = ! dead_libcall;
6552 else
6553 live_insn = insn_live_p (insn, counts);
6555 /* If this is a dead insn, delete it and show registers in it aren't
6556 being used. */
6558 if (! live_insn)
6560 count_reg_usage (insn, counts, NULL_RTX, -1);
6561 delete_insn_and_edges (insn);
6562 ndead++;
6565 if (in_libcall && find_reg_note (insn, REG_LIBCALL, NULL_RTX))
6567 in_libcall = 0;
6568 dead_libcall = 0;
6572 if (dump_file && ndead)
6573 fprintf (dump_file, "Deleted %i trivially dead insns\n",
6574 ndead);
6575 /* Clean up. */
6576 free (counts);
6577 timevar_pop (TV_DELETE_TRIVIALLY_DEAD);
6578 return ndead;
6581 /* This function is called via for_each_rtx. The argument, NEWREG, is
6582 a condition code register with the desired mode. If we are looking
6583 at the same register in a different mode, replace it with
6584 NEWREG. */
6586 static int
6587 cse_change_cc_mode (rtx *loc, void *data)
6589 struct change_cc_mode_args* args = (struct change_cc_mode_args*)data;
6591 if (*loc
6592 && REG_P (*loc)
6593 && REGNO (*loc) == REGNO (args->newreg)
6594 && GET_MODE (*loc) != GET_MODE (args->newreg))
6596 validate_change (args->insn, loc, args->newreg, 1);
6598 return -1;
6600 return 0;
6603 /* Change the mode of any reference to the register REGNO (NEWREG) to
6604 GET_MODE (NEWREG) in INSN. */
6606 static void
6607 cse_change_cc_mode_insn (rtx insn, rtx newreg)
6609 struct change_cc_mode_args args;
6610 int success;
6612 if (!INSN_P (insn))
6613 return;
6615 args.insn = insn;
6616 args.newreg = newreg;
6618 for_each_rtx (&PATTERN (insn), cse_change_cc_mode, &args);
6619 for_each_rtx (&REG_NOTES (insn), cse_change_cc_mode, &args);
6621 /* If the following assertion was triggered, there is most probably
6622 something wrong with the cc_modes_compatible back end function.
6623 CC modes only can be considered compatible if the insn - with the mode
6624 replaced by any of the compatible modes - can still be recognized. */
6625 success = apply_change_group ();
6626 gcc_assert (success);
6629 /* Change the mode of any reference to the register REGNO (NEWREG) to
6630 GET_MODE (NEWREG), starting at START. Stop before END. Stop at
6631 any instruction which modifies NEWREG. */
6633 static void
6634 cse_change_cc_mode_insns (rtx start, rtx end, rtx newreg)
6636 rtx insn;
6638 for (insn = start; insn != end; insn = NEXT_INSN (insn))
6640 if (! INSN_P (insn))
6641 continue;
6643 if (reg_set_p (newreg, insn))
6644 return;
6646 cse_change_cc_mode_insn (insn, newreg);
6650 /* BB is a basic block which finishes with CC_REG as a condition code
6651 register which is set to CC_SRC. Look through the successors of BB
6652 to find blocks which have a single predecessor (i.e., this one),
6653 and look through those blocks for an assignment to CC_REG which is
6654 equivalent to CC_SRC. CAN_CHANGE_MODE indicates whether we are
6655 permitted to change the mode of CC_SRC to a compatible mode. This
6656 returns VOIDmode if no equivalent assignments were found.
6657 Otherwise it returns the mode which CC_SRC should wind up with.
6659 The main complexity in this function is handling the mode issues.
6660 We may have more than one duplicate which we can eliminate, and we
6661 try to find a mode which will work for multiple duplicates. */
6663 static enum machine_mode
6664 cse_cc_succs (basic_block bb, rtx cc_reg, rtx cc_src, bool can_change_mode)
6666 bool found_equiv;
6667 enum machine_mode mode;
6668 unsigned int insn_count;
6669 edge e;
6670 rtx insns[2];
6671 enum machine_mode modes[2];
6672 rtx last_insns[2];
6673 unsigned int i;
6674 rtx newreg;
6675 edge_iterator ei;
6677 /* We expect to have two successors. Look at both before picking
6678 the final mode for the comparison. If we have more successors
6679 (i.e., some sort of table jump, although that seems unlikely),
6680 then we require all beyond the first two to use the same
6681 mode. */
6683 found_equiv = false;
6684 mode = GET_MODE (cc_src);
6685 insn_count = 0;
6686 FOR_EACH_EDGE (e, ei, bb->succs)
6688 rtx insn;
6689 rtx end;
6691 if (e->flags & EDGE_COMPLEX)
6692 continue;
6694 if (EDGE_COUNT (e->dest->preds) != 1
6695 || e->dest == EXIT_BLOCK_PTR)
6696 continue;
6698 end = NEXT_INSN (BB_END (e->dest));
6699 for (insn = BB_HEAD (e->dest); insn != end; insn = NEXT_INSN (insn))
6701 rtx set;
6703 if (! INSN_P (insn))
6704 continue;
6706 /* If CC_SRC is modified, we have to stop looking for
6707 something which uses it. */
6708 if (modified_in_p (cc_src, insn))
6709 break;
6711 /* Check whether INSN sets CC_REG to CC_SRC. */
6712 set = single_set (insn);
6713 if (set
6714 && REG_P (SET_DEST (set))
6715 && REGNO (SET_DEST (set)) == REGNO (cc_reg))
6717 bool found;
6718 enum machine_mode set_mode;
6719 enum machine_mode comp_mode;
6721 found = false;
6722 set_mode = GET_MODE (SET_SRC (set));
6723 comp_mode = set_mode;
6724 if (rtx_equal_p (cc_src, SET_SRC (set)))
6725 found = true;
6726 else if (GET_CODE (cc_src) == COMPARE
6727 && GET_CODE (SET_SRC (set)) == COMPARE
6728 && mode != set_mode
6729 && rtx_equal_p (XEXP (cc_src, 0),
6730 XEXP (SET_SRC (set), 0))
6731 && rtx_equal_p (XEXP (cc_src, 1),
6732 XEXP (SET_SRC (set), 1)))
6735 comp_mode = targetm.cc_modes_compatible (mode, set_mode);
6736 if (comp_mode != VOIDmode
6737 && (can_change_mode || comp_mode == mode))
6738 found = true;
6741 if (found)
6743 found_equiv = true;
6744 if (insn_count < ARRAY_SIZE (insns))
6746 insns[insn_count] = insn;
6747 modes[insn_count] = set_mode;
6748 last_insns[insn_count] = end;
6749 ++insn_count;
6751 if (mode != comp_mode)
6753 gcc_assert (can_change_mode);
6754 mode = comp_mode;
6756 /* The modified insn will be re-recognized later. */
6757 PUT_MODE (cc_src, mode);
6760 else
6762 if (set_mode != mode)
6764 /* We found a matching expression in the
6765 wrong mode, but we don't have room to
6766 store it in the array. Punt. This case
6767 should be rare. */
6768 break;
6770 /* INSN sets CC_REG to a value equal to CC_SRC
6771 with the right mode. We can simply delete
6772 it. */
6773 delete_insn (insn);
6776 /* We found an instruction to delete. Keep looking,
6777 in the hopes of finding a three-way jump. */
6778 continue;
6781 /* We found an instruction which sets the condition
6782 code, so don't look any farther. */
6783 break;
6786 /* If INSN sets CC_REG in some other way, don't look any
6787 farther. */
6788 if (reg_set_p (cc_reg, insn))
6789 break;
6792 /* If we fell off the bottom of the block, we can keep looking
6793 through successors. We pass CAN_CHANGE_MODE as false because
6794 we aren't prepared to handle compatibility between the
6795 further blocks and this block. */
6796 if (insn == end)
6798 enum machine_mode submode;
6800 submode = cse_cc_succs (e->dest, cc_reg, cc_src, false);
6801 if (submode != VOIDmode)
6803 gcc_assert (submode == mode);
6804 found_equiv = true;
6805 can_change_mode = false;
6810 if (! found_equiv)
6811 return VOIDmode;
6813 /* Now INSN_COUNT is the number of instructions we found which set
6814 CC_REG to a value equivalent to CC_SRC. The instructions are in
6815 INSNS. The modes used by those instructions are in MODES. */
6817 newreg = NULL_RTX;
6818 for (i = 0; i < insn_count; ++i)
6820 if (modes[i] != mode)
6822 /* We need to change the mode of CC_REG in INSNS[i] and
6823 subsequent instructions. */
6824 if (! newreg)
6826 if (GET_MODE (cc_reg) == mode)
6827 newreg = cc_reg;
6828 else
6829 newreg = gen_rtx_REG (mode, REGNO (cc_reg));
6831 cse_change_cc_mode_insns (NEXT_INSN (insns[i]), last_insns[i],
6832 newreg);
6835 delete_insn (insns[i]);
6838 return mode;
6841 /* If we have a fixed condition code register (or two), walk through
6842 the instructions and try to eliminate duplicate assignments. */
6844 static void
6845 cse_condition_code_reg (void)
6847 unsigned int cc_regno_1;
6848 unsigned int cc_regno_2;
6849 rtx cc_reg_1;
6850 rtx cc_reg_2;
6851 basic_block bb;
6853 if (! targetm.fixed_condition_code_regs (&cc_regno_1, &cc_regno_2))
6854 return;
6856 cc_reg_1 = gen_rtx_REG (CCmode, cc_regno_1);
6857 if (cc_regno_2 != INVALID_REGNUM)
6858 cc_reg_2 = gen_rtx_REG (CCmode, cc_regno_2);
6859 else
6860 cc_reg_2 = NULL_RTX;
6862 FOR_EACH_BB (bb)
6864 rtx last_insn;
6865 rtx cc_reg;
6866 rtx insn;
6867 rtx cc_src_insn;
6868 rtx cc_src;
6869 enum machine_mode mode;
6870 enum machine_mode orig_mode;
6872 /* Look for blocks which end with a conditional jump based on a
6873 condition code register. Then look for the instruction which
6874 sets the condition code register. Then look through the
6875 successor blocks for instructions which set the condition
6876 code register to the same value. There are other possible
6877 uses of the condition code register, but these are by far the
6878 most common and the ones which we are most likely to be able
6879 to optimize. */
6881 last_insn = BB_END (bb);
6882 if (!JUMP_P (last_insn))
6883 continue;
6885 if (reg_referenced_p (cc_reg_1, PATTERN (last_insn)))
6886 cc_reg = cc_reg_1;
6887 else if (cc_reg_2 && reg_referenced_p (cc_reg_2, PATTERN (last_insn)))
6888 cc_reg = cc_reg_2;
6889 else
6890 continue;
6892 cc_src_insn = NULL_RTX;
6893 cc_src = NULL_RTX;
6894 for (insn = PREV_INSN (last_insn);
6895 insn && insn != PREV_INSN (BB_HEAD (bb));
6896 insn = PREV_INSN (insn))
6898 rtx set;
6900 if (! INSN_P (insn))
6901 continue;
6902 set = single_set (insn);
6903 if (set
6904 && REG_P (SET_DEST (set))
6905 && REGNO (SET_DEST (set)) == REGNO (cc_reg))
6907 cc_src_insn = insn;
6908 cc_src = SET_SRC (set);
6909 break;
6911 else if (reg_set_p (cc_reg, insn))
6912 break;
6915 if (! cc_src_insn)
6916 continue;
6918 if (modified_between_p (cc_src, cc_src_insn, NEXT_INSN (last_insn)))
6919 continue;
6921 /* Now CC_REG is a condition code register used for a
6922 conditional jump at the end of the block, and CC_SRC, in
6923 CC_SRC_INSN, is the value to which that condition code
6924 register is set, and CC_SRC is still meaningful at the end of
6925 the basic block. */
6927 orig_mode = GET_MODE (cc_src);
6928 mode = cse_cc_succs (bb, cc_reg, cc_src, true);
6929 if (mode != VOIDmode)
6931 gcc_assert (mode == GET_MODE (cc_src));
6932 if (mode != orig_mode)
6934 rtx newreg = gen_rtx_REG (mode, REGNO (cc_reg));
6936 cse_change_cc_mode_insn (cc_src_insn, newreg);
6938 /* Do the same in the following insns that use the
6939 current value of CC_REG within BB. */
6940 cse_change_cc_mode_insns (NEXT_INSN (cc_src_insn),
6941 NEXT_INSN (last_insn),
6942 newreg);
6949 /* Perform common subexpression elimination. Nonzero value from
6950 `cse_main' means that jumps were simplified and some code may now
6951 be unreachable, so do jump optimization again. */
6952 static bool
6953 gate_handle_cse (void)
6955 return optimize > 0;
6958 static unsigned int
6959 rest_of_handle_cse (void)
6961 static int counter = 0;
6962 int tem;
6963 counter++;
6964 if (dump_file)
6965 dump_flow_info (dump_file, dump_flags);
6967 reg_scan (get_insns (), max_reg_num ());
6969 tem = cse_main (get_insns (), max_reg_num ());
6971 /* If we are not running more CSE passes, then we are no longer
6972 expecting CSE to be run. But always rerun it in a cheap mode. */
6973 cse_not_expected = !flag_rerun_cse_after_loop && !flag_gcse;
6975 /* If there are dead edges to purge, we haven't properly updated
6976 the CFG incrementally. */
6977 gcc_assert (!purge_all_dead_edges ());
6979 if (tem)
6980 rebuild_jump_labels (get_insns ());
6982 if (tem || optimize > 1)
6983 cleanup_cfg (CLEANUP_EXPENSIVE);
6985 return 0;
6988 struct tree_opt_pass pass_cse =
6990 "cse1", /* name */
6991 gate_handle_cse, /* gate */
6992 rest_of_handle_cse, /* execute */
6993 NULL, /* sub */
6994 NULL, /* next */
6995 0, /* static_pass_number */
6996 TV_CSE, /* tv_id */
6997 0, /* properties_required */
6998 0, /* properties_provided */
6999 0, /* properties_destroyed */
7000 0, /* todo_flags_start */
7001 TODO_dump_func |
7002 TODO_ggc_collect |
7003 TODO_verify_flow, /* todo_flags_finish */
7004 's' /* letter */
7008 static bool
7009 gate_handle_cse2 (void)
7011 return optimize > 0 && flag_rerun_cse_after_loop;
7014 /* Run second CSE pass after loop optimizations. */
7015 static unsigned int
7016 rest_of_handle_cse2 (void)
7018 int tem;
7020 if (dump_file)
7021 dump_flow_info (dump_file, dump_flags);
7023 tem = cse_main (get_insns (), max_reg_num ());
7025 /* Run a pass to eliminate duplicated assignments to condition code
7026 registers. We have to run this after bypass_jumps, because it
7027 makes it harder for that pass to determine whether a jump can be
7028 bypassed safely. */
7029 cse_condition_code_reg ();
7031 /* If there are dead edges to purge, we haven't properly updated
7032 the CFG incrementally. */
7033 gcc_assert (!purge_all_dead_edges ());
7035 delete_trivially_dead_insns (get_insns (), max_reg_num ());
7037 if (tem)
7039 timevar_push (TV_JUMP);
7040 rebuild_jump_labels (get_insns ());
7041 delete_dead_jumptables ();
7042 cleanup_cfg (CLEANUP_EXPENSIVE);
7043 timevar_pop (TV_JUMP);
7045 reg_scan (get_insns (), max_reg_num ());
7046 cse_not_expected = 1;
7047 return 0;
7051 struct tree_opt_pass pass_cse2 =
7053 "cse2", /* name */
7054 gate_handle_cse2, /* gate */
7055 rest_of_handle_cse2, /* execute */
7056 NULL, /* sub */
7057 NULL, /* next */
7058 0, /* static_pass_number */
7059 TV_CSE2, /* tv_id */
7060 0, /* properties_required */
7061 0, /* properties_provided */
7062 0, /* properties_destroyed */
7063 0, /* todo_flags_start */
7064 TODO_dump_func |
7065 TODO_ggc_collect |
7066 TODO_verify_flow, /* todo_flags_finish */
7067 't' /* letter */