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