88a15e4b39ba050c0ebc9249196ca2daa3bbcae8
[gcc.git] / gcc / cse.c
1 /* Common subexpression elimination for GNU compiler.
2 Copyright (C) 1987-2015 Free Software Foundation, Inc.
3
4 This file is part of GCC.
5
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
9 version.
10
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3. If not see
18 <http://www.gnu.org/licenses/>. */
19
20 #include "config.h"
21 #include "system.h"
22 #include "coretypes.h"
23 #include "tm.h"
24 #include "rtl.h"
25 #include "tm_p.h"
26 #include "hard-reg-set.h"
27 #include "regs.h"
28 #include "predict.h"
29 #include "vec.h"
30 #include "hashtab.h"
31 #include "hash-set.h"
32 #include "machmode.h"
33 #include "input.h"
34 #include "function.h"
35 #include "dominance.h"
36 #include "cfg.h"
37 #include "cfgrtl.h"
38 #include "cfganal.h"
39 #include "cfgcleanup.h"
40 #include "basic-block.h"
41 #include "flags.h"
42 #include "insn-config.h"
43 #include "recog.h"
44 #include "symtab.h"
45 #include "statistics.h"
46 #include "double-int.h"
47 #include "real.h"
48 #include "fixed-value.h"
49 #include "alias.h"
50 #include "wide-int.h"
51 #include "inchash.h"
52 #include "tree.h"
53 #include "expmed.h"
54 #include "dojump.h"
55 #include "explow.h"
56 #include "calls.h"
57 #include "emit-rtl.h"
58 #include "varasm.h"
59 #include "stmt.h"
60 #include "expr.h"
61 #include "diagnostic-core.h"
62 #include "toplev.h"
63 #include "ggc.h"
64 #include "except.h"
65 #include "target.h"
66 #include "params.h"
67 #include "rtlhooks-def.h"
68 #include "tree-pass.h"
69 #include "df.h"
70 #include "dbgcnt.h"
71 #include "rtl-iter.h"
72
73 /* The basic idea of common subexpression elimination is to go
74 through the code, keeping a record of expressions that would
75 have the same value at the current scan point, and replacing
76 expressions encountered with the cheapest equivalent expression.
77
78 It is too complicated to keep track of the different possibilities
79 when control paths merge in this code; so, at each label, we forget all
80 that is known and start fresh. This can be described as processing each
81 extended basic block separately. We have a separate pass to perform
82 global CSE.
83
84 Note CSE can turn a conditional or computed jump into a nop or
85 an unconditional jump. When this occurs we arrange to run the jump
86 optimizer after CSE to delete the unreachable code.
87
88 We use two data structures to record the equivalent expressions:
89 a hash table for most expressions, and a vector of "quantity
90 numbers" to record equivalent (pseudo) registers.
91
92 The use of the special data structure for registers is desirable
93 because it is faster. It is possible because registers references
94 contain a fairly small number, the register number, taken from
95 a contiguously allocated series, and two register references are
96 identical if they have the same number. General expressions
97 do not have any such thing, so the only way to retrieve the
98 information recorded on an expression other than a register
99 is to keep it in a hash table.
100
101 Registers and "quantity numbers":
102
103 At the start of each basic block, all of the (hardware and pseudo)
104 registers used in the function are given distinct quantity
105 numbers to indicate their contents. During scan, when the code
106 copies one register into another, we copy the quantity number.
107 When a register is loaded in any other way, we allocate a new
108 quantity number to describe the value generated by this operation.
109 `REG_QTY (N)' records what quantity register N is currently thought
110 of as containing.
111
112 All real quantity numbers are greater than or equal to zero.
113 If register N has not been assigned a quantity, `REG_QTY (N)' will
114 equal -N - 1, which is always negative.
115
116 Quantity numbers below zero do not exist and none of the `qty_table'
117 entries should be referenced with a negative index.
118
119 We also maintain a bidirectional chain of registers for each
120 quantity number. The `qty_table` members `first_reg' and `last_reg',
121 and `reg_eqv_table' members `next' and `prev' hold these chains.
122
123 The first register in a chain is the one whose lifespan is least local.
124 Among equals, it is the one that was seen first.
125 We replace any equivalent register with that one.
126
127 If two registers have the same quantity number, it must be true that
128 REG expressions with qty_table `mode' must be in the hash table for both
129 registers and must be in the same class.
130
131 The converse is not true. Since hard registers may be referenced in
132 any mode, two REG expressions might be equivalent in the hash table
133 but not have the same quantity number if the quantity number of one
134 of the registers is not the same mode as those expressions.
135
136 Constants and quantity numbers
137
138 When a quantity has a known constant value, that value is stored
139 in the appropriate qty_table `const_rtx'. This is in addition to
140 putting the constant in the hash table as is usual for non-regs.
141
142 Whether a reg or a constant is preferred is determined by the configuration
143 macro CONST_COSTS and will often depend on the constant value. In any
144 event, expressions containing constants can be simplified, by fold_rtx.
145
146 When a quantity has a known nearly constant value (such as an address
147 of a stack slot), that value is stored in the appropriate qty_table
148 `const_rtx'.
149
150 Integer constants don't have a machine mode. However, cse
151 determines the intended machine mode from the destination
152 of the instruction that moves the constant. The machine mode
153 is recorded in the hash table along with the actual RTL
154 constant expression so that different modes are kept separate.
155
156 Other expressions:
157
158 To record known equivalences among expressions in general
159 we use a hash table called `table'. It has a fixed number of buckets
160 that contain chains of `struct table_elt' elements for expressions.
161 These chains connect the elements whose expressions have the same
162 hash codes.
163
164 Other chains through the same elements connect the elements which
165 currently have equivalent values.
166
167 Register references in an expression are canonicalized before hashing
168 the expression. This is done using `reg_qty' and qty_table `first_reg'.
169 The hash code of a register reference is computed using the quantity
170 number, not the register number.
171
172 When the value of an expression changes, it is necessary to remove from the
173 hash table not just that expression but all expressions whose values
174 could be different as a result.
175
176 1. If the value changing is in memory, except in special cases
177 ANYTHING referring to memory could be changed. That is because
178 nobody knows where a pointer does not point.
179 The function `invalidate_memory' removes what is necessary.
180
181 The special cases are when the address is constant or is
182 a constant plus a fixed register such as the frame pointer
183 or a static chain pointer. When such addresses are stored in,
184 we can tell exactly which other such addresses must be invalidated
185 due to overlap. `invalidate' does this.
186 All expressions that refer to non-constant
187 memory addresses are also invalidated. `invalidate_memory' does this.
188
189 2. If the value changing is a register, all expressions
190 containing references to that register, and only those,
191 must be removed.
192
193 Because searching the entire hash table for expressions that contain
194 a register is very slow, we try to figure out when it isn't necessary.
195 Precisely, this is necessary only when expressions have been
196 entered in the hash table using this register, and then the value has
197 changed, and then another expression wants to be added to refer to
198 the register's new value. This sequence of circumstances is rare
199 within any one basic block.
200
201 `REG_TICK' and `REG_IN_TABLE', accessors for members of
202 cse_reg_info, are used to detect this case. REG_TICK (i) is
203 incremented whenever a value is stored in register i.
204 REG_IN_TABLE (i) holds -1 if no references to register i have been
205 entered in the table; otherwise, it contains the value REG_TICK (i)
206 had when the references were entered. If we want to enter a
207 reference and REG_IN_TABLE (i) != REG_TICK (i), we must scan and
208 remove old references. Until we want to enter a new entry, the
209 mere fact that the two vectors don't match makes the entries be
210 ignored if anyone tries to match them.
211
212 Registers themselves are entered in the hash table as well as in
213 the equivalent-register chains. However, `REG_TICK' and
214 `REG_IN_TABLE' do not apply to expressions which are simple
215 register references. These expressions are removed from the table
216 immediately when they become invalid, and this can be done even if
217 we do not immediately search for all the expressions that refer to
218 the register.
219
220 A CLOBBER rtx in an instruction invalidates its operand for further
221 reuse. A CLOBBER or SET rtx whose operand is a MEM:BLK
222 invalidates everything that resides in memory.
223
224 Related expressions:
225
226 Constant expressions that differ only by an additive integer
227 are called related. When a constant expression is put in
228 the table, the related expression with no constant term
229 is also entered. These are made to point at each other
230 so that it is possible to find out if there exists any
231 register equivalent to an expression related to a given expression. */
232
233 /* Length of qty_table vector. We know in advance we will not need
234 a quantity number this big. */
235
236 static int max_qty;
237
238 /* Next quantity number to be allocated.
239 This is 1 + the largest number needed so far. */
240
241 static int next_qty;
242
243 /* Per-qty information tracking.
244
245 `first_reg' and `last_reg' track the head and tail of the
246 chain of registers which currently contain this quantity.
247
248 `mode' contains the machine mode of this quantity.
249
250 `const_rtx' holds the rtx of the constant value of this
251 quantity, if known. A summations of the frame/arg pointer
252 and a constant can also be entered here. When this holds
253 a known value, `const_insn' is the insn which stored the
254 constant value.
255
256 `comparison_{code,const,qty}' are used to track when a
257 comparison between a quantity and some constant or register has
258 been passed. In such a case, we know the results of the comparison
259 in case we see it again. These members record a comparison that
260 is known to be true. `comparison_code' holds the rtx code of such
261 a comparison, else it is set to UNKNOWN and the other two
262 comparison members are undefined. `comparison_const' holds
263 the constant being compared against, or zero if the comparison
264 is not against a constant. `comparison_qty' holds the quantity
265 being compared against when the result is known. If the comparison
266 is not with a register, `comparison_qty' is -1. */
267
268 struct qty_table_elem
269 {
270 rtx const_rtx;
271 rtx_insn *const_insn;
272 rtx comparison_const;
273 int comparison_qty;
274 unsigned int first_reg, last_reg;
275 /* The sizes of these fields should match the sizes of the
276 code and mode fields of struct rtx_def (see rtl.h). */
277 ENUM_BITFIELD(rtx_code) comparison_code : 16;
278 ENUM_BITFIELD(machine_mode) mode : 8;
279 };
280
281 /* The table of all qtys, indexed by qty number. */
282 static struct qty_table_elem *qty_table;
283
284 /* For machines that have a CC0, we do not record its value in the hash
285 table since its use is guaranteed to be the insn immediately following
286 its definition and any other insn is presumed to invalidate it.
287
288 Instead, we store below the current and last value assigned to CC0.
289 If it should happen to be a constant, it is stored in preference
290 to the actual assigned value. In case it is a constant, we store
291 the mode in which the constant should be interpreted. */
292
293 static rtx this_insn_cc0, prev_insn_cc0;
294 static machine_mode this_insn_cc0_mode, prev_insn_cc0_mode;
295
296 /* Insn being scanned. */
297
298 static rtx_insn *this_insn;
299 static bool optimize_this_for_speed_p;
300
301 /* Index by register number, gives the number of the next (or
302 previous) register in the chain of registers sharing the same
303 value.
304
305 Or -1 if this register is at the end of the chain.
306
307 If REG_QTY (N) == -N - 1, reg_eqv_table[N].next is undefined. */
308
309 /* Per-register equivalence chain. */
310 struct reg_eqv_elem
311 {
312 int next, prev;
313 };
314
315 /* The table of all register equivalence chains. */
316 static struct reg_eqv_elem *reg_eqv_table;
317
318 struct cse_reg_info
319 {
320 /* The timestamp at which this register is initialized. */
321 unsigned int timestamp;
322
323 /* The quantity number of the register's current contents. */
324 int reg_qty;
325
326 /* The number of times the register has been altered in the current
327 basic block. */
328 int reg_tick;
329
330 /* The REG_TICK value at which rtx's containing this register are
331 valid in the hash table. If this does not equal the current
332 reg_tick value, such expressions existing in the hash table are
333 invalid. */
334 int reg_in_table;
335
336 /* The SUBREG that was set when REG_TICK was last incremented. Set
337 to -1 if the last store was to the whole register, not a subreg. */
338 unsigned int subreg_ticked;
339 };
340
341 /* A table of cse_reg_info indexed by register numbers. */
342 static struct cse_reg_info *cse_reg_info_table;
343
344 /* The size of the above table. */
345 static unsigned int cse_reg_info_table_size;
346
347 /* The index of the first entry that has not been initialized. */
348 static unsigned int cse_reg_info_table_first_uninitialized;
349
350 /* The timestamp at the beginning of the current run of
351 cse_extended_basic_block. We increment this variable at the beginning of
352 the current run of cse_extended_basic_block. The timestamp field of a
353 cse_reg_info entry matches the value of this variable if and only
354 if the entry has been initialized during the current run of
355 cse_extended_basic_block. */
356 static unsigned int cse_reg_info_timestamp;
357
358 /* A HARD_REG_SET containing all the hard registers for which there is
359 currently a REG expression in the hash table. Note the difference
360 from the above variables, which indicate if the REG is mentioned in some
361 expression in the table. */
362
363 static HARD_REG_SET hard_regs_in_table;
364
365 /* True if CSE has altered the CFG. */
366 static bool cse_cfg_altered;
367
368 /* True if CSE has altered conditional jump insns in such a way
369 that jump optimization should be redone. */
370 static bool cse_jumps_altered;
371
372 /* True if we put a LABEL_REF into the hash table for an INSN
373 without a REG_LABEL_OPERAND, we have to rerun jump after CSE
374 to put in the note. */
375 static bool recorded_label_ref;
376
377 /* canon_hash stores 1 in do_not_record
378 if it notices a reference to CC0, PC, or some other volatile
379 subexpression. */
380
381 static int do_not_record;
382
383 /* canon_hash stores 1 in hash_arg_in_memory
384 if it notices a reference to memory within the expression being hashed. */
385
386 static int hash_arg_in_memory;
387
388 /* The hash table contains buckets which are chains of `struct table_elt's,
389 each recording one expression's information.
390 That expression is in the `exp' field.
391
392 The canon_exp field contains a canonical (from the point of view of
393 alias analysis) version of the `exp' field.
394
395 Those elements with the same hash code are chained in both directions
396 through the `next_same_hash' and `prev_same_hash' fields.
397
398 Each set of expressions with equivalent values
399 are on a two-way chain through the `next_same_value'
400 and `prev_same_value' fields, and all point with
401 the `first_same_value' field at the first element in
402 that chain. The chain is in order of increasing cost.
403 Each element's cost value is in its `cost' field.
404
405 The `in_memory' field is nonzero for elements that
406 involve any reference to memory. These elements are removed
407 whenever a write is done to an unidentified location in memory.
408 To be safe, we assume that a memory address is unidentified unless
409 the address is either a symbol constant or a constant plus
410 the frame pointer or argument pointer.
411
412 The `related_value' field is used to connect related expressions
413 (that differ by adding an integer).
414 The related expressions are chained in a circular fashion.
415 `related_value' is zero for expressions for which this
416 chain is not useful.
417
418 The `cost' field stores the cost of this element's expression.
419 The `regcost' field stores the value returned by approx_reg_cost for
420 this element's expression.
421
422 The `is_const' flag is set if the element is a constant (including
423 a fixed address).
424
425 The `flag' field is used as a temporary during some search routines.
426
427 The `mode' field is usually the same as GET_MODE (`exp'), but
428 if `exp' is a CONST_INT and has no machine mode then the `mode'
429 field is the mode it was being used as. Each constant is
430 recorded separately for each mode it is used with. */
431
432 struct table_elt
433 {
434 rtx exp;
435 rtx canon_exp;
436 struct table_elt *next_same_hash;
437 struct table_elt *prev_same_hash;
438 struct table_elt *next_same_value;
439 struct table_elt *prev_same_value;
440 struct table_elt *first_same_value;
441 struct table_elt *related_value;
442 int cost;
443 int regcost;
444 /* The size of this field should match the size
445 of the mode field of struct rtx_def (see rtl.h). */
446 ENUM_BITFIELD(machine_mode) mode : 8;
447 char in_memory;
448 char is_const;
449 char flag;
450 };
451
452 /* We don't want a lot of buckets, because we rarely have very many
453 things stored in the hash table, and a lot of buckets slows
454 down a lot of loops that happen frequently. */
455 #define HASH_SHIFT 5
456 #define HASH_SIZE (1 << HASH_SHIFT)
457 #define HASH_MASK (HASH_SIZE - 1)
458
459 /* Compute hash code of X in mode M. Special-case case where X is a pseudo
460 register (hard registers may require `do_not_record' to be set). */
461
462 #define HASH(X, M) \
463 ((REG_P (X) && REGNO (X) >= FIRST_PSEUDO_REGISTER \
464 ? (((unsigned) REG << 7) + (unsigned) REG_QTY (REGNO (X))) \
465 : canon_hash (X, M)) & HASH_MASK)
466
467 /* Like HASH, but without side-effects. */
468 #define SAFE_HASH(X, M) \
469 ((REG_P (X) && REGNO (X) >= FIRST_PSEUDO_REGISTER \
470 ? (((unsigned) REG << 7) + (unsigned) REG_QTY (REGNO (X))) \
471 : safe_hash (X, M)) & HASH_MASK)
472
473 /* Determine whether register number N is considered a fixed register for the
474 purpose of approximating register costs.
475 It is desirable to replace other regs with fixed regs, to reduce need for
476 non-fixed hard regs.
477 A reg wins if it is either the frame pointer or designated as fixed. */
478 #define FIXED_REGNO_P(N) \
479 ((N) == FRAME_POINTER_REGNUM || (N) == HARD_FRAME_POINTER_REGNUM \
480 || fixed_regs[N] || global_regs[N])
481
482 /* Compute cost of X, as stored in the `cost' field of a table_elt. Fixed
483 hard registers and pointers into the frame are the cheapest with a cost
484 of 0. Next come pseudos with a cost of one and other hard registers with
485 a cost of 2. Aside from these special cases, call `rtx_cost'. */
486
487 #define CHEAP_REGNO(N) \
488 (REGNO_PTR_FRAME_P (N) \
489 || (HARD_REGISTER_NUM_P (N) \
490 && FIXED_REGNO_P (N) && REGNO_REG_CLASS (N) != NO_REGS))
491
492 #define COST(X) (REG_P (X) ? 0 : notreg_cost (X, SET, 1))
493 #define COST_IN(X, OUTER, OPNO) (REG_P (X) ? 0 : notreg_cost (X, OUTER, OPNO))
494
495 /* Get the number of times this register has been updated in this
496 basic block. */
497
498 #define REG_TICK(N) (get_cse_reg_info (N)->reg_tick)
499
500 /* Get the point at which REG was recorded in the table. */
501
502 #define REG_IN_TABLE(N) (get_cse_reg_info (N)->reg_in_table)
503
504 /* Get the SUBREG set at the last increment to REG_TICK (-1 if not a
505 SUBREG). */
506
507 #define SUBREG_TICKED(N) (get_cse_reg_info (N)->subreg_ticked)
508
509 /* Get the quantity number for REG. */
510
511 #define REG_QTY(N) (get_cse_reg_info (N)->reg_qty)
512
513 /* Determine if the quantity number for register X represents a valid index
514 into the qty_table. */
515
516 #define REGNO_QTY_VALID_P(N) (REG_QTY (N) >= 0)
517
518 /* Compare table_elt X and Y and return true iff X is cheaper than Y. */
519
520 #define CHEAPER(X, Y) \
521 (preferable ((X)->cost, (X)->regcost, (Y)->cost, (Y)->regcost) < 0)
522
523 static struct table_elt *table[HASH_SIZE];
524
525 /* Chain of `struct table_elt's made so far for this function
526 but currently removed from the table. */
527
528 static struct table_elt *free_element_chain;
529
530 /* Set to the cost of a constant pool reference if one was found for a
531 symbolic constant. If this was found, it means we should try to
532 convert constants into constant pool entries if they don't fit in
533 the insn. */
534
535 static int constant_pool_entries_cost;
536 static int constant_pool_entries_regcost;
537
538 /* Trace a patch through the CFG. */
539
540 struct branch_path
541 {
542 /* The basic block for this path entry. */
543 basic_block bb;
544 };
545
546 /* This data describes a block that will be processed by
547 cse_extended_basic_block. */
548
549 struct cse_basic_block_data
550 {
551 /* Total number of SETs in block. */
552 int nsets;
553 /* Size of current branch path, if any. */
554 int path_size;
555 /* Current path, indicating which basic_blocks will be processed. */
556 struct branch_path *path;
557 };
558
559
560 /* Pointers to the live in/live out bitmaps for the boundaries of the
561 current EBB. */
562 static bitmap cse_ebb_live_in, cse_ebb_live_out;
563
564 /* A simple bitmap to track which basic blocks have been visited
565 already as part of an already processed extended basic block. */
566 static sbitmap cse_visited_basic_blocks;
567
568 static bool fixed_base_plus_p (rtx x);
569 static int notreg_cost (rtx, enum rtx_code, int);
570 static int preferable (int, int, int, int);
571 static void new_basic_block (void);
572 static void make_new_qty (unsigned int, machine_mode);
573 static void make_regs_eqv (unsigned int, unsigned int);
574 static void delete_reg_equiv (unsigned int);
575 static int mention_regs (rtx);
576 static int insert_regs (rtx, struct table_elt *, int);
577 static void remove_from_table (struct table_elt *, unsigned);
578 static void remove_pseudo_from_table (rtx, unsigned);
579 static struct table_elt *lookup (rtx, unsigned, machine_mode);
580 static struct table_elt *lookup_for_remove (rtx, unsigned, machine_mode);
581 static rtx lookup_as_function (rtx, enum rtx_code);
582 static struct table_elt *insert_with_costs (rtx, struct table_elt *, unsigned,
583 machine_mode, int, int);
584 static struct table_elt *insert (rtx, struct table_elt *, unsigned,
585 machine_mode);
586 static void merge_equiv_classes (struct table_elt *, struct table_elt *);
587 static void invalidate (rtx, machine_mode);
588 static void remove_invalid_refs (unsigned int);
589 static void remove_invalid_subreg_refs (unsigned int, unsigned int,
590 machine_mode);
591 static void rehash_using_reg (rtx);
592 static void invalidate_memory (void);
593 static void invalidate_for_call (void);
594 static rtx use_related_value (rtx, struct table_elt *);
595
596 static inline unsigned canon_hash (rtx, machine_mode);
597 static inline unsigned safe_hash (rtx, machine_mode);
598 static inline unsigned hash_rtx_string (const char *);
599
600 static rtx canon_reg (rtx, rtx_insn *);
601 static enum rtx_code find_comparison_args (enum rtx_code, rtx *, rtx *,
602 machine_mode *,
603 machine_mode *);
604 static rtx fold_rtx (rtx, rtx_insn *);
605 static rtx equiv_constant (rtx);
606 static void record_jump_equiv (rtx_insn *, bool);
607 static void record_jump_cond (enum rtx_code, machine_mode, rtx, rtx,
608 int);
609 static void cse_insn (rtx_insn *);
610 static void cse_prescan_path (struct cse_basic_block_data *);
611 static void invalidate_from_clobbers (rtx_insn *);
612 static void invalidate_from_sets_and_clobbers (rtx_insn *);
613 static rtx cse_process_notes (rtx, rtx, bool *);
614 static void cse_extended_basic_block (struct cse_basic_block_data *);
615 extern void dump_class (struct table_elt*);
616 static void get_cse_reg_info_1 (unsigned int regno);
617 static struct cse_reg_info * get_cse_reg_info (unsigned int regno);
618
619 static void flush_hash_table (void);
620 static bool insn_live_p (rtx_insn *, int *);
621 static bool set_live_p (rtx, rtx_insn *, int *);
622 static void cse_change_cc_mode_insn (rtx_insn *, rtx);
623 static void cse_change_cc_mode_insns (rtx_insn *, rtx_insn *, rtx);
624 static machine_mode cse_cc_succs (basic_block, basic_block, rtx, rtx,
625 bool);
626 \f
627
628 #undef RTL_HOOKS_GEN_LOWPART
629 #define RTL_HOOKS_GEN_LOWPART gen_lowpart_if_possible
630
631 static const struct rtl_hooks cse_rtl_hooks = RTL_HOOKS_INITIALIZER;
632 \f
633 /* Nonzero if X has the form (PLUS frame-pointer integer). */
634
635 static bool
636 fixed_base_plus_p (rtx x)
637 {
638 switch (GET_CODE (x))
639 {
640 case REG:
641 if (x == frame_pointer_rtx || x == hard_frame_pointer_rtx)
642 return true;
643 if (x == arg_pointer_rtx && fixed_regs[ARG_POINTER_REGNUM])
644 return true;
645 return false;
646
647 case PLUS:
648 if (!CONST_INT_P (XEXP (x, 1)))
649 return false;
650 return fixed_base_plus_p (XEXP (x, 0));
651
652 default:
653 return false;
654 }
655 }
656
657 /* Dump the expressions in the equivalence class indicated by CLASSP.
658 This function is used only for debugging. */
659 DEBUG_FUNCTION void
660 dump_class (struct table_elt *classp)
661 {
662 struct table_elt *elt;
663
664 fprintf (stderr, "Equivalence chain for ");
665 print_rtl (stderr, classp->exp);
666 fprintf (stderr, ": \n");
667
668 for (elt = classp->first_same_value; elt; elt = elt->next_same_value)
669 {
670 print_rtl (stderr, elt->exp);
671 fprintf (stderr, "\n");
672 }
673 }
674
675 /* Return an estimate of the cost of the registers used in an rtx.
676 This is mostly the number of different REG expressions in the rtx;
677 however for some exceptions like fixed registers we use a cost of
678 0. If any other hard register reference occurs, return MAX_COST. */
679
680 static int
681 approx_reg_cost (const_rtx x)
682 {
683 int cost = 0;
684 subrtx_iterator::array_type array;
685 FOR_EACH_SUBRTX (iter, array, x, NONCONST)
686 {
687 const_rtx x = *iter;
688 if (REG_P (x))
689 {
690 unsigned int regno = REGNO (x);
691 if (!CHEAP_REGNO (regno))
692 {
693 if (regno < FIRST_PSEUDO_REGISTER)
694 {
695 if (targetm.small_register_classes_for_mode_p (GET_MODE (x)))
696 return MAX_COST;
697 cost += 2;
698 }
699 else
700 cost += 1;
701 }
702 }
703 }
704 return cost;
705 }
706
707 /* Return a negative value if an rtx A, whose costs are given by COST_A
708 and REGCOST_A, is more desirable than an rtx B.
709 Return a positive value if A is less desirable, or 0 if the two are
710 equally good. */
711 static int
712 preferable (int cost_a, int regcost_a, int cost_b, int regcost_b)
713 {
714 /* First, get rid of cases involving expressions that are entirely
715 unwanted. */
716 if (cost_a != cost_b)
717 {
718 if (cost_a == MAX_COST)
719 return 1;
720 if (cost_b == MAX_COST)
721 return -1;
722 }
723
724 /* Avoid extending lifetimes of hardregs. */
725 if (regcost_a != regcost_b)
726 {
727 if (regcost_a == MAX_COST)
728 return 1;
729 if (regcost_b == MAX_COST)
730 return -1;
731 }
732
733 /* Normal operation costs take precedence. */
734 if (cost_a != cost_b)
735 return cost_a - cost_b;
736 /* Only if these are identical consider effects on register pressure. */
737 if (regcost_a != regcost_b)
738 return regcost_a - regcost_b;
739 return 0;
740 }
741
742 /* Internal function, to compute cost when X is not a register; called
743 from COST macro to keep it simple. */
744
745 static int
746 notreg_cost (rtx x, enum rtx_code outer, int opno)
747 {
748 return ((GET_CODE (x) == SUBREG
749 && REG_P (SUBREG_REG (x))
750 && GET_MODE_CLASS (GET_MODE (x)) == MODE_INT
751 && GET_MODE_CLASS (GET_MODE (SUBREG_REG (x))) == MODE_INT
752 && (GET_MODE_SIZE (GET_MODE (x))
753 < GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))))
754 && subreg_lowpart_p (x)
755 && TRULY_NOOP_TRUNCATION_MODES_P (GET_MODE (x),
756 GET_MODE (SUBREG_REG (x))))
757 ? 0
758 : rtx_cost (x, outer, opno, optimize_this_for_speed_p) * 2);
759 }
760
761 \f
762 /* Initialize CSE_REG_INFO_TABLE. */
763
764 static void
765 init_cse_reg_info (unsigned int nregs)
766 {
767 /* Do we need to grow the table? */
768 if (nregs > cse_reg_info_table_size)
769 {
770 unsigned int new_size;
771
772 if (cse_reg_info_table_size < 2048)
773 {
774 /* Compute a new size that is a power of 2 and no smaller
775 than the large of NREGS and 64. */
776 new_size = (cse_reg_info_table_size
777 ? cse_reg_info_table_size : 64);
778
779 while (new_size < nregs)
780 new_size *= 2;
781 }
782 else
783 {
784 /* If we need a big table, allocate just enough to hold
785 NREGS registers. */
786 new_size = nregs;
787 }
788
789 /* Reallocate the table with NEW_SIZE entries. */
790 free (cse_reg_info_table);
791 cse_reg_info_table = XNEWVEC (struct cse_reg_info, new_size);
792 cse_reg_info_table_size = new_size;
793 cse_reg_info_table_first_uninitialized = 0;
794 }
795
796 /* Do we have all of the first NREGS entries initialized? */
797 if (cse_reg_info_table_first_uninitialized < nregs)
798 {
799 unsigned int old_timestamp = cse_reg_info_timestamp - 1;
800 unsigned int i;
801
802 /* Put the old timestamp on newly allocated entries so that they
803 will all be considered out of date. We do not touch those
804 entries beyond the first NREGS entries to be nice to the
805 virtual memory. */
806 for (i = cse_reg_info_table_first_uninitialized; i < nregs; i++)
807 cse_reg_info_table[i].timestamp = old_timestamp;
808
809 cse_reg_info_table_first_uninitialized = nregs;
810 }
811 }
812
813 /* Given REGNO, initialize the cse_reg_info entry for REGNO. */
814
815 static void
816 get_cse_reg_info_1 (unsigned int regno)
817 {
818 /* Set TIMESTAMP field to CSE_REG_INFO_TIMESTAMP so that this
819 entry will be considered to have been initialized. */
820 cse_reg_info_table[regno].timestamp = cse_reg_info_timestamp;
821
822 /* Initialize the rest of the entry. */
823 cse_reg_info_table[regno].reg_tick = 1;
824 cse_reg_info_table[regno].reg_in_table = -1;
825 cse_reg_info_table[regno].subreg_ticked = -1;
826 cse_reg_info_table[regno].reg_qty = -regno - 1;
827 }
828
829 /* Find a cse_reg_info entry for REGNO. */
830
831 static inline struct cse_reg_info *
832 get_cse_reg_info (unsigned int regno)
833 {
834 struct cse_reg_info *p = &cse_reg_info_table[regno];
835
836 /* If this entry has not been initialized, go ahead and initialize
837 it. */
838 if (p->timestamp != cse_reg_info_timestamp)
839 get_cse_reg_info_1 (regno);
840
841 return p;
842 }
843
844 /* Clear the hash table and initialize each register with its own quantity,
845 for a new basic block. */
846
847 static void
848 new_basic_block (void)
849 {
850 int i;
851
852 next_qty = 0;
853
854 /* Invalidate cse_reg_info_table. */
855 cse_reg_info_timestamp++;
856
857 /* Clear out hash table state for this pass. */
858 CLEAR_HARD_REG_SET (hard_regs_in_table);
859
860 /* The per-quantity values used to be initialized here, but it is
861 much faster to initialize each as it is made in `make_new_qty'. */
862
863 for (i = 0; i < HASH_SIZE; i++)
864 {
865 struct table_elt *first;
866
867 first = table[i];
868 if (first != NULL)
869 {
870 struct table_elt *last = first;
871
872 table[i] = NULL;
873
874 while (last->next_same_hash != NULL)
875 last = last->next_same_hash;
876
877 /* Now relink this hash entire chain into
878 the free element list. */
879
880 last->next_same_hash = free_element_chain;
881 free_element_chain = first;
882 }
883 }
884
885 prev_insn_cc0 = 0;
886 }
887
888 /* Say that register REG contains a quantity in mode MODE not in any
889 register before and initialize that quantity. */
890
891 static void
892 make_new_qty (unsigned int reg, machine_mode mode)
893 {
894 int q;
895 struct qty_table_elem *ent;
896 struct reg_eqv_elem *eqv;
897
898 gcc_assert (next_qty < max_qty);
899
900 q = REG_QTY (reg) = next_qty++;
901 ent = &qty_table[q];
902 ent->first_reg = reg;
903 ent->last_reg = reg;
904 ent->mode = mode;
905 ent->const_rtx = ent->const_insn = NULL;
906 ent->comparison_code = UNKNOWN;
907
908 eqv = &reg_eqv_table[reg];
909 eqv->next = eqv->prev = -1;
910 }
911
912 /* Make reg NEW equivalent to reg OLD.
913 OLD is not changing; NEW is. */
914
915 static void
916 make_regs_eqv (unsigned int new_reg, unsigned int old_reg)
917 {
918 unsigned int lastr, firstr;
919 int q = REG_QTY (old_reg);
920 struct qty_table_elem *ent;
921
922 ent = &qty_table[q];
923
924 /* Nothing should become eqv until it has a "non-invalid" qty number. */
925 gcc_assert (REGNO_QTY_VALID_P (old_reg));
926
927 REG_QTY (new_reg) = q;
928 firstr = ent->first_reg;
929 lastr = ent->last_reg;
930
931 /* Prefer fixed hard registers to anything. Prefer pseudo regs to other
932 hard regs. Among pseudos, if NEW will live longer than any other reg
933 of the same qty, and that is beyond the current basic block,
934 make it the new canonical replacement for this qty. */
935 if (! (firstr < FIRST_PSEUDO_REGISTER && FIXED_REGNO_P (firstr))
936 /* Certain fixed registers might be of the class NO_REGS. This means
937 that not only can they not be allocated by the compiler, but
938 they cannot be used in substitutions or canonicalizations
939 either. */
940 && (new_reg >= FIRST_PSEUDO_REGISTER || REGNO_REG_CLASS (new_reg) != NO_REGS)
941 && ((new_reg < FIRST_PSEUDO_REGISTER && FIXED_REGNO_P (new_reg))
942 || (new_reg >= FIRST_PSEUDO_REGISTER
943 && (firstr < FIRST_PSEUDO_REGISTER
944 || (bitmap_bit_p (cse_ebb_live_out, new_reg)
945 && !bitmap_bit_p (cse_ebb_live_out, firstr))
946 || (bitmap_bit_p (cse_ebb_live_in, new_reg)
947 && !bitmap_bit_p (cse_ebb_live_in, firstr))))))
948 {
949 reg_eqv_table[firstr].prev = new_reg;
950 reg_eqv_table[new_reg].next = firstr;
951 reg_eqv_table[new_reg].prev = -1;
952 ent->first_reg = new_reg;
953 }
954 else
955 {
956 /* If NEW is a hard reg (known to be non-fixed), insert at end.
957 Otherwise, insert before any non-fixed hard regs that are at the
958 end. Registers of class NO_REGS cannot be used as an
959 equivalent for anything. */
960 while (lastr < FIRST_PSEUDO_REGISTER && reg_eqv_table[lastr].prev >= 0
961 && (REGNO_REG_CLASS (lastr) == NO_REGS || ! FIXED_REGNO_P (lastr))
962 && new_reg >= FIRST_PSEUDO_REGISTER)
963 lastr = reg_eqv_table[lastr].prev;
964 reg_eqv_table[new_reg].next = reg_eqv_table[lastr].next;
965 if (reg_eqv_table[lastr].next >= 0)
966 reg_eqv_table[reg_eqv_table[lastr].next].prev = new_reg;
967 else
968 qty_table[q].last_reg = new_reg;
969 reg_eqv_table[lastr].next = new_reg;
970 reg_eqv_table[new_reg].prev = lastr;
971 }
972 }
973
974 /* Remove REG from its equivalence class. */
975
976 static void
977 delete_reg_equiv (unsigned int reg)
978 {
979 struct qty_table_elem *ent;
980 int q = REG_QTY (reg);
981 int p, n;
982
983 /* If invalid, do nothing. */
984 if (! REGNO_QTY_VALID_P (reg))
985 return;
986
987 ent = &qty_table[q];
988
989 p = reg_eqv_table[reg].prev;
990 n = reg_eqv_table[reg].next;
991
992 if (n != -1)
993 reg_eqv_table[n].prev = p;
994 else
995 ent->last_reg = p;
996 if (p != -1)
997 reg_eqv_table[p].next = n;
998 else
999 ent->first_reg = n;
1000
1001 REG_QTY (reg) = -reg - 1;
1002 }
1003
1004 /* Remove any invalid expressions from the hash table
1005 that refer to any of the registers contained in expression X.
1006
1007 Make sure that newly inserted references to those registers
1008 as subexpressions will be considered valid.
1009
1010 mention_regs is not called when a register itself
1011 is being stored in the table.
1012
1013 Return 1 if we have done something that may have changed the hash code
1014 of X. */
1015
1016 static int
1017 mention_regs (rtx x)
1018 {
1019 enum rtx_code code;
1020 int i, j;
1021 const char *fmt;
1022 int changed = 0;
1023
1024 if (x == 0)
1025 return 0;
1026
1027 code = GET_CODE (x);
1028 if (code == REG)
1029 {
1030 unsigned int regno = REGNO (x);
1031 unsigned int endregno = END_REGNO (x);
1032 unsigned int i;
1033
1034 for (i = regno; i < endregno; i++)
1035 {
1036 if (REG_IN_TABLE (i) >= 0 && REG_IN_TABLE (i) != REG_TICK (i))
1037 remove_invalid_refs (i);
1038
1039 REG_IN_TABLE (i) = REG_TICK (i);
1040 SUBREG_TICKED (i) = -1;
1041 }
1042
1043 return 0;
1044 }
1045
1046 /* If this is a SUBREG, we don't want to discard other SUBREGs of the same
1047 pseudo if they don't use overlapping words. We handle only pseudos
1048 here for simplicity. */
1049 if (code == SUBREG && REG_P (SUBREG_REG (x))
1050 && REGNO (SUBREG_REG (x)) >= FIRST_PSEUDO_REGISTER)
1051 {
1052 unsigned int i = REGNO (SUBREG_REG (x));
1053
1054 if (REG_IN_TABLE (i) >= 0 && REG_IN_TABLE (i) != REG_TICK (i))
1055 {
1056 /* If REG_IN_TABLE (i) differs from REG_TICK (i) by one, and
1057 the last store to this register really stored into this
1058 subreg, then remove the memory of this subreg.
1059 Otherwise, remove any memory of the entire register and
1060 all its subregs from the table. */
1061 if (REG_TICK (i) - REG_IN_TABLE (i) > 1
1062 || SUBREG_TICKED (i) != REGNO (SUBREG_REG (x)))
1063 remove_invalid_refs (i);
1064 else
1065 remove_invalid_subreg_refs (i, SUBREG_BYTE (x), GET_MODE (x));
1066 }
1067
1068 REG_IN_TABLE (i) = REG_TICK (i);
1069 SUBREG_TICKED (i) = REGNO (SUBREG_REG (x));
1070 return 0;
1071 }
1072
1073 /* If X is a comparison or a COMPARE and either operand is a register
1074 that does not have a quantity, give it one. This is so that a later
1075 call to record_jump_equiv won't cause X to be assigned a different
1076 hash code and not found in the table after that call.
1077
1078 It is not necessary to do this here, since rehash_using_reg can
1079 fix up the table later, but doing this here eliminates the need to
1080 call that expensive function in the most common case where the only
1081 use of the register is in the comparison. */
1082
1083 if (code == COMPARE || COMPARISON_P (x))
1084 {
1085 if (REG_P (XEXP (x, 0))
1086 && ! REGNO_QTY_VALID_P (REGNO (XEXP (x, 0))))
1087 if (insert_regs (XEXP (x, 0), NULL, 0))
1088 {
1089 rehash_using_reg (XEXP (x, 0));
1090 changed = 1;
1091 }
1092
1093 if (REG_P (XEXP (x, 1))
1094 && ! REGNO_QTY_VALID_P (REGNO (XEXP (x, 1))))
1095 if (insert_regs (XEXP (x, 1), NULL, 0))
1096 {
1097 rehash_using_reg (XEXP (x, 1));
1098 changed = 1;
1099 }
1100 }
1101
1102 fmt = GET_RTX_FORMAT (code);
1103 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1104 if (fmt[i] == 'e')
1105 changed |= mention_regs (XEXP (x, i));
1106 else if (fmt[i] == 'E')
1107 for (j = 0; j < XVECLEN (x, i); j++)
1108 changed |= mention_regs (XVECEXP (x, i, j));
1109
1110 return changed;
1111 }
1112
1113 /* Update the register quantities for inserting X into the hash table
1114 with a value equivalent to CLASSP.
1115 (If the class does not contain a REG, it is irrelevant.)
1116 If MODIFIED is nonzero, X is a destination; it is being modified.
1117 Note that delete_reg_equiv should be called on a register
1118 before insert_regs is done on that register with MODIFIED != 0.
1119
1120 Nonzero value means that elements of reg_qty have changed
1121 so X's hash code may be different. */
1122
1123 static int
1124 insert_regs (rtx x, struct table_elt *classp, int modified)
1125 {
1126 if (REG_P (x))
1127 {
1128 unsigned int regno = REGNO (x);
1129 int qty_valid;
1130
1131 /* If REGNO is in the equivalence table already but is of the
1132 wrong mode for that equivalence, don't do anything here. */
1133
1134 qty_valid = REGNO_QTY_VALID_P (regno);
1135 if (qty_valid)
1136 {
1137 struct qty_table_elem *ent = &qty_table[REG_QTY (regno)];
1138
1139 if (ent->mode != GET_MODE (x))
1140 return 0;
1141 }
1142
1143 if (modified || ! qty_valid)
1144 {
1145 if (classp)
1146 for (classp = classp->first_same_value;
1147 classp != 0;
1148 classp = classp->next_same_value)
1149 if (REG_P (classp->exp)
1150 && GET_MODE (classp->exp) == GET_MODE (x))
1151 {
1152 unsigned c_regno = REGNO (classp->exp);
1153
1154 gcc_assert (REGNO_QTY_VALID_P (c_regno));
1155
1156 /* Suppose that 5 is hard reg and 100 and 101 are
1157 pseudos. Consider
1158
1159 (set (reg:si 100) (reg:si 5))
1160 (set (reg:si 5) (reg:si 100))
1161 (set (reg:di 101) (reg:di 5))
1162
1163 We would now set REG_QTY (101) = REG_QTY (5), but the
1164 entry for 5 is in SImode. When we use this later in
1165 copy propagation, we get the register in wrong mode. */
1166 if (qty_table[REG_QTY (c_regno)].mode != GET_MODE (x))
1167 continue;
1168
1169 make_regs_eqv (regno, c_regno);
1170 return 1;
1171 }
1172
1173 /* Mention_regs for a SUBREG checks if REG_TICK is exactly one larger
1174 than REG_IN_TABLE to find out if there was only a single preceding
1175 invalidation - for the SUBREG - or another one, which would be
1176 for the full register. However, if we find here that REG_TICK
1177 indicates that the register is invalid, it means that it has
1178 been invalidated in a separate operation. The SUBREG might be used
1179 now (then this is a recursive call), or we might use the full REG
1180 now and a SUBREG of it later. So bump up REG_TICK so that
1181 mention_regs will do the right thing. */
1182 if (! modified
1183 && REG_IN_TABLE (regno) >= 0
1184 && REG_TICK (regno) == REG_IN_TABLE (regno) + 1)
1185 REG_TICK (regno)++;
1186 make_new_qty (regno, GET_MODE (x));
1187 return 1;
1188 }
1189
1190 return 0;
1191 }
1192
1193 /* If X is a SUBREG, we will likely be inserting the inner register in the
1194 table. If that register doesn't have an assigned quantity number at
1195 this point but does later, the insertion that we will be doing now will
1196 not be accessible because its hash code will have changed. So assign
1197 a quantity number now. */
1198
1199 else if (GET_CODE (x) == SUBREG && REG_P (SUBREG_REG (x))
1200 && ! REGNO_QTY_VALID_P (REGNO (SUBREG_REG (x))))
1201 {
1202 insert_regs (SUBREG_REG (x), NULL, 0);
1203 mention_regs (x);
1204 return 1;
1205 }
1206 else
1207 return mention_regs (x);
1208 }
1209 \f
1210
1211 /* Compute upper and lower anchors for CST. Also compute the offset of CST
1212 from these anchors/bases such that *_BASE + *_OFFS = CST. Return false iff
1213 CST is equal to an anchor. */
1214
1215 static bool
1216 compute_const_anchors (rtx cst,
1217 HOST_WIDE_INT *lower_base, HOST_WIDE_INT *lower_offs,
1218 HOST_WIDE_INT *upper_base, HOST_WIDE_INT *upper_offs)
1219 {
1220 HOST_WIDE_INT n = INTVAL (cst);
1221
1222 *lower_base = n & ~(targetm.const_anchor - 1);
1223 if (*lower_base == n)
1224 return false;
1225
1226 *upper_base =
1227 (n + (targetm.const_anchor - 1)) & ~(targetm.const_anchor - 1);
1228 *upper_offs = n - *upper_base;
1229 *lower_offs = n - *lower_base;
1230 return true;
1231 }
1232
1233 /* Insert the equivalence between ANCHOR and (REG + OFF) in mode MODE. */
1234
1235 static void
1236 insert_const_anchor (HOST_WIDE_INT anchor, rtx reg, HOST_WIDE_INT offs,
1237 machine_mode mode)
1238 {
1239 struct table_elt *elt;
1240 unsigned hash;
1241 rtx anchor_exp;
1242 rtx exp;
1243
1244 anchor_exp = GEN_INT (anchor);
1245 hash = HASH (anchor_exp, mode);
1246 elt = lookup (anchor_exp, hash, mode);
1247 if (!elt)
1248 elt = insert (anchor_exp, NULL, hash, mode);
1249
1250 exp = plus_constant (mode, reg, offs);
1251 /* REG has just been inserted and the hash codes recomputed. */
1252 mention_regs (exp);
1253 hash = HASH (exp, mode);
1254
1255 /* Use the cost of the register rather than the whole expression. When
1256 looking up constant anchors we will further offset the corresponding
1257 expression therefore it does not make sense to prefer REGs over
1258 reg-immediate additions. Prefer instead the oldest expression. Also
1259 don't prefer pseudos over hard regs so that we derive constants in
1260 argument registers from other argument registers rather than from the
1261 original pseudo that was used to synthesize the constant. */
1262 insert_with_costs (exp, elt, hash, mode, COST (reg), 1);
1263 }
1264
1265 /* The constant CST is equivalent to the register REG. Create
1266 equivalences between the two anchors of CST and the corresponding
1267 register-offset expressions using REG. */
1268
1269 static void
1270 insert_const_anchors (rtx reg, rtx cst, machine_mode mode)
1271 {
1272 HOST_WIDE_INT lower_base, lower_offs, upper_base, upper_offs;
1273
1274 if (!compute_const_anchors (cst, &lower_base, &lower_offs,
1275 &upper_base, &upper_offs))
1276 return;
1277
1278 /* Ignore anchors of value 0. Constants accessible from zero are
1279 simple. */
1280 if (lower_base != 0)
1281 insert_const_anchor (lower_base, reg, -lower_offs, mode);
1282
1283 if (upper_base != 0)
1284 insert_const_anchor (upper_base, reg, -upper_offs, mode);
1285 }
1286
1287 /* We need to express ANCHOR_ELT->exp + OFFS. Walk the equivalence list of
1288 ANCHOR_ELT and see if offsetting any of the entries by OFFS would create a
1289 valid expression. Return the cheapest and oldest of such expressions. In
1290 *OLD, return how old the resulting expression is compared to the other
1291 equivalent expressions. */
1292
1293 static rtx
1294 find_reg_offset_for_const (struct table_elt *anchor_elt, HOST_WIDE_INT offs,
1295 unsigned *old)
1296 {
1297 struct table_elt *elt;
1298 unsigned idx;
1299 struct table_elt *match_elt;
1300 rtx match;
1301
1302 /* Find the cheapest and *oldest* expression to maximize the chance of
1303 reusing the same pseudo. */
1304
1305 match_elt = NULL;
1306 match = NULL_RTX;
1307 for (elt = anchor_elt->first_same_value, idx = 0;
1308 elt;
1309 elt = elt->next_same_value, idx++)
1310 {
1311 if (match_elt && CHEAPER (match_elt, elt))
1312 return match;
1313
1314 if (REG_P (elt->exp)
1315 || (GET_CODE (elt->exp) == PLUS
1316 && REG_P (XEXP (elt->exp, 0))
1317 && GET_CODE (XEXP (elt->exp, 1)) == CONST_INT))
1318 {
1319 rtx x;
1320
1321 /* Ignore expressions that are no longer valid. */
1322 if (!REG_P (elt->exp) && !exp_equiv_p (elt->exp, elt->exp, 1, false))
1323 continue;
1324
1325 x = plus_constant (GET_MODE (elt->exp), elt->exp, offs);
1326 if (REG_P (x)
1327 || (GET_CODE (x) == PLUS
1328 && IN_RANGE (INTVAL (XEXP (x, 1)),
1329 -targetm.const_anchor,
1330 targetm.const_anchor - 1)))
1331 {
1332 match = x;
1333 match_elt = elt;
1334 *old = idx;
1335 }
1336 }
1337 }
1338
1339 return match;
1340 }
1341
1342 /* Try to express the constant SRC_CONST using a register+offset expression
1343 derived from a constant anchor. Return it if successful or NULL_RTX,
1344 otherwise. */
1345
1346 static rtx
1347 try_const_anchors (rtx src_const, machine_mode mode)
1348 {
1349 struct table_elt *lower_elt, *upper_elt;
1350 HOST_WIDE_INT lower_base, lower_offs, upper_base, upper_offs;
1351 rtx lower_anchor_rtx, upper_anchor_rtx;
1352 rtx lower_exp = NULL_RTX, upper_exp = NULL_RTX;
1353 unsigned lower_old, upper_old;
1354
1355 /* CONST_INT is used for CC modes, but we should leave those alone. */
1356 if (GET_MODE_CLASS (mode) == MODE_CC)
1357 return NULL_RTX;
1358
1359 gcc_assert (SCALAR_INT_MODE_P (mode));
1360 if (!compute_const_anchors (src_const, &lower_base, &lower_offs,
1361 &upper_base, &upper_offs))
1362 return NULL_RTX;
1363
1364 lower_anchor_rtx = GEN_INT (lower_base);
1365 upper_anchor_rtx = GEN_INT (upper_base);
1366 lower_elt = lookup (lower_anchor_rtx, HASH (lower_anchor_rtx, mode), mode);
1367 upper_elt = lookup (upper_anchor_rtx, HASH (upper_anchor_rtx, mode), mode);
1368
1369 if (lower_elt)
1370 lower_exp = find_reg_offset_for_const (lower_elt, lower_offs, &lower_old);
1371 if (upper_elt)
1372 upper_exp = find_reg_offset_for_const (upper_elt, upper_offs, &upper_old);
1373
1374 if (!lower_exp)
1375 return upper_exp;
1376 if (!upper_exp)
1377 return lower_exp;
1378
1379 /* Return the older expression. */
1380 return (upper_old > lower_old ? upper_exp : lower_exp);
1381 }
1382 \f
1383 /* Look in or update the hash table. */
1384
1385 /* Remove table element ELT from use in the table.
1386 HASH is its hash code, made using the HASH macro.
1387 It's an argument because often that is known in advance
1388 and we save much time not recomputing it. */
1389
1390 static void
1391 remove_from_table (struct table_elt *elt, unsigned int hash)
1392 {
1393 if (elt == 0)
1394 return;
1395
1396 /* Mark this element as removed. See cse_insn. */
1397 elt->first_same_value = 0;
1398
1399 /* Remove the table element from its equivalence class. */
1400
1401 {
1402 struct table_elt *prev = elt->prev_same_value;
1403 struct table_elt *next = elt->next_same_value;
1404
1405 if (next)
1406 next->prev_same_value = prev;
1407
1408 if (prev)
1409 prev->next_same_value = next;
1410 else
1411 {
1412 struct table_elt *newfirst = next;
1413 while (next)
1414 {
1415 next->first_same_value = newfirst;
1416 next = next->next_same_value;
1417 }
1418 }
1419 }
1420
1421 /* Remove the table element from its hash bucket. */
1422
1423 {
1424 struct table_elt *prev = elt->prev_same_hash;
1425 struct table_elt *next = elt->next_same_hash;
1426
1427 if (next)
1428 next->prev_same_hash = prev;
1429
1430 if (prev)
1431 prev->next_same_hash = next;
1432 else if (table[hash] == elt)
1433 table[hash] = next;
1434 else
1435 {
1436 /* This entry is not in the proper hash bucket. This can happen
1437 when two classes were merged by `merge_equiv_classes'. Search
1438 for the hash bucket that it heads. This happens only very
1439 rarely, so the cost is acceptable. */
1440 for (hash = 0; hash < HASH_SIZE; hash++)
1441 if (table[hash] == elt)
1442 table[hash] = next;
1443 }
1444 }
1445
1446 /* Remove the table element from its related-value circular chain. */
1447
1448 if (elt->related_value != 0 && elt->related_value != elt)
1449 {
1450 struct table_elt *p = elt->related_value;
1451
1452 while (p->related_value != elt)
1453 p = p->related_value;
1454 p->related_value = elt->related_value;
1455 if (p->related_value == p)
1456 p->related_value = 0;
1457 }
1458
1459 /* Now add it to the free element chain. */
1460 elt->next_same_hash = free_element_chain;
1461 free_element_chain = elt;
1462 }
1463
1464 /* Same as above, but X is a pseudo-register. */
1465
1466 static void
1467 remove_pseudo_from_table (rtx x, unsigned int hash)
1468 {
1469 struct table_elt *elt;
1470
1471 /* Because a pseudo-register can be referenced in more than one
1472 mode, we might have to remove more than one table entry. */
1473 while ((elt = lookup_for_remove (x, hash, VOIDmode)))
1474 remove_from_table (elt, hash);
1475 }
1476
1477 /* Look up X in the hash table and return its table element,
1478 or 0 if X is not in the table.
1479
1480 MODE is the machine-mode of X, or if X is an integer constant
1481 with VOIDmode then MODE is the mode with which X will be used.
1482
1483 Here we are satisfied to find an expression whose tree structure
1484 looks like X. */
1485
1486 static struct table_elt *
1487 lookup (rtx x, unsigned int hash, machine_mode mode)
1488 {
1489 struct table_elt *p;
1490
1491 for (p = table[hash]; p; p = p->next_same_hash)
1492 if (mode == p->mode && ((x == p->exp && REG_P (x))
1493 || exp_equiv_p (x, p->exp, !REG_P (x), false)))
1494 return p;
1495
1496 return 0;
1497 }
1498
1499 /* Like `lookup' but don't care whether the table element uses invalid regs.
1500 Also ignore discrepancies in the machine mode of a register. */
1501
1502 static struct table_elt *
1503 lookup_for_remove (rtx x, unsigned int hash, machine_mode mode)
1504 {
1505 struct table_elt *p;
1506
1507 if (REG_P (x))
1508 {
1509 unsigned int regno = REGNO (x);
1510
1511 /* Don't check the machine mode when comparing registers;
1512 invalidating (REG:SI 0) also invalidates (REG:DF 0). */
1513 for (p = table[hash]; p; p = p->next_same_hash)
1514 if (REG_P (p->exp)
1515 && REGNO (p->exp) == regno)
1516 return p;
1517 }
1518 else
1519 {
1520 for (p = table[hash]; p; p = p->next_same_hash)
1521 if (mode == p->mode
1522 && (x == p->exp || exp_equiv_p (x, p->exp, 0, false)))
1523 return p;
1524 }
1525
1526 return 0;
1527 }
1528
1529 /* Look for an expression equivalent to X and with code CODE.
1530 If one is found, return that expression. */
1531
1532 static rtx
1533 lookup_as_function (rtx x, enum rtx_code code)
1534 {
1535 struct table_elt *p
1536 = lookup (x, SAFE_HASH (x, VOIDmode), GET_MODE (x));
1537
1538 if (p == 0)
1539 return 0;
1540
1541 for (p = p->first_same_value; p; p = p->next_same_value)
1542 if (GET_CODE (p->exp) == code
1543 /* Make sure this is a valid entry in the table. */
1544 && exp_equiv_p (p->exp, p->exp, 1, false))
1545 return p->exp;
1546
1547 return 0;
1548 }
1549
1550 /* Insert X in the hash table, assuming HASH is its hash code and
1551 CLASSP is an element of the class it should go in (or 0 if a new
1552 class should be made). COST is the code of X and reg_cost is the
1553 cost of registers in X. It is inserted at the proper position to
1554 keep the class in the order cheapest first.
1555
1556 MODE is the machine-mode of X, or if X is an integer constant
1557 with VOIDmode then MODE is the mode with which X will be used.
1558
1559 For elements of equal cheapness, the most recent one
1560 goes in front, except that the first element in the list
1561 remains first unless a cheaper element is added. The order of
1562 pseudo-registers does not matter, as canon_reg will be called to
1563 find the cheapest when a register is retrieved from the table.
1564
1565 The in_memory field in the hash table element is set to 0.
1566 The caller must set it nonzero if appropriate.
1567
1568 You should call insert_regs (X, CLASSP, MODIFY) before calling here,
1569 and if insert_regs returns a nonzero value
1570 you must then recompute its hash code before calling here.
1571
1572 If necessary, update table showing constant values of quantities. */
1573
1574 static struct table_elt *
1575 insert_with_costs (rtx x, struct table_elt *classp, unsigned int hash,
1576 machine_mode mode, int cost, int reg_cost)
1577 {
1578 struct table_elt *elt;
1579
1580 /* If X is a register and we haven't made a quantity for it,
1581 something is wrong. */
1582 gcc_assert (!REG_P (x) || REGNO_QTY_VALID_P (REGNO (x)));
1583
1584 /* If X is a hard register, show it is being put in the table. */
1585 if (REG_P (x) && REGNO (x) < FIRST_PSEUDO_REGISTER)
1586 add_to_hard_reg_set (&hard_regs_in_table, GET_MODE (x), REGNO (x));
1587
1588 /* Put an element for X into the right hash bucket. */
1589
1590 elt = free_element_chain;
1591 if (elt)
1592 free_element_chain = elt->next_same_hash;
1593 else
1594 elt = XNEW (struct table_elt);
1595
1596 elt->exp = x;
1597 elt->canon_exp = NULL_RTX;
1598 elt->cost = cost;
1599 elt->regcost = reg_cost;
1600 elt->next_same_value = 0;
1601 elt->prev_same_value = 0;
1602 elt->next_same_hash = table[hash];
1603 elt->prev_same_hash = 0;
1604 elt->related_value = 0;
1605 elt->in_memory = 0;
1606 elt->mode = mode;
1607 elt->is_const = (CONSTANT_P (x) || fixed_base_plus_p (x));
1608
1609 if (table[hash])
1610 table[hash]->prev_same_hash = elt;
1611 table[hash] = elt;
1612
1613 /* Put it into the proper value-class. */
1614 if (classp)
1615 {
1616 classp = classp->first_same_value;
1617 if (CHEAPER (elt, classp))
1618 /* Insert at the head of the class. */
1619 {
1620 struct table_elt *p;
1621 elt->next_same_value = classp;
1622 classp->prev_same_value = elt;
1623 elt->first_same_value = elt;
1624
1625 for (p = classp; p; p = p->next_same_value)
1626 p->first_same_value = elt;
1627 }
1628 else
1629 {
1630 /* Insert not at head of the class. */
1631 /* Put it after the last element cheaper than X. */
1632 struct table_elt *p, *next;
1633
1634 for (p = classp;
1635 (next = p->next_same_value) && CHEAPER (next, elt);
1636 p = next)
1637 ;
1638
1639 /* Put it after P and before NEXT. */
1640 elt->next_same_value = next;
1641 if (next)
1642 next->prev_same_value = elt;
1643
1644 elt->prev_same_value = p;
1645 p->next_same_value = elt;
1646 elt->first_same_value = classp;
1647 }
1648 }
1649 else
1650 elt->first_same_value = elt;
1651
1652 /* If this is a constant being set equivalent to a register or a register
1653 being set equivalent to a constant, note the constant equivalence.
1654
1655 If this is a constant, it cannot be equivalent to a different constant,
1656 and a constant is the only thing that can be cheaper than a register. So
1657 we know the register is the head of the class (before the constant was
1658 inserted).
1659
1660 If this is a register that is not already known equivalent to a
1661 constant, we must check the entire class.
1662
1663 If this is a register that is already known equivalent to an insn,
1664 update the qtys `const_insn' to show that `this_insn' is the latest
1665 insn making that quantity equivalent to the constant. */
1666
1667 if (elt->is_const && classp && REG_P (classp->exp)
1668 && !REG_P (x))
1669 {
1670 int exp_q = REG_QTY (REGNO (classp->exp));
1671 struct qty_table_elem *exp_ent = &qty_table[exp_q];
1672
1673 exp_ent->const_rtx = gen_lowpart (exp_ent->mode, x);
1674 exp_ent->const_insn = this_insn;
1675 }
1676
1677 else if (REG_P (x)
1678 && classp
1679 && ! qty_table[REG_QTY (REGNO (x))].const_rtx
1680 && ! elt->is_const)
1681 {
1682 struct table_elt *p;
1683
1684 for (p = classp; p != 0; p = p->next_same_value)
1685 {
1686 if (p->is_const && !REG_P (p->exp))
1687 {
1688 int x_q = REG_QTY (REGNO (x));
1689 struct qty_table_elem *x_ent = &qty_table[x_q];
1690
1691 x_ent->const_rtx
1692 = gen_lowpart (GET_MODE (x), p->exp);
1693 x_ent->const_insn = this_insn;
1694 break;
1695 }
1696 }
1697 }
1698
1699 else if (REG_P (x)
1700 && qty_table[REG_QTY (REGNO (x))].const_rtx
1701 && GET_MODE (x) == qty_table[REG_QTY (REGNO (x))].mode)
1702 qty_table[REG_QTY (REGNO (x))].const_insn = this_insn;
1703
1704 /* If this is a constant with symbolic value,
1705 and it has a term with an explicit integer value,
1706 link it up with related expressions. */
1707 if (GET_CODE (x) == CONST)
1708 {
1709 rtx subexp = get_related_value (x);
1710 unsigned subhash;
1711 struct table_elt *subelt, *subelt_prev;
1712
1713 if (subexp != 0)
1714 {
1715 /* Get the integer-free subexpression in the hash table. */
1716 subhash = SAFE_HASH (subexp, mode);
1717 subelt = lookup (subexp, subhash, mode);
1718 if (subelt == 0)
1719 subelt = insert (subexp, NULL, subhash, mode);
1720 /* Initialize SUBELT's circular chain if it has none. */
1721 if (subelt->related_value == 0)
1722 subelt->related_value = subelt;
1723 /* Find the element in the circular chain that precedes SUBELT. */
1724 subelt_prev = subelt;
1725 while (subelt_prev->related_value != subelt)
1726 subelt_prev = subelt_prev->related_value;
1727 /* Put new ELT into SUBELT's circular chain just before SUBELT.
1728 This way the element that follows SUBELT is the oldest one. */
1729 elt->related_value = subelt_prev->related_value;
1730 subelt_prev->related_value = elt;
1731 }
1732 }
1733
1734 return elt;
1735 }
1736
1737 /* Wrap insert_with_costs by passing the default costs. */
1738
1739 static struct table_elt *
1740 insert (rtx x, struct table_elt *classp, unsigned int hash,
1741 machine_mode mode)
1742 {
1743 return
1744 insert_with_costs (x, classp, hash, mode, COST (x), approx_reg_cost (x));
1745 }
1746
1747 \f
1748 /* Given two equivalence classes, CLASS1 and CLASS2, put all the entries from
1749 CLASS2 into CLASS1. This is done when we have reached an insn which makes
1750 the two classes equivalent.
1751
1752 CLASS1 will be the surviving class; CLASS2 should not be used after this
1753 call.
1754
1755 Any invalid entries in CLASS2 will not be copied. */
1756
1757 static void
1758 merge_equiv_classes (struct table_elt *class1, struct table_elt *class2)
1759 {
1760 struct table_elt *elt, *next, *new_elt;
1761
1762 /* Ensure we start with the head of the classes. */
1763 class1 = class1->first_same_value;
1764 class2 = class2->first_same_value;
1765
1766 /* If they were already equal, forget it. */
1767 if (class1 == class2)
1768 return;
1769
1770 for (elt = class2; elt; elt = next)
1771 {
1772 unsigned int hash;
1773 rtx exp = elt->exp;
1774 machine_mode mode = elt->mode;
1775
1776 next = elt->next_same_value;
1777
1778 /* Remove old entry, make a new one in CLASS1's class.
1779 Don't do this for invalid entries as we cannot find their
1780 hash code (it also isn't necessary). */
1781 if (REG_P (exp) || exp_equiv_p (exp, exp, 1, false))
1782 {
1783 bool need_rehash = false;
1784
1785 hash_arg_in_memory = 0;
1786 hash = HASH (exp, mode);
1787
1788 if (REG_P (exp))
1789 {
1790 need_rehash = REGNO_QTY_VALID_P (REGNO (exp));
1791 delete_reg_equiv (REGNO (exp));
1792 }
1793
1794 if (REG_P (exp) && REGNO (exp) >= FIRST_PSEUDO_REGISTER)
1795 remove_pseudo_from_table (exp, hash);
1796 else
1797 remove_from_table (elt, hash);
1798
1799 if (insert_regs (exp, class1, 0) || need_rehash)
1800 {
1801 rehash_using_reg (exp);
1802 hash = HASH (exp, mode);
1803 }
1804 new_elt = insert (exp, class1, hash, mode);
1805 new_elt->in_memory = hash_arg_in_memory;
1806 if (GET_CODE (exp) == ASM_OPERANDS && elt->cost == MAX_COST)
1807 new_elt->cost = MAX_COST;
1808 }
1809 }
1810 }
1811 \f
1812 /* Flush the entire hash table. */
1813
1814 static void
1815 flush_hash_table (void)
1816 {
1817 int i;
1818 struct table_elt *p;
1819
1820 for (i = 0; i < HASH_SIZE; i++)
1821 for (p = table[i]; p; p = table[i])
1822 {
1823 /* Note that invalidate can remove elements
1824 after P in the current hash chain. */
1825 if (REG_P (p->exp))
1826 invalidate (p->exp, VOIDmode);
1827 else
1828 remove_from_table (p, i);
1829 }
1830 }
1831 \f
1832 /* Check whether an anti dependence exists between X and EXP. MODE and
1833 ADDR are as for canon_anti_dependence. */
1834
1835 static bool
1836 check_dependence (const_rtx x, rtx exp, machine_mode mode, rtx addr)
1837 {
1838 subrtx_iterator::array_type array;
1839 FOR_EACH_SUBRTX (iter, array, x, NONCONST)
1840 {
1841 const_rtx x = *iter;
1842 if (MEM_P (x) && canon_anti_dependence (x, true, exp, mode, addr))
1843 return true;
1844 }
1845 return false;
1846 }
1847 \f
1848 /* Remove from the hash table, or mark as invalid, all expressions whose
1849 values could be altered by storing in X. X is a register, a subreg, or
1850 a memory reference with nonvarying address (because, when a memory
1851 reference with a varying address is stored in, all memory references are
1852 removed by invalidate_memory so specific invalidation is superfluous).
1853 FULL_MODE, if not VOIDmode, indicates that this much should be
1854 invalidated instead of just the amount indicated by the mode of X. This
1855 is only used for bitfield stores into memory.
1856
1857 A nonvarying address may be just a register or just a symbol reference,
1858 or it may be either of those plus a numeric offset. */
1859
1860 static void
1861 invalidate (rtx x, machine_mode full_mode)
1862 {
1863 int i;
1864 struct table_elt *p;
1865 rtx addr;
1866
1867 switch (GET_CODE (x))
1868 {
1869 case REG:
1870 {
1871 /* If X is a register, dependencies on its contents are recorded
1872 through the qty number mechanism. Just change the qty number of
1873 the register, mark it as invalid for expressions that refer to it,
1874 and remove it itself. */
1875 unsigned int regno = REGNO (x);
1876 unsigned int hash = HASH (x, GET_MODE (x));
1877
1878 /* Remove REGNO from any quantity list it might be on and indicate
1879 that its value might have changed. If it is a pseudo, remove its
1880 entry from the hash table.
1881
1882 For a hard register, we do the first two actions above for any
1883 additional hard registers corresponding to X. Then, if any of these
1884 registers are in the table, we must remove any REG entries that
1885 overlap these registers. */
1886
1887 delete_reg_equiv (regno);
1888 REG_TICK (regno)++;
1889 SUBREG_TICKED (regno) = -1;
1890
1891 if (regno >= FIRST_PSEUDO_REGISTER)
1892 remove_pseudo_from_table (x, hash);
1893 else
1894 {
1895 HOST_WIDE_INT in_table
1896 = TEST_HARD_REG_BIT (hard_regs_in_table, regno);
1897 unsigned int endregno = END_HARD_REGNO (x);
1898 unsigned int tregno, tendregno, rn;
1899 struct table_elt *p, *next;
1900
1901 CLEAR_HARD_REG_BIT (hard_regs_in_table, regno);
1902
1903 for (rn = regno + 1; rn < endregno; rn++)
1904 {
1905 in_table |= TEST_HARD_REG_BIT (hard_regs_in_table, rn);
1906 CLEAR_HARD_REG_BIT (hard_regs_in_table, rn);
1907 delete_reg_equiv (rn);
1908 REG_TICK (rn)++;
1909 SUBREG_TICKED (rn) = -1;
1910 }
1911
1912 if (in_table)
1913 for (hash = 0; hash < HASH_SIZE; hash++)
1914 for (p = table[hash]; p; p = next)
1915 {
1916 next = p->next_same_hash;
1917
1918 if (!REG_P (p->exp)
1919 || REGNO (p->exp) >= FIRST_PSEUDO_REGISTER)
1920 continue;
1921
1922 tregno = REGNO (p->exp);
1923 tendregno = END_HARD_REGNO (p->exp);
1924 if (tendregno > regno && tregno < endregno)
1925 remove_from_table (p, hash);
1926 }
1927 }
1928 }
1929 return;
1930
1931 case SUBREG:
1932 invalidate (SUBREG_REG (x), VOIDmode);
1933 return;
1934
1935 case PARALLEL:
1936 for (i = XVECLEN (x, 0) - 1; i >= 0; --i)
1937 invalidate (XVECEXP (x, 0, i), VOIDmode);
1938 return;
1939
1940 case EXPR_LIST:
1941 /* This is part of a disjoint return value; extract the location in
1942 question ignoring the offset. */
1943 invalidate (XEXP (x, 0), VOIDmode);
1944 return;
1945
1946 case MEM:
1947 addr = canon_rtx (get_addr (XEXP (x, 0)));
1948 /* Calculate the canonical version of X here so that
1949 true_dependence doesn't generate new RTL for X on each call. */
1950 x = canon_rtx (x);
1951
1952 /* Remove all hash table elements that refer to overlapping pieces of
1953 memory. */
1954 if (full_mode == VOIDmode)
1955 full_mode = GET_MODE (x);
1956
1957 for (i = 0; i < HASH_SIZE; i++)
1958 {
1959 struct table_elt *next;
1960
1961 for (p = table[i]; p; p = next)
1962 {
1963 next = p->next_same_hash;
1964 if (p->in_memory)
1965 {
1966 /* Just canonicalize the expression once;
1967 otherwise each time we call invalidate
1968 true_dependence will canonicalize the
1969 expression again. */
1970 if (!p->canon_exp)
1971 p->canon_exp = canon_rtx (p->exp);
1972 if (check_dependence (p->canon_exp, x, full_mode, addr))
1973 remove_from_table (p, i);
1974 }
1975 }
1976 }
1977 return;
1978
1979 default:
1980 gcc_unreachable ();
1981 }
1982 }
1983
1984 /* Invalidate DEST. Used when DEST is not going to be added
1985 into the hash table for some reason, e.g. do_not_record
1986 flagged on it. */
1987
1988 static void
1989 invalidate_dest (rtx dest)
1990 {
1991 if (REG_P (dest)
1992 || GET_CODE (dest) == SUBREG
1993 || MEM_P (dest))
1994 invalidate (dest, VOIDmode);
1995 else if (GET_CODE (dest) == STRICT_LOW_PART
1996 || GET_CODE (dest) == ZERO_EXTRACT)
1997 invalidate (XEXP (dest, 0), GET_MODE (dest));
1998 }
1999 \f
2000 /* Remove all expressions that refer to register REGNO,
2001 since they are already invalid, and we are about to
2002 mark that register valid again and don't want the old
2003 expressions to reappear as valid. */
2004
2005 static void
2006 remove_invalid_refs (unsigned int regno)
2007 {
2008 unsigned int i;
2009 struct table_elt *p, *next;
2010
2011 for (i = 0; i < HASH_SIZE; i++)
2012 for (p = table[i]; p; p = next)
2013 {
2014 next = p->next_same_hash;
2015 if (!REG_P (p->exp) && refers_to_regno_p (regno, p->exp))
2016 remove_from_table (p, i);
2017 }
2018 }
2019
2020 /* Likewise for a subreg with subreg_reg REGNO, subreg_byte OFFSET,
2021 and mode MODE. */
2022 static void
2023 remove_invalid_subreg_refs (unsigned int regno, unsigned int offset,
2024 machine_mode mode)
2025 {
2026 unsigned int i;
2027 struct table_elt *p, *next;
2028 unsigned int end = offset + (GET_MODE_SIZE (mode) - 1);
2029
2030 for (i = 0; i < HASH_SIZE; i++)
2031 for (p = table[i]; p; p = next)
2032 {
2033 rtx exp = p->exp;
2034 next = p->next_same_hash;
2035
2036 if (!REG_P (exp)
2037 && (GET_CODE (exp) != SUBREG
2038 || !REG_P (SUBREG_REG (exp))
2039 || REGNO (SUBREG_REG (exp)) != regno
2040 || (((SUBREG_BYTE (exp)
2041 + (GET_MODE_SIZE (GET_MODE (exp)) - 1)) >= offset)
2042 && SUBREG_BYTE (exp) <= end))
2043 && refers_to_regno_p (regno, p->exp))
2044 remove_from_table (p, i);
2045 }
2046 }
2047 \f
2048 /* Recompute the hash codes of any valid entries in the hash table that
2049 reference X, if X is a register, or SUBREG_REG (X) if X is a SUBREG.
2050
2051 This is called when we make a jump equivalence. */
2052
2053 static void
2054 rehash_using_reg (rtx x)
2055 {
2056 unsigned int i;
2057 struct table_elt *p, *next;
2058 unsigned hash;
2059
2060 if (GET_CODE (x) == SUBREG)
2061 x = SUBREG_REG (x);
2062
2063 /* If X is not a register or if the register is known not to be in any
2064 valid entries in the table, we have no work to do. */
2065
2066 if (!REG_P (x)
2067 || REG_IN_TABLE (REGNO (x)) < 0
2068 || REG_IN_TABLE (REGNO (x)) != REG_TICK (REGNO (x)))
2069 return;
2070
2071 /* Scan all hash chains looking for valid entries that mention X.
2072 If we find one and it is in the wrong hash chain, move it. */
2073
2074 for (i = 0; i < HASH_SIZE; i++)
2075 for (p = table[i]; p; p = next)
2076 {
2077 next = p->next_same_hash;
2078 if (reg_mentioned_p (x, p->exp)
2079 && exp_equiv_p (p->exp, p->exp, 1, false)
2080 && i != (hash = SAFE_HASH (p->exp, p->mode)))
2081 {
2082 if (p->next_same_hash)
2083 p->next_same_hash->prev_same_hash = p->prev_same_hash;
2084
2085 if (p->prev_same_hash)
2086 p->prev_same_hash->next_same_hash = p->next_same_hash;
2087 else
2088 table[i] = p->next_same_hash;
2089
2090 p->next_same_hash = table[hash];
2091 p->prev_same_hash = 0;
2092 if (table[hash])
2093 table[hash]->prev_same_hash = p;
2094 table[hash] = p;
2095 }
2096 }
2097 }
2098 \f
2099 /* Remove from the hash table any expression that is a call-clobbered
2100 register. Also update their TICK values. */
2101
2102 static void
2103 invalidate_for_call (void)
2104 {
2105 unsigned int regno, endregno;
2106 unsigned int i;
2107 unsigned hash;
2108 struct table_elt *p, *next;
2109 int in_table = 0;
2110 hard_reg_set_iterator hrsi;
2111
2112 /* Go through all the hard registers. For each that is clobbered in
2113 a CALL_INSN, remove the register from quantity chains and update
2114 reg_tick if defined. Also see if any of these registers is currently
2115 in the table. */
2116 EXECUTE_IF_SET_IN_HARD_REG_SET (regs_invalidated_by_call, 0, regno, hrsi)
2117 {
2118 delete_reg_equiv (regno);
2119 if (REG_TICK (regno) >= 0)
2120 {
2121 REG_TICK (regno)++;
2122 SUBREG_TICKED (regno) = -1;
2123 }
2124 in_table |= (TEST_HARD_REG_BIT (hard_regs_in_table, regno) != 0);
2125 }
2126
2127 /* In the case where we have no call-clobbered hard registers in the
2128 table, we are done. Otherwise, scan the table and remove any
2129 entry that overlaps a call-clobbered register. */
2130
2131 if (in_table)
2132 for (hash = 0; hash < HASH_SIZE; hash++)
2133 for (p = table[hash]; p; p = next)
2134 {
2135 next = p->next_same_hash;
2136
2137 if (!REG_P (p->exp)
2138 || REGNO (p->exp) >= FIRST_PSEUDO_REGISTER)
2139 continue;
2140
2141 regno = REGNO (p->exp);
2142 endregno = END_HARD_REGNO (p->exp);
2143
2144 for (i = regno; i < endregno; i++)
2145 if (TEST_HARD_REG_BIT (regs_invalidated_by_call, i))
2146 {
2147 remove_from_table (p, hash);
2148 break;
2149 }
2150 }
2151 }
2152 \f
2153 /* Given an expression X of type CONST,
2154 and ELT which is its table entry (or 0 if it
2155 is not in the hash table),
2156 return an alternate expression for X as a register plus integer.
2157 If none can be found, return 0. */
2158
2159 static rtx
2160 use_related_value (rtx x, struct table_elt *elt)
2161 {
2162 struct table_elt *relt = 0;
2163 struct table_elt *p, *q;
2164 HOST_WIDE_INT offset;
2165
2166 /* First, is there anything related known?
2167 If we have a table element, we can tell from that.
2168 Otherwise, must look it up. */
2169
2170 if (elt != 0 && elt->related_value != 0)
2171 relt = elt;
2172 else if (elt == 0 && GET_CODE (x) == CONST)
2173 {
2174 rtx subexp = get_related_value (x);
2175 if (subexp != 0)
2176 relt = lookup (subexp,
2177 SAFE_HASH (subexp, GET_MODE (subexp)),
2178 GET_MODE (subexp));
2179 }
2180
2181 if (relt == 0)
2182 return 0;
2183
2184 /* Search all related table entries for one that has an
2185 equivalent register. */
2186
2187 p = relt;
2188 while (1)
2189 {
2190 /* This loop is strange in that it is executed in two different cases.
2191 The first is when X is already in the table. Then it is searching
2192 the RELATED_VALUE list of X's class (RELT). The second case is when
2193 X is not in the table. Then RELT points to a class for the related
2194 value.
2195
2196 Ensure that, whatever case we are in, that we ignore classes that have
2197 the same value as X. */
2198
2199 if (rtx_equal_p (x, p->exp))
2200 q = 0;
2201 else
2202 for (q = p->first_same_value; q; q = q->next_same_value)
2203 if (REG_P (q->exp))
2204 break;
2205
2206 if (q)
2207 break;
2208
2209 p = p->related_value;
2210
2211 /* We went all the way around, so there is nothing to be found.
2212 Alternatively, perhaps RELT was in the table for some other reason
2213 and it has no related values recorded. */
2214 if (p == relt || p == 0)
2215 break;
2216 }
2217
2218 if (q == 0)
2219 return 0;
2220
2221 offset = (get_integer_term (x) - get_integer_term (p->exp));
2222 /* Note: OFFSET may be 0 if P->xexp and X are related by commutativity. */
2223 return plus_constant (q->mode, q->exp, offset);
2224 }
2225 \f
2226
2227 /* Hash a string. Just add its bytes up. */
2228 static inline unsigned
2229 hash_rtx_string (const char *ps)
2230 {
2231 unsigned hash = 0;
2232 const unsigned char *p = (const unsigned char *) ps;
2233
2234 if (p)
2235 while (*p)
2236 hash += *p++;
2237
2238 return hash;
2239 }
2240
2241 /* Same as hash_rtx, but call CB on each rtx if it is not NULL.
2242 When the callback returns true, we continue with the new rtx. */
2243
2244 unsigned
2245 hash_rtx_cb (const_rtx x, machine_mode mode,
2246 int *do_not_record_p, int *hash_arg_in_memory_p,
2247 bool have_reg_qty, hash_rtx_callback_function cb)
2248 {
2249 int i, j;
2250 unsigned hash = 0;
2251 enum rtx_code code;
2252 const char *fmt;
2253 machine_mode newmode;
2254 rtx newx;
2255
2256 /* Used to turn recursion into iteration. We can't rely on GCC's
2257 tail-recursion elimination since we need to keep accumulating values
2258 in HASH. */
2259 repeat:
2260 if (x == 0)
2261 return hash;
2262
2263 /* Invoke the callback first. */
2264 if (cb != NULL
2265 && ((*cb) (x, mode, &newx, &newmode)))
2266 {
2267 hash += hash_rtx_cb (newx, newmode, do_not_record_p,
2268 hash_arg_in_memory_p, have_reg_qty, cb);
2269 return hash;
2270 }
2271
2272 code = GET_CODE (x);
2273 switch (code)
2274 {
2275 case REG:
2276 {
2277 unsigned int regno = REGNO (x);
2278
2279 if (do_not_record_p && !reload_completed)
2280 {
2281 /* On some machines, we can't record any non-fixed hard register,
2282 because extending its life will cause reload problems. We
2283 consider ap, fp, sp, gp to be fixed for this purpose.
2284
2285 We also consider CCmode registers to be fixed for this purpose;
2286 failure to do so leads to failure to simplify 0<100 type of
2287 conditionals.
2288
2289 On all machines, we can't record any global registers.
2290 Nor should we record any register that is in a small
2291 class, as defined by TARGET_CLASS_LIKELY_SPILLED_P. */
2292 bool record;
2293
2294 if (regno >= FIRST_PSEUDO_REGISTER)
2295 record = true;
2296 else if (x == frame_pointer_rtx
2297 || x == hard_frame_pointer_rtx
2298 || x == arg_pointer_rtx
2299 || x == stack_pointer_rtx
2300 || x == pic_offset_table_rtx)
2301 record = true;
2302 else if (global_regs[regno])
2303 record = false;
2304 else if (fixed_regs[regno])
2305 record = true;
2306 else if (GET_MODE_CLASS (GET_MODE (x)) == MODE_CC)
2307 record = true;
2308 else if (targetm.small_register_classes_for_mode_p (GET_MODE (x)))
2309 record = false;
2310 else if (targetm.class_likely_spilled_p (REGNO_REG_CLASS (regno)))
2311 record = false;
2312 else
2313 record = true;
2314
2315 if (!record)
2316 {
2317 *do_not_record_p = 1;
2318 return 0;
2319 }
2320 }
2321
2322 hash += ((unsigned int) REG << 7);
2323 hash += (have_reg_qty ? (unsigned) REG_QTY (regno) : regno);
2324 return hash;
2325 }
2326
2327 /* We handle SUBREG of a REG specially because the underlying
2328 reg changes its hash value with every value change; we don't
2329 want to have to forget unrelated subregs when one subreg changes. */
2330 case SUBREG:
2331 {
2332 if (REG_P (SUBREG_REG (x)))
2333 {
2334 hash += (((unsigned int) SUBREG << 7)
2335 + REGNO (SUBREG_REG (x))
2336 + (SUBREG_BYTE (x) / UNITS_PER_WORD));
2337 return hash;
2338 }
2339 break;
2340 }
2341
2342 case CONST_INT:
2343 hash += (((unsigned int) CONST_INT << 7) + (unsigned int) mode
2344 + (unsigned int) INTVAL (x));
2345 return hash;
2346
2347 case CONST_WIDE_INT:
2348 for (i = 0; i < CONST_WIDE_INT_NUNITS (x); i++)
2349 hash += CONST_WIDE_INT_ELT (x, i);
2350 return hash;
2351
2352 case CONST_DOUBLE:
2353 /* This is like the general case, except that it only counts
2354 the integers representing the constant. */
2355 hash += (unsigned int) code + (unsigned int) GET_MODE (x);
2356 if (TARGET_SUPPORTS_WIDE_INT == 0 && GET_MODE (x) == VOIDmode)
2357 hash += ((unsigned int) CONST_DOUBLE_LOW (x)
2358 + (unsigned int) CONST_DOUBLE_HIGH (x));
2359 else
2360 hash += real_hash (CONST_DOUBLE_REAL_VALUE (x));
2361 return hash;
2362
2363 case CONST_FIXED:
2364 hash += (unsigned int) code + (unsigned int) GET_MODE (x);
2365 hash += fixed_hash (CONST_FIXED_VALUE (x));
2366 return hash;
2367
2368 case CONST_VECTOR:
2369 {
2370 int units;
2371 rtx elt;
2372
2373 units = CONST_VECTOR_NUNITS (x);
2374
2375 for (i = 0; i < units; ++i)
2376 {
2377 elt = CONST_VECTOR_ELT (x, i);
2378 hash += hash_rtx_cb (elt, GET_MODE (elt),
2379 do_not_record_p, hash_arg_in_memory_p,
2380 have_reg_qty, cb);
2381 }
2382
2383 return hash;
2384 }
2385
2386 /* Assume there is only one rtx object for any given label. */
2387 case LABEL_REF:
2388 /* We don't hash on the address of the CODE_LABEL to avoid bootstrap
2389 differences and differences between each stage's debugging dumps. */
2390 hash += (((unsigned int) LABEL_REF << 7)
2391 + CODE_LABEL_NUMBER (LABEL_REF_LABEL (x)));
2392 return hash;
2393
2394 case SYMBOL_REF:
2395 {
2396 /* Don't hash on the symbol's address to avoid bootstrap differences.
2397 Different hash values may cause expressions to be recorded in
2398 different orders and thus different registers to be used in the
2399 final assembler. This also avoids differences in the dump files
2400 between various stages. */
2401 unsigned int h = 0;
2402 const unsigned char *p = (const unsigned char *) XSTR (x, 0);
2403
2404 while (*p)
2405 h += (h << 7) + *p++; /* ??? revisit */
2406
2407 hash += ((unsigned int) SYMBOL_REF << 7) + h;
2408 return hash;
2409 }
2410
2411 case MEM:
2412 /* We don't record if marked volatile or if BLKmode since we don't
2413 know the size of the move. */
2414 if (do_not_record_p && (MEM_VOLATILE_P (x) || GET_MODE (x) == BLKmode))
2415 {
2416 *do_not_record_p = 1;
2417 return 0;
2418 }
2419 if (hash_arg_in_memory_p && !MEM_READONLY_P (x))
2420 *hash_arg_in_memory_p = 1;
2421
2422 /* Now that we have already found this special case,
2423 might as well speed it up as much as possible. */
2424 hash += (unsigned) MEM;
2425 x = XEXP (x, 0);
2426 goto repeat;
2427
2428 case USE:
2429 /* A USE that mentions non-volatile memory needs special
2430 handling since the MEM may be BLKmode which normally
2431 prevents an entry from being made. Pure calls are
2432 marked by a USE which mentions BLKmode memory.
2433 See calls.c:emit_call_1. */
2434 if (MEM_P (XEXP (x, 0))
2435 && ! MEM_VOLATILE_P (XEXP (x, 0)))
2436 {
2437 hash += (unsigned) USE;
2438 x = XEXP (x, 0);
2439
2440 if (hash_arg_in_memory_p && !MEM_READONLY_P (x))
2441 *hash_arg_in_memory_p = 1;
2442
2443 /* Now that we have already found this special case,
2444 might as well speed it up as much as possible. */
2445 hash += (unsigned) MEM;
2446 x = XEXP (x, 0);
2447 goto repeat;
2448 }
2449 break;
2450
2451 case PRE_DEC:
2452 case PRE_INC:
2453 case POST_DEC:
2454 case POST_INC:
2455 case PRE_MODIFY:
2456 case POST_MODIFY:
2457 case PC:
2458 case CC0:
2459 case CALL:
2460 case UNSPEC_VOLATILE:
2461 if (do_not_record_p) {
2462 *do_not_record_p = 1;
2463 return 0;
2464 }
2465 else
2466 return hash;
2467 break;
2468
2469 case ASM_OPERANDS:
2470 if (do_not_record_p && MEM_VOLATILE_P (x))
2471 {
2472 *do_not_record_p = 1;
2473 return 0;
2474 }
2475 else
2476 {
2477 /* We don't want to take the filename and line into account. */
2478 hash += (unsigned) code + (unsigned) GET_MODE (x)
2479 + hash_rtx_string (ASM_OPERANDS_TEMPLATE (x))
2480 + hash_rtx_string (ASM_OPERANDS_OUTPUT_CONSTRAINT (x))
2481 + (unsigned) ASM_OPERANDS_OUTPUT_IDX (x);
2482
2483 if (ASM_OPERANDS_INPUT_LENGTH (x))
2484 {
2485 for (i = 1; i < ASM_OPERANDS_INPUT_LENGTH (x); i++)
2486 {
2487 hash += (hash_rtx_cb (ASM_OPERANDS_INPUT (x, i),
2488 GET_MODE (ASM_OPERANDS_INPUT (x, i)),
2489 do_not_record_p, hash_arg_in_memory_p,
2490 have_reg_qty, cb)
2491 + hash_rtx_string
2492 (ASM_OPERANDS_INPUT_CONSTRAINT (x, i)));
2493 }
2494
2495 hash += hash_rtx_string (ASM_OPERANDS_INPUT_CONSTRAINT (x, 0));
2496 x = ASM_OPERANDS_INPUT (x, 0);
2497 mode = GET_MODE (x);
2498 goto repeat;
2499 }
2500
2501 return hash;
2502 }
2503 break;
2504
2505 default:
2506 break;
2507 }
2508
2509 i = GET_RTX_LENGTH (code) - 1;
2510 hash += (unsigned) code + (unsigned) GET_MODE (x);
2511 fmt = GET_RTX_FORMAT (code);
2512 for (; i >= 0; i--)
2513 {
2514 switch (fmt[i])
2515 {
2516 case 'e':
2517 /* If we are about to do the last recursive call
2518 needed at this level, change it into iteration.
2519 This function is called enough to be worth it. */
2520 if (i == 0)
2521 {
2522 x = XEXP (x, i);
2523 goto repeat;
2524 }
2525
2526 hash += hash_rtx_cb (XEXP (x, i), VOIDmode, do_not_record_p,
2527 hash_arg_in_memory_p,
2528 have_reg_qty, cb);
2529 break;
2530
2531 case 'E':
2532 for (j = 0; j < XVECLEN (x, i); j++)
2533 hash += hash_rtx_cb (XVECEXP (x, i, j), VOIDmode, do_not_record_p,
2534 hash_arg_in_memory_p,
2535 have_reg_qty, cb);
2536 break;
2537
2538 case 's':
2539 hash += hash_rtx_string (XSTR (x, i));
2540 break;
2541
2542 case 'i':
2543 hash += (unsigned int) XINT (x, i);
2544 break;
2545
2546 case '0': case 't':
2547 /* Unused. */
2548 break;
2549
2550 default:
2551 gcc_unreachable ();
2552 }
2553 }
2554
2555 return hash;
2556 }
2557
2558 /* Hash an rtx. We are careful to make sure the value is never negative.
2559 Equivalent registers hash identically.
2560 MODE is used in hashing for CONST_INTs only;
2561 otherwise the mode of X is used.
2562
2563 Store 1 in DO_NOT_RECORD_P if any subexpression is volatile.
2564
2565 If HASH_ARG_IN_MEMORY_P is not NULL, store 1 in it if X contains
2566 a MEM rtx which does not have the MEM_READONLY_P flag set.
2567
2568 Note that cse_insn knows that the hash code of a MEM expression
2569 is just (int) MEM plus the hash code of the address. */
2570
2571 unsigned
2572 hash_rtx (const_rtx x, machine_mode mode, int *do_not_record_p,
2573 int *hash_arg_in_memory_p, bool have_reg_qty)
2574 {
2575 return hash_rtx_cb (x, mode, do_not_record_p,
2576 hash_arg_in_memory_p, have_reg_qty, NULL);
2577 }
2578
2579 /* Hash an rtx X for cse via hash_rtx.
2580 Stores 1 in do_not_record if any subexpression is volatile.
2581 Stores 1 in hash_arg_in_memory if X contains a mem rtx which
2582 does not have the MEM_READONLY_P flag set. */
2583
2584 static inline unsigned
2585 canon_hash (rtx x, machine_mode mode)
2586 {
2587 return hash_rtx (x, mode, &do_not_record, &hash_arg_in_memory, true);
2588 }
2589
2590 /* Like canon_hash but with no side effects, i.e. do_not_record
2591 and hash_arg_in_memory are not changed. */
2592
2593 static inline unsigned
2594 safe_hash (rtx x, machine_mode mode)
2595 {
2596 int dummy_do_not_record;
2597 return hash_rtx (x, mode, &dummy_do_not_record, NULL, true);
2598 }
2599 \f
2600 /* Return 1 iff X and Y would canonicalize into the same thing,
2601 without actually constructing the canonicalization of either one.
2602 If VALIDATE is nonzero,
2603 we assume X is an expression being processed from the rtl
2604 and Y was found in the hash table. We check register refs
2605 in Y for being marked as valid.
2606
2607 If FOR_GCSE is true, we compare X and Y for equivalence for GCSE. */
2608
2609 int
2610 exp_equiv_p (const_rtx x, const_rtx y, int validate, bool for_gcse)
2611 {
2612 int i, j;
2613 enum rtx_code code;
2614 const char *fmt;
2615
2616 /* Note: it is incorrect to assume an expression is equivalent to itself
2617 if VALIDATE is nonzero. */
2618 if (x == y && !validate)
2619 return 1;
2620
2621 if (x == 0 || y == 0)
2622 return x == y;
2623
2624 code = GET_CODE (x);
2625 if (code != GET_CODE (y))
2626 return 0;
2627
2628 /* (MULT:SI x y) and (MULT:HI x y) are NOT equivalent. */
2629 if (GET_MODE (x) != GET_MODE (y))
2630 return 0;
2631
2632 /* MEMs referring to different address space are not equivalent. */
2633 if (code == MEM && MEM_ADDR_SPACE (x) != MEM_ADDR_SPACE (y))
2634 return 0;
2635
2636 switch (code)
2637 {
2638 case PC:
2639 case CC0:
2640 CASE_CONST_UNIQUE:
2641 return x == y;
2642
2643 case LABEL_REF:
2644 return LABEL_REF_LABEL (x) == LABEL_REF_LABEL (y);
2645
2646 case SYMBOL_REF:
2647 return XSTR (x, 0) == XSTR (y, 0);
2648
2649 case REG:
2650 if (for_gcse)
2651 return REGNO (x) == REGNO (y);
2652 else
2653 {
2654 unsigned int regno = REGNO (y);
2655 unsigned int i;
2656 unsigned int endregno = END_REGNO (y);
2657
2658 /* If the quantities are not the same, the expressions are not
2659 equivalent. If there are and we are not to validate, they
2660 are equivalent. Otherwise, ensure all regs are up-to-date. */
2661
2662 if (REG_QTY (REGNO (x)) != REG_QTY (regno))
2663 return 0;
2664
2665 if (! validate)
2666 return 1;
2667
2668 for (i = regno; i < endregno; i++)
2669 if (REG_IN_TABLE (i) != REG_TICK (i))
2670 return 0;
2671
2672 return 1;
2673 }
2674
2675 case MEM:
2676 if (for_gcse)
2677 {
2678 /* A volatile mem should not be considered equivalent to any
2679 other. */
2680 if (MEM_VOLATILE_P (x) || MEM_VOLATILE_P (y))
2681 return 0;
2682
2683 /* Can't merge two expressions in different alias sets, since we
2684 can decide that the expression is transparent in a block when
2685 it isn't, due to it being set with the different alias set.
2686
2687 Also, can't merge two expressions with different MEM_ATTRS.
2688 They could e.g. be two different entities allocated into the
2689 same space on the stack (see e.g. PR25130). In that case, the
2690 MEM addresses can be the same, even though the two MEMs are
2691 absolutely not equivalent.
2692
2693 But because really all MEM attributes should be the same for
2694 equivalent MEMs, we just use the invariant that MEMs that have
2695 the same attributes share the same mem_attrs data structure. */
2696 if (!mem_attrs_eq_p (MEM_ATTRS (x), MEM_ATTRS (y)))
2697 return 0;
2698
2699 /* If we are handling exceptions, we cannot consider two expressions
2700 with different trapping status as equivalent, because simple_mem
2701 might accept one and reject the other. */
2702 if (cfun->can_throw_non_call_exceptions
2703 && (MEM_NOTRAP_P (x) != MEM_NOTRAP_P (y)))
2704 return 0;
2705 }
2706 break;
2707
2708 /* For commutative operations, check both orders. */
2709 case PLUS:
2710 case MULT:
2711 case AND:
2712 case IOR:
2713 case XOR:
2714 case NE:
2715 case EQ:
2716 return ((exp_equiv_p (XEXP (x, 0), XEXP (y, 0),
2717 validate, for_gcse)
2718 && exp_equiv_p (XEXP (x, 1), XEXP (y, 1),
2719 validate, for_gcse))
2720 || (exp_equiv_p (XEXP (x, 0), XEXP (y, 1),
2721 validate, for_gcse)
2722 && exp_equiv_p (XEXP (x, 1), XEXP (y, 0),
2723 validate, for_gcse)));
2724
2725 case ASM_OPERANDS:
2726 /* We don't use the generic code below because we want to
2727 disregard filename and line numbers. */
2728
2729 /* A volatile asm isn't equivalent to any other. */
2730 if (MEM_VOLATILE_P (x) || MEM_VOLATILE_P (y))
2731 return 0;
2732
2733 if (GET_MODE (x) != GET_MODE (y)
2734 || strcmp (ASM_OPERANDS_TEMPLATE (x), ASM_OPERANDS_TEMPLATE (y))
2735 || strcmp (ASM_OPERANDS_OUTPUT_CONSTRAINT (x),
2736 ASM_OPERANDS_OUTPUT_CONSTRAINT (y))
2737 || ASM_OPERANDS_OUTPUT_IDX (x) != ASM_OPERANDS_OUTPUT_IDX (y)
2738 || ASM_OPERANDS_INPUT_LENGTH (x) != ASM_OPERANDS_INPUT_LENGTH (y))
2739 return 0;
2740
2741 if (ASM_OPERANDS_INPUT_LENGTH (x))
2742 {
2743 for (i = ASM_OPERANDS_INPUT_LENGTH (x) - 1; i >= 0; i--)
2744 if (! exp_equiv_p (ASM_OPERANDS_INPUT (x, i),
2745 ASM_OPERANDS_INPUT (y, i),
2746 validate, for_gcse)
2747 || strcmp (ASM_OPERANDS_INPUT_CONSTRAINT (x, i),
2748 ASM_OPERANDS_INPUT_CONSTRAINT (y, i)))
2749 return 0;
2750 }
2751
2752 return 1;
2753
2754 default:
2755 break;
2756 }
2757
2758 /* Compare the elements. If any pair of corresponding elements
2759 fail to match, return 0 for the whole thing. */
2760
2761 fmt = GET_RTX_FORMAT (code);
2762 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
2763 {
2764 switch (fmt[i])
2765 {
2766 case 'e':
2767 if (! exp_equiv_p (XEXP (x, i), XEXP (y, i),
2768 validate, for_gcse))
2769 return 0;
2770 break;
2771
2772 case 'E':
2773 if (XVECLEN (x, i) != XVECLEN (y, i))
2774 return 0;
2775 for (j = 0; j < XVECLEN (x, i); j++)
2776 if (! exp_equiv_p (XVECEXP (x, i, j), XVECEXP (y, i, j),
2777 validate, for_gcse))
2778 return 0;
2779 break;
2780
2781 case 's':
2782 if (strcmp (XSTR (x, i), XSTR (y, i)))
2783 return 0;
2784 break;
2785
2786 case 'i':
2787 if (XINT (x, i) != XINT (y, i))
2788 return 0;
2789 break;
2790
2791 case 'w':
2792 if (XWINT (x, i) != XWINT (y, i))
2793 return 0;
2794 break;
2795
2796 case '0':
2797 case 't':
2798 break;
2799
2800 default:
2801 gcc_unreachable ();
2802 }
2803 }
2804
2805 return 1;
2806 }
2807 \f
2808 /* Subroutine of canon_reg. Pass *XLOC through canon_reg, and validate
2809 the result if necessary. INSN is as for canon_reg. */
2810
2811 static void
2812 validate_canon_reg (rtx *xloc, rtx_insn *insn)
2813 {
2814 if (*xloc)
2815 {
2816 rtx new_rtx = canon_reg (*xloc, insn);
2817
2818 /* If replacing pseudo with hard reg or vice versa, ensure the
2819 insn remains valid. Likewise if the insn has MATCH_DUPs. */
2820 gcc_assert (insn && new_rtx);
2821 validate_change (insn, xloc, new_rtx, 1);
2822 }
2823 }
2824
2825 /* Canonicalize an expression:
2826 replace each register reference inside it
2827 with the "oldest" equivalent register.
2828
2829 If INSN is nonzero validate_change is used to ensure that INSN remains valid
2830 after we make our substitution. The calls are made with IN_GROUP nonzero
2831 so apply_change_group must be called upon the outermost return from this
2832 function (unless INSN is zero). The result of apply_change_group can
2833 generally be discarded since the changes we are making are optional. */
2834
2835 static rtx
2836 canon_reg (rtx x, rtx_insn *insn)
2837 {
2838 int i;
2839 enum rtx_code code;
2840 const char *fmt;
2841
2842 if (x == 0)
2843 return x;
2844
2845 code = GET_CODE (x);
2846 switch (code)
2847 {
2848 case PC:
2849 case CC0:
2850 case CONST:
2851 CASE_CONST_ANY:
2852 case SYMBOL_REF:
2853 case LABEL_REF:
2854 case ADDR_VEC:
2855 case ADDR_DIFF_VEC:
2856 return x;
2857
2858 case REG:
2859 {
2860 int first;
2861 int q;
2862 struct qty_table_elem *ent;
2863
2864 /* Never replace a hard reg, because hard regs can appear
2865 in more than one machine mode, and we must preserve the mode
2866 of each occurrence. Also, some hard regs appear in
2867 MEMs that are shared and mustn't be altered. Don't try to
2868 replace any reg that maps to a reg of class NO_REGS. */
2869 if (REGNO (x) < FIRST_PSEUDO_REGISTER
2870 || ! REGNO_QTY_VALID_P (REGNO (x)))
2871 return x;
2872
2873 q = REG_QTY (REGNO (x));
2874 ent = &qty_table[q];
2875 first = ent->first_reg;
2876 return (first >= FIRST_PSEUDO_REGISTER ? regno_reg_rtx[first]
2877 : REGNO_REG_CLASS (first) == NO_REGS ? x
2878 : gen_rtx_REG (ent->mode, first));
2879 }
2880
2881 default:
2882 break;
2883 }
2884
2885 fmt = GET_RTX_FORMAT (code);
2886 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
2887 {
2888 int j;
2889
2890 if (fmt[i] == 'e')
2891 validate_canon_reg (&XEXP (x, i), insn);
2892 else if (fmt[i] == 'E')
2893 for (j = 0; j < XVECLEN (x, i); j++)
2894 validate_canon_reg (&XVECEXP (x, i, j), insn);
2895 }
2896
2897 return x;
2898 }
2899 \f
2900 /* Given an operation (CODE, *PARG1, *PARG2), where code is a comparison
2901 operation (EQ, NE, GT, etc.), follow it back through the hash table and
2902 what values are being compared.
2903
2904 *PARG1 and *PARG2 are updated to contain the rtx representing the values
2905 actually being compared. For example, if *PARG1 was (cc0) and *PARG2
2906 was (const_int 0), *PARG1 and *PARG2 will be set to the objects that were
2907 compared to produce cc0.
2908
2909 The return value is the comparison operator and is either the code of
2910 A or the code corresponding to the inverse of the comparison. */
2911
2912 static enum rtx_code
2913 find_comparison_args (enum rtx_code code, rtx *parg1, rtx *parg2,
2914 machine_mode *pmode1, machine_mode *pmode2)
2915 {
2916 rtx arg1, arg2;
2917 hash_set<rtx> *visited = NULL;
2918 /* Set nonzero when we find something of interest. */
2919 rtx x = NULL;
2920
2921 arg1 = *parg1, arg2 = *parg2;
2922
2923 /* If ARG2 is const0_rtx, see what ARG1 is equivalent to. */
2924
2925 while (arg2 == CONST0_RTX (GET_MODE (arg1)))
2926 {
2927 int reverse_code = 0;
2928 struct table_elt *p = 0;
2929
2930 /* Remember state from previous iteration. */
2931 if (x)
2932 {
2933 if (!visited)
2934 visited = new hash_set<rtx>;
2935 visited->add (x);
2936 x = 0;
2937 }
2938
2939 /* If arg1 is a COMPARE, extract the comparison arguments from it.
2940 On machines with CC0, this is the only case that can occur, since
2941 fold_rtx will return the COMPARE or item being compared with zero
2942 when given CC0. */
2943
2944 if (GET_CODE (arg1) == COMPARE && arg2 == const0_rtx)
2945 x = arg1;
2946
2947 /* If ARG1 is a comparison operator and CODE is testing for
2948 STORE_FLAG_VALUE, get the inner arguments. */
2949
2950 else if (COMPARISON_P (arg1))
2951 {
2952 #ifdef FLOAT_STORE_FLAG_VALUE
2953 REAL_VALUE_TYPE fsfv;
2954 #endif
2955
2956 if (code == NE
2957 || (GET_MODE_CLASS (GET_MODE (arg1)) == MODE_INT
2958 && code == LT && STORE_FLAG_VALUE == -1)
2959 #ifdef FLOAT_STORE_FLAG_VALUE
2960 || (SCALAR_FLOAT_MODE_P (GET_MODE (arg1))
2961 && (fsfv = FLOAT_STORE_FLAG_VALUE (GET_MODE (arg1)),
2962 REAL_VALUE_NEGATIVE (fsfv)))
2963 #endif
2964 )
2965 x = arg1;
2966 else if (code == EQ
2967 || (GET_MODE_CLASS (GET_MODE (arg1)) == MODE_INT
2968 && code == GE && STORE_FLAG_VALUE == -1)
2969 #ifdef FLOAT_STORE_FLAG_VALUE
2970 || (SCALAR_FLOAT_MODE_P (GET_MODE (arg1))
2971 && (fsfv = FLOAT_STORE_FLAG_VALUE (GET_MODE (arg1)),
2972 REAL_VALUE_NEGATIVE (fsfv)))
2973 #endif
2974 )
2975 x = arg1, reverse_code = 1;
2976 }
2977
2978 /* ??? We could also check for
2979
2980 (ne (and (eq (...) (const_int 1))) (const_int 0))
2981
2982 and related forms, but let's wait until we see them occurring. */
2983
2984 if (x == 0)
2985 /* Look up ARG1 in the hash table and see if it has an equivalence
2986 that lets us see what is being compared. */
2987 p = lookup (arg1, SAFE_HASH (arg1, GET_MODE (arg1)), GET_MODE (arg1));
2988 if (p)
2989 {
2990 p = p->first_same_value;
2991
2992 /* If what we compare is already known to be constant, that is as
2993 good as it gets.
2994 We need to break the loop in this case, because otherwise we
2995 can have an infinite loop when looking at a reg that is known
2996 to be a constant which is the same as a comparison of a reg
2997 against zero which appears later in the insn stream, which in
2998 turn is constant and the same as the comparison of the first reg
2999 against zero... */
3000 if (p->is_const)
3001 break;
3002 }
3003
3004 for (; p; p = p->next_same_value)
3005 {
3006 machine_mode inner_mode = GET_MODE (p->exp);
3007 #ifdef FLOAT_STORE_FLAG_VALUE
3008 REAL_VALUE_TYPE fsfv;
3009 #endif
3010
3011 /* If the entry isn't valid, skip it. */
3012 if (! exp_equiv_p (p->exp, p->exp, 1, false))
3013 continue;
3014
3015 /* If it's a comparison we've used before, skip it. */
3016 if (visited && visited->contains (p->exp))
3017 continue;
3018
3019 if (GET_CODE (p->exp) == COMPARE
3020 /* Another possibility is that this machine has a compare insn
3021 that includes the comparison code. In that case, ARG1 would
3022 be equivalent to a comparison operation that would set ARG1 to
3023 either STORE_FLAG_VALUE or zero. If this is an NE operation,
3024 ORIG_CODE is the actual comparison being done; if it is an EQ,
3025 we must reverse ORIG_CODE. On machine with a negative value
3026 for STORE_FLAG_VALUE, also look at LT and GE operations. */
3027 || ((code == NE
3028 || (code == LT
3029 && val_signbit_known_set_p (inner_mode,
3030 STORE_FLAG_VALUE))
3031 #ifdef FLOAT_STORE_FLAG_VALUE
3032 || (code == LT
3033 && SCALAR_FLOAT_MODE_P (inner_mode)
3034 && (fsfv = FLOAT_STORE_FLAG_VALUE (GET_MODE (arg1)),
3035 REAL_VALUE_NEGATIVE (fsfv)))
3036 #endif
3037 )
3038 && COMPARISON_P (p->exp)))
3039 {
3040 x = p->exp;
3041 break;
3042 }
3043 else if ((code == EQ
3044 || (code == GE
3045 && val_signbit_known_set_p (inner_mode,
3046 STORE_FLAG_VALUE))
3047 #ifdef FLOAT_STORE_FLAG_VALUE
3048 || (code == GE
3049 && SCALAR_FLOAT_MODE_P (inner_mode)
3050 && (fsfv = FLOAT_STORE_FLAG_VALUE (GET_MODE (arg1)),
3051 REAL_VALUE_NEGATIVE (fsfv)))
3052 #endif
3053 )
3054 && COMPARISON_P (p->exp))
3055 {
3056 reverse_code = 1;
3057 x = p->exp;
3058 break;
3059 }
3060
3061 /* If this non-trapping address, e.g. fp + constant, the
3062 equivalent is a better operand since it may let us predict
3063 the value of the comparison. */
3064 else if (!rtx_addr_can_trap_p (p->exp))
3065 {
3066 arg1 = p->exp;
3067 continue;
3068 }
3069 }
3070
3071 /* If we didn't find a useful equivalence for ARG1, we are done.
3072 Otherwise, set up for the next iteration. */
3073 if (x == 0)
3074 break;
3075
3076 /* If we need to reverse the comparison, make sure that that is
3077 possible -- we can't necessarily infer the value of GE from LT
3078 with floating-point operands. */
3079 if (reverse_code)
3080 {
3081 enum rtx_code reversed = reversed_comparison_code (x, NULL_RTX);
3082 if (reversed == UNKNOWN)
3083 break;
3084 else
3085 code = reversed;
3086 }
3087 else if (COMPARISON_P (x))
3088 code = GET_CODE (x);
3089 arg1 = XEXP (x, 0), arg2 = XEXP (x, 1);
3090 }
3091
3092 /* Return our results. Return the modes from before fold_rtx
3093 because fold_rtx might produce const_int, and then it's too late. */
3094 *pmode1 = GET_MODE (arg1), *pmode2 = GET_MODE (arg2);
3095 *parg1 = fold_rtx (arg1, 0), *parg2 = fold_rtx (arg2, 0);
3096
3097 if (visited)
3098 delete visited;
3099 return code;
3100 }
3101 \f
3102 /* If X is a nontrivial arithmetic operation on an argument for which
3103 a constant value can be determined, return the result of operating
3104 on that value, as a constant. Otherwise, return X, possibly with
3105 one or more operands changed to a forward-propagated constant.
3106
3107 If X is a register whose contents are known, we do NOT return
3108 those contents here; equiv_constant is called to perform that task.
3109 For SUBREGs and MEMs, we do that both here and in equiv_constant.
3110
3111 INSN is the insn that we may be modifying. If it is 0, make a copy
3112 of X before modifying it. */
3113
3114 static rtx
3115 fold_rtx (rtx x, rtx_insn *insn)
3116 {
3117 enum rtx_code code;
3118 machine_mode mode;
3119 const char *fmt;
3120 int i;
3121 rtx new_rtx = 0;
3122 int changed = 0;
3123
3124 /* Operands of X. */
3125 /* Workaround -Wmaybe-uninitialized false positive during
3126 profiledbootstrap by initializing them. */
3127 rtx folded_arg0 = NULL_RTX;
3128 rtx folded_arg1 = NULL_RTX;
3129
3130 /* Constant equivalents of first three operands of X;
3131 0 when no such equivalent is known. */
3132 rtx const_arg0;
3133 rtx const_arg1;
3134 rtx const_arg2;
3135
3136 /* The mode of the first operand of X. We need this for sign and zero
3137 extends. */
3138 machine_mode mode_arg0;
3139
3140 if (x == 0)
3141 return x;
3142
3143 /* Try to perform some initial simplifications on X. */
3144 code = GET_CODE (x);
3145 switch (code)
3146 {
3147 case MEM:
3148 case SUBREG:
3149 /* The first operand of a SIGN/ZERO_EXTRACT has a different meaning
3150 than it would in other contexts. Basically its mode does not
3151 signify the size of the object read. That information is carried
3152 by size operand. If we happen to have a MEM of the appropriate
3153 mode in our tables with a constant value we could simplify the
3154 extraction incorrectly if we allowed substitution of that value
3155 for the MEM. */
3156 case ZERO_EXTRACT:
3157 case SIGN_EXTRACT:
3158 if ((new_rtx = equiv_constant (x)) != NULL_RTX)
3159 return new_rtx;
3160 return x;
3161
3162 case CONST:
3163 CASE_CONST_ANY:
3164 case SYMBOL_REF:
3165 case LABEL_REF:
3166 case REG:
3167 case PC:
3168 /* No use simplifying an EXPR_LIST
3169 since they are used only for lists of args
3170 in a function call's REG_EQUAL note. */
3171 case EXPR_LIST:
3172 return x;
3173
3174 case CC0:
3175 return prev_insn_cc0;
3176
3177 case ASM_OPERANDS:
3178 if (insn)
3179 {
3180 for (i = ASM_OPERANDS_INPUT_LENGTH (x) - 1; i >= 0; i--)
3181 validate_change (insn, &ASM_OPERANDS_INPUT (x, i),
3182 fold_rtx (ASM_OPERANDS_INPUT (x, i), insn), 0);
3183 }
3184 return x;
3185
3186 #ifdef NO_FUNCTION_CSE
3187 case CALL:
3188 if (CONSTANT_P (XEXP (XEXP (x, 0), 0)))
3189 return x;
3190 break;
3191 #endif
3192
3193 /* Anything else goes through the loop below. */
3194 default:
3195 break;
3196 }
3197
3198 mode = GET_MODE (x);
3199 const_arg0 = 0;
3200 const_arg1 = 0;
3201 const_arg2 = 0;
3202 mode_arg0 = VOIDmode;
3203
3204 /* Try folding our operands.
3205 Then see which ones have constant values known. */
3206
3207 fmt = GET_RTX_FORMAT (code);
3208 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
3209 if (fmt[i] == 'e')
3210 {
3211 rtx folded_arg = XEXP (x, i), const_arg;
3212 machine_mode mode_arg = GET_MODE (folded_arg);
3213
3214 switch (GET_CODE (folded_arg))
3215 {
3216 case MEM:
3217 case REG:
3218 case SUBREG:
3219 const_arg = equiv_constant (folded_arg);
3220 break;
3221
3222 case CONST:
3223 CASE_CONST_ANY:
3224 case SYMBOL_REF:
3225 case LABEL_REF:
3226 const_arg = folded_arg;
3227 break;
3228
3229 case CC0:
3230 /* The cc0-user and cc0-setter may be in different blocks if
3231 the cc0-setter potentially traps. In that case PREV_INSN_CC0
3232 will have been cleared as we exited the block with the
3233 setter.
3234
3235 While we could potentially track cc0 in this case, it just
3236 doesn't seem to be worth it given that cc0 targets are not
3237 terribly common or important these days and trapping math
3238 is rarely used. The combination of those two conditions
3239 necessary to trip this situation is exceedingly rare in the
3240 real world. */
3241 if (!prev_insn_cc0)
3242 {
3243 const_arg = NULL_RTX;
3244 }
3245 else
3246 {
3247 folded_arg = prev_insn_cc0;
3248 mode_arg = prev_insn_cc0_mode;
3249 const_arg = equiv_constant (folded_arg);
3250 }
3251 break;
3252
3253 default:
3254 folded_arg = fold_rtx (folded_arg, insn);
3255 const_arg = equiv_constant (folded_arg);
3256 break;
3257 }
3258
3259 /* For the first three operands, see if the operand
3260 is constant or equivalent to a constant. */
3261 switch (i)
3262 {
3263 case 0:
3264 folded_arg0 = folded_arg;
3265 const_arg0 = const_arg;
3266 mode_arg0 = mode_arg;
3267 break;
3268 case 1:
3269 folded_arg1 = folded_arg;
3270 const_arg1 = const_arg;
3271 break;
3272 case 2:
3273 const_arg2 = const_arg;
3274 break;
3275 }
3276
3277 /* Pick the least expensive of the argument and an equivalent constant
3278 argument. */
3279 if (const_arg != 0
3280 && const_arg != folded_arg
3281 && COST_IN (const_arg, code, i) <= COST_IN (folded_arg, code, i)
3282
3283 /* It's not safe to substitute the operand of a conversion
3284 operator with a constant, as the conversion's identity
3285 depends upon the mode of its operand. This optimization
3286 is handled by the call to simplify_unary_operation. */
3287 && (GET_RTX_CLASS (code) != RTX_UNARY
3288 || GET_MODE (const_arg) == mode_arg0
3289 || (code != ZERO_EXTEND
3290 && code != SIGN_EXTEND
3291 && code != TRUNCATE
3292 && code != FLOAT_TRUNCATE
3293 && code != FLOAT_EXTEND
3294 && code != FLOAT
3295 && code != FIX
3296 && code != UNSIGNED_FLOAT
3297 && code != UNSIGNED_FIX)))
3298 folded_arg = const_arg;
3299
3300 if (folded_arg == XEXP (x, i))
3301 continue;
3302
3303 if (insn == NULL_RTX && !changed)
3304 x = copy_rtx (x);
3305 changed = 1;
3306 validate_unshare_change (insn, &XEXP (x, i), folded_arg, 1);
3307 }
3308
3309 if (changed)
3310 {
3311 /* Canonicalize X if necessary, and keep const_argN and folded_argN
3312 consistent with the order in X. */
3313 if (canonicalize_change_group (insn, x))
3314 {
3315 rtx tem;
3316 tem = const_arg0, const_arg0 = const_arg1, const_arg1 = tem;
3317 tem = folded_arg0, folded_arg0 = folded_arg1, folded_arg1 = tem;
3318 }
3319
3320 apply_change_group ();
3321 }
3322
3323 /* If X is an arithmetic operation, see if we can simplify it. */
3324
3325 switch (GET_RTX_CLASS (code))
3326 {
3327 case RTX_UNARY:
3328 {
3329 /* We can't simplify extension ops unless we know the
3330 original mode. */
3331 if ((code == ZERO_EXTEND || code == SIGN_EXTEND)
3332 && mode_arg0 == VOIDmode)
3333 break;
3334
3335 new_rtx = simplify_unary_operation (code, mode,
3336 const_arg0 ? const_arg0 : folded_arg0,
3337 mode_arg0);
3338 }
3339 break;
3340
3341 case RTX_COMPARE:
3342 case RTX_COMM_COMPARE:
3343 /* See what items are actually being compared and set FOLDED_ARG[01]
3344 to those values and CODE to the actual comparison code. If any are
3345 constant, set CONST_ARG0 and CONST_ARG1 appropriately. We needn't
3346 do anything if both operands are already known to be constant. */
3347
3348 /* ??? Vector mode comparisons are not supported yet. */
3349 if (VECTOR_MODE_P (mode))
3350 break;
3351
3352 if (const_arg0 == 0 || const_arg1 == 0)
3353 {
3354 struct table_elt *p0, *p1;
3355 rtx true_rtx, false_rtx;
3356 machine_mode mode_arg1;
3357
3358 if (SCALAR_FLOAT_MODE_P (mode))
3359 {
3360 #ifdef FLOAT_STORE_FLAG_VALUE
3361 true_rtx = (CONST_DOUBLE_FROM_REAL_VALUE
3362 (FLOAT_STORE_FLAG_VALUE (mode), mode));
3363 #else
3364 true_rtx = NULL_RTX;
3365 #endif
3366 false_rtx = CONST0_RTX (mode);
3367 }
3368 else
3369 {
3370 true_rtx = const_true_rtx;
3371 false_rtx = const0_rtx;
3372 }
3373
3374 code = find_comparison_args (code, &folded_arg0, &folded_arg1,
3375 &mode_arg0, &mode_arg1);
3376
3377 /* If the mode is VOIDmode or a MODE_CC mode, we don't know
3378 what kinds of things are being compared, so we can't do
3379 anything with this comparison. */
3380
3381 if (mode_arg0 == VOIDmode || GET_MODE_CLASS (mode_arg0) == MODE_CC)
3382 break;
3383
3384 const_arg0 = equiv_constant (folded_arg0);
3385 const_arg1 = equiv_constant (folded_arg1);
3386
3387 /* If we do not now have two constants being compared, see
3388 if we can nevertheless deduce some things about the
3389 comparison. */
3390 if (const_arg0 == 0 || const_arg1 == 0)
3391 {
3392 if (const_arg1 != NULL)
3393 {
3394 rtx cheapest_simplification;
3395 int cheapest_cost;
3396 rtx simp_result;
3397 struct table_elt *p;
3398
3399 /* See if we can find an equivalent of folded_arg0
3400 that gets us a cheaper expression, possibly a
3401 constant through simplifications. */
3402 p = lookup (folded_arg0, SAFE_HASH (folded_arg0, mode_arg0),
3403 mode_arg0);
3404
3405 if (p != NULL)
3406 {
3407 cheapest_simplification = x;
3408 cheapest_cost = COST (x);
3409
3410 for (p = p->first_same_value; p != NULL; p = p->next_same_value)
3411 {
3412 int cost;
3413
3414 /* If the entry isn't valid, skip it. */
3415 if (! exp_equiv_p (p->exp, p->exp, 1, false))
3416 continue;
3417
3418 /* Try to simplify using this equivalence. */
3419 simp_result
3420 = simplify_relational_operation (code, mode,
3421 mode_arg0,
3422 p->exp,
3423 const_arg1);
3424
3425 if (simp_result == NULL)
3426 continue;
3427
3428 cost = COST (simp_result);
3429 if (cost < cheapest_cost)
3430 {
3431 cheapest_cost = cost;
3432 cheapest_simplification = simp_result;
3433 }
3434 }
3435
3436 /* If we have a cheaper expression now, use that
3437 and try folding it further, from the top. */
3438 if (cheapest_simplification != x)
3439 return fold_rtx (copy_rtx (cheapest_simplification),
3440 insn);
3441 }
3442 }
3443
3444 /* See if the two operands are the same. */
3445
3446 if ((REG_P (folded_arg0)
3447 && REG_P (folded_arg1)
3448 && (REG_QTY (REGNO (folded_arg0))
3449 == REG_QTY (REGNO (folded_arg1))))
3450 || ((p0 = lookup (folded_arg0,
3451 SAFE_HASH (folded_arg0, mode_arg0),
3452 mode_arg0))
3453 && (p1 = lookup (folded_arg1,
3454 SAFE_HASH (folded_arg1, mode_arg0),
3455 mode_arg0))
3456 && p0->first_same_value == p1->first_same_value))
3457 folded_arg1 = folded_arg0;
3458
3459 /* If FOLDED_ARG0 is a register, see if the comparison we are
3460 doing now is either the same as we did before or the reverse
3461 (we only check the reverse if not floating-point). */
3462 else if (REG_P (folded_arg0))
3463 {
3464 int qty = REG_QTY (REGNO (folded_arg0));
3465
3466 if (REGNO_QTY_VALID_P (REGNO (folded_arg0)))
3467 {
3468 struct qty_table_elem *ent = &qty_table[qty];
3469
3470 if ((comparison_dominates_p (ent->comparison_code, code)
3471 || (! FLOAT_MODE_P (mode_arg0)
3472 && comparison_dominates_p (ent->comparison_code,
3473 reverse_condition (code))))
3474 && (rtx_equal_p (ent->comparison_const, folded_arg1)
3475 || (const_arg1
3476 && rtx_equal_p (ent->comparison_const,
3477 const_arg1))
3478 || (REG_P (folded_arg1)
3479 && (REG_QTY (REGNO (folded_arg1)) == ent->comparison_qty))))
3480 {
3481 if (comparison_dominates_p (ent->comparison_code, code))
3482 {
3483 if (true_rtx)
3484 return true_rtx;
3485 else
3486 break;
3487 }
3488 else
3489 return false_rtx;
3490 }
3491 }
3492 }
3493 }
3494 }
3495
3496 /* If we are comparing against zero, see if the first operand is
3497 equivalent to an IOR with a constant. If so, we may be able to
3498 determine the result of this comparison. */
3499 if (const_arg1 == const0_rtx && !const_arg0)
3500 {
3501 rtx y = lookup_as_function (folded_arg0, IOR);
3502 rtx inner_const;
3503
3504 if (y != 0
3505 && (inner_const = equiv_constant (XEXP (y, 1))) != 0
3506 && CONST_INT_P (inner_const)
3507 && INTVAL (inner_const) != 0)
3508 folded_arg0 = gen_rtx_IOR (mode_arg0, XEXP (y, 0), inner_const);
3509 }
3510
3511 {
3512 rtx op0 = const_arg0 ? const_arg0 : copy_rtx (folded_arg0);
3513 rtx op1 = const_arg1 ? const_arg1 : copy_rtx (folded_arg1);
3514 new_rtx = simplify_relational_operation (code, mode, mode_arg0,
3515 op0, op1);
3516 }
3517 break;
3518
3519 case RTX_BIN_ARITH:
3520 case RTX_COMM_ARITH:
3521 switch (code)
3522 {
3523 case PLUS:
3524 /* If the second operand is a LABEL_REF, see if the first is a MINUS
3525 with that LABEL_REF as its second operand. If so, the result is
3526 the first operand of that MINUS. This handles switches with an
3527 ADDR_DIFF_VEC table. */
3528 if (const_arg1 && GET_CODE (const_arg1) == LABEL_REF)
3529 {
3530 rtx y
3531 = GET_CODE (folded_arg0) == MINUS ? folded_arg0
3532 : lookup_as_function (folded_arg0, MINUS);
3533
3534 if (y != 0 && GET_CODE (XEXP (y, 1)) == LABEL_REF
3535 && LABEL_REF_LABEL (XEXP (y, 1)) == LABEL_REF_LABEL (const_arg1))
3536 return XEXP (y, 0);
3537
3538 /* Now try for a CONST of a MINUS like the above. */
3539 if ((y = (GET_CODE (folded_arg0) == CONST ? folded_arg0
3540 : lookup_as_function (folded_arg0, CONST))) != 0
3541 && GET_CODE (XEXP (y, 0)) == MINUS
3542 && GET_CODE (XEXP (XEXP (y, 0), 1)) == LABEL_REF
3543 && LABEL_REF_LABEL (XEXP (XEXP (y, 0), 1)) == LABEL_REF_LABEL (const_arg1))
3544 return XEXP (XEXP (y, 0), 0);
3545 }
3546
3547 /* Likewise if the operands are in the other order. */
3548 if (const_arg0 && GET_CODE (const_arg0) == LABEL_REF)
3549 {
3550 rtx y
3551 = GET_CODE (folded_arg1) == MINUS ? folded_arg1
3552 : lookup_as_function (folded_arg1, MINUS);
3553
3554 if (y != 0 && GET_CODE (XEXP (y, 1)) == LABEL_REF
3555 && LABEL_REF_LABEL (XEXP (y, 1)) == LABEL_REF_LABEL (const_arg0))
3556 return XEXP (y, 0);
3557
3558 /* Now try for a CONST of a MINUS like the above. */
3559 if ((y = (GET_CODE (folded_arg1) == CONST ? folded_arg1
3560 : lookup_as_function (folded_arg1, CONST))) != 0
3561 && GET_CODE (XEXP (y, 0)) == MINUS
3562 && GET_CODE (XEXP (XEXP (y, 0), 1)) == LABEL_REF
3563 && LABEL_REF_LABEL (XEXP (XEXP (y, 0), 1)) == LABEL_REF_LABEL (const_arg0))
3564 return XEXP (XEXP (y, 0), 0);
3565 }
3566
3567 /* If second operand is a register equivalent to a negative
3568 CONST_INT, see if we can find a register equivalent to the
3569 positive constant. Make a MINUS if so. Don't do this for
3570 a non-negative constant since we might then alternate between
3571 choosing positive and negative constants. Having the positive
3572 constant previously-used is the more common case. Be sure
3573 the resulting constant is non-negative; if const_arg1 were
3574 the smallest negative number this would overflow: depending
3575 on the mode, this would either just be the same value (and
3576 hence not save anything) or be incorrect. */
3577 if (const_arg1 != 0 && CONST_INT_P (const_arg1)
3578 && INTVAL (const_arg1) < 0
3579 /* This used to test
3580
3581 -INTVAL (const_arg1) >= 0
3582
3583 But The Sun V5.0 compilers mis-compiled that test. So
3584 instead we test for the problematic value in a more direct
3585 manner and hope the Sun compilers get it correct. */
3586 && INTVAL (const_arg1) !=
3587 ((HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT - 1))
3588 && REG_P (folded_arg1))
3589 {
3590 rtx new_const = GEN_INT (-INTVAL (const_arg1));
3591 struct table_elt *p
3592 = lookup (new_const, SAFE_HASH (new_const, mode), mode);
3593
3594 if (p)
3595 for (p = p->first_same_value; p; p = p->next_same_value)
3596 if (REG_P (p->exp))
3597 return simplify_gen_binary (MINUS, mode, folded_arg0,
3598 canon_reg (p->exp, NULL));
3599 }
3600 goto from_plus;
3601
3602 case MINUS:
3603 /* If we have (MINUS Y C), see if Y is known to be (PLUS Z C2).
3604 If so, produce (PLUS Z C2-C). */
3605 if (const_arg1 != 0 && CONST_INT_P (const_arg1))
3606 {
3607 rtx y = lookup_as_function (XEXP (x, 0), PLUS);
3608 if (y && CONST_INT_P (XEXP (y, 1)))
3609 return fold_rtx (plus_constant (mode, copy_rtx (y),
3610 -INTVAL (const_arg1)),
3611 NULL);
3612 }
3613
3614 /* Fall through. */
3615
3616 from_plus:
3617 case SMIN: case SMAX: case UMIN: case UMAX:
3618 case IOR: case AND: case XOR:
3619 case MULT:
3620 case ASHIFT: case LSHIFTRT: case ASHIFTRT:
3621 /* If we have (<op> <reg> <const_int>) for an associative OP and REG
3622 is known to be of similar form, we may be able to replace the
3623 operation with a combined operation. This may eliminate the
3624 intermediate operation if every use is simplified in this way.
3625 Note that the similar optimization done by combine.c only works
3626 if the intermediate operation's result has only one reference. */
3627
3628 if (REG_P (folded_arg0)
3629 && const_arg1 && CONST_INT_P (const_arg1))
3630 {
3631 int is_shift
3632 = (code == ASHIFT || code == ASHIFTRT || code == LSHIFTRT);
3633 rtx y, inner_const, new_const;
3634 rtx canon_const_arg1 = const_arg1;
3635 enum rtx_code associate_code;
3636
3637 if (is_shift
3638 && (INTVAL (const_arg1) >= GET_MODE_PRECISION (mode)
3639 || INTVAL (const_arg1) < 0))
3640 {
3641 if (SHIFT_COUNT_TRUNCATED)
3642 canon_const_arg1 = GEN_INT (INTVAL (const_arg1)
3643 & (GET_MODE_BITSIZE (mode)
3644 - 1));
3645 else
3646 break;
3647 }
3648
3649 y = lookup_as_function (folded_arg0, code);
3650 if (y == 0)
3651 break;
3652
3653 /* If we have compiled a statement like
3654 "if (x == (x & mask1))", and now are looking at
3655 "x & mask2", we will have a case where the first operand
3656 of Y is the same as our first operand. Unless we detect
3657 this case, an infinite loop will result. */
3658 if (XEXP (y, 0) == folded_arg0)
3659 break;
3660
3661 inner_const = equiv_constant (fold_rtx (XEXP (y, 1), 0));
3662 if (!inner_const || !CONST_INT_P (inner_const))
3663 break;
3664
3665 /* Don't associate these operations if they are a PLUS with the
3666 same constant and it is a power of two. These might be doable
3667 with a pre- or post-increment. Similarly for two subtracts of
3668 identical powers of two with post decrement. */
3669
3670 if (code == PLUS && const_arg1 == inner_const
3671 && ((HAVE_PRE_INCREMENT
3672 && exact_log2 (INTVAL (const_arg1)) >= 0)
3673 || (HAVE_POST_INCREMENT
3674 && exact_log2 (INTVAL (const_arg1)) >= 0)
3675 || (HAVE_PRE_DECREMENT
3676 && exact_log2 (- INTVAL (const_arg1)) >= 0)
3677 || (HAVE_POST_DECREMENT
3678 && exact_log2 (- INTVAL (const_arg1)) >= 0)))
3679 break;
3680
3681 /* ??? Vector mode shifts by scalar
3682 shift operand are not supported yet. */
3683 if (is_shift && VECTOR_MODE_P (mode))
3684 break;
3685
3686 if (is_shift
3687 && (INTVAL (inner_const) >= GET_MODE_PRECISION (mode)
3688 || INTVAL (inner_const) < 0))
3689 {
3690 if (SHIFT_COUNT_TRUNCATED)
3691 inner_const = GEN_INT (INTVAL (inner_const)
3692 & (GET_MODE_BITSIZE (mode) - 1));
3693 else
3694 break;
3695 }
3696
3697 /* Compute the code used to compose the constants. For example,
3698 A-C1-C2 is A-(C1 + C2), so if CODE == MINUS, we want PLUS. */
3699
3700 associate_code = (is_shift || code == MINUS ? PLUS : code);
3701
3702 new_const = simplify_binary_operation (associate_code, mode,
3703 canon_const_arg1,
3704 inner_const);
3705
3706 if (new_const == 0)
3707 break;
3708
3709 /* If we are associating shift operations, don't let this
3710 produce a shift of the size of the object or larger.
3711 This could occur when we follow a sign-extend by a right
3712 shift on a machine that does a sign-extend as a pair
3713 of shifts. */
3714
3715 if (is_shift
3716 && CONST_INT_P (new_const)
3717 && INTVAL (new_const) >= GET_MODE_PRECISION (mode))
3718 {
3719 /* As an exception, we can turn an ASHIFTRT of this
3720 form into a shift of the number of bits - 1. */
3721 if (code == ASHIFTRT)
3722 new_const = GEN_INT (GET_MODE_BITSIZE (mode) - 1);
3723 else if (!side_effects_p (XEXP (y, 0)))
3724 return CONST0_RTX (mode);
3725 else
3726 break;
3727 }
3728
3729 y = copy_rtx (XEXP (y, 0));
3730
3731 /* If Y contains our first operand (the most common way this
3732 can happen is if Y is a MEM), we would do into an infinite
3733 loop if we tried to fold it. So don't in that case. */
3734
3735 if (! reg_mentioned_p (folded_arg0, y))
3736 y = fold_rtx (y, insn);
3737
3738 return simplify_gen_binary (code, mode, y, new_const);
3739 }
3740 break;
3741
3742 case DIV: case UDIV:
3743 /* ??? The associative optimization performed immediately above is
3744 also possible for DIV and UDIV using associate_code of MULT.
3745 However, we would need extra code to verify that the
3746 multiplication does not overflow, that is, there is no overflow
3747 in the calculation of new_const. */
3748 break;
3749
3750 default:
3751 break;
3752 }
3753
3754 new_rtx = simplify_binary_operation (code, mode,
3755 const_arg0 ? const_arg0 : folded_arg0,
3756 const_arg1 ? const_arg1 : folded_arg1);
3757 break;
3758
3759 case RTX_OBJ:
3760 /* (lo_sum (high X) X) is simply X. */
3761 if (code == LO_SUM && const_arg0 != 0
3762 && GET_CODE (const_arg0) == HIGH
3763 && rtx_equal_p (XEXP (const_arg0, 0), const_arg1))
3764 return const_arg1;
3765 break;
3766
3767 case RTX_TERNARY:
3768 case RTX_BITFIELD_OPS:
3769 new_rtx = simplify_ternary_operation (code, mode, mode_arg0,
3770 const_arg0 ? const_arg0 : folded_arg0,
3771 const_arg1 ? const_arg1 : folded_arg1,
3772 const_arg2 ? const_arg2 : XEXP (x, 2));
3773 break;
3774
3775 default:
3776 break;
3777 }
3778
3779 return new_rtx ? new_rtx : x;
3780 }
3781 \f
3782 /* Return a constant value currently equivalent to X.
3783 Return 0 if we don't know one. */
3784
3785 static rtx
3786 equiv_constant (rtx x)
3787 {
3788 if (REG_P (x)
3789 && REGNO_QTY_VALID_P (REGNO (x)))
3790 {
3791 int x_q = REG_QTY (REGNO (x));
3792 struct qty_table_elem *x_ent = &qty_table[x_q];
3793
3794 if (x_ent->const_rtx)
3795 x = gen_lowpart (GET_MODE (x), x_ent->const_rtx);
3796 }
3797
3798 if (x == 0 || CONSTANT_P (x))
3799 return x;
3800
3801 if (GET_CODE (x) == SUBREG)
3802 {
3803 machine_mode mode = GET_MODE (x);
3804 machine_mode imode = GET_MODE (SUBREG_REG (x));
3805 rtx new_rtx;
3806
3807 /* See if we previously assigned a constant value to this SUBREG. */
3808 if ((new_rtx = lookup_as_function (x, CONST_INT)) != 0
3809 || (new_rtx = lookup_as_function (x, CONST_WIDE_INT)) != 0
3810 || (new_rtx = lookup_as_function (x, CONST_DOUBLE)) != 0
3811 || (new_rtx = lookup_as_function (x, CONST_FIXED)) != 0)
3812 return new_rtx;
3813
3814 /* If we didn't and if doing so makes sense, see if we previously
3815 assigned a constant value to the enclosing word mode SUBREG. */
3816 if (GET_MODE_SIZE (mode) < GET_MODE_SIZE (word_mode)
3817 && GET_MODE_SIZE (word_mode) < GET_MODE_SIZE (imode))
3818 {
3819 int byte = SUBREG_BYTE (x) - subreg_lowpart_offset (mode, word_mode);
3820 if (byte >= 0 && (byte % UNITS_PER_WORD) == 0)
3821 {
3822 rtx y = gen_rtx_SUBREG (word_mode, SUBREG_REG (x), byte);
3823 new_rtx = lookup_as_function (y, CONST_INT);
3824 if (new_rtx)
3825 return gen_lowpart (mode, new_rtx);
3826 }
3827 }
3828
3829 /* Otherwise see if we already have a constant for the inner REG,
3830 and if that is enough to calculate an equivalent constant for
3831 the subreg. Note that the upper bits of paradoxical subregs
3832 are undefined, so they cannot be said to equal anything. */
3833 if (REG_P (SUBREG_REG (x))
3834 && GET_MODE_SIZE (mode) <= GET_MODE_SIZE (imode)
3835 && (new_rtx = equiv_constant (SUBREG_REG (x))) != 0)
3836 return simplify_subreg (mode, new_rtx, imode, SUBREG_BYTE (x));
3837
3838 return 0;
3839 }
3840
3841 /* If X is a MEM, see if it is a constant-pool reference, or look it up in
3842 the hash table in case its value was seen before. */
3843
3844 if (MEM_P (x))
3845 {
3846 struct table_elt *elt;
3847
3848 x = avoid_constant_pool_reference (x);
3849 if (CONSTANT_P (x))
3850 return x;
3851
3852 elt = lookup (x, SAFE_HASH (x, GET_MODE (x)), GET_MODE (x));
3853 if (elt == 0)
3854 return 0;
3855
3856 for (elt = elt->first_same_value; elt; elt = elt->next_same_value)
3857 if (elt->is_const && CONSTANT_P (elt->exp))
3858 return elt->exp;
3859 }
3860
3861 return 0;
3862 }
3863 \f
3864 /* Given INSN, a jump insn, TAKEN indicates if we are following the
3865 "taken" branch.
3866
3867 In certain cases, this can cause us to add an equivalence. For example,
3868 if we are following the taken case of
3869 if (i == 2)
3870 we can add the fact that `i' and '2' are now equivalent.
3871
3872 In any case, we can record that this comparison was passed. If the same
3873 comparison is seen later, we will know its value. */
3874
3875 static void
3876 record_jump_equiv (rtx_insn *insn, bool taken)
3877 {
3878 int cond_known_true;
3879 rtx op0, op1;
3880 rtx set;
3881 machine_mode mode, mode0, mode1;
3882 int reversed_nonequality = 0;
3883 enum rtx_code code;
3884
3885 /* Ensure this is the right kind of insn. */
3886 gcc_assert (any_condjump_p (insn));
3887
3888 set = pc_set (insn);
3889
3890 /* See if this jump condition is known true or false. */
3891 if (taken)
3892 cond_known_true = (XEXP (SET_SRC (set), 2) == pc_rtx);
3893 else
3894 cond_known_true = (XEXP (SET_SRC (set), 1) == pc_rtx);
3895
3896 /* Get the type of comparison being done and the operands being compared.
3897 If we had to reverse a non-equality condition, record that fact so we
3898 know that it isn't valid for floating-point. */
3899 code = GET_CODE (XEXP (SET_SRC (set), 0));
3900 op0 = fold_rtx (XEXP (XEXP (SET_SRC (set), 0), 0), insn);
3901 op1 = fold_rtx (XEXP (XEXP (SET_SRC (set), 0), 1), insn);
3902
3903 code = find_comparison_args (code, &op0, &op1, &mode0, &mode1);
3904 if (! cond_known_true)
3905 {
3906 code = reversed_comparison_code_parts (code, op0, op1, insn);
3907
3908 /* Don't remember if we can't find the inverse. */
3909 if (code == UNKNOWN)
3910 return;
3911 }
3912
3913 /* The mode is the mode of the non-constant. */
3914 mode = mode0;
3915 if (mode1 != VOIDmode)
3916 mode = mode1;
3917
3918 record_jump_cond (code, mode, op0, op1, reversed_nonequality);
3919 }
3920
3921 /* Yet another form of subreg creation. In this case, we want something in
3922 MODE, and we should assume OP has MODE iff it is naturally modeless. */
3923
3924 static rtx
3925 record_jump_cond_subreg (machine_mode mode, rtx op)
3926 {
3927 machine_mode op_mode = GET_MODE (op);
3928 if (op_mode == mode || op_mode == VOIDmode)
3929 return op;
3930 return lowpart_subreg (mode, op, op_mode);
3931 }
3932
3933 /* We know that comparison CODE applied to OP0 and OP1 in MODE is true.
3934 REVERSED_NONEQUALITY is nonzero if CODE had to be swapped.
3935 Make any useful entries we can with that information. Called from
3936 above function and called recursively. */
3937
3938 static void
3939 record_jump_cond (enum rtx_code code, machine_mode mode, rtx op0,
3940 rtx op1, int reversed_nonequality)
3941 {
3942 unsigned op0_hash, op1_hash;
3943 int op0_in_memory, op1_in_memory;
3944 struct table_elt *op0_elt, *op1_elt;
3945
3946 /* If OP0 and OP1 are known equal, and either is a paradoxical SUBREG,
3947 we know that they are also equal in the smaller mode (this is also
3948 true for all smaller modes whether or not there is a SUBREG, but
3949 is not worth testing for with no SUBREG). */
3950
3951 /* Note that GET_MODE (op0) may not equal MODE. */
3952 if (code == EQ && paradoxical_subreg_p (op0))
3953 {
3954 machine_mode inner_mode = GET_MODE (SUBREG_REG (op0));
3955 rtx tem = record_jump_cond_subreg (inner_mode, op1);
3956 if (tem)
3957 record_jump_cond (code, mode, SUBREG_REG (op0), tem,
3958 reversed_nonequality);
3959 }
3960
3961 if (code == EQ && paradoxical_subreg_p (op1))
3962 {
3963 machine_mode inner_mode = GET_MODE (SUBREG_REG (op1));
3964 rtx tem = record_jump_cond_subreg (inner_mode, op0);
3965 if (tem)
3966 record_jump_cond (code, mode, SUBREG_REG (op1), tem,
3967 reversed_nonequality);
3968 }
3969
3970 /* Similarly, if this is an NE comparison, and either is a SUBREG
3971 making a smaller mode, we know the whole thing is also NE. */
3972
3973 /* Note that GET_MODE (op0) may not equal MODE;
3974 if we test MODE instead, we can get an infinite recursion
3975 alternating between two modes each wider than MODE. */
3976
3977 if (code == NE && GET_CODE (op0) == SUBREG
3978 && subreg_lowpart_p (op0)
3979 && (GET_MODE_SIZE (GET_MODE (op0))
3980 < GET_MODE_SIZE (GET_MODE (SUBREG_REG (op0)))))
3981 {
3982 machine_mode inner_mode = GET_MODE (SUBREG_REG (op0));
3983 rtx tem = record_jump_cond_subreg (inner_mode, op1);
3984 if (tem)
3985 record_jump_cond (code, mode, SUBREG_REG (op0), tem,
3986 reversed_nonequality);
3987 }
3988
3989 if (code == NE && GET_CODE (op1) == SUBREG
3990 && subreg_lowpart_p (op1)
3991 && (GET_MODE_SIZE (GET_MODE (op1))
3992 < GET_MODE_SIZE (GET_MODE (SUBREG_REG (op1)))))
3993 {
3994 machine_mode inner_mode = GET_MODE (SUBREG_REG (op1));
3995 rtx tem = record_jump_cond_subreg (inner_mode, op0);
3996 if (tem)
3997 record_jump_cond (code, mode, SUBREG_REG (op1), tem,
3998 reversed_nonequality);
3999 }
4000
4001 /* Hash both operands. */
4002
4003 do_not_record = 0;
4004 hash_arg_in_memory = 0;
4005 op0_hash = HASH (op0, mode);
4006 op0_in_memory = hash_arg_in_memory;
4007
4008 if (do_not_record)
4009 return;
4010
4011 do_not_record = 0;
4012 hash_arg_in_memory = 0;
4013 op1_hash = HASH (op1, mode);
4014 op1_in_memory = hash_arg_in_memory;
4015
4016 if (do_not_record)
4017 return;
4018
4019 /* Look up both operands. */
4020 op0_elt = lookup (op0, op0_hash, mode);
4021 op1_elt = lookup (op1, op1_hash, mode);
4022
4023 /* If both operands are already equivalent or if they are not in the
4024 table but are identical, do nothing. */
4025 if ((op0_elt != 0 && op1_elt != 0
4026 && op0_elt->first_same_value == op1_elt->first_same_value)
4027 || op0 == op1 || rtx_equal_p (op0, op1))
4028 return;
4029
4030 /* If we aren't setting two things equal all we can do is save this
4031 comparison. Similarly if this is floating-point. In the latter
4032 case, OP1 might be zero and both -0.0 and 0.0 are equal to it.
4033 If we record the equality, we might inadvertently delete code
4034 whose intent was to change -0 to +0. */
4035
4036 if (code != EQ || FLOAT_MODE_P (GET_MODE (op0)))
4037 {
4038 struct qty_table_elem *ent;
4039 int qty;
4040
4041 /* If we reversed a floating-point comparison, if OP0 is not a
4042 register, or if OP1 is neither a register or constant, we can't
4043 do anything. */
4044
4045 if (!REG_P (op1))
4046 op1 = equiv_constant (op1);
4047
4048 if ((reversed_nonequality && FLOAT_MODE_P (mode))
4049 || !REG_P (op0) || op1 == 0)
4050 return;
4051
4052 /* Put OP0 in the hash table if it isn't already. This gives it a
4053 new quantity number. */
4054 if (op0_elt == 0)
4055 {
4056 if (insert_regs (op0, NULL, 0))
4057 {
4058 rehash_using_reg (op0);
4059 op0_hash = HASH (op0, mode);
4060
4061 /* If OP0 is contained in OP1, this changes its hash code
4062 as well. Faster to rehash than to check, except
4063 for the simple case of a constant. */
4064 if (! CONSTANT_P (op1))
4065 op1_hash = HASH (op1,mode);
4066 }
4067
4068 op0_elt = insert (op0, NULL, op0_hash, mode);
4069 op0_elt->in_memory = op0_in_memory;
4070 }
4071
4072 qty = REG_QTY (REGNO (op0));
4073 ent = &qty_table[qty];
4074
4075 ent->comparison_code = code;
4076 if (REG_P (op1))
4077 {
4078 /* Look it up again--in case op0 and op1 are the same. */
4079 op1_elt = lookup (op1, op1_hash, mode);
4080
4081 /* Put OP1 in the hash table so it gets a new quantity number. */
4082 if (op1_elt == 0)
4083 {
4084 if (insert_regs (op1, NULL, 0))
4085 {
4086 rehash_using_reg (op1);
4087 op1_hash = HASH (op1, mode);
4088 }
4089
4090 op1_elt = insert (op1, NULL, op1_hash, mode);
4091 op1_elt->in_memory = op1_in_memory;
4092 }
4093
4094 ent->comparison_const = NULL_RTX;
4095 ent->comparison_qty = REG_QTY (REGNO (op1));
4096 }
4097 else
4098 {
4099 ent->comparison_const = op1;
4100 ent->comparison_qty = -1;
4101 }
4102
4103 return;
4104 }
4105
4106 /* If either side is still missing an equivalence, make it now,
4107 then merge the equivalences. */
4108
4109 if (op0_elt == 0)
4110 {
4111 if (insert_regs (op0, NULL, 0))
4112 {
4113 rehash_using_reg (op0);
4114 op0_hash = HASH (op0, mode);
4115 }
4116
4117 op0_elt = insert (op0, NULL, op0_hash, mode);
4118 op0_elt->in_memory = op0_in_memory;
4119 }
4120
4121 if (op1_elt == 0)
4122 {
4123 if (insert_regs (op1, NULL, 0))
4124 {
4125 rehash_using_reg (op1);
4126 op1_hash = HASH (op1, mode);
4127 }
4128
4129 op1_elt = insert (op1, NULL, op1_hash, mode);
4130 op1_elt->in_memory = op1_in_memory;
4131 }
4132
4133 merge_equiv_classes (op0_elt, op1_elt);
4134 }
4135 \f
4136 /* CSE processing for one instruction.
4137
4138 Most "true" common subexpressions are mostly optimized away in GIMPLE,
4139 but the few that "leak through" are cleaned up by cse_insn, and complex
4140 addressing modes are often formed here.
4141
4142 The main function is cse_insn, and between here and that function
4143 a couple of helper functions is defined to keep the size of cse_insn
4144 within reasonable proportions.
4145
4146 Data is shared between the main and helper functions via STRUCT SET,
4147 that contains all data related for every set in the instruction that
4148 is being processed.
4149
4150 Note that cse_main processes all sets in the instruction. Most
4151 passes in GCC only process simple SET insns or single_set insns, but
4152 CSE processes insns with multiple sets as well. */
4153
4154 /* Data on one SET contained in the instruction. */
4155
4156 struct set
4157 {
4158 /* The SET rtx itself. */
4159 rtx rtl;
4160 /* The SET_SRC of the rtx (the original value, if it is changing). */
4161 rtx src;
4162 /* The hash-table element for the SET_SRC of the SET. */
4163 struct table_elt *src_elt;
4164 /* Hash value for the SET_SRC. */
4165 unsigned src_hash;
4166 /* Hash value for the SET_DEST. */
4167 unsigned dest_hash;
4168 /* The SET_DEST, with SUBREG, etc., stripped. */
4169 rtx inner_dest;
4170 /* Nonzero if the SET_SRC is in memory. */
4171 char src_in_memory;
4172 /* Nonzero if the SET_SRC contains something
4173 whose value cannot be predicted and understood. */
4174 char src_volatile;
4175 /* Original machine mode, in case it becomes a CONST_INT.
4176 The size of this field should match the size of the mode
4177 field of struct rtx_def (see rtl.h). */
4178 ENUM_BITFIELD(machine_mode) mode : 8;
4179 /* A constant equivalent for SET_SRC, if any. */
4180 rtx src_const;
4181 /* Hash value of constant equivalent for SET_SRC. */
4182 unsigned src_const_hash;
4183 /* Table entry for constant equivalent for SET_SRC, if any. */
4184 struct table_elt *src_const_elt;
4185 /* Table entry for the destination address. */
4186 struct table_elt *dest_addr_elt;
4187 };
4188 \f
4189 /* Special handling for (set REG0 REG1) where REG0 is the
4190 "cheapest", cheaper than REG1. After cse, REG1 will probably not
4191 be used in the sequel, so (if easily done) change this insn to
4192 (set REG1 REG0) and replace REG1 with REG0 in the previous insn
4193 that computed their value. Then REG1 will become a dead store
4194 and won't cloud the situation for later optimizations.
4195
4196 Do not make this change if REG1 is a hard register, because it will
4197 then be used in the sequel and we may be changing a two-operand insn
4198 into a three-operand insn.
4199
4200 This is the last transformation that cse_insn will try to do. */
4201
4202 static void
4203 try_back_substitute_reg (rtx set, rtx_insn *insn)
4204 {
4205 rtx dest = SET_DEST (set);
4206 rtx src = SET_SRC (set);
4207
4208 if (REG_P (dest)
4209 && REG_P (src) && ! HARD_REGISTER_P (src)
4210 && REGNO_QTY_VALID_P (REGNO (src)))
4211 {
4212 int src_q = REG_QTY (REGNO (src));
4213 struct qty_table_elem *src_ent = &qty_table[src_q];
4214
4215 if (src_ent->first_reg == REGNO (dest))
4216 {
4217 /* Scan for the previous nonnote insn, but stop at a basic
4218 block boundary. */
4219 rtx_insn *prev = insn;
4220 rtx_insn *bb_head = BB_HEAD (BLOCK_FOR_INSN (insn));
4221 do
4222 {
4223 prev = PREV_INSN (prev);
4224 }
4225 while (prev != bb_head && (NOTE_P (prev) || DEBUG_INSN_P (prev)));
4226
4227 /* Do not swap the registers around if the previous instruction
4228 attaches a REG_EQUIV note to REG1.
4229
4230 ??? It's not entirely clear whether we can transfer a REG_EQUIV
4231 from the pseudo that originally shadowed an incoming argument
4232 to another register. Some uses of REG_EQUIV might rely on it
4233 being attached to REG1 rather than REG2.
4234
4235 This section previously turned the REG_EQUIV into a REG_EQUAL
4236 note. We cannot do that because REG_EQUIV may provide an
4237 uninitialized stack slot when REG_PARM_STACK_SPACE is used. */
4238 if (NONJUMP_INSN_P (prev)
4239 && GET_CODE (PATTERN (prev)) == SET
4240 && SET_DEST (PATTERN (prev)) == src
4241 && ! find_reg_note (prev, REG_EQUIV, NULL_RTX))
4242 {
4243 rtx note;
4244
4245 validate_change (prev, &SET_DEST (PATTERN (prev)), dest, 1);
4246 validate_change (insn, &SET_DEST (set), src, 1);
4247 validate_change (insn, &SET_SRC (set), dest, 1);
4248 apply_change_group ();
4249
4250 /* If INSN has a REG_EQUAL note, and this note mentions
4251 REG0, then we must delete it, because the value in
4252 REG0 has changed. If the note's value is REG1, we must
4253 also delete it because that is now this insn's dest. */
4254 note = find_reg_note (insn, REG_EQUAL, NULL_RTX);
4255 if (note != 0
4256 && (reg_mentioned_p (dest, XEXP (note, 0))
4257 || rtx_equal_p (src, XEXP (note, 0))))
4258 remove_note (insn, note);
4259 }
4260 }
4261 }
4262 }
4263 \f
4264 /* Record all the SETs in this instruction into SETS_PTR,
4265 and return the number of recorded sets. */
4266 static int
4267 find_sets_in_insn (rtx_insn *insn, struct set **psets)
4268 {
4269 struct set *sets = *psets;
4270 int n_sets = 0;
4271 rtx x = PATTERN (insn);
4272
4273 if (GET_CODE (x) == SET)
4274 {
4275 /* Ignore SETs that are unconditional jumps.
4276 They never need cse processing, so this does not hurt.
4277 The reason is not efficiency but rather
4278 so that we can test at the end for instructions
4279 that have been simplified to unconditional jumps
4280 and not be misled by unchanged instructions
4281 that were unconditional jumps to begin with. */
4282 if (SET_DEST (x) == pc_rtx
4283 && GET_CODE (SET_SRC (x)) == LABEL_REF)
4284 ;
4285 /* Don't count call-insns, (set (reg 0) (call ...)), as a set.
4286 The hard function value register is used only once, to copy to
4287 someplace else, so it isn't worth cse'ing. */
4288 else if (GET_CODE (SET_SRC (x)) == CALL)
4289 ;
4290 else
4291 sets[n_sets++].rtl = x;
4292 }
4293 else if (GET_CODE (x) == PARALLEL)
4294 {
4295 int i, lim = XVECLEN (x, 0);
4296
4297 /* Go over the expressions of the PARALLEL in forward order, to
4298 put them in the same order in the SETS array. */
4299 for (i = 0; i < lim; i++)
4300 {
4301 rtx y = XVECEXP (x, 0, i);
4302 if (GET_CODE (y) == SET)
4303 {
4304 /* As above, we ignore unconditional jumps and call-insns and
4305 ignore the result of apply_change_group. */
4306 if (SET_DEST (y) == pc_rtx
4307 && GET_CODE (SET_SRC (y)) == LABEL_REF)
4308 ;
4309 else if (GET_CODE (SET_SRC (y)) == CALL)
4310 ;
4311 else
4312 sets[n_sets++].rtl = y;
4313 }
4314 }
4315 }
4316
4317 return n_sets;
4318 }
4319 \f
4320 /* Where possible, substitute every register reference in the N_SETS
4321 number of SETS in INSN with the the canonical register.
4322
4323 Register canonicalization propagatest the earliest register (i.e.
4324 one that is set before INSN) with the same value. This is a very
4325 useful, simple form of CSE, to clean up warts from expanding GIMPLE
4326 to RTL. For instance, a CONST for an address is usually expanded
4327 multiple times to loads into different registers, thus creating many
4328 subexpressions of the form:
4329
4330 (set (reg1) (some_const))
4331 (set (mem (... reg1 ...) (thing)))
4332 (set (reg2) (some_const))
4333 (set (mem (... reg2 ...) (thing)))
4334
4335 After canonicalizing, the code takes the following form:
4336
4337 (set (reg1) (some_const))
4338 (set (mem (... reg1 ...) (thing)))
4339 (set (reg2) (some_const))
4340 (set (mem (... reg1 ...) (thing)))
4341
4342 The set to reg2 is now trivially dead, and the memory reference (or
4343 address, or whatever) may be a candidate for further CSEing.
4344
4345 In this function, the result of apply_change_group can be ignored;
4346 see canon_reg. */
4347
4348 static void
4349 canonicalize_insn (rtx_insn *insn, struct set **psets, int n_sets)
4350 {
4351 struct set *sets = *psets;
4352 rtx tem;
4353 rtx x = PATTERN (insn);
4354 int i;
4355
4356 if (CALL_P (insn))
4357 {
4358 for (tem = CALL_INSN_FUNCTION_USAGE (insn); tem; tem = XEXP (tem, 1))
4359 if (GET_CODE (XEXP (tem, 0)) != SET)
4360 XEXP (tem, 0) = canon_reg (XEXP (tem, 0), insn);
4361 }
4362
4363 if (GET_CODE (x) == SET && GET_CODE (SET_SRC (x)) == CALL)
4364 {
4365 canon_reg (SET_SRC (x), insn);
4366 apply_change_group ();
4367 fold_rtx (SET_SRC (x), insn);
4368 }
4369 else if (GET_CODE (x) == CLOBBER)
4370 {
4371 /* If we clobber memory, canon the address.
4372 This does nothing when a register is clobbered
4373 because we have already invalidated the reg. */
4374 if (MEM_P (XEXP (x, 0)))
4375 canon_reg (XEXP (x, 0), insn);
4376 }
4377 else if (GET_CODE (x) == USE
4378 && ! (REG_P (XEXP (x, 0))
4379 && REGNO (XEXP (x, 0)) < FIRST_PSEUDO_REGISTER))
4380 /* Canonicalize a USE of a pseudo register or memory location. */
4381 canon_reg (x, insn);
4382 else if (GET_CODE (x) == ASM_OPERANDS)
4383 {
4384 for (i = ASM_OPERANDS_INPUT_LENGTH (x) - 1; i >= 0; i--)
4385 {
4386 rtx input = ASM_OPERANDS_INPUT (x, i);
4387 if (!(REG_P (input) && REGNO (input) < FIRST_PSEUDO_REGISTER))
4388 {
4389 input = canon_reg (input, insn);
4390 validate_change (insn, &ASM_OPERANDS_INPUT (x, i), input, 1);
4391 }
4392 }
4393 }
4394 else if (GET_CODE (x) == CALL)
4395 {
4396 canon_reg (x, insn);
4397 apply_change_group ();
4398 fold_rtx (x, insn);
4399 }
4400 else if (DEBUG_INSN_P (insn))
4401 canon_reg (PATTERN (insn), insn);
4402 else if (GET_CODE (x) == PARALLEL)
4403 {
4404 for (i = XVECLEN (x, 0) - 1; i >= 0; i--)
4405 {
4406 rtx y = XVECEXP (x, 0, i);
4407 if (GET_CODE (y) == SET && GET_CODE (SET_SRC (y)) == CALL)
4408 {
4409 canon_reg (SET_SRC (y), insn);
4410 apply_change_group ();
4411 fold_rtx (SET_SRC (y), insn);
4412 }
4413 else if (GET_CODE (y) == CLOBBER)
4414 {
4415 if (MEM_P (XEXP (y, 0)))
4416 canon_reg (XEXP (y, 0), insn);
4417 }
4418 else if (GET_CODE (y) == USE
4419 && ! (REG_P (XEXP (y, 0))
4420 && REGNO (XEXP (y, 0)) < FIRST_PSEUDO_REGISTER))
4421 canon_reg (y, insn);
4422 else if (GET_CODE (y) == CALL)
4423 {
4424 canon_reg (y, insn);
4425 apply_change_group ();
4426 fold_rtx (y, insn);
4427 }
4428 }
4429 }
4430
4431 if (n_sets == 1 && REG_NOTES (insn) != 0
4432 && (tem = find_reg_note (insn, REG_EQUAL, NULL_RTX)) != 0)
4433 {
4434 /* We potentially will process this insn many times. Therefore,
4435 drop the REG_EQUAL note if it is equal to the SET_SRC of the
4436 unique set in INSN.
4437
4438 Do not do so if the REG_EQUAL note is for a STRICT_LOW_PART,
4439 because cse_insn handles those specially. */
4440 if (GET_CODE (SET_DEST (sets[0].rtl)) != STRICT_LOW_PART
4441 && rtx_equal_p (XEXP (tem, 0), SET_SRC (sets[0].rtl)))
4442 remove_note (insn, tem);
4443 else
4444 {
4445 canon_reg (XEXP (tem, 0), insn);
4446 apply_change_group ();
4447 XEXP (tem, 0) = fold_rtx (XEXP (tem, 0), insn);
4448 df_notes_rescan (insn);
4449 }
4450 }
4451
4452 /* Canonicalize sources and addresses of destinations.
4453 We do this in a separate pass to avoid problems when a MATCH_DUP is
4454 present in the insn pattern. In that case, we want to ensure that
4455 we don't break the duplicate nature of the pattern. So we will replace
4456 both operands at the same time. Otherwise, we would fail to find an
4457 equivalent substitution in the loop calling validate_change below.
4458
4459 We used to suppress canonicalization of DEST if it appears in SRC,
4460 but we don't do this any more. */
4461
4462 for (i = 0; i < n_sets; i++)
4463 {
4464 rtx dest = SET_DEST (sets[i].rtl);
4465 rtx src = SET_SRC (sets[i].rtl);
4466 rtx new_rtx = canon_reg (src, insn);
4467
4468 validate_change (insn, &SET_SRC (sets[i].rtl), new_rtx, 1);
4469
4470 if (GET_CODE (dest) == ZERO_EXTRACT)
4471 {
4472 validate_change (insn, &XEXP (dest, 1),
4473 canon_reg (XEXP (dest, 1), insn), 1);
4474 validate_change (insn, &XEXP (dest, 2),
4475 canon_reg (XEXP (dest, 2), insn), 1);
4476 }
4477
4478 while (GET_CODE (dest) == SUBREG
4479 || GET_CODE (dest) == ZERO_EXTRACT
4480 || GET_CODE (dest) == STRICT_LOW_PART)
4481 dest = XEXP (dest, 0);
4482
4483 if (MEM_P (dest))
4484 canon_reg (dest, insn);
4485 }
4486
4487 /* Now that we have done all the replacements, we can apply the change
4488 group and see if they all work. Note that this will cause some
4489 canonicalizations that would have worked individually not to be applied
4490 because some other canonicalization didn't work, but this should not
4491 occur often.
4492
4493 The result of apply_change_group can be ignored; see canon_reg. */
4494
4495 apply_change_group ();
4496 }
4497 \f
4498 /* Main function of CSE.
4499 First simplify sources and addresses of all assignments
4500 in the instruction, using previously-computed equivalents values.
4501 Then install the new sources and destinations in the table
4502 of available values. */
4503
4504 static void
4505 cse_insn (rtx_insn *insn)
4506 {
4507 rtx x = PATTERN (insn);
4508 int i;
4509 rtx tem;
4510 int n_sets = 0;
4511
4512 rtx src_eqv = 0;
4513 struct table_elt *src_eqv_elt = 0;
4514 int src_eqv_volatile = 0;
4515 int src_eqv_in_memory = 0;
4516 unsigned src_eqv_hash = 0;
4517
4518 struct set *sets = (struct set *) 0;
4519
4520 if (GET_CODE (x) == SET)
4521 sets = XALLOCA (struct set);
4522 else if (GET_CODE (x) == PARALLEL)
4523 sets = XALLOCAVEC (struct set, XVECLEN (x, 0));
4524
4525 this_insn = insn;
4526 /* Records what this insn does to set CC0. */
4527 this_insn_cc0 = 0;
4528 this_insn_cc0_mode = VOIDmode;
4529
4530 /* Find all regs explicitly clobbered in this insn,
4531 to ensure they are not replaced with any other regs
4532 elsewhere in this insn. */
4533 invalidate_from_sets_and_clobbers (insn);
4534
4535 /* Record all the SETs in this instruction. */
4536 n_sets = find_sets_in_insn (insn, &sets);
4537
4538 /* Substitute the canonical register where possible. */
4539 canonicalize_insn (insn, &sets, n_sets);
4540
4541 /* If this insn has a REG_EQUAL note, store the equivalent value in SRC_EQV,
4542 if different, or if the DEST is a STRICT_LOW_PART. The latter condition
4543 is necessary because SRC_EQV is handled specially for this case, and if
4544 it isn't set, then there will be no equivalence for the destination. */
4545 if (n_sets == 1 && REG_NOTES (insn) != 0
4546 && (tem = find_reg_note (insn, REG_EQUAL, NULL_RTX)) != 0
4547 && (! rtx_equal_p (XEXP (tem, 0), SET_SRC (sets[0].rtl))
4548 || GET_CODE (SET_DEST (sets[0].rtl)) == STRICT_LOW_PART))
4549 src_eqv = copy_rtx (XEXP (tem, 0));
4550
4551 /* Set sets[i].src_elt to the class each source belongs to.
4552 Detect assignments from or to volatile things
4553 and set set[i] to zero so they will be ignored
4554 in the rest of this function.
4555
4556 Nothing in this loop changes the hash table or the register chains. */
4557
4558 for (i = 0; i < n_sets; i++)
4559 {
4560 bool repeat = false;
4561 rtx src, dest;
4562 rtx src_folded;
4563 struct table_elt *elt = 0, *p;
4564 machine_mode mode;
4565 rtx src_eqv_here;
4566 rtx src_const = 0;
4567 rtx src_related = 0;
4568 bool src_related_is_const_anchor = false;
4569 struct table_elt *src_const_elt = 0;
4570 int src_cost = MAX_COST;
4571 int src_eqv_cost = MAX_COST;
4572 int src_folded_cost = MAX_COST;
4573 int src_related_cost = MAX_COST;
4574 int src_elt_cost = MAX_COST;
4575 int src_regcost = MAX_COST;
4576 int src_eqv_regcost = MAX_COST;
4577 int src_folded_regcost = MAX_COST;
4578 int src_related_regcost = MAX_COST;
4579 int src_elt_regcost = MAX_COST;
4580 /* Set nonzero if we need to call force_const_mem on with the
4581 contents of src_folded before using it. */
4582 int src_folded_force_flag = 0;
4583
4584 dest = SET_DEST (sets[i].rtl);
4585 src = SET_SRC (sets[i].rtl);
4586
4587 /* If SRC is a constant that has no machine mode,
4588 hash it with the destination's machine mode.
4589 This way we can keep different modes separate. */
4590
4591 mode = GET_MODE (src) == VOIDmode ? GET_MODE (dest) : GET_MODE (src);
4592 sets[i].mode = mode;
4593
4594 if (src_eqv)
4595 {
4596 machine_mode eqvmode = mode;
4597 if (GET_CODE (dest) == STRICT_LOW_PART)
4598 eqvmode = GET_MODE (SUBREG_REG (XEXP (dest, 0)));
4599 do_not_record = 0;
4600 hash_arg_in_memory = 0;
4601 src_eqv_hash = HASH (src_eqv, eqvmode);
4602
4603 /* Find the equivalence class for the equivalent expression. */
4604
4605 if (!do_not_record)
4606 src_eqv_elt = lookup (src_eqv, src_eqv_hash, eqvmode);
4607
4608 src_eqv_volatile = do_not_record;
4609 src_eqv_in_memory = hash_arg_in_memory;
4610 }
4611
4612 /* If this is a STRICT_LOW_PART assignment, src_eqv corresponds to the
4613 value of the INNER register, not the destination. So it is not
4614 a valid substitution for the source. But save it for later. */
4615 if (GET_CODE (dest) == STRICT_LOW_PART)
4616 src_eqv_here = 0;
4617 else
4618 src_eqv_here = src_eqv;
4619
4620 /* Simplify and foldable subexpressions in SRC. Then get the fully-
4621 simplified result, which may not necessarily be valid. */
4622 src_folded = fold_rtx (src, insn);
4623
4624 #if 0
4625 /* ??? This caused bad code to be generated for the m68k port with -O2.
4626 Suppose src is (CONST_INT -1), and that after truncation src_folded
4627 is (CONST_INT 3). Suppose src_folded is then used for src_const.
4628 At the end we will add src and src_const to the same equivalence
4629 class. We now have 3 and -1 on the same equivalence class. This
4630 causes later instructions to be mis-optimized. */
4631 /* If storing a constant in a bitfield, pre-truncate the constant
4632 so we will be able to record it later. */
4633 if (GET_CODE (SET_DEST (sets[i].rtl)) == ZERO_EXTRACT)
4634 {
4635 rtx width = XEXP (SET_DEST (sets[i].rtl), 1);
4636
4637 if (CONST_INT_P (src)
4638 && CONST_INT_P (width)
4639 && INTVAL (width) < HOST_BITS_PER_WIDE_INT
4640 && (INTVAL (src) & ((HOST_WIDE_INT) (-1) << INTVAL (width))))
4641 src_folded
4642 = GEN_INT (INTVAL (src) & (((HOST_WIDE_INT) 1
4643 << INTVAL (width)) - 1));
4644 }
4645 #endif
4646
4647 /* Compute SRC's hash code, and also notice if it
4648 should not be recorded at all. In that case,
4649 prevent any further processing of this assignment. */
4650 do_not_record = 0;
4651 hash_arg_in_memory = 0;
4652
4653 sets[i].src = src;
4654 sets[i].src_hash = HASH (src, mode);
4655 sets[i].src_volatile = do_not_record;
4656 sets[i].src_in_memory = hash_arg_in_memory;
4657
4658 /* If SRC is a MEM, there is a REG_EQUIV note for SRC, and DEST is
4659 a pseudo, do not record SRC. Using SRC as a replacement for
4660 anything else will be incorrect in that situation. Note that
4661 this usually occurs only for stack slots, in which case all the
4662 RTL would be referring to SRC, so we don't lose any optimization
4663 opportunities by not having SRC in the hash table. */
4664
4665 if (MEM_P (src)
4666 && find_reg_note (insn, REG_EQUIV, NULL_RTX) != 0
4667 && REG_P (dest)
4668 && REGNO (dest) >= FIRST_PSEUDO_REGISTER)
4669 sets[i].src_volatile = 1;
4670
4671 else if (GET_CODE (src) == ASM_OPERANDS
4672 && GET_CODE (x) == PARALLEL)
4673 {
4674 /* Do not record result of a non-volatile inline asm with
4675 more than one result. */
4676 if (n_sets > 1)
4677 sets[i].src_volatile = 1;
4678
4679 int j, lim = XVECLEN (x, 0);
4680 for (j = 0; j < lim; j++)
4681 {
4682 rtx y = XVECEXP (x, 0, j);
4683 /* And do not record result of a non-volatile inline asm
4684 with "memory" clobber. */
4685 if (GET_CODE (y) == CLOBBER && MEM_P (XEXP (y, 0)))
4686 {
4687 sets[i].src_volatile = 1;
4688 break;
4689 }
4690 }
4691 }
4692
4693 #if 0
4694 /* It is no longer clear why we used to do this, but it doesn't
4695 appear to still be needed. So let's try without it since this
4696 code hurts cse'ing widened ops. */
4697 /* If source is a paradoxical subreg (such as QI treated as an SI),
4698 treat it as volatile. It may do the work of an SI in one context
4699 where the extra bits are not being used, but cannot replace an SI
4700 in general. */
4701 if (paradoxical_subreg_p (src))
4702 sets[i].src_volatile = 1;
4703 #endif
4704
4705 /* Locate all possible equivalent forms for SRC. Try to replace
4706 SRC in the insn with each cheaper equivalent.
4707
4708 We have the following types of equivalents: SRC itself, a folded
4709 version, a value given in a REG_EQUAL note, or a value related
4710 to a constant.
4711
4712 Each of these equivalents may be part of an additional class
4713 of equivalents (if more than one is in the table, they must be in
4714 the same class; we check for this).
4715
4716 If the source is volatile, we don't do any table lookups.
4717
4718 We note any constant equivalent for possible later use in a
4719 REG_NOTE. */
4720
4721 if (!sets[i].src_volatile)
4722 elt = lookup (src, sets[i].src_hash, mode);
4723
4724 sets[i].src_elt = elt;
4725
4726 if (elt && src_eqv_here && src_eqv_elt)
4727 {
4728 if (elt->first_same_value != src_eqv_elt->first_same_value)
4729 {
4730 /* The REG_EQUAL is indicating that two formerly distinct
4731 classes are now equivalent. So merge them. */
4732 merge_equiv_classes (elt, src_eqv_elt);
4733 src_eqv_hash = HASH (src_eqv, elt->mode);
4734 src_eqv_elt = lookup (src_eqv, src_eqv_hash, elt->mode);
4735 }
4736
4737 src_eqv_here = 0;
4738 }
4739
4740 else if (src_eqv_elt)
4741 elt = src_eqv_elt;
4742
4743 /* Try to find a constant somewhere and record it in `src_const'.
4744 Record its table element, if any, in `src_const_elt'. Look in
4745 any known equivalences first. (If the constant is not in the
4746 table, also set `sets[i].src_const_hash'). */
4747 if (elt)
4748 for (p = elt->first_same_value; p; p = p->next_same_value)
4749 if (p->is_const)
4750 {
4751 src_const = p->exp;
4752 src_const_elt = elt;
4753 break;
4754 }
4755
4756 if (src_const == 0
4757 && (CONSTANT_P (src_folded)
4758 /* Consider (minus (label_ref L1) (label_ref L2)) as
4759 "constant" here so we will record it. This allows us
4760 to fold switch statements when an ADDR_DIFF_VEC is used. */
4761 || (GET_CODE (src_folded) == MINUS
4762 && GET_CODE (XEXP (src_folded, 0)) == LABEL_REF
4763 && GET_CODE (XEXP (src_folded, 1)) == LABEL_REF)))
4764 src_const = src_folded, src_const_elt = elt;
4765 else if (src_const == 0 && src_eqv_here && CONSTANT_P (src_eqv_here))
4766 src_const = src_eqv_here, src_const_elt = src_eqv_elt;
4767
4768 /* If we don't know if the constant is in the table, get its
4769 hash code and look it up. */
4770 if (src_const && src_const_elt == 0)
4771 {
4772 sets[i].src_const_hash = HASH (src_const, mode);
4773 src_const_elt = lookup (src_const, sets[i].src_const_hash, mode);
4774 }
4775
4776 sets[i].src_const = src_const;
4777 sets[i].src_const_elt = src_const_elt;
4778
4779 /* If the constant and our source are both in the table, mark them as
4780 equivalent. Otherwise, if a constant is in the table but the source
4781 isn't, set ELT to it. */
4782 if (src_const_elt && elt
4783 && src_const_elt->first_same_value != elt->first_same_value)
4784 merge_equiv_classes (elt, src_const_elt);
4785 else if (src_const_elt && elt == 0)
4786 elt = src_const_elt;
4787
4788 /* See if there is a register linearly related to a constant
4789 equivalent of SRC. */
4790 if (src_const
4791 && (GET_CODE (src_const) == CONST
4792 || (src_const_elt && src_const_elt->related_value != 0)))
4793 {
4794 src_related = use_related_value (src_const, src_const_elt);
4795 if (src_related)
4796 {
4797 struct table_elt *src_related_elt
4798 = lookup (src_related, HASH (src_related, mode), mode);
4799 if (src_related_elt && elt)
4800 {
4801 if (elt->first_same_value
4802 != src_related_elt->first_same_value)
4803 /* This can occur when we previously saw a CONST
4804 involving a SYMBOL_REF and then see the SYMBOL_REF
4805 twice. Merge the involved classes. */
4806 merge_equiv_classes (elt, src_related_elt);
4807
4808 src_related = 0;
4809 src_related_elt = 0;
4810 }
4811 else if (src_related_elt && elt == 0)
4812 elt = src_related_elt;
4813 }
4814 }
4815
4816 /* See if we have a CONST_INT that is already in a register in a
4817 wider mode. */
4818
4819 if (src_const && src_related == 0 && CONST_INT_P (src_const)
4820 && GET_MODE_CLASS (mode) == MODE_INT
4821 && GET_MODE_PRECISION (mode) < BITS_PER_WORD)
4822 {
4823 machine_mode wider_mode;
4824
4825 for (wider_mode = GET_MODE_WIDER_MODE (mode);
4826 wider_mode != VOIDmode
4827 && GET_MODE_PRECISION (wider_mode) <= BITS_PER_WORD
4828 && src_related == 0;
4829 wider_mode = GET_MODE_WIDER_MODE (wider_mode))
4830 {
4831 struct table_elt *const_elt
4832 = lookup (src_const, HASH (src_const, wider_mode), wider_mode);
4833
4834 if (const_elt == 0)
4835 continue;
4836
4837 for (const_elt = const_elt->first_same_value;
4838 const_elt; const_elt = const_elt->next_same_value)
4839 if (REG_P (const_elt->exp))
4840 {
4841 src_related = gen_lowpart (mode, const_elt->exp);
4842 break;
4843 }
4844 }
4845 }
4846
4847 /* Another possibility is that we have an AND with a constant in
4848 a mode narrower than a word. If so, it might have been generated
4849 as part of an "if" which would narrow the AND. If we already
4850 have done the AND in a wider mode, we can use a SUBREG of that
4851 value. */
4852
4853 if (flag_expensive_optimizations && ! src_related
4854 && GET_CODE (src) == AND && CONST_INT_P (XEXP (src, 1))
4855 && GET_MODE_SIZE (mode) < UNITS_PER_WORD)
4856 {
4857 machine_mode tmode;
4858 rtx new_and = gen_rtx_AND (VOIDmode, NULL_RTX, XEXP (src, 1));
4859
4860 for (tmode = GET_MODE_WIDER_MODE (mode);
4861 GET_MODE_SIZE (tmode) <= UNITS_PER_WORD;
4862 tmode = GET_MODE_WIDER_MODE (tmode))
4863 {
4864 rtx inner = gen_lowpart (tmode, XEXP (src, 0));
4865 struct table_elt *larger_elt;
4866
4867 if (inner)
4868 {
4869 PUT_MODE (new_and, tmode);
4870 XEXP (new_and, 0) = inner;
4871 larger_elt = lookup (new_and, HASH (new_and, tmode), tmode);
4872 if (larger_elt == 0)
4873 continue;
4874
4875 for (larger_elt = larger_elt->first_same_value;
4876 larger_elt; larger_elt = larger_elt->next_same_value)
4877 if (REG_P (larger_elt->exp))
4878 {
4879 src_related
4880 = gen_lowpart (mode, larger_elt->exp);
4881 break;
4882 }
4883
4884 if (src_related)
4885 break;
4886 }
4887 }
4888 }
4889
4890 #ifdef LOAD_EXTEND_OP
4891 /* See if a MEM has already been loaded with a widening operation;
4892 if it has, we can use a subreg of that. Many CISC machines
4893 also have such operations, but this is only likely to be
4894 beneficial on these machines. */
4895
4896 if (flag_expensive_optimizations && src_related == 0
4897 && (GET_MODE_SIZE (mode) < UNITS_PER_WORD)
4898 && GET_MODE_CLASS (mode) == MODE_INT
4899 && MEM_P (src) && ! do_not_record
4900 && LOAD_EXTEND_OP (mode) != UNKNOWN)
4901 {
4902 struct rtx_def memory_extend_buf;
4903 rtx memory_extend_rtx = &memory_extend_buf;
4904 machine_mode tmode;
4905
4906 /* Set what we are trying to extend and the operation it might
4907 have been extended with. */
4908 memset (memory_extend_rtx, 0, sizeof (*memory_extend_rtx));
4909 PUT_CODE (memory_extend_rtx, LOAD_EXTEND_OP (mode));
4910 XEXP (memory_extend_rtx, 0) = src;
4911
4912 for (tmode = GET_MODE_WIDER_MODE (mode);
4913 GET_MODE_SIZE (tmode) <= UNITS_PER_WORD;
4914 tmode = GET_MODE_WIDER_MODE (tmode))
4915 {
4916 struct table_elt *larger_elt;
4917
4918 PUT_MODE (memory_extend_rtx, tmode);
4919 larger_elt = lookup (memory_extend_rtx,
4920 HASH (memory_extend_rtx, tmode), tmode);
4921 if (larger_elt == 0)
4922 continue;
4923
4924 for (larger_elt = larger_elt->first_same_value;
4925 larger_elt; larger_elt = larger_elt->next_same_value)
4926 if (REG_P (larger_elt->exp))
4927 {
4928 src_related = gen_lowpart (mode, larger_elt->exp);
4929 break;
4930 }
4931
4932 if (src_related)
4933 break;
4934 }
4935 }
4936 #endif /* LOAD_EXTEND_OP */
4937
4938 /* Try to express the constant using a register+offset expression
4939 derived from a constant anchor. */
4940
4941 if (targetm.const_anchor
4942 && !src_related
4943 && src_const
4944 && GET_CODE (src_const) == CONST_INT)
4945 {
4946 src_related = try_const_anchors (src_const, mode);
4947 src_related_is_const_anchor = src_related != NULL_RTX;
4948 }
4949
4950
4951 if (src == src_folded)
4952 src_folded = 0;
4953
4954 /* At this point, ELT, if nonzero, points to a class of expressions
4955 equivalent to the source of this SET and SRC, SRC_EQV, SRC_FOLDED,
4956 and SRC_RELATED, if nonzero, each contain additional equivalent
4957 expressions. Prune these latter expressions by deleting expressions
4958 already in the equivalence class.
4959
4960 Check for an equivalent identical to the destination. If found,
4961 this is the preferred equivalent since it will likely lead to
4962 elimination of the insn. Indicate this by placing it in
4963 `src_related'. */
4964
4965 if (elt)
4966 elt = elt->first_same_value;
4967 for (p = elt; p; p = p->next_same_value)
4968 {
4969 enum rtx_code code = GET_CODE (p->exp);
4970
4971 /* If the expression is not valid, ignore it. Then we do not
4972 have to check for validity below. In most cases, we can use
4973 `rtx_equal_p', since canonicalization has already been done. */
4974 if (code != REG && ! exp_equiv_p (p->exp, p->exp, 1, false))
4975 continue;
4976
4977 /* Also skip paradoxical subregs, unless that's what we're
4978 looking for. */
4979 if (paradoxical_subreg_p (p->exp)
4980 && ! (src != 0
4981 && GET_CODE (src) == SUBREG
4982 && GET_MODE (src) == GET_MODE (p->exp)
4983 && (GET_MODE_SIZE (GET_MODE (SUBREG_REG (src)))
4984 < GET_MODE_SIZE (GET_MODE (SUBREG_REG (p->exp))))))
4985 continue;
4986
4987 if (src && GET_CODE (src) == code && rtx_equal_p (src, p->exp))
4988 src = 0;
4989 else if (src_folded && GET_CODE (src_folded) == code
4990 && rtx_equal_p (src_folded, p->exp))
4991 src_folded = 0;
4992 else if (src_eqv_here && GET_CODE (src_eqv_here) == code
4993 && rtx_equal_p (src_eqv_here, p->exp))
4994 src_eqv_here = 0;
4995 else if (src_related && GET_CODE (src_related) == code
4996 && rtx_equal_p (src_related, p->exp))
4997 src_related = 0;
4998
4999 /* This is the same as the destination of the insns, we want
5000 to prefer it. Copy it to src_related. The code below will
5001 then give it a negative cost. */
5002 if (GET_CODE (dest) == code && rtx_equal_p (p->exp, dest))
5003 src_related = dest;
5004 }
5005
5006 /* Find the cheapest valid equivalent, trying all the available
5007 possibilities. Prefer items not in the hash table to ones
5008 that are when they are equal cost. Note that we can never
5009 worsen an insn as the current contents will also succeed.
5010 If we find an equivalent identical to the destination, use it as best,
5011 since this insn will probably be eliminated in that case. */
5012 if (src)
5013 {
5014 if (rtx_equal_p (src, dest))
5015 src_cost = src_regcost = -1;
5016 else
5017 {
5018 src_cost = COST (src);
5019 src_regcost = approx_reg_cost (src);
5020 }
5021 }
5022
5023 if (src_eqv_here)
5024 {
5025 if (rtx_equal_p (src_eqv_here, dest))
5026 src_eqv_cost = src_eqv_regcost = -1;
5027 else
5028 {
5029 src_eqv_cost = COST (src_eqv_here);
5030 src_eqv_regcost = approx_reg_cost (src_eqv_here);
5031 }
5032 }
5033
5034 if (src_folded)
5035 {
5036 if (rtx_equal_p (src_folded, dest))
5037 src_folded_cost = src_folded_regcost = -1;
5038 else
5039 {
5040 src_folded_cost = COST (src_folded);
5041 src_folded_regcost = approx_reg_cost (src_folded);
5042 }
5043 }
5044
5045 if (src_related)
5046 {
5047 if (rtx_equal_p (src_related, dest))
5048 src_related_cost = src_related_regcost = -1;
5049 else
5050 {
5051 src_related_cost = COST (src_related);
5052 src_related_regcost = approx_reg_cost (src_related);
5053
5054 /* If a const-anchor is used to synthesize a constant that
5055 normally requires multiple instructions then slightly prefer
5056 it over the original sequence. These instructions are likely
5057 to become redundant now. We can't compare against the cost
5058 of src_eqv_here because, on MIPS for example, multi-insn
5059 constants have zero cost; they are assumed to be hoisted from
5060 loops. */
5061 if (src_related_is_const_anchor
5062 && src_related_cost == src_cost
5063 && src_eqv_here)
5064 src_related_cost--;
5065 }
5066 }
5067
5068 /* If this was an indirect jump insn, a known label will really be
5069 cheaper even though it looks more expensive. */
5070 if (dest == pc_rtx && src_const && GET_CODE (src_const) == LABEL_REF)
5071 src_folded = src_const, src_folded_cost = src_folded_regcost = -1;
5072
5073 /* Terminate loop when replacement made. This must terminate since
5074 the current contents will be tested and will always be valid. */
5075 while (1)
5076 {
5077 rtx trial;
5078
5079 /* Skip invalid entries. */
5080 while (elt && !REG_P (elt->exp)
5081 && ! exp_equiv_p (elt->exp, elt->exp, 1, false))
5082 elt = elt->next_same_value;
5083
5084 /* A paradoxical subreg would be bad here: it'll be the right
5085 size, but later may be adjusted so that the upper bits aren't
5086 what we want. So reject it. */
5087 if (elt != 0
5088 && paradoxical_subreg_p (elt->exp)
5089 /* It is okay, though, if the rtx we're trying to match
5090 will ignore any of the bits we can't predict. */
5091 && ! (src != 0
5092 && GET_CODE (src) == SUBREG
5093 && GET_MODE (src) == GET_MODE (elt->exp)
5094 && (GET_MODE_SIZE (GET_MODE (SUBREG_REG (src)))
5095 < GET_MODE_SIZE (GET_MODE (SUBREG_REG (elt->exp))))))
5096 {
5097 elt = elt->next_same_value;
5098 continue;
5099 }
5100
5101 if (elt)
5102 {
5103 src_elt_cost = elt->cost;
5104 src_elt_regcost = elt->regcost;
5105 }
5106
5107 /* Find cheapest and skip it for the next time. For items
5108 of equal cost, use this order:
5109 src_folded, src, src_eqv, src_related and hash table entry. */
5110 if (src_folded
5111 && preferable (src_folded_cost, src_folded_regcost,
5112 src_cost, src_regcost) <= 0
5113 && preferable (src_folded_cost, src_folded_regcost,
5114 src_eqv_cost, src_eqv_regcost) <= 0
5115 && preferable (src_folded_cost, src_folded_regcost,
5116 src_related_cost, src_related_regcost) <= 0
5117 && preferable (src_folded_cost, src_folded_regcost,
5118 src_elt_cost, src_elt_regcost) <= 0)
5119 {
5120 trial = src_folded, src_folded_cost = MAX_COST;
5121 if (src_folded_force_flag)
5122 {
5123 rtx forced = force_const_mem (mode, trial);
5124 if (forced)
5125 trial = forced;
5126 }
5127 }
5128 else if (src
5129 && preferable (src_cost, src_regcost,
5130 src_eqv_cost, src_eqv_regcost) <= 0
5131 && preferable (src_cost, src_regcost,
5132 src_related_cost, src_related_regcost) <= 0
5133 && preferable (src_cost, src_regcost,
5134 src_elt_cost, src_elt_regcost) <= 0)
5135 trial = src, src_cost = MAX_COST;
5136 else if (src_eqv_here
5137 && preferable (src_eqv_cost, src_eqv_regcost,
5138 src_related_cost, src_related_regcost) <= 0
5139 && preferable (src_eqv_cost, src_eqv_regcost,
5140 src_elt_cost, src_elt_regcost) <= 0)
5141 trial = src_eqv_here, src_eqv_cost = MAX_COST;
5142 else if (src_related
5143 && preferable (src_related_cost, src_related_regcost,
5144 src_elt_cost, src_elt_regcost) <= 0)
5145 trial = src_related, src_related_cost = MAX_COST;
5146 else
5147 {
5148 trial = elt->exp;
5149 elt = elt->next_same_value;
5150 src_elt_cost = MAX_COST;
5151 }
5152
5153 /* Avoid creation of overlapping memory moves. */
5154 if (MEM_P (trial) && MEM_P (SET_DEST (sets[i].rtl)))
5155 {
5156 rtx src, dest;
5157
5158 /* BLKmode moves are not handled by cse anyway. */
5159 if (GET_MODE (trial) == BLKmode)
5160 break;
5161
5162 src = canon_rtx (trial);
5163 dest = canon_rtx (SET_DEST (sets[i].rtl));
5164
5165 if (!MEM_P (src) || !MEM_P (dest)
5166 || !nonoverlapping_memrefs_p (src, dest, false))
5167 break;
5168 }
5169
5170 /* Try to optimize
5171 (set (reg:M N) (const_int A))
5172 (set (reg:M2 O) (const_int B))
5173 (set (zero_extract:M2 (reg:M N) (const_int C) (const_int D))
5174 (reg:M2 O)). */
5175 if (GET_CODE (SET_DEST (sets[i].rtl)) == ZERO_EXTRACT
5176 && CONST_INT_P (trial)
5177 && CONST_INT_P (XEXP (SET_DEST (sets[i].rtl), 1))
5178 && CONST_INT_P (XEXP (SET_DEST (sets[i].rtl), 2))
5179 && REG_P (XEXP (SET_DEST (sets[i].rtl), 0))
5180 && (GET_MODE_PRECISION (GET_MODE (SET_DEST (sets[i].rtl)))
5181 >= INTVAL (XEXP (SET_DEST (sets[i].rtl), 1)))
5182 && ((unsigned) INTVAL (XEXP (SET_DEST (sets[i].rtl), 1))
5183 + (unsigned) INTVAL (XEXP (SET_DEST (sets[i].rtl), 2))
5184 <= HOST_BITS_PER_WIDE_INT))
5185 {
5186 rtx dest_reg = XEXP (SET_DEST (sets[i].rtl), 0);
5187 rtx width = XEXP (SET_DEST (sets[i].rtl), 1);
5188 rtx pos = XEXP (SET_DEST (sets[i].rtl), 2);
5189 unsigned int dest_hash = HASH (dest_reg, GET_MODE (dest_reg));
5190 struct table_elt *dest_elt
5191 = lookup (dest_reg, dest_hash, GET_MODE (dest_reg));
5192 rtx dest_cst = NULL;
5193
5194 if (dest_elt)
5195 for (p = dest_elt->first_same_value; p; p = p->next_same_value)
5196 if (p->is_const && CONST_INT_P (p->exp))
5197 {
5198 dest_cst = p->exp;
5199 break;
5200 }
5201 if (dest_cst)
5202 {
5203 HOST_WIDE_INT val = INTVAL (dest_cst);
5204 HOST_WIDE_INT mask;
5205 unsigned int shift;
5206 if (BITS_BIG_ENDIAN)
5207 shift = GET_MODE_PRECISION (GET_MODE (dest_reg))
5208 - INTVAL (pos) - INTVAL (width);
5209 else
5210 shift = INTVAL (pos);
5211 if (INTVAL (width) == HOST_BITS_PER_WIDE_INT)
5212 mask = ~(HOST_WIDE_INT) 0;
5213 else
5214 mask = ((HOST_WIDE_INT) 1 << INTVAL (width)) - 1;
5215 val &= ~(mask << shift);
5216 val |= (INTVAL (trial) & mask) << shift;
5217 val = trunc_int_for_mode (val, GET_MODE (dest_reg));
5218 validate_unshare_change (insn, &SET_DEST (sets[i].rtl),
5219 dest_reg, 1);
5220 validate_unshare_change (insn, &SET_SRC (sets[i].rtl),
5221 GEN_INT (val), 1);
5222 if (apply_change_group ())
5223 {
5224 rtx note = find_reg_note (insn, REG_EQUAL, NULL_RTX);
5225 if (note)
5226 {
5227 remove_note (insn, note);
5228 df_notes_rescan (insn);
5229 }
5230 src_eqv = NULL_RTX;
5231 src_eqv_elt = NULL;
5232 src_eqv_volatile = 0;
5233 src_eqv_in_memory = 0;
5234 src_eqv_hash = 0;
5235 repeat = true;
5236 break;
5237 }
5238 }
5239 }
5240
5241 /* We don't normally have an insn matching (set (pc) (pc)), so
5242 check for this separately here. We will delete such an
5243 insn below.
5244
5245 For other cases such as a table jump or conditional jump
5246 where we know the ultimate target, go ahead and replace the
5247 operand. While that may not make a valid insn, we will
5248 reemit the jump below (and also insert any necessary
5249 barriers). */
5250 if (n_sets == 1 && dest == pc_rtx
5251 && (trial == pc_rtx
5252 || (GET_CODE (trial) == LABEL_REF
5253 && ! condjump_p (insn))))
5254 {
5255 /* Don't substitute non-local labels, this confuses CFG. */
5256 if (GET_CODE (trial) == LABEL_REF
5257 && LABEL_REF_NONLOCAL_P (trial))
5258 continue;
5259
5260 SET_SRC (sets[i].rtl) = trial;
5261 cse_jumps_altered = true;
5262 break;
5263 }
5264
5265 /* Reject certain invalid forms of CONST that we create. */
5266 else if (CONSTANT_P (trial)
5267 && GET_CODE (trial) == CONST
5268 /* Reject cases that will cause decode_rtx_const to
5269 die. On the alpha when simplifying a switch, we
5270 get (const (truncate (minus (label_ref)
5271 (label_ref)))). */
5272 && (GET_CODE (XEXP (trial, 0)) == TRUNCATE
5273 /* Likewise on IA-64, except without the
5274 truncate. */
5275 || (GET_CODE (XEXP (trial, 0)) == MINUS
5276 && GET_CODE (XEXP (XEXP (trial, 0), 0)) == LABEL_REF
5277 && GET_CODE (XEXP (XEXP (trial, 0), 1)) == LABEL_REF)))
5278 /* Do nothing for this case. */
5279 ;
5280
5281 /* Look for a substitution that makes a valid insn. */
5282 else if (validate_unshare_change (insn, &SET_SRC (sets[i].rtl),
5283 trial, 0))
5284 {
5285 rtx new_rtx = canon_reg (SET_SRC (sets[i].rtl), insn);
5286
5287 /* The result of apply_change_group can be ignored; see
5288 canon_reg. */
5289
5290 validate_change (insn, &SET_SRC (sets[i].rtl), new_rtx, 1);
5291 apply_change_group ();
5292
5293 break;
5294 }
5295
5296 /* If we previously found constant pool entries for
5297 constants and this is a constant, try making a
5298 pool entry. Put it in src_folded unless we already have done
5299 this since that is where it likely came from. */
5300
5301 else if (constant_pool_entries_cost
5302 && CONSTANT_P (trial)
5303 && (src_folded == 0
5304 || (!MEM_P (src_folded)
5305 && ! src_folded_force_flag))
5306 && GET_MODE_CLASS (mode) != MODE_CC
5307 && mode != VOIDmode)
5308 {
5309 src_folded_force_flag = 1;
5310 src_folded = trial;
5311 src_folded_cost = constant_pool_entries_cost;
5312 src_folded_regcost = constant_pool_entries_regcost;
5313 }
5314 }
5315
5316 /* If we changed the insn too much, handle this set from scratch. */
5317 if (repeat)
5318 {
5319 i--;
5320 continue;
5321 }
5322
5323 src = SET_SRC (sets[i].rtl);
5324
5325 /* In general, it is good to have a SET with SET_SRC == SET_DEST.
5326 However, there is an important exception: If both are registers
5327 that are not the head of their equivalence class, replace SET_SRC
5328 with the head of the class. If we do not do this, we will have
5329 both registers live over a portion of the basic block. This way,
5330 their lifetimes will likely abut instead of overlapping. */
5331 if (REG_P (dest)
5332 && REGNO_QTY_VALID_P (REGNO (dest)))
5333 {
5334 int dest_q = REG_QTY (REGNO (dest));
5335 struct qty_table_elem *dest_ent = &qty_table[dest_q];
5336
5337 if (dest_ent->mode == GET_MODE (dest)
5338 && dest_ent->first_reg != REGNO (dest)
5339 && REG_P (src) && REGNO (src) == REGNO (dest)
5340 /* Don't do this if the original insn had a hard reg as
5341 SET_SRC or SET_DEST. */
5342 && (!REG_P (sets[i].src)
5343 || REGNO (sets[i].src) >= FIRST_PSEUDO_REGISTER)
5344 && (!REG_P (dest) || REGNO (dest) >= FIRST_PSEUDO_REGISTER))
5345 /* We can't call canon_reg here because it won't do anything if
5346 SRC is a hard register. */
5347 {
5348 int src_q = REG_QTY (REGNO (src));
5349 struct qty_table_elem *src_ent = &qty_table[src_q];
5350 int first = src_ent->first_reg;
5351 rtx new_src
5352 = (first >= FIRST_PSEUDO_REGISTER
5353 ? regno_reg_rtx[first] : gen_rtx_REG (GET_MODE (src), first));
5354
5355 /* We must use validate-change even for this, because this
5356 might be a special no-op instruction, suitable only to
5357 tag notes onto. */
5358 if (validate_change (insn, &SET_SRC (sets[i].rtl), new_src, 0))
5359 {
5360 src = new_src;
5361 /* If we had a constant that is cheaper than what we are now
5362 setting SRC to, use that constant. We ignored it when we
5363 thought we could make this into a no-op. */
5364 if (src_const && COST (src_const) < COST (src)
5365 && validate_change (insn, &SET_SRC (sets[i].rtl),
5366 src_const, 0))
5367 src = src_const;
5368 }
5369 }
5370 }
5371
5372 /* If we made a change, recompute SRC values. */
5373 if (src != sets[i].src)
5374 {
5375 do_not_record = 0;
5376 hash_arg_in_memory = 0;
5377 sets[i].src = src;
5378 sets[i].src_hash = HASH (src, mode);
5379 sets[i].src_volatile = do_not_record;
5380 sets[i].src_in_memory = hash_arg_in_memory;
5381 sets[i].src_elt = lookup (src, sets[i].src_hash, mode);
5382 }
5383
5384 /* If this is a single SET, we are setting a register, and we have an
5385 equivalent constant, we want to add a REG_EQUAL note if the constant
5386 is different from the source. We don't want to do it for a constant
5387 pseudo since verifying that this pseudo hasn't been eliminated is a
5388 pain; moreover such a note won't help anything.
5389
5390 Avoid a REG_EQUAL note for (CONST (MINUS (LABEL_REF) (LABEL_REF)))
5391 which can be created for a reference to a compile time computable
5392 entry in a jump table. */
5393 if (n_sets == 1
5394 && REG_P (dest)
5395 && src_const
5396 && !REG_P (src_const)
5397 && !(GET_CODE (src_const) == SUBREG
5398 && REG_P (SUBREG_REG (src_const)))
5399 && !(GET_CODE (src_const) == CONST
5400 && GET_CODE (XEXP (src_const, 0)) == MINUS
5401 && GET_CODE (XEXP (XEXP (src_const, 0), 0)) == LABEL_REF
5402 && GET_CODE (XEXP (XEXP (src_const, 0), 1)) == LABEL_REF)
5403 && !rtx_equal_p (src, src_const))
5404 {
5405 /* Make sure that the rtx is not shared. */
5406 src_const = copy_rtx (src_const);
5407
5408 /* Record the actual constant value in a REG_EQUAL note,
5409 making a new one if one does not already exist. */
5410 set_unique_reg_note (insn, REG_EQUAL, src_const);
5411 df_notes_rescan (insn);
5412 }
5413
5414 /* Now deal with the destination. */
5415 do_not_record = 0;
5416
5417 /* Look within any ZERO_EXTRACT to the MEM or REG within it. */
5418 while (GET_CODE (dest) == SUBREG
5419 || GET_CODE (dest) == ZERO_EXTRACT
5420 || GET_CODE (dest) == STRICT_LOW_PART)
5421 dest = XEXP (dest, 0);
5422
5423 sets[i].inner_dest = dest;
5424
5425 if (MEM_P (dest))
5426 {
5427 #ifdef PUSH_ROUNDING
5428 /* Stack pushes invalidate the stack pointer. */
5429 rtx addr = XEXP (dest, 0);
5430 if (GET_RTX_CLASS (GET_CODE (addr)) == RTX_AUTOINC
5431 && XEXP (addr, 0) == stack_pointer_rtx)
5432 invalidate (stack_pointer_rtx, VOIDmode);
5433 #endif
5434 dest = fold_rtx (dest, insn);
5435 }
5436
5437 /* Compute the hash code of the destination now,
5438 before the effects of this instruction are recorded,
5439 since the register values used in the address computation
5440 are those before this instruction. */
5441 sets[i].dest_hash = HASH (dest, mode);
5442
5443 /* Don't enter a bit-field in the hash table
5444 because the value in it after the store
5445 may not equal what was stored, due to truncation. */
5446
5447 if (GET_CODE (SET_DEST (sets[i].rtl)) == ZERO_EXTRACT)
5448 {
5449 rtx width = XEXP (SET_DEST (sets[i].rtl), 1);
5450
5451 if (src_const != 0 && CONST_INT_P (src_const)
5452 && CONST_INT_P (width)
5453 && INTVAL (width) < HOST_BITS_PER_WIDE_INT
5454 && ! (INTVAL (src_const)
5455 & (HOST_WIDE_INT_M1U << INTVAL (width))))
5456 /* Exception: if the value is constant,
5457 and it won't be truncated, record it. */
5458 ;
5459 else
5460 {
5461 /* This is chosen so that the destination will be invalidated
5462 but no new value will be recorded.
5463 We must invalidate because sometimes constant
5464 values can be recorded for bitfields. */
5465 sets[i].src_elt = 0;
5466 sets[i].src_volatile = 1;
5467 src_eqv = 0;
5468 src_eqv_elt = 0;
5469 }
5470 }
5471
5472 /* If only one set in a JUMP_INSN and it is now a no-op, we can delete
5473 the insn. */
5474 else if (n_sets == 1 && dest == pc_rtx && src == pc_rtx)
5475 {
5476 /* One less use of the label this insn used to jump to. */
5477 delete_insn_and_edges (insn);
5478 cse_jumps_altered = true;
5479 /* No more processing for this set. */
5480 sets[i].rtl = 0;
5481 }
5482
5483 /* If this SET is now setting PC to a label, we know it used to
5484 be a conditional or computed branch. */
5485 else if (dest == pc_rtx && GET_CODE (src) == LABEL_REF
5486 && !LABEL_REF_NONLOCAL_P (src))
5487 {
5488 /* We reemit the jump in as many cases as possible just in
5489 case the form of an unconditional jump is significantly
5490 different than a computed jump or conditional jump.
5491
5492 If this insn has multiple sets, then reemitting the
5493 jump is nontrivial. So instead we just force rerecognition
5494 and hope for the best. */
5495 if (n_sets == 1)
5496 {
5497 rtx_insn *new_rtx;
5498 rtx note;
5499
5500 new_rtx = emit_jump_insn_before (gen_jump (XEXP (src, 0)), insn);
5501 JUMP_LABEL (new_rtx) = XEXP (src, 0);
5502 LABEL_NUSES (XEXP (src, 0))++;
5503
5504 /* Make sure to copy over REG_NON_LOCAL_GOTO. */
5505 note = find_reg_note (insn, REG_NON_LOCAL_GOTO, 0);
5506 if (note)
5507 {
5508 XEXP (note, 1) = NULL_RTX;
5509 REG_NOTES (new_rtx) = note;
5510 }
5511
5512 delete_insn_and_edges (insn);
5513 insn = new_rtx;
5514 }
5515 else
5516 INSN_CODE (insn) = -1;
5517
5518 /* Do not bother deleting any unreachable code, let jump do it. */
5519 cse_jumps_altered = true;
5520 sets[i].rtl = 0;
5521 }
5522
5523 /* If destination is volatile, invalidate it and then do no further
5524 processing for this assignment. */
5525
5526 else if (do_not_record)
5527 {
5528 invalidate_dest (dest);
5529 sets[i].rtl = 0;
5530 }
5531
5532 if (sets[i].rtl != 0 && dest != SET_DEST (sets[i].rtl))
5533 {
5534 do_not_record = 0;
5535 sets[i].dest_hash = HASH (SET_DEST (sets[i].rtl), mode);
5536 if (do_not_record)
5537 {
5538 invalidate_dest (SET_DEST (sets[i].rtl));
5539 sets[i].rtl = 0;
5540 }
5541 }
5542
5543 /* If setting CC0, record what it was set to, or a constant, if it
5544 is equivalent to a constant. If it is being set to a floating-point
5545 value, make a COMPARE with the appropriate constant of 0. If we
5546 don't do this, later code can interpret this as a test against
5547 const0_rtx, which can cause problems if we try to put it into an
5548 insn as a floating-point operand. */
5549 if (dest == cc0_rtx)
5550 {
5551 this_insn_cc0 = src_const && mode != VOIDmode ? src_const : src;
5552 this_insn_cc0_mode = mode;
5553 if (FLOAT_MODE_P (mode))
5554 this_insn_cc0 = gen_rtx_COMPARE (VOIDmode, this_insn_cc0,
5555 CONST0_RTX (mode));
5556 }
5557 }
5558
5559 /* Now enter all non-volatile source expressions in the hash table
5560 if they are not already present.
5561 Record their equivalence classes in src_elt.
5562 This way we can insert the corresponding destinations into
5563 the same classes even if the actual sources are no longer in them
5564 (having been invalidated). */
5565
5566 if (src_eqv && src_eqv_elt == 0 && sets[0].rtl != 0 && ! src_eqv_volatile
5567 && ! rtx_equal_p (src_eqv, SET_DEST (sets[0].rtl)))
5568 {
5569 struct table_elt *elt;
5570 struct table_elt *classp = sets[0].src_elt;
5571 rtx dest = SET_DEST (sets[0].rtl);
5572 machine_mode eqvmode = GET_MODE (dest);
5573
5574 if (GET_CODE (dest) == STRICT_LOW_PART)
5575 {
5576 eqvmode = GET_MODE (SUBREG_REG (XEXP (dest, 0)));
5577 classp = 0;
5578 }
5579 if (insert_regs (src_eqv, classp, 0))
5580 {
5581 rehash_using_reg (src_eqv);
5582 src_eqv_hash = HASH (src_eqv, eqvmode);
5583 }
5584 elt = insert (src_eqv, classp, src_eqv_hash, eqvmode);
5585 elt->in_memory = src_eqv_in_memory;
5586 src_eqv_elt = elt;
5587
5588 /* Check to see if src_eqv_elt is the same as a set source which
5589 does not yet have an elt, and if so set the elt of the set source
5590 to src_eqv_elt. */
5591 for (i = 0; i < n_sets; i++)
5592 if (sets[i].rtl && sets[i].src_elt == 0
5593 && rtx_equal_p (SET_SRC (sets[i].rtl), src_eqv))
5594 sets[i].src_elt = src_eqv_elt;
5595 }
5596
5597 for (i = 0; i < n_sets; i++)
5598 if (sets[i].rtl && ! sets[i].src_volatile
5599 && ! rtx_equal_p (SET_SRC (sets[i].rtl), SET_DEST (sets[i].rtl)))
5600 {
5601 if (GET_CODE (SET_DEST (sets[i].rtl)) == STRICT_LOW_PART)
5602 {
5603 /* REG_EQUAL in setting a STRICT_LOW_PART
5604 gives an equivalent for the entire destination register,
5605 not just for the subreg being stored in now.
5606 This is a more interesting equivalence, so we arrange later
5607 to treat the entire reg as the destination. */
5608 sets[i].src_elt = src_eqv_elt;
5609 sets[i].src_hash = src_eqv_hash;
5610 }
5611 else
5612 {
5613 /* Insert source and constant equivalent into hash table, if not
5614 already present. */
5615 struct table_elt *classp = src_eqv_elt;
5616 rtx src = sets[i].src;
5617 rtx dest = SET_DEST (sets[i].rtl);
5618 machine_mode mode
5619 = GET_MODE (src) == VOIDmode ? GET_MODE (dest) : GET_MODE (src);
5620
5621 /* It's possible that we have a source value known to be
5622 constant but don't have a REG_EQUAL note on the insn.
5623 Lack of a note will mean src_eqv_elt will be NULL. This
5624 can happen where we've generated a SUBREG to access a
5625 CONST_INT that is already in a register in a wider mode.
5626 Ensure that the source expression is put in the proper
5627 constant class. */
5628 if (!classp)
5629 classp = sets[i].src_const_elt;
5630
5631 if (sets[i].src_elt == 0)
5632 {
5633 struct table_elt *elt;
5634
5635 /* Note that these insert_regs calls cannot remove
5636 any of the src_elt's, because they would have failed to
5637 match if not still valid. */
5638 if (insert_regs (src, classp, 0))
5639 {
5640 rehash_using_reg (src);
5641 sets[i].src_hash = HASH (src, mode);
5642 }
5643 elt = insert (src, classp, sets[i].src_hash, mode);
5644 elt->in_memory = sets[i].src_in_memory;
5645 /* If inline asm has any clobbers, ensure we only reuse
5646 existing inline asms and never try to put the ASM_OPERANDS
5647 into an insn that isn't inline asm. */
5648 if (GET_CODE (src) == ASM_OPERANDS
5649 && GET_CODE (x) == PARALLEL)
5650 elt->cost = MAX_COST;
5651 sets[i].src_elt = classp = elt;
5652 }
5653 if (sets[i].src_const && sets[i].src_const_elt == 0
5654 && src != sets[i].src_const
5655 && ! rtx_equal_p (sets[i].src_const, src))
5656 sets[i].src_elt = insert (sets[i].src_const, classp,
5657 sets[i].src_const_hash, mode);
5658 }
5659 }
5660 else if (sets[i].src_elt == 0)
5661 /* If we did not insert the source into the hash table (e.g., it was
5662 volatile), note the equivalence class for the REG_EQUAL value, if any,
5663 so that the destination goes into that class. */
5664 sets[i].src_elt = src_eqv_elt;
5665
5666 /* Record destination addresses in the hash table. This allows us to
5667 check if they are invalidated by other sets. */
5668 for (i = 0; i < n_sets; i++)
5669 {
5670 if (sets[i].rtl)
5671 {
5672 rtx x = sets[i].inner_dest;
5673 struct table_elt *elt;
5674 machine_mode mode;
5675 unsigned hash;
5676
5677 if (MEM_P (x))
5678 {
5679 x = XEXP (x, 0);
5680 mode = GET_MODE (x);
5681 hash = HASH (x, mode);
5682 elt = lookup (x, hash, mode);
5683 if (!elt)
5684 {
5685 if (insert_regs (x, NULL, 0))
5686 {
5687 rtx dest = SET_DEST (sets[i].rtl);
5688
5689 rehash_using_reg (x);
5690 hash = HASH (x, mode);
5691 sets[i].dest_hash = HASH (dest, GET_MODE (dest));
5692 }
5693 elt = insert (x, NULL, hash, mode);
5694 }
5695
5696 sets[i].dest_addr_elt = elt;
5697 }
5698 else
5699 sets[i].dest_addr_elt = NULL;
5700 }
5701 }
5702
5703 invalidate_from_clobbers (insn);
5704
5705 /* Some registers are invalidated by subroutine calls. Memory is
5706 invalidated by non-constant calls. */
5707
5708 if (CALL_P (insn))
5709 {
5710 if (!(RTL_CONST_OR_PURE_CALL_P (insn)))
5711 invalidate_memory ();
5712 invalidate_for_call ();
5713 }
5714
5715 /* Now invalidate everything set by this instruction.
5716 If a SUBREG or other funny destination is being set,
5717 sets[i].rtl is still nonzero, so here we invalidate the reg
5718 a part of which is being set. */
5719
5720 for (i = 0; i < n_sets; i++)
5721 if (sets[i].rtl)
5722 {
5723 /* We can't use the inner dest, because the mode associated with
5724 a ZERO_EXTRACT is significant. */
5725 rtx dest = SET_DEST (sets[i].rtl);
5726
5727 /* Needed for registers to remove the register from its
5728 previous quantity's chain.
5729 Needed for memory if this is a nonvarying address, unless
5730 we have just done an invalidate_memory that covers even those. */
5731 if (REG_P (dest) || GET_CODE (dest) == SUBREG)
5732 invalidate (dest, VOIDmode);
5733 else if (MEM_P (dest))
5734 invalidate (dest, VOIDmode);
5735 else if (GET_CODE (dest) == STRICT_LOW_PART
5736 || GET_CODE (dest) == ZERO_EXTRACT)
5737 invalidate (XEXP (dest, 0), GET_MODE (dest));
5738 }
5739
5740 /* Don't cse over a call to setjmp; on some machines (eg VAX)
5741 the regs restored by the longjmp come from a later time
5742 than the setjmp. */
5743 if (CALL_P (insn) && find_reg_note (insn, REG_SETJMP, NULL))
5744 {
5745 flush_hash_table ();
5746 goto done;
5747 }
5748
5749 /* Make sure registers mentioned in destinations
5750 are safe for use in an expression to be inserted.
5751 This removes from the hash table
5752 any invalid entry that refers to one of these registers.
5753
5754 We don't care about the return value from mention_regs because
5755 we are going to hash the SET_DEST values unconditionally. */
5756
5757 for (i = 0; i < n_sets; i++)
5758 {
5759 if (sets[i].rtl)
5760 {
5761 rtx x = SET_DEST (sets[i].rtl);
5762
5763 if (!REG_P (x))
5764 mention_regs (x);
5765 else
5766 {
5767 /* We used to rely on all references to a register becoming
5768 inaccessible when a register changes to a new quantity,
5769 since that changes the hash code. However, that is not
5770 safe, since after HASH_SIZE new quantities we get a
5771 hash 'collision' of a register with its own invalid
5772 entries. And since SUBREGs have been changed not to
5773 change their hash code with the hash code of the register,
5774 it wouldn't work any longer at all. So we have to check
5775 for any invalid references lying around now.
5776 This code is similar to the REG case in mention_regs,
5777 but it knows that reg_tick has been incremented, and
5778 it leaves reg_in_table as -1 . */
5779 unsigned int regno = REGNO (x);
5780 unsigned int endregno = END_REGNO (x);
5781 unsigned int i;
5782
5783 for (i = regno; i < endregno; i++)
5784 {
5785 if (REG_IN_TABLE (i) >= 0)
5786 {
5787 remove_invalid_refs (i);
5788 REG_IN_TABLE (i) = -1;
5789 }
5790 }
5791 }
5792 }
5793 }
5794
5795 /* We may have just removed some of the src_elt's from the hash table.
5796 So replace each one with the current head of the same class.
5797 Also check if destination addresses have been removed. */
5798
5799 for (i = 0; i < n_sets; i++)
5800 if (sets[i].rtl)
5801 {
5802 if (sets[i].dest_addr_elt
5803 && sets[i].dest_addr_elt->first_same_value == 0)
5804 {
5805 /* The elt was removed, which means this destination is not
5806 valid after this instruction. */
5807 sets[i].rtl = NULL_RTX;
5808 }
5809 else if (sets[i].src_elt && sets[i].src_elt->first_same_value == 0)
5810 /* If elt was removed, find current head of same class,
5811 or 0 if nothing remains of that class. */
5812 {
5813 struct table_elt *elt = sets[i].src_elt;
5814
5815 while (elt && elt->prev_same_value)
5816 elt = elt->prev_same_value;
5817
5818 while (elt && elt->first_same_value == 0)
5819 elt = elt->next_same_value;
5820 sets[i].src_elt = elt ? elt->first_same_value : 0;
5821 }
5822 }
5823
5824 /* Now insert the destinations into their equivalence classes. */
5825
5826 for (i = 0; i < n_sets; i++)
5827 if (sets[i].rtl)
5828 {
5829 rtx dest = SET_DEST (sets[i].rtl);
5830 struct table_elt *elt;
5831
5832 /* Don't record value if we are not supposed to risk allocating
5833 floating-point values in registers that might be wider than
5834 memory. */
5835 if ((flag_float_store
5836 && MEM_P (dest)
5837 && FLOAT_MODE_P (GET_MODE (dest)))
5838 /* Don't record BLKmode values, because we don't know the
5839 size of it, and can't be sure that other BLKmode values
5840 have the same or smaller size. */
5841 || GET_MODE (dest) == BLKmode
5842 /* If we didn't put a REG_EQUAL value or a source into the hash
5843 table, there is no point is recording DEST. */
5844 || sets[i].src_elt == 0
5845 /* If DEST is a paradoxical SUBREG and SRC is a ZERO_EXTEND
5846 or SIGN_EXTEND, don't record DEST since it can cause
5847 some tracking to be wrong.
5848
5849 ??? Think about this more later. */
5850 || (paradoxical_subreg_p (dest)
5851 && (GET_CODE (sets[i].src) == SIGN_EXTEND
5852 || GET_CODE (sets[i].src) == ZERO_EXTEND)))
5853 continue;
5854
5855 /* STRICT_LOW_PART isn't part of the value BEING set,
5856 and neither is the SUBREG inside it.
5857 Note that in this case SETS[I].SRC_ELT is really SRC_EQV_ELT. */
5858 if (GET_CODE (dest) == STRICT_LOW_PART)
5859 dest = SUBREG_REG (XEXP (dest, 0));
5860
5861 if (REG_P (dest) || GET_CODE (dest) == SUBREG)
5862 /* Registers must also be inserted into chains for quantities. */
5863 if (insert_regs (dest, sets[i].src_elt, 1))
5864 {
5865 /* If `insert_regs' changes something, the hash code must be
5866 recalculated. */
5867 rehash_using_reg (dest);
5868 sets[i].dest_hash = HASH (dest, GET_MODE (dest));
5869 }
5870
5871 elt = insert (dest, sets[i].src_elt,
5872 sets[i].dest_hash, GET_MODE (dest));
5873
5874 /* If this is a constant, insert the constant anchors with the
5875 equivalent register-offset expressions using register DEST. */
5876 if (targetm.const_anchor
5877 && REG_P (dest)
5878 && SCALAR_INT_MODE_P (GET_MODE (dest))
5879 && GET_CODE (sets[i].src_elt->exp) == CONST_INT)
5880 insert_const_anchors (dest, sets[i].src_elt->exp, GET_MODE (dest));
5881
5882 elt->in_memory = (MEM_P (sets[i].inner_dest)
5883 && !MEM_READONLY_P (sets[i].inner_dest));
5884
5885 /* If we have (set (subreg:m1 (reg:m2 foo) 0) (bar:m1)), M1 is no
5886 narrower than M2, and both M1 and M2 are the same number of words,
5887 we are also doing (set (reg:m2 foo) (subreg:m2 (bar:m1) 0)) so
5888 make that equivalence as well.
5889
5890 However, BAR may have equivalences for which gen_lowpart
5891 will produce a simpler value than gen_lowpart applied to
5892 BAR (e.g., if BAR was ZERO_EXTENDed from M2), so we will scan all
5893 BAR's equivalences. If we don't get a simplified form, make
5894 the SUBREG. It will not be used in an equivalence, but will
5895 cause two similar assignments to be detected.
5896
5897 Note the loop below will find SUBREG_REG (DEST) since we have
5898 already entered SRC and DEST of the SET in the table. */
5899
5900 if (GET_CODE (dest) == SUBREG
5901 && (((GET_MODE_SIZE (GET_MODE (SUBREG_REG (dest))) - 1)
5902 / UNITS_PER_WORD)
5903 == (GET_MODE_SIZE (GET_MODE (dest)) - 1) / UNITS_PER_WORD)
5904 && (GET_MODE_SIZE (GET_MODE (dest))
5905 >= GET_MODE_SIZE (GET_MODE (SUBREG_REG (dest))))
5906 && sets[i].src_elt != 0)
5907 {
5908 machine_mode new_mode = GET_MODE (SUBREG_REG (dest));
5909 struct table_elt *elt, *classp = 0;
5910
5911 for (elt = sets[i].src_elt->first_same_value; elt;
5912 elt = elt->next_same_value)
5913 {
5914 rtx new_src = 0;
5915 unsigned src_hash;
5916 struct table_elt *src_elt;
5917 int byte = 0;
5918
5919 /* Ignore invalid entries. */
5920 if (!REG_P (elt->exp)
5921 && ! exp_equiv_p (elt->exp, elt->exp, 1, false))
5922 continue;
5923
5924 /* We may have already been playing subreg games. If the
5925 mode is already correct for the destination, use it. */
5926 if (GET_MODE (elt->exp) == new_mode)
5927 new_src = elt->exp;
5928 else
5929 {
5930 /* Calculate big endian correction for the SUBREG_BYTE.
5931 We have already checked that M1 (GET_MODE (dest))
5932 is not narrower than M2 (new_mode). */
5933 if (BYTES_BIG_ENDIAN)
5934 byte = (GET_MODE_SIZE (GET_MODE (dest))
5935 - GET_MODE_SIZE (new_mode));
5936
5937 new_src = simplify_gen_subreg (new_mode, elt->exp,
5938 GET_MODE (dest), byte);
5939 }
5940
5941 /* The call to simplify_gen_subreg fails if the value
5942 is VOIDmode, yet we can't do any simplification, e.g.
5943 for EXPR_LISTs denoting function call results.
5944 It is invalid to construct a SUBREG with a VOIDmode
5945 SUBREG_REG, hence a zero new_src means we can't do
5946 this substitution. */
5947 if (! new_src)
5948 continue;
5949
5950 src_hash = HASH (new_src, new_mode);
5951 src_elt = lookup (new_src, src_hash, new_mode);
5952
5953 /* Put the new source in the hash table is if isn't
5954 already. */
5955 if (src_elt == 0)
5956 {
5957 if (insert_regs (new_src, classp, 0))
5958 {
5959 rehash_using_reg (new_src);
5960 src_hash = HASH (new_src, new_mode);
5961 }
5962 src_elt = insert (new_src, classp, src_hash, new_mode);
5963 src_elt->in_memory = elt->in_memory;
5964 if (GET_CODE (new_src) == ASM_OPERANDS
5965 && elt->cost == MAX_COST)
5966 src_elt->cost = MAX_COST;
5967 }
5968 else if (classp && classp != src_elt->first_same_value)
5969 /* Show that two things that we've seen before are
5970 actually the same. */
5971 merge_equiv_classes (src_elt, classp);
5972
5973 classp = src_elt->first_same_value;
5974 /* Ignore invalid entries. */
5975 while (classp
5976 && !REG_P (classp->exp)
5977 && ! exp_equiv_p (classp->exp, classp->exp, 1, false))
5978 classp = classp->next_same_value;
5979 }
5980 }
5981 }
5982
5983 /* Special handling for (set REG0 REG1) where REG0 is the
5984 "cheapest", cheaper than REG1. After cse, REG1 will probably not
5985 be used in the sequel, so (if easily done) change this insn to
5986 (set REG1 REG0) and replace REG1 with REG0 in the previous insn
5987 that computed their value. Then REG1 will become a dead store
5988 and won't cloud the situation for later optimizations.
5989
5990 Do not make this change if REG1 is a hard register, because it will
5991 then be used in the sequel and we may be changing a two-operand insn
5992 into a three-operand insn.
5993
5994 Also do not do this if we are operating on a copy of INSN. */
5995
5996 if (n_sets == 1 && sets[0].rtl)
5997 try_back_substitute_reg (sets[0].rtl, insn);
5998
5999 done:;
6000 }
6001 \f
6002 /* Remove from the hash table all expressions that reference memory. */
6003
6004 static void
6005 invalidate_memory (void)
6006 {
6007 int i;
6008 struct table_elt *p, *next;
6009
6010 for (i = 0; i < HASH_SIZE; i++)
6011 for (p = table[i]; p; p = next)
6012 {
6013 next = p->next_same_hash;
6014 if (p->in_memory)
6015 remove_from_table (p, i);
6016 }
6017 }
6018
6019 /* Perform invalidation on the basis of everything about INSN,
6020 except for invalidating the actual places that are SET in it.
6021 This includes the places CLOBBERed, and anything that might
6022 alias with something that is SET or CLOBBERed. */
6023
6024 static void
6025 invalidate_from_clobbers (rtx_insn *insn)
6026 {
6027 rtx x = PATTERN (insn);
6028
6029 if (GET_CODE (x) == CLOBBER)
6030 {
6031 rtx ref = XEXP (x, 0);
6032 if (ref)
6033 {
6034 if (REG_P (ref) || GET_CODE (ref) == SUBREG
6035 || MEM_P (ref))
6036 invalidate (ref, VOIDmode);
6037 else if (GET_CODE (ref) == STRICT_LOW_PART
6038 || GET_CODE (ref) == ZERO_EXTRACT)
6039 invalidate (XEXP (ref, 0), GET_MODE (ref));
6040 }
6041 }
6042 else if (GET_CODE (x) == PARALLEL)
6043 {
6044 int i;
6045 for (i = XVECLEN (x, 0) - 1; i >= 0; i--)
6046 {
6047 rtx y = XVECEXP (x, 0, i);
6048 if (GET_CODE (y) == CLOBBER)
6049 {
6050 rtx ref = XEXP (y, 0);
6051 if (REG_P (ref) || GET_CODE (ref) == SUBREG
6052 || MEM_P (ref))
6053 invalidate (ref, VOIDmode);
6054 else if (GET_CODE (ref) == STRICT_LOW_PART
6055 || GET_CODE (ref) == ZERO_EXTRACT)
6056 invalidate (XEXP (ref, 0), GET_MODE (ref));
6057 }
6058 }
6059 }
6060 }
6061 \f
6062 /* Perform invalidation on the basis of everything about INSN.
6063 This includes the places CLOBBERed, and anything that might
6064 alias with something that is SET or CLOBBERed. */
6065
6066 static void
6067 invalidate_from_sets_and_clobbers (rtx_insn *insn)
6068 {
6069 rtx tem;
6070 rtx x = PATTERN (insn);
6071
6072 if (CALL_P (insn))
6073 {
6074 for (tem = CALL_INSN_FUNCTION_USAGE (insn); tem; tem = XEXP (tem, 1))
6075 if (GET_CODE (XEXP (tem, 0)) == CLOBBER)
6076 invalidate (SET_DEST (XEXP (tem, 0)), VOIDmode);
6077 }
6078
6079 /* Ensure we invalidate the destination register of a CALL insn.
6080 This is necessary for machines where this register is a fixed_reg,
6081 because no other code would invalidate it. */
6082 if (GET_CODE (x) == SET && GET_CODE (SET_SRC (x)) == CALL)
6083 invalidate (SET_DEST (x), VOIDmode);
6084
6085 else if (GET_CODE (x) == PARALLEL)
6086 {
6087 int i;
6088
6089 for (i = XVECLEN (x, 0) - 1; i >= 0; i--)
6090 {
6091 rtx y = XVECEXP (x, 0, i);
6092 if (GET_CODE (y) == CLOBBER)
6093 {
6094 rtx clobbered = XEXP (y, 0);
6095
6096 if (REG_P (clobbered)
6097 || GET_CODE (clobbered) == SUBREG)
6098 invalidate (clobbered, VOIDmode);
6099 else if (GET_CODE (clobbered) == STRICT_LOW_PART
6100 || GET_CODE (clobbered) == ZERO_EXTRACT)
6101 invalidate (XEXP (clobbered, 0), GET_MODE (clobbered));
6102 }
6103 else if (GET_CODE (y) == SET && GET_CODE (SET_SRC (y)) == CALL)
6104 invalidate (SET_DEST (y), VOIDmode);
6105 }
6106 }
6107 }
6108 \f
6109 /* Process X, part of the REG_NOTES of an insn. Look at any REG_EQUAL notes
6110 and replace any registers in them with either an equivalent constant
6111 or the canonical form of the register. If we are inside an address,
6112 only do this if the address remains valid.
6113
6114 OBJECT is 0 except when within a MEM in which case it is the MEM.
6115
6116 Return the replacement for X. */
6117
6118 static rtx
6119 cse_process_notes_1 (rtx x, rtx object, bool *changed)
6120 {
6121 enum rtx_code code = GET_CODE (x);
6122 const char *fmt = GET_RTX_FORMAT (code);
6123 int i;
6124
6125 switch (code)
6126 {
6127 case CONST:
6128 case SYMBOL_REF:
6129 case LABEL_REF:
6130 CASE_CONST_ANY:
6131 case PC:
6132 case CC0:
6133 case LO_SUM:
6134 return x;
6135
6136 case MEM:
6137 validate_change (x, &XEXP (x, 0),
6138 cse_process_notes (XEXP (x, 0), x, changed), 0);
6139 return x;
6140
6141 case EXPR_LIST:
6142 if (REG_NOTE_KIND (x) == REG_EQUAL)
6143 XEXP (x, 0) = cse_process_notes (XEXP (x, 0), NULL_RTX, changed);
6144 /* Fall through. */
6145
6146 case INSN_LIST:
6147 case INT_LIST:
6148 if (XEXP (x, 1))
6149 XEXP (x, 1) = cse_process_notes (XEXP (x, 1), NULL_RTX, changed);
6150 return x;
6151
6152 case SIGN_EXTEND:
6153 case ZERO_EXTEND:
6154 case SUBREG:
6155 {
6156 rtx new_rtx = cse_process_notes (XEXP (x, 0), object, changed);
6157 /* We don't substitute VOIDmode constants into these rtx,
6158 since they would impede folding. */
6159 if (GET_MODE (new_rtx) != VOIDmode)
6160 validate_change (object, &XEXP (x, 0), new_rtx, 0);
6161 return x;
6162 }
6163
6164 case UNSIGNED_FLOAT:
6165 {
6166 rtx new_rtx = cse_process_notes (XEXP (x, 0), object, changed);
6167 /* We don't substitute negative VOIDmode constants into these rtx,
6168 since they would impede folding. */
6169 if (GET_MODE (new_rtx) != VOIDmode
6170 || (CONST_INT_P (new_rtx) && INTVAL (new_rtx) >= 0)
6171 || (CONST_DOUBLE_P (new_rtx) && CONST_DOUBLE_HIGH (new_rtx) >= 0))
6172 validate_change (object, &XEXP (x, 0), new_rtx, 0);
6173 return x;
6174 }
6175
6176 case REG:
6177 i = REG_QTY (REGNO (x));
6178
6179 /* Return a constant or a constant register. */
6180 if (REGNO_QTY_VALID_P (REGNO (x)))
6181 {
6182 struct qty_table_elem *ent = &qty_table[i];
6183
6184 if (ent->const_rtx != NULL_RTX
6185 && (CONSTANT_P (ent->const_rtx)
6186 || REG_P (ent->const_rtx)))
6187 {
6188 rtx new_rtx = gen_lowpart (GET_MODE (x), ent->const_rtx);
6189 if (new_rtx)
6190 return copy_rtx (new_rtx);
6191 }
6192 }
6193
6194 /* Otherwise, canonicalize this register. */
6195 return canon_reg (x, NULL);
6196
6197 default:
6198 break;
6199 }
6200
6201 for (i = 0; i < GET_RTX_LENGTH (code); i++)
6202 if (fmt[i] == 'e')
6203 validate_change (object, &XEXP (x, i),
6204 cse_process_notes (XEXP (x, i), object, changed), 0);
6205
6206 return x;
6207 }
6208
6209 static rtx
6210 cse_process_notes (rtx x, rtx object, bool *changed)
6211 {
6212 rtx new_rtx = cse_process_notes_1 (x, object, changed);
6213 if (new_rtx != x)
6214 *changed = true;
6215 return new_rtx;
6216 }
6217
6218 \f
6219 /* Find a path in the CFG, starting with FIRST_BB to perform CSE on.
6220
6221 DATA is a pointer to a struct cse_basic_block_data, that is used to
6222 describe the path.
6223 It is filled with a queue of basic blocks, starting with FIRST_BB
6224 and following a trace through the CFG.
6225
6226 If all paths starting at FIRST_BB have been followed, or no new path
6227 starting at FIRST_BB can be constructed, this function returns FALSE.
6228 Otherwise, DATA->path is filled and the function returns TRUE indicating
6229 that a path to follow was found.
6230
6231 If FOLLOW_JUMPS is false, the maximum path length is 1 and the only
6232 block in the path will be FIRST_BB. */
6233
6234 static bool
6235 cse_find_path (basic_block first_bb, struct cse_basic_block_data *data,
6236 int follow_jumps)
6237 {
6238 basic_block bb;
6239 edge e;
6240 int path_size;
6241
6242 bitmap_set_bit (cse_visited_basic_blocks, first_bb->index);
6243
6244 /* See if there is a previous path. */
6245 path_size = data->path_size;
6246
6247 /* There is a previous path. Make sure it started with FIRST_BB. */
6248 if (path_size)
6249 gcc_assert (data->path[0].bb == first_bb);
6250
6251 /* There was only one basic block in the last path. Clear the path and
6252 return, so that paths starting at another basic block can be tried. */
6253 if (path_size == 1)
6254 {
6255 path_size = 0;
6256 goto done;
6257 }
6258
6259 /* If the path was empty from the beginning, construct a new path. */
6260 if (path_size == 0)
6261 data->path[path_size++].bb = first_bb;
6262 else
6263 {
6264 /* Otherwise, path_size must be equal to or greater than 2, because
6265 a previous path exists that is at least two basic blocks long.
6266
6267 Update the previous branch path, if any. If the last branch was
6268 previously along the branch edge, take the fallthrough edge now. */
6269 while (path_size >= 2)
6270 {
6271 basic_block last_bb_in_path, previous_bb_in_path;
6272 edge e;
6273
6274 --path_size;
6275 last_bb_in_path = data->path[path_size].bb;
6276 previous_bb_in_path = data->path[path_size - 1].bb;
6277
6278 /* If we previously followed a path along the branch edge, try
6279 the fallthru edge now. */
6280 if (EDGE_COUNT (previous_bb_in_path->succs) == 2
6281 && any_condjump_p (BB_END (previous_bb_in_path))
6282 && (e = find_edge (previous_bb_in_path, last_bb_in_path))
6283 && e == BRANCH_EDGE (previous_bb_in_path))
6284 {
6285 bb = FALLTHRU_EDGE (previous_bb_in_path)->dest;
6286 if (bb != EXIT_BLOCK_PTR_FOR_FN (cfun)
6287 && single_pred_p (bb)
6288 /* We used to assert here that we would only see blocks
6289 that we have not visited yet. But we may end up
6290 visiting basic blocks twice if the CFG has changed
6291 in this run of cse_main, because when the CFG changes
6292 the topological sort of the CFG also changes. A basic
6293 blocks that previously had more than two predecessors
6294 may now have a single predecessor, and become part of
6295 a path that starts at another basic block.
6296
6297 We still want to visit each basic block only once, so
6298 halt the path here if we have already visited BB. */
6299 && !bitmap_bit_p (cse_visited_basic_blocks, bb->index))
6300 {
6301 bitmap_set_bit (cse_visited_basic_blocks, bb->index);
6302 data->path[path_size++].bb = bb;
6303 break;
6304 }
6305 }
6306
6307 data->path[path_size].bb = NULL;
6308 }
6309
6310 /* If only one block remains in the path, bail. */
6311 if (path_size == 1)
6312 {
6313 path_size = 0;
6314 goto done;
6315 }
6316 }
6317
6318 /* Extend the path if possible. */
6319 if (follow_jumps)
6320 {
6321 bb = data->path[path_size - 1].bb;
6322 while (bb && path_size < PARAM_VALUE (PARAM_MAX_CSE_PATH_LENGTH))
6323 {
6324 if (single_succ_p (bb))
6325 e = single_succ_edge (bb);
6326 else if (EDGE_COUNT (bb->succs) == 2
6327 && any_condjump_p (BB_END (bb)))
6328 {
6329 /* First try to follow the branch. If that doesn't lead
6330 to a useful path, follow the fallthru edge. */
6331 e = BRANCH_EDGE (bb);
6332 if (!single_pred_p (e->dest))
6333 e = FALLTHRU_EDGE (bb);
6334 }
6335 else
6336 e = NULL;
6337
6338 if (e
6339 && !((e->flags & EDGE_ABNORMAL_CALL) && cfun->has_nonlocal_label)
6340 && e->dest != EXIT_BLOCK_PTR_FOR_FN (cfun)
6341 && single_pred_p (e->dest)
6342 /* Avoid visiting basic blocks twice. The large comment
6343 above explains why this can happen. */
6344 && !bitmap_bit_p (cse_visited_basic_blocks, e->dest->index))
6345 {
6346 basic_block bb2 = e->dest;
6347 bitmap_set_bit (cse_visited_basic_blocks, bb2->index);
6348 data->path[path_size++].bb = bb2;
6349 bb = bb2;
6350 }
6351 else
6352 bb = NULL;
6353 }
6354 }
6355
6356 done:
6357 data->path_size = path_size;
6358 return path_size != 0;
6359 }
6360 \f
6361 /* Dump the path in DATA to file F. NSETS is the number of sets
6362 in the path. */
6363
6364 static void
6365 cse_dump_path (struct cse_basic_block_data *data, int nsets, FILE *f)
6366 {
6367 int path_entry;
6368
6369 fprintf (f, ";; Following path with %d sets: ", nsets);
6370 for (path_entry = 0; path_entry < data->path_size; path_entry++)
6371 fprintf (f, "%d ", (data->path[path_entry].bb)->index);
6372 fputc ('\n', dump_file);
6373 fflush (f);
6374 }
6375
6376 \f
6377 /* Return true if BB has exception handling successor edges. */
6378
6379 static bool
6380 have_eh_succ_edges (basic_block bb)
6381 {
6382 edge e;
6383 edge_iterator ei;
6384
6385 FOR_EACH_EDGE (e, ei, bb->succs)
6386 if (e->flags & EDGE_EH)
6387 return true;
6388
6389 return false;
6390 }
6391
6392 \f
6393 /* Scan to the end of the path described by DATA. Return an estimate of
6394 the total number of SETs of all insns in the path. */
6395
6396 static void
6397 cse_prescan_path (struct cse_basic_block_data *data)
6398 {
6399 int nsets = 0;
6400 int path_size = data->path_size;
6401 int path_entry;
6402
6403 /* Scan to end of each basic block in the path. */
6404 for (path_entry = 0; path_entry < path_size; path_entry++)
6405 {
6406 basic_block bb;
6407 rtx_insn *insn;
6408
6409 bb = data->path[path_entry].bb;
6410
6411 FOR_BB_INSNS (bb, insn)
6412 {
6413 if (!INSN_P (insn))
6414 continue;
6415
6416 /* A PARALLEL can have lots of SETs in it,
6417 especially if it is really an ASM_OPERANDS. */
6418 if (GET_CODE (PATTERN (insn)) == PARALLEL)
6419 nsets += XVECLEN (PATTERN (insn), 0);
6420 else
6421 nsets += 1;
6422 }
6423 }
6424
6425 data->nsets = nsets;
6426 }
6427 \f
6428 /* Return true if the pattern of INSN uses a LABEL_REF for which
6429 there isn't a REG_LABEL_OPERAND note. */
6430
6431 static bool
6432 check_for_label_ref (rtx_insn *insn)
6433 {
6434 /* If this insn uses a LABEL_REF and there isn't a REG_LABEL_OPERAND
6435 note for it, we must rerun jump since it needs to place the note. If
6436 this is a LABEL_REF for a CODE_LABEL that isn't in the insn chain,
6437 don't do this since no REG_LABEL_OPERAND will be added. */
6438 subrtx_iterator::array_type array;
6439 FOR_EACH_SUBRTX (iter, array, PATTERN (insn), ALL)
6440 {
6441 const_rtx x = *iter;
6442 if (GET_CODE (x) == LABEL_REF
6443 && !LABEL_REF_NONLOCAL_P (x)
6444 && (!JUMP_P (insn)
6445 || !label_is_jump_target_p (LABEL_REF_LABEL (x), insn))
6446 && LABEL_P (LABEL_REF_LABEL (x))
6447 && INSN_UID (LABEL_REF_LABEL (x)) != 0
6448 && !find_reg_note (insn, REG_LABEL_OPERAND, LABEL_REF_LABEL (x)))
6449 return true;
6450 }
6451 return false;
6452 }
6453
6454 /* Process a single extended basic block described by EBB_DATA. */
6455
6456 static void
6457 cse_extended_basic_block (struct cse_basic_block_data *ebb_data)
6458 {
6459 int path_size = ebb_data->path_size;
6460 int path_entry;
6461 int num_insns = 0;
6462
6463 /* Allocate the space needed by qty_table. */
6464 qty_table = XNEWVEC (struct qty_table_elem, max_qty);
6465
6466 new_basic_block ();
6467 cse_ebb_live_in = df_get_live_in (ebb_data->path[0].bb);
6468 cse_ebb_live_out = df_get_live_out (ebb_data->path[path_size - 1].bb);
6469 for (path_entry = 0; path_entry < path_size; path_entry++)
6470 {
6471 basic_block bb;
6472 rtx_insn *insn;
6473
6474 bb = ebb_data->path[path_entry].bb;
6475
6476 /* Invalidate recorded information for eh regs if there is an EH
6477 edge pointing to that bb. */
6478 if (bb_has_eh_pred (bb))
6479 {
6480 df_ref def;
6481
6482 FOR_EACH_ARTIFICIAL_DEF (def, bb->index)
6483 if (DF_REF_FLAGS (def) & DF_REF_AT_TOP)
6484 invalidate (DF_REF_REG (def), GET_MODE (DF_REF_REG (def)));
6485 }
6486
6487 optimize_this_for_speed_p = optimize_bb_for_speed_p (bb);
6488 FOR_BB_INSNS (bb, insn)
6489 {
6490 /* If we have processed 1,000 insns, flush the hash table to
6491 avoid extreme quadratic behavior. We must not include NOTEs
6492 in the count since there may be more of them when generating
6493 debugging information. If we clear the table at different
6494 times, code generated with -g -O might be different than code
6495 generated with -O but not -g.
6496
6497 FIXME: This is a real kludge and needs to be done some other
6498 way. */
6499 if (NONDEBUG_INSN_P (insn)
6500 && num_insns++ > PARAM_VALUE (PARAM_MAX_CSE_INSNS))
6501 {
6502 flush_hash_table ();
6503 num_insns = 0;
6504 }
6505
6506 if (INSN_P (insn))
6507 {
6508 /* Process notes first so we have all notes in canonical forms
6509 when looking for duplicate operations. */
6510 if (REG_NOTES (insn))
6511 {
6512 bool changed = false;
6513 REG_NOTES (insn) = cse_process_notes (REG_NOTES (insn),
6514 NULL_RTX, &changed);
6515 if (changed)
6516 df_notes_rescan (insn);
6517 }
6518
6519 cse_insn (insn);
6520
6521 /* If we haven't already found an insn where we added a LABEL_REF,
6522 check this one. */
6523 if (INSN_P (insn) && !recorded_label_ref
6524 && check_for_label_ref (insn))
6525 recorded_label_ref = true;
6526
6527 if (HAVE_cc0 && NONDEBUG_INSN_P (insn))
6528 {
6529 /* If the previous insn sets CC0 and this insn no
6530 longer references CC0, delete the previous insn.
6531 Here we use fact that nothing expects CC0 to be
6532 valid over an insn, which is true until the final
6533 pass. */
6534 rtx_insn *prev_insn;
6535 rtx tem;
6536
6537 prev_insn = prev_nonnote_nondebug_insn (insn);
6538 if (prev_insn && NONJUMP_INSN_P (prev_insn)
6539 && (tem = single_set (prev_insn)) != NULL_RTX
6540 && SET_DEST (tem) == cc0_rtx
6541 && ! reg_mentioned_p (cc0_rtx, PATTERN (insn)))
6542 delete_insn (prev_insn);
6543
6544 /* If this insn is not the last insn in the basic
6545 block, it will be PREV_INSN(insn) in the next
6546 iteration. If we recorded any CC0-related
6547 information for this insn, remember it. */
6548 if (insn != BB_END (bb))
6549 {
6550 prev_insn_cc0 = this_insn_cc0;
6551 prev_insn_cc0_mode = this_insn_cc0_mode;
6552 }
6553 }
6554 }
6555 }
6556
6557 /* With non-call exceptions, we are not always able to update
6558 the CFG properly inside cse_insn. So clean up possibly
6559 redundant EH edges here. */
6560 if (cfun->can_throw_non_call_exceptions && have_eh_succ_edges (bb))
6561 cse_cfg_altered |= purge_dead_edges (bb);
6562
6563 /* If we changed a conditional jump, we may have terminated
6564 the path we are following. Check that by verifying that
6565 the edge we would take still exists. If the edge does
6566 not exist anymore, purge the remainder of the path.
6567 Note that this will cause us to return to the caller. */
6568 if (path_entry < path_size - 1)
6569 {
6570 basic_block next_bb = ebb_data->path[path_entry + 1].bb;
6571 if (!find_edge (bb, next_bb))
6572 {
6573 do
6574 {
6575 path_size--;
6576
6577 /* If we truncate the path, we must also reset the
6578 visited bit on the remaining blocks in the path,
6579 or we will never visit them at all. */
6580 bitmap_clear_bit (cse_visited_basic_blocks,
6581 ebb_data->path[path_size].bb->index);
6582 ebb_data->path[path_size].bb = NULL;
6583 }
6584 while (path_size - 1 != path_entry);
6585 ebb_data->path_size = path_size;
6586 }
6587 }
6588
6589 /* If this is a conditional jump insn, record any known
6590 equivalences due to the condition being tested. */
6591 insn = BB_END (bb);
6592 if (path_entry < path_size - 1
6593 && JUMP_P (insn)
6594 && single_set (insn)
6595 && any_condjump_p (insn))
6596 {
6597 basic_block next_bb = ebb_data->path[path_entry + 1].bb;
6598 bool taken = (next_bb == BRANCH_EDGE (bb)->dest);
6599 record_jump_equiv (insn, taken);
6600 }
6601
6602 /* Clear the CC0-tracking related insns, they can't provide
6603 useful information across basic block boundaries. */
6604 prev_insn_cc0 = 0;
6605 }
6606
6607 gcc_assert (next_qty <= max_qty);
6608
6609 free (qty_table);
6610 }
6611
6612 \f
6613 /* Perform cse on the instructions of a function.
6614 F is the first instruction.
6615 NREGS is one plus the highest pseudo-reg number used in the instruction.
6616
6617 Return 2 if jump optimizations should be redone due to simplifications
6618 in conditional jump instructions.
6619 Return 1 if the CFG should be cleaned up because it has been modified.
6620 Return 0 otherwise. */
6621
6622 static int
6623 cse_main (rtx_insn *f ATTRIBUTE_UNUSED, int nregs)
6624 {
6625 struct cse_basic_block_data ebb_data;
6626 basic_block bb;
6627 int *rc_order = XNEWVEC (int, last_basic_block_for_fn (cfun));
6628 int i, n_blocks;
6629
6630 df_set_flags (DF_LR_RUN_DCE);
6631 df_note_add_problem ();
6632 df_analyze ();
6633 df_set_flags (DF_DEFER_INSN_RESCAN);
6634
6635 reg_scan (get_insns (), max_reg_num ());
6636 init_cse_reg_info (nregs);
6637
6638 ebb_data.path = XNEWVEC (struct branch_path,
6639 PARAM_VALUE (PARAM_MAX_CSE_PATH_LENGTH));
6640
6641 cse_cfg_altered = false;
6642 cse_jumps_altered = false;
6643 recorded_label_ref = false;
6644 constant_pool_entries_cost = 0;
6645 constant_pool_entries_regcost = 0;
6646 ebb_data.path_size = 0;
6647 ebb_data.nsets = 0;
6648 rtl_hooks = cse_rtl_hooks;
6649
6650 init_recog ();
6651 init_alias_analysis ();
6652
6653 reg_eqv_table = XNEWVEC (struct reg_eqv_elem, nregs);
6654
6655 /* Set up the table of already visited basic blocks. */
6656 cse_visited_basic_blocks = sbitmap_alloc (last_basic_block_for_fn (cfun));
6657 bitmap_clear (cse_visited_basic_blocks);
6658
6659 /* Loop over basic blocks in reverse completion order (RPO),
6660 excluding the ENTRY and EXIT blocks. */
6661 n_blocks = pre_and_rev_post_order_compute (NULL, rc_order, false);
6662 i = 0;
6663 while (i < n_blocks)
6664 {
6665 /* Find the first block in the RPO queue that we have not yet
6666 processed before. */
6667 do
6668 {
6669 bb = BASIC_BLOCK_FOR_FN (cfun, rc_order[i++]);
6670 }
6671 while (bitmap_bit_p (cse_visited_basic_blocks, bb->index)
6672 && i < n_blocks);
6673
6674 /* Find all paths starting with BB, and process them. */
6675 while (cse_find_path (bb, &ebb_data, flag_cse_follow_jumps))
6676 {
6677 /* Pre-scan the path. */
6678 cse_prescan_path (&ebb_data);
6679
6680 /* If this basic block has no sets, skip it. */
6681 if (ebb_data.nsets == 0)
6682 continue;
6683
6684 /* Get a reasonable estimate for the maximum number of qty's
6685 needed for this path. For this, we take the number of sets
6686 and multiply that by MAX_RECOG_OPERANDS. */
6687 max_qty = ebb_data.nsets * MAX_RECOG_OPERANDS;
6688
6689 /* Dump the path we're about to process. */
6690 if (dump_file)
6691 cse_dump_path (&ebb_data, ebb_data.nsets, dump_file);
6692
6693 cse_extended_basic_block (&ebb_data);
6694 }
6695 }
6696
6697 /* Clean up. */
6698 end_alias_analysis ();
6699 free (reg_eqv_table);
6700 free (ebb_data.path);
6701 sbitmap_free (cse_visited_basic_blocks);
6702 free (rc_order);
6703 rtl_hooks = general_rtl_hooks;
6704
6705 if (cse_jumps_altered || recorded_label_ref)
6706 return 2;
6707 else if (cse_cfg_altered)
6708 return 1;
6709 else
6710 return 0;
6711 }
6712 \f
6713 /* Count the number of times registers are used (not set) in X.
6714 COUNTS is an array in which we accumulate the count, INCR is how much
6715 we count each register usage.
6716
6717 Don't count a usage of DEST, which is the SET_DEST of a SET which
6718 contains X in its SET_SRC. This is because such a SET does not
6719 modify the liveness of DEST.
6720 DEST is set to pc_rtx for a trapping insn, or for an insn with side effects.
6721 We must then count uses of a SET_DEST regardless, because the insn can't be
6722 deleted here. */
6723
6724 static void
6725 count_reg_usage (rtx x, int *counts, rtx dest, int incr)
6726 {
6727 enum rtx_code code;
6728 rtx note;
6729 const char *fmt;
6730 int i, j;
6731
6732 if (x == 0)
6733 return;
6734
6735 switch (code = GET_CODE (x))
6736 {
6737 case REG:
6738 if (x != dest)
6739 counts[REGNO (x)] += incr;
6740 return;
6741
6742 case PC:
6743 case CC0:
6744 case CONST:
6745 CASE_CONST_ANY:
6746 case SYMBOL_REF:
6747 case LABEL_REF:
6748 return;
6749
6750 case CLOBBER:
6751 /* If we are clobbering a MEM, mark any registers inside the address
6752 as being used. */
6753 if (MEM_P (XEXP (x, 0)))
6754 count_reg_usage (XEXP (XEXP (x, 0), 0), counts, NULL_RTX, incr);
6755 return;
6756
6757 case SET:
6758 /* Unless we are setting a REG, count everything in SET_DEST. */
6759 if (!REG_P (SET_DEST (x)))
6760 count_reg_usage (SET_DEST (x), counts, NULL_RTX, incr);
6761 count_reg_usage (SET_SRC (x), counts,
6762 dest ? dest : SET_DEST (x),
6763 incr);
6764 return;
6765
6766 case DEBUG_INSN:
6767 return;
6768
6769 case CALL_INSN:
6770 case INSN:
6771 case JUMP_INSN:
6772 /* We expect dest to be NULL_RTX here. If the insn may throw,
6773 or if it cannot be deleted due to side-effects, mark this fact
6774 by setting DEST to pc_rtx. */
6775 if ((!cfun->can_delete_dead_exceptions && !insn_nothrow_p (x))
6776 || side_effects_p (PATTERN (x)))
6777 dest = pc_rtx;
6778 if (code == CALL_INSN)
6779 count_reg_usage (CALL_INSN_FUNCTION_USAGE (x), counts, dest, incr);
6780 count_reg_usage (PATTERN (x), counts, dest, incr);
6781
6782 /* Things used in a REG_EQUAL note aren't dead since loop may try to
6783 use them. */
6784
6785 note = find_reg_equal_equiv_note (x);
6786 if (note)
6787 {
6788 rtx eqv = XEXP (note, 0);
6789
6790 if (GET_CODE (eqv) == EXPR_LIST)
6791 /* This REG_EQUAL note describes the result of a function call.
6792 Process all the arguments. */
6793 do
6794 {
6795 count_reg_usage (XEXP (eqv, 0), counts, dest, incr);
6796 eqv = XEXP (eqv, 1);
6797 }
6798 while (eqv && GET_CODE (eqv) == EXPR_LIST);
6799 else
6800 count_reg_usage (eqv, counts, dest, incr);
6801 }
6802 return;
6803
6804 case EXPR_LIST:
6805 if (REG_NOTE_KIND (x) == REG_EQUAL
6806 || (REG_NOTE_KIND (x) != REG_NONNEG && GET_CODE (XEXP (x,0)) == USE)
6807 /* FUNCTION_USAGE expression lists may include (CLOBBER (mem /u)),
6808 involving registers in the address. */
6809 || GET_CODE (XEXP (x, 0)) == CLOBBER)
6810 count_reg_usage (XEXP (x, 0), counts, NULL_RTX, incr);
6811
6812 count_reg_usage (XEXP (x, 1), counts, NULL_RTX, incr);
6813 return;
6814
6815 case ASM_OPERANDS:
6816 /* Iterate over just the inputs, not the constraints as well. */
6817 for (i = ASM_OPERANDS_INPUT_LENGTH (x) - 1; i >= 0; i--)
6818 count_reg_usage (ASM_OPERANDS_INPUT (x, i), counts, dest, incr);
6819 return;
6820
6821 case INSN_LIST:
6822 case INT_LIST:
6823 gcc_unreachable ();
6824
6825 default:
6826 break;
6827 }
6828
6829 fmt = GET_RTX_FORMAT (code);
6830 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
6831 {
6832 if (fmt[i] == 'e')
6833 count_reg_usage (XEXP (x, i), counts, dest, incr);
6834 else if (fmt[i] == 'E')
6835 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
6836 count_reg_usage (XVECEXP (x, i, j), counts, dest, incr);
6837 }
6838 }
6839 \f
6840 /* Return true if X is a dead register. */
6841
6842 static inline int
6843 is_dead_reg (const_rtx x, int *counts)
6844 {
6845 return (REG_P (x)
6846 && REGNO (x) >= FIRST_PSEUDO_REGISTER
6847 && counts[REGNO (x)] == 0);
6848 }
6849
6850 /* Return true if set is live. */
6851 static bool
6852 set_live_p (rtx set, rtx_insn *insn ATTRIBUTE_UNUSED, /* Only used with HAVE_cc0. */
6853 int *counts)
6854 {
6855 rtx tem;
6856
6857 if (set_noop_p (set))
6858 ;
6859
6860 else if (GET_CODE (SET_DEST (set)) == CC0
6861 && !side_effects_p (SET_SRC (set))
6862 && ((tem = next_nonnote_nondebug_insn (insn)) == NULL_RTX
6863 || !INSN_P (tem)
6864 || !reg_referenced_p (cc0_rtx, PATTERN (tem))))
6865 return false;
6866 else if (!is_dead_reg (SET_DEST (set), counts)
6867 || side_effects_p (SET_SRC (set)))
6868 return true;
6869 return false;
6870 }
6871
6872 /* Return true if insn is live. */
6873
6874 static bool
6875 insn_live_p (rtx_insn *insn, int *counts)
6876 {
6877 int i;
6878 if (!cfun->can_delete_dead_exceptions && !insn_nothrow_p (insn))
6879 return true;
6880 else if (GET_CODE (PATTERN (insn)) == SET)
6881 return set_live_p (PATTERN (insn), insn, counts);
6882 else if (GET_CODE (PATTERN (insn)) == PARALLEL)
6883 {
6884 for (i = XVECLEN (PATTERN (insn), 0) - 1; i >= 0; i--)
6885 {
6886 rtx elt = XVECEXP (PATTERN (insn), 0, i);
6887
6888 if (GET_CODE (elt) == SET)
6889 {
6890 if (set_live_p (elt, insn, counts))
6891 return true;
6892 }
6893 else if (GET_CODE (elt) != CLOBBER && GET_CODE (elt) != USE)
6894 return true;
6895 }
6896 return false;
6897 }
6898 else if (DEBUG_INSN_P (insn))
6899 {
6900 rtx_insn *next;
6901
6902 for (next = NEXT_INSN (insn); next; next = NEXT_INSN (next))
6903 if (NOTE_P (next))
6904 continue;
6905 else if (!DEBUG_INSN_P (next))
6906 return true;
6907 else if (INSN_VAR_LOCATION_DECL (insn) == INSN_VAR_LOCATION_DECL (next))
6908 return false;
6909
6910 return true;
6911 }
6912 else
6913 return true;
6914 }
6915
6916 /* Count the number of stores into pseudo. Callback for note_stores. */
6917
6918 static void
6919 count_stores (rtx x, const_rtx set ATTRIBUTE_UNUSED, void *data)
6920 {
6921 int *counts = (int *) data;
6922 if (REG_P (x) && REGNO (x) >= FIRST_PSEUDO_REGISTER)
6923 counts[REGNO (x)]++;
6924 }
6925
6926 /* Return if DEBUG_INSN pattern PAT needs to be reset because some dead
6927 pseudo doesn't have a replacement. COUNTS[X] is zero if register X
6928 is dead and REPLACEMENTS[X] is null if it has no replacemenet.
6929 Set *SEEN_REPL to true if we see a dead register that does have
6930 a replacement. */
6931
6932 static bool
6933 is_dead_debug_insn (const_rtx pat, int *counts, rtx *replacements,
6934 bool *seen_repl)
6935 {
6936 subrtx_iterator::array_type array;
6937 FOR_EACH_SUBRTX (iter, array, pat, NONCONST)
6938 {
6939 const_rtx x = *iter;
6940 if (is_dead_reg (x, counts))
6941 {
6942 if (replacements && replacements[REGNO (x)] != NULL_RTX)
6943 *seen_repl = true;
6944 else
6945 return true;
6946 }
6947 }
6948 return false;
6949 }
6950
6951 /* Replace a dead pseudo in a DEBUG_INSN with replacement DEBUG_EXPR.
6952 Callback for simplify_replace_fn_rtx. */
6953
6954 static rtx
6955 replace_dead_reg (rtx x, const_rtx old_rtx ATTRIBUTE_UNUSED, void *data)
6956 {
6957 rtx *replacements = (rtx *) data;
6958
6959 if (REG_P (x)
6960 && REGNO (x) >= FIRST_PSEUDO_REGISTER
6961 && replacements[REGNO (x)] != NULL_RTX)
6962 {
6963 if (GET_MODE (x) == GET_MODE (replacements[REGNO (x)]))
6964 return replacements[REGNO (x)];
6965 return lowpart_subreg (GET_MODE (x), replacements[REGNO (x)],
6966 GET_MODE (replacements[REGNO (x)]));
6967 }
6968 return NULL_RTX;
6969 }
6970
6971 /* Scan all the insns and delete any that are dead; i.e., they store a register
6972 that is never used or they copy a register to itself.
6973
6974 This is used to remove insns made obviously dead by cse, loop or other
6975 optimizations. It improves the heuristics in loop since it won't try to
6976 move dead invariants out of loops or make givs for dead quantities. The
6977 remaining passes of the compilation are also sped up. */
6978
6979 int
6980 delete_trivially_dead_insns (rtx_insn *insns, int nreg)
6981 {
6982 int *counts;
6983 rtx_insn *insn, *prev;
6984 rtx *replacements = NULL;
6985 int ndead = 0;
6986
6987 timevar_push (TV_DELETE_TRIVIALLY_DEAD);
6988 /* First count the number of times each register is used. */
6989 if (MAY_HAVE_DEBUG_INSNS)
6990 {
6991 counts = XCNEWVEC (int, nreg * 3);
6992 for (insn = insns; insn; insn = NEXT_INSN (insn))
6993 if (DEBUG_INSN_P (insn))
6994 count_reg_usage (INSN_VAR_LOCATION_LOC (insn), counts + nreg,
6995 NULL_RTX, 1);
6996 else if (INSN_P (insn))
6997 {
6998 count_reg_usage (insn, counts, NULL_RTX, 1);
6999 note_stores (PATTERN (insn), count_stores, counts + nreg * 2);
7000 }
7001 /* If there can be debug insns, COUNTS are 3 consecutive arrays.
7002 First one counts how many times each pseudo is used outside
7003 of debug insns, second counts how many times each pseudo is
7004 used in debug insns and third counts how many times a pseudo
7005 is stored. */
7006 }
7007 else
7008 {
7009 counts = XCNEWVEC (int, nreg);
7010 for (insn = insns; insn; insn = NEXT_INSN (insn))
7011 if (INSN_P (insn))
7012 count_reg_usage (insn, counts, NULL_RTX, 1);
7013 /* If no debug insns can be present, COUNTS is just an array
7014 which counts how many times each pseudo is used. */
7015 }
7016 /* Pseudo PIC register should be considered as used due to possible
7017 new usages generated. */
7018 if (!reload_completed
7019 && pic_offset_table_rtx
7020 && REGNO (pic_offset_table_rtx) >= FIRST_PSEUDO_REGISTER)
7021 counts[REGNO (pic_offset_table_rtx)]++;
7022 /* Go from the last insn to the first and delete insns that only set unused
7023 registers or copy a register to itself. As we delete an insn, remove
7024 usage counts for registers it uses.
7025
7026 The first jump optimization pass may leave a real insn as the last
7027 insn in the function. We must not skip that insn or we may end
7028 up deleting code that is not really dead.
7029
7030 If some otherwise unused register is only used in DEBUG_INSNs,
7031 try to create a DEBUG_EXPR temporary and emit a DEBUG_INSN before
7032 the setter. Then go through DEBUG_INSNs and if a DEBUG_EXPR
7033 has been created for the unused register, replace it with
7034 the DEBUG_EXPR, otherwise reset the DEBUG_INSN. */
7035 for (insn = get_last_insn (); insn; insn = prev)
7036 {
7037 int live_insn = 0;
7038
7039 prev = PREV_INSN (insn);
7040 if (!INSN_P (insn))
7041 continue;
7042
7043 live_insn = insn_live_p (insn, counts);
7044
7045 /* If this is a dead insn, delete it and show registers in it aren't
7046 being used. */
7047
7048 if (! live_insn && dbg_cnt (delete_trivial_dead))
7049 {
7050 if (DEBUG_INSN_P (insn))
7051 count_reg_usage (INSN_VAR_LOCATION_LOC (insn), counts + nreg,
7052 NULL_RTX, -1);
7053 else
7054 {
7055 rtx set;
7056 if (MAY_HAVE_DEBUG_INSNS
7057 && (set = single_set (insn)) != NULL_RTX
7058 && is_dead_reg (SET_DEST (set), counts)
7059 /* Used at least once in some DEBUG_INSN. */
7060 && counts[REGNO (SET_DEST (set)) + nreg] > 0
7061 /* And set exactly once. */
7062 && counts[REGNO (SET_DEST (set)) + nreg * 2] == 1
7063 && !side_effects_p (SET_SRC (set))
7064 && asm_noperands (PATTERN (insn)) < 0)
7065 {
7066 rtx dval, bind_var_loc;
7067 rtx_insn *bind;
7068
7069 /* Create DEBUG_EXPR (and DEBUG_EXPR_DECL). */
7070 dval = make_debug_expr_from_rtl (SET_DEST (set));
7071
7072 /* Emit a debug bind insn before the insn in which
7073 reg dies. */
7074 bind_var_loc =
7075 gen_rtx_VAR_LOCATION (GET_MODE (SET_DEST (set)),
7076 DEBUG_EXPR_TREE_DECL (dval),
7077 SET_SRC (set),
7078 VAR_INIT_STATUS_INITIALIZED);
7079 count_reg_usage (bind_var_loc, counts + nreg, NULL_RTX, 1);
7080
7081 bind = emit_debug_insn_before (bind_var_loc, insn);
7082 df_insn_rescan (bind);
7083
7084 if (replacements == NULL)
7085 replacements = XCNEWVEC (rtx, nreg);
7086 replacements[REGNO (SET_DEST (set))] = dval;
7087 }
7088
7089 count_reg_usage (insn, counts, NULL_RTX, -1);
7090 ndead++;
7091 }
7092 delete_insn_and_edges (insn);
7093 }
7094 }
7095
7096 if (MAY_HAVE_DEBUG_INSNS)
7097 {
7098 for (insn = get_last_insn (); insn; insn = PREV_INSN (insn))
7099 if (DEBUG_INSN_P (insn))
7100 {
7101 /* If this debug insn references a dead register that wasn't replaced
7102 with an DEBUG_EXPR, reset the DEBUG_INSN. */
7103 bool seen_repl = false;
7104 if (is_dead_debug_insn (INSN_VAR_LOCATION_LOC (insn),
7105 counts, replacements, &seen_repl))
7106 {
7107 INSN_VAR_LOCATION_LOC (insn) = gen_rtx_UNKNOWN_VAR_LOC ();
7108 df_insn_rescan (insn);
7109 }
7110 else if (seen_repl)
7111 {
7112 INSN_VAR_LOCATION_LOC (insn)
7113 = simplify_replace_fn_rtx (INSN_VAR_LOCATION_LOC (insn),
7114 NULL_RTX, replace_dead_reg,
7115 replacements);
7116 df_insn_rescan (insn);
7117 }
7118 }
7119 free (replacements);
7120 }
7121
7122 if (dump_file && ndead)
7123 fprintf (dump_file, "Deleted %i trivially dead insns\n",
7124 ndead);
7125 /* Clean up. */
7126 free (counts);
7127 timevar_pop (TV_DELETE_TRIVIALLY_DEAD);
7128 return ndead;
7129 }
7130
7131 /* If LOC contains references to NEWREG in a different mode, change them
7132 to use NEWREG instead. */
7133
7134 static void
7135 cse_change_cc_mode (subrtx_ptr_iterator::array_type &array,
7136 rtx *loc, rtx insn, rtx newreg)
7137 {
7138 FOR_EACH_SUBRTX_PTR (iter, array, loc, NONCONST)
7139 {
7140 rtx *loc = *iter;
7141 rtx x = *loc;
7142 if (x
7143 && REG_P (x)
7144 && REGNO (x) == REGNO (newreg)
7145 && GET_MODE (x) != GET_MODE (newreg))
7146 {
7147 validate_change (insn, loc, newreg, 1);
7148 iter.skip_subrtxes ();
7149 }
7150 }
7151 }
7152
7153 /* Change the mode of any reference to the register REGNO (NEWREG) to
7154 GET_MODE (NEWREG) in INSN. */
7155
7156 static void
7157 cse_change_cc_mode_insn (rtx_insn *insn, rtx newreg)
7158 {
7159 int success;
7160
7161 if (!INSN_P (insn))
7162 return;
7163
7164 subrtx_ptr_iterator::array_type array;
7165 cse_change_cc_mode (array, &PATTERN (insn), insn, newreg);
7166 cse_change_cc_mode (array, &REG_NOTES (insn), insn, newreg);
7167
7168 /* If the following assertion was triggered, there is most probably
7169 something wrong with the cc_modes_compatible back end function.
7170 CC modes only can be considered compatible if the insn - with the mode
7171 replaced by any of the compatible modes - can still be recognized. */
7172 success = apply_change_group ();
7173 gcc_assert (success);
7174 }
7175
7176 /* Change the mode of any reference to the register REGNO (NEWREG) to
7177 GET_MODE (NEWREG), starting at START. Stop before END. Stop at
7178 any instruction which modifies NEWREG. */
7179
7180 static void
7181 cse_change_cc_mode_insns (rtx_insn *start, rtx_insn *end, rtx newreg)
7182 {
7183 rtx_insn *insn;
7184
7185 for (insn = start; insn != end; insn = NEXT_INSN (insn))
7186 {
7187 if (! INSN_P (insn))
7188 continue;
7189
7190 if (reg_set_p (newreg, insn))
7191 return;
7192
7193 cse_change_cc_mode_insn (insn, newreg);
7194 }
7195 }
7196
7197 /* BB is a basic block which finishes with CC_REG as a condition code
7198 register which is set to CC_SRC. Look through the successors of BB
7199 to find blocks which have a single predecessor (i.e., this one),
7200 and look through those blocks for an assignment to CC_REG which is
7201 equivalent to CC_SRC. CAN_CHANGE_MODE indicates whether we are
7202 permitted to change the mode of CC_SRC to a compatible mode. This
7203 returns VOIDmode if no equivalent assignments were found.
7204 Otherwise it returns the mode which CC_SRC should wind up with.
7205 ORIG_BB should be the same as BB in the outermost cse_cc_succs call,
7206 but is passed unmodified down to recursive calls in order to prevent
7207 endless recursion.
7208
7209 The main complexity in this function is handling the mode issues.
7210 We may have more than one duplicate which we can eliminate, and we
7211 try to find a mode which will work for multiple duplicates. */
7212
7213 static machine_mode
7214 cse_cc_succs (basic_block bb, basic_block orig_bb, rtx cc_reg, rtx cc_src,
7215 bool can_change_mode)
7216 {
7217 bool found_equiv;
7218 machine_mode mode;
7219 unsigned int insn_count;
7220 edge e;
7221 rtx_insn *insns[2];
7222 machine_mode modes[2];
7223 rtx_insn *last_insns[2];
7224 unsigned int i;
7225 rtx newreg;
7226 edge_iterator ei;
7227
7228 /* We expect to have two successors. Look at both before picking
7229 the final mode for the comparison. If we have more successors
7230 (i.e., some sort of table jump, although that seems unlikely),
7231 then we require all beyond the first two to use the same
7232 mode. */
7233
7234 found_equiv = false;
7235 mode = GET_MODE (cc_src);
7236 insn_count = 0;
7237 FOR_EACH_EDGE (e, ei, bb->succs)
7238 {
7239 rtx_insn *insn;
7240 rtx_insn *end;
7241
7242 if (e->flags & EDGE_COMPLEX)
7243 continue;
7244
7245 if (EDGE_COUNT (e->dest->preds) != 1
7246 || e->dest == EXIT_BLOCK_PTR_FOR_FN (cfun)
7247 /* Avoid endless recursion on unreachable blocks. */
7248 || e->dest == orig_bb)
7249 continue;
7250
7251 end = NEXT_INSN (BB_END (e->dest));
7252 for (insn = BB_HEAD (e->dest); insn != end; insn = NEXT_INSN (insn))
7253 {
7254 rtx set;
7255
7256 if (! INSN_P (insn))
7257 continue;
7258
7259 /* If CC_SRC is modified, we have to stop looking for
7260 something which uses it. */
7261 if (modified_in_p (cc_src, insn))
7262 break;
7263
7264 /* Check whether INSN sets CC_REG to CC_SRC. */
7265 set = single_set (insn);
7266 if (set
7267 && REG_P (SET_DEST (set))
7268 && REGNO (SET_DEST (set)) == REGNO (cc_reg))
7269 {
7270 bool found;
7271 machine_mode set_mode;
7272 machine_mode comp_mode;
7273
7274 found = false;
7275 set_mode = GET_MODE (SET_SRC (set));
7276 comp_mode = set_mode;
7277 if (rtx_equal_p (cc_src, SET_SRC (set)))
7278 found = true;
7279 else if (GET_CODE (cc_src) == COMPARE
7280 && GET_CODE (SET_SRC (set)) == COMPARE
7281 && mode != set_mode
7282 && rtx_equal_p (XEXP (cc_src, 0),
7283 XEXP (SET_SRC (set), 0))
7284 && rtx_equal_p (XEXP (cc_src, 1),
7285 XEXP (SET_SRC (set), 1)))
7286
7287 {
7288 comp_mode = targetm.cc_modes_compatible (mode, set_mode);
7289 if (comp_mode != VOIDmode
7290 && (can_change_mode || comp_mode == mode))
7291 found = true;
7292 }
7293
7294 if (found)
7295 {
7296 found_equiv = true;
7297 if (insn_count < ARRAY_SIZE (insns))
7298 {
7299 insns[insn_count] = insn;
7300 modes[insn_count] = set_mode;
7301 last_insns[insn_count] = end;
7302 ++insn_count;
7303
7304 if (mode != comp_mode)
7305 {
7306 gcc_assert (can_change_mode);
7307 mode = comp_mode;
7308
7309 /* The modified insn will be re-recognized later. */
7310 PUT_MODE (cc_src, mode);
7311 }
7312 }
7313 else
7314 {
7315 if (set_mode != mode)
7316 {
7317 /* We found a matching expression in the
7318 wrong mode, but we don't have room to
7319 store it in the array. Punt. This case
7320 should be rare. */
7321 break;
7322 }
7323 /* INSN sets CC_REG to a value equal to CC_SRC
7324 with the right mode. We can simply delete
7325 it. */
7326 delete_insn (insn);
7327 }
7328
7329 /* We found an instruction to delete. Keep looking,
7330 in the hopes of finding a three-way jump. */
7331 continue;
7332 }
7333
7334 /* We found an instruction which sets the condition
7335 code, so don't look any farther. */
7336 break;
7337 }
7338
7339 /* If INSN sets CC_REG in some other way, don't look any
7340 farther. */
7341 if (reg_set_p (cc_reg, insn))
7342 break;
7343 }
7344
7345 /* If we fell off the bottom of the block, we can keep looking
7346 through successors. We pass CAN_CHANGE_MODE as false because
7347 we aren't prepared to handle compatibility between the
7348 further blocks and this block. */
7349 if (insn == end)
7350 {
7351 machine_mode submode;
7352
7353 submode = cse_cc_succs (e->dest, orig_bb, cc_reg, cc_src, false);
7354 if (submode != VOIDmode)
7355 {
7356 gcc_assert (submode == mode);
7357 found_equiv = true;
7358 can_change_mode = false;
7359 }
7360 }
7361 }
7362
7363 if (! found_equiv)
7364 return VOIDmode;
7365
7366 /* Now INSN_COUNT is the number of instructions we found which set
7367 CC_REG to a value equivalent to CC_SRC. The instructions are in
7368 INSNS. The modes used by those instructions are in MODES. */
7369
7370 newreg = NULL_RTX;
7371 for (i = 0; i < insn_count; ++i)
7372 {
7373 if (modes[i] != mode)
7374 {
7375 /* We need to change the mode of CC_REG in INSNS[i] and
7376 subsequent instructions. */
7377 if (! newreg)
7378 {
7379 if (GET_MODE (cc_reg) == mode)
7380 newreg = cc_reg;
7381 else
7382 newreg = gen_rtx_REG (mode, REGNO (cc_reg));
7383 }
7384 cse_change_cc_mode_insns (NEXT_INSN (insns[i]), last_insns[i],
7385 newreg);
7386 }
7387
7388 delete_insn_and_edges (insns[i]);
7389 }
7390
7391 return mode;
7392 }
7393
7394 /* If we have a fixed condition code register (or two), walk through
7395 the instructions and try to eliminate duplicate assignments. */
7396
7397 static void
7398 cse_condition_code_reg (void)
7399 {
7400 unsigned int cc_regno_1;
7401 unsigned int cc_regno_2;
7402 rtx cc_reg_1;
7403 rtx cc_reg_2;
7404 basic_block bb;
7405
7406 if (! targetm.fixed_condition_code_regs (&cc_regno_1, &cc_regno_2))
7407 return;
7408
7409 cc_reg_1 = gen_rtx_REG (CCmode, cc_regno_1);
7410 if (cc_regno_2 != INVALID_REGNUM)
7411 cc_reg_2 = gen_rtx_REG (CCmode, cc_regno_2);
7412 else
7413 cc_reg_2 = NULL_RTX;
7414
7415 FOR_EACH_BB_FN (bb, cfun)
7416 {
7417 rtx_insn *last_insn;
7418 rtx cc_reg;
7419 rtx_insn *insn;
7420 rtx_insn *cc_src_insn;
7421 rtx cc_src;
7422 machine_mode mode;
7423 machine_mode orig_mode;
7424
7425 /* Look for blocks which end with a conditional jump based on a
7426 condition code register. Then look for the instruction which
7427 sets the condition code register. Then look through the
7428 successor blocks for instructions which set the condition
7429 code register to the same value. There are other possible
7430 uses of the condition code register, but these are by far the
7431 most common and the ones which we are most likely to be able
7432 to optimize. */
7433
7434 last_insn = BB_END (bb);
7435 if (!JUMP_P (last_insn))
7436 continue;
7437
7438 if (reg_referenced_p (cc_reg_1, PATTERN (last_insn)))
7439 cc_reg = cc_reg_1;
7440 else if (cc_reg_2 && reg_referenced_p (cc_reg_2, PATTERN (last_insn)))
7441 cc_reg = cc_reg_2;
7442 else
7443 continue;
7444
7445 cc_src_insn = NULL;
7446 cc_src = NULL_RTX;
7447 for (insn = PREV_INSN (last_insn);
7448 insn && insn != PREV_INSN (BB_HEAD (bb));
7449 insn = PREV_INSN (insn))
7450 {
7451 rtx set;
7452
7453 if (! INSN_P (insn))
7454 continue;
7455 set = single_set (insn);
7456 if (set
7457 && REG_P (SET_DEST (set))
7458 && REGNO (SET_DEST (set)) == REGNO (cc_reg))
7459 {
7460 cc_src_insn = insn;
7461 cc_src = SET_SRC (set);
7462 break;
7463 }
7464 else if (reg_set_p (cc_reg, insn))
7465 break;
7466 }
7467
7468 if (! cc_src_insn)
7469 continue;
7470
7471 if (modified_between_p (cc_src, cc_src_insn, NEXT_INSN (last_insn)))
7472 continue;
7473
7474 /* Now CC_REG is a condition code register used for a
7475 conditional jump at the end of the block, and CC_SRC, in
7476 CC_SRC_INSN, is the value to which that condition code
7477 register is set, and CC_SRC is still meaningful at the end of
7478 the basic block. */
7479
7480 orig_mode = GET_MODE (cc_src);
7481 mode = cse_cc_succs (bb, bb, cc_reg, cc_src, true);
7482 if (mode != VOIDmode)
7483 {
7484 gcc_assert (mode == GET_MODE (cc_src));
7485 if (mode != orig_mode)
7486 {
7487 rtx newreg = gen_rtx_REG (mode, REGNO (cc_reg));
7488
7489 cse_change_cc_mode_insn (cc_src_insn, newreg);
7490
7491 /* Do the same in the following insns that use the
7492 current value of CC_REG within BB. */
7493 cse_change_cc_mode_insns (NEXT_INSN (cc_src_insn),
7494 NEXT_INSN (last_insn),
7495 newreg);
7496 }
7497 }
7498 }
7499 }
7500 \f
7501
7502 /* Perform common subexpression elimination. Nonzero value from
7503 `cse_main' means that jumps were simplified and some code may now
7504 be unreachable, so do jump optimization again. */
7505 static unsigned int
7506 rest_of_handle_cse (void)
7507 {
7508 int tem;
7509
7510 if (dump_file)
7511 dump_flow_info (dump_file, dump_flags);
7512
7513 tem = cse_main (get_insns (), max_reg_num ());
7514
7515 /* If we are not running more CSE passes, then we are no longer
7516 expecting CSE to be run. But always rerun it in a cheap mode. */
7517 cse_not_expected = !flag_rerun_cse_after_loop && !flag_gcse;
7518
7519 if (tem == 2)
7520 {
7521 timevar_push (TV_JUMP);
7522 rebuild_jump_labels (get_insns ());
7523 cleanup_cfg (CLEANUP_CFG_CHANGED);
7524 timevar_pop (TV_JUMP);
7525 }
7526 else if (tem == 1 || optimize > 1)
7527 cleanup_cfg (0);
7528
7529 return 0;
7530 }
7531
7532 namespace {
7533
7534 const pass_data pass_data_cse =
7535 {
7536 RTL_PASS, /* type */
7537 "cse1", /* name */
7538 OPTGROUP_NONE, /* optinfo_flags */
7539 TV_CSE, /* tv_id */
7540 0, /* properties_required */
7541 0, /* properties_provided */
7542 0, /* properties_destroyed */
7543 0, /* todo_flags_start */
7544 TODO_df_finish, /* todo_flags_finish */
7545 };
7546
7547 class pass_cse : public rtl_opt_pass
7548 {
7549 public:
7550 pass_cse (gcc::context *ctxt)
7551 : rtl_opt_pass (pass_data_cse, ctxt)
7552 {}
7553
7554 /* opt_pass methods: */
7555 virtual bool gate (function *) { return optimize > 0; }
7556 virtual unsigned int execute (function *) { return rest_of_handle_cse (); }
7557
7558 }; // class pass_cse
7559
7560 } // anon namespace
7561
7562 rtl_opt_pass *
7563 make_pass_cse (gcc::context *ctxt)
7564 {
7565 return new pass_cse (ctxt);
7566 }
7567
7568
7569 /* Run second CSE pass after loop optimizations. */
7570 static unsigned int
7571 rest_of_handle_cse2 (void)
7572 {
7573 int tem;
7574
7575 if (dump_file)
7576 dump_flow_info (dump_file, dump_flags);
7577
7578 tem = cse_main (get_insns (), max_reg_num ());
7579
7580 /* Run a pass to eliminate duplicated assignments to condition code
7581 registers. We have to run this after bypass_jumps, because it
7582 makes it harder for that pass to determine whether a jump can be
7583 bypassed safely. */
7584 cse_condition_code_reg ();
7585
7586 delete_trivially_dead_insns (get_insns (), max_reg_num ());
7587
7588 if (tem == 2)
7589 {
7590 timevar_push (TV_JUMP);
7591 rebuild_jump_labels (get_insns ());
7592 cleanup_cfg (CLEANUP_CFG_CHANGED);
7593 timevar_pop (TV_JUMP);
7594 }
7595 else if (tem == 1)
7596 cleanup_cfg (0);
7597
7598 cse_not_expected = 1;
7599 return 0;
7600 }
7601
7602
7603 namespace {
7604
7605 const pass_data pass_data_cse2 =
7606 {
7607 RTL_PASS, /* type */
7608 "cse2", /* name */
7609 OPTGROUP_NONE, /* optinfo_flags */
7610 TV_CSE2, /* tv_id */
7611 0, /* properties_required */
7612 0, /* properties_provided */
7613 0, /* properties_destroyed */
7614 0, /* todo_flags_start */
7615 TODO_df_finish, /* todo_flags_finish */
7616 };
7617
7618 class pass_cse2 : public rtl_opt_pass
7619 {
7620 public:
7621 pass_cse2 (gcc::context *ctxt)
7622 : rtl_opt_pass (pass_data_cse2, ctxt)
7623 {}
7624
7625 /* opt_pass methods: */
7626 virtual bool gate (function *)
7627 {
7628 return optimize > 0 && flag_rerun_cse_after_loop;
7629 }
7630
7631 virtual unsigned int execute (function *) { return rest_of_handle_cse2 (); }
7632
7633 }; // class pass_cse2
7634
7635 } // anon namespace
7636
7637 rtl_opt_pass *
7638 make_pass_cse2 (gcc::context *ctxt)
7639 {
7640 return new pass_cse2 (ctxt);
7641 }
7642
7643 /* Run second CSE pass after loop optimizations. */
7644 static unsigned int
7645 rest_of_handle_cse_after_global_opts (void)
7646 {
7647 int save_cfj;
7648 int tem;
7649
7650 /* We only want to do local CSE, so don't follow jumps. */
7651 save_cfj = flag_cse_follow_jumps;
7652 flag_cse_follow_jumps = 0;
7653
7654 rebuild_jump_labels (get_insns ());
7655 tem = cse_main (get_insns (), max_reg_num ());
7656 purge_all_dead_edges ();
7657 delete_trivially_dead_insns (get_insns (), max_reg_num ());
7658
7659 cse_not_expected = !flag_rerun_cse_after_loop;
7660
7661 /* If cse altered any jumps, rerun jump opts to clean things up. */
7662 if (tem == 2)
7663 {
7664 timevar_push (TV_JUMP);
7665 rebuild_jump_labels (get_insns ());
7666 cleanup_cfg (CLEANUP_CFG_CHANGED);
7667 timevar_pop (TV_JUMP);
7668 }
7669 else if (tem == 1)
7670 cleanup_cfg (0);
7671
7672 flag_cse_follow_jumps = save_cfj;
7673 return 0;
7674 }
7675
7676 namespace {
7677
7678 const pass_data pass_data_cse_after_global_opts =
7679 {
7680 RTL_PASS, /* type */
7681 "cse_local", /* name */
7682 OPTGROUP_NONE, /* optinfo_flags */
7683 TV_CSE, /* tv_id */
7684 0, /* properties_required */
7685 0, /* properties_provided */
7686 0, /* properties_destroyed */
7687 0, /* todo_flags_start */
7688 TODO_df_finish, /* todo_flags_finish */
7689 };
7690
7691 class pass_cse_after_global_opts : public rtl_opt_pass
7692 {
7693 public:
7694 pass_cse_after_global_opts (gcc::context *ctxt)
7695 : rtl_opt_pass (pass_data_cse_after_global_opts, ctxt)
7696 {}
7697
7698 /* opt_pass methods: */
7699 virtual bool gate (function *)
7700 {
7701 return optimize > 0 && flag_rerun_cse_after_global_opts;
7702 }
7703
7704 virtual unsigned int execute (function *)
7705 {
7706 return rest_of_handle_cse_after_global_opts ();
7707 }
7708
7709 }; // class pass_cse_after_global_opts
7710
7711 } // anon namespace
7712
7713 rtl_opt_pass *
7714 make_pass_cse_after_global_opts (gcc::context *ctxt)
7715 {
7716 return new pass_cse_after_global_opts (ctxt);
7717 }