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