]> gcc.gnu.org Git - gcc.git/blame - gcc/cse.c
Major cutover to using system.h:
[gcc.git] / gcc / cse.c
CommitLineData
7afe21cc 1/* Common subexpression elimination for GNU compiler.
c85f7c16 2 Copyright (C) 1987, 88, 89, 92-7, 1998 Free Software Foundation, Inc.
7afe21cc
RK
3
4This file is part of GNU CC.
5
6GNU CC is free software; you can redistribute it and/or modify
7it under the terms of the GNU General Public License as published by
8the Free Software Foundation; either version 2, or (at your option)
9any later version.
10
11GNU CC is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with GNU CC; see the file COPYING. If not, write to
940d9d63
RK
18the Free Software Foundation, 59 Temple Place - Suite 330,
19Boston, MA 02111-1307, USA. */
7afe21cc
RK
20
21
22#include "config.h"
670ee920
KG
23/* stdio.h must precede rtl.h for FFS. */
24#include "system.h"
9c3b4c8b 25
7afe21cc
RK
26#include "rtl.h"
27#include "regs.h"
28#include "hard-reg-set.h"
29#include "flags.h"
30#include "real.h"
31#include "insn-config.h"
32#include "recog.h"
956d6950 33#include "expr.h"
7afe21cc 34
7afe21cc
RK
35#include <setjmp.h>
36
37/* The basic idea of common subexpression elimination is to go
38 through the code, keeping a record of expressions that would
39 have the same value at the current scan point, and replacing
40 expressions encountered with the cheapest equivalent expression.
41
42 It is too complicated to keep track of the different possibilities
43 when control paths merge; so, at each label, we forget all that is
44 known and start fresh. This can be described as processing each
45 basic block separately. Note, however, that these are not quite
46 the same as the basic blocks found by a later pass and used for
47 data flow analysis and register packing. We do not need to start fresh
48 after a conditional jump instruction if there is no label there.
49
50 We use two data structures to record the equivalent expressions:
51 a hash table for most expressions, and several vectors together
52 with "quantity numbers" to record equivalent (pseudo) registers.
53
54 The use of the special data structure for registers is desirable
55 because it is faster. It is possible because registers references
56 contain a fairly small number, the register number, taken from
57 a contiguously allocated series, and two register references are
58 identical if they have the same number. General expressions
59 do not have any such thing, so the only way to retrieve the
60 information recorded on an expression other than a register
61 is to keep it in a hash table.
62
63Registers and "quantity numbers":
64
65 At the start of each basic block, all of the (hardware and pseudo)
66 registers used in the function are given distinct quantity
67 numbers to indicate their contents. During scan, when the code
68 copies one register into another, we copy the quantity number.
69 When a register is loaded in any other way, we allocate a new
70 quantity number to describe the value generated by this operation.
71 `reg_qty' records what quantity a register is currently thought
72 of as containing.
73
74 All real quantity numbers are greater than or equal to `max_reg'.
75 If register N has not been assigned a quantity, reg_qty[N] will equal N.
76
77 Quantity numbers below `max_reg' do not exist and none of the `qty_...'
78 variables should be referenced with an index below `max_reg'.
79
80 We also maintain a bidirectional chain of registers for each
81 quantity number. `qty_first_reg', `qty_last_reg',
82 `reg_next_eqv' and `reg_prev_eqv' hold these chains.
83
84 The first register in a chain is the one whose lifespan is least local.
85 Among equals, it is the one that was seen first.
86 We replace any equivalent register with that one.
87
88 If two registers have the same quantity number, it must be true that
89 REG expressions with `qty_mode' must be in the hash table for both
90 registers and must be in the same class.
91
92 The converse is not true. Since hard registers may be referenced in
93 any mode, two REG expressions might be equivalent in the hash table
94 but not have the same quantity number if the quantity number of one
95 of the registers is not the same mode as those expressions.
96
97Constants and quantity numbers
98
99 When a quantity has a known constant value, that value is stored
100 in the appropriate element of qty_const. This is in addition to
101 putting the constant in the hash table as is usual for non-regs.
102
d45cf215 103 Whether a reg or a constant is preferred is determined by the configuration
7afe21cc
RK
104 macro CONST_COSTS and will often depend on the constant value. In any
105 event, expressions containing constants can be simplified, by fold_rtx.
106
107 When a quantity has a known nearly constant value (such as an address
108 of a stack slot), that value is stored in the appropriate element
109 of qty_const.
110
111 Integer constants don't have a machine mode. However, cse
112 determines the intended machine mode from the destination
113 of the instruction that moves the constant. The machine mode
114 is recorded in the hash table along with the actual RTL
115 constant expression so that different modes are kept separate.
116
117Other expressions:
118
119 To record known equivalences among expressions in general
120 we use a hash table called `table'. It has a fixed number of buckets
121 that contain chains of `struct table_elt' elements for expressions.
122 These chains connect the elements whose expressions have the same
123 hash codes.
124
125 Other chains through the same elements connect the elements which
126 currently have equivalent values.
127
128 Register references in an expression are canonicalized before hashing
129 the expression. This is done using `reg_qty' and `qty_first_reg'.
130 The hash code of a register reference is computed using the quantity
131 number, not the register number.
132
133 When the value of an expression changes, it is necessary to remove from the
134 hash table not just that expression but all expressions whose values
135 could be different as a result.
136
137 1. If the value changing is in memory, except in special cases
138 ANYTHING referring to memory could be changed. That is because
139 nobody knows where a pointer does not point.
140 The function `invalidate_memory' removes what is necessary.
141
142 The special cases are when the address is constant or is
143 a constant plus a fixed register such as the frame pointer
144 or a static chain pointer. When such addresses are stored in,
145 we can tell exactly which other such addresses must be invalidated
146 due to overlap. `invalidate' does this.
147 All expressions that refer to non-constant
148 memory addresses are also invalidated. `invalidate_memory' does this.
149
150 2. If the value changing is a register, all expressions
151 containing references to that register, and only those,
152 must be removed.
153
154 Because searching the entire hash table for expressions that contain
155 a register is very slow, we try to figure out when it isn't necessary.
156 Precisely, this is necessary only when expressions have been
157 entered in the hash table using this register, and then the value has
158 changed, and then another expression wants to be added to refer to
159 the register's new value. This sequence of circumstances is rare
160 within any one basic block.
161
162 The vectors `reg_tick' and `reg_in_table' are used to detect this case.
163 reg_tick[i] is incremented whenever a value is stored in register i.
164 reg_in_table[i] holds -1 if no references to register i have been
165 entered in the table; otherwise, it contains the value reg_tick[i] had
166 when the references were entered. If we want to enter a reference
167 and reg_in_table[i] != reg_tick[i], we must scan and remove old references.
168 Until we want to enter a new entry, the mere fact that the two vectors
169 don't match makes the entries be ignored if anyone tries to match them.
170
171 Registers themselves are entered in the hash table as well as in
172 the equivalent-register chains. However, the vectors `reg_tick'
173 and `reg_in_table' do not apply to expressions which are simple
174 register references. These expressions are removed from the table
175 immediately when they become invalid, and this can be done even if
176 we do not immediately search for all the expressions that refer to
177 the register.
178
179 A CLOBBER rtx in an instruction invalidates its operand for further
180 reuse. A CLOBBER or SET rtx whose operand is a MEM:BLK
181 invalidates everything that resides in memory.
182
183Related expressions:
184
185 Constant expressions that differ only by an additive integer
186 are called related. When a constant expression is put in
187 the table, the related expression with no constant term
188 is also entered. These are made to point at each other
189 so that it is possible to find out if there exists any
190 register equivalent to an expression related to a given expression. */
191
192/* One plus largest register number used in this function. */
193
194static int max_reg;
195
556c714b
JW
196/* One plus largest instruction UID used in this function at time of
197 cse_main call. */
198
199static int max_insn_uid;
200
7afe21cc
RK
201/* Length of vectors indexed by quantity number.
202 We know in advance we will not need a quantity number this big. */
203
204static int max_qty;
205
206/* Next quantity number to be allocated.
207 This is 1 + the largest number needed so far. */
208
209static int next_qty;
210
71d306d1 211/* Indexed by quantity number, gives the first (or last) register
7afe21cc
RK
212 in the chain of registers that currently contain this quantity. */
213
214static int *qty_first_reg;
215static int *qty_last_reg;
216
217/* Index by quantity number, gives the mode of the quantity. */
218
219static enum machine_mode *qty_mode;
220
221/* Indexed by quantity number, gives the rtx of the constant value of the
222 quantity, or zero if it does not have a known value.
223 A sum of the frame pointer (or arg pointer) plus a constant
224 can also be entered here. */
225
226static rtx *qty_const;
227
228/* Indexed by qty number, gives the insn that stored the constant value
229 recorded in `qty_const'. */
230
231static rtx *qty_const_insn;
232
233/* The next three variables are used to track when a comparison between a
234 quantity and some constant or register has been passed. In that case, we
235 know the results of the comparison in case we see it again. These variables
236 record a comparison that is known to be true. */
237
238/* Indexed by qty number, gives the rtx code of a comparison with a known
239 result involving this quantity. If none, it is UNKNOWN. */
240static enum rtx_code *qty_comparison_code;
241
242/* Indexed by qty number, gives the constant being compared against in a
243 comparison of known result. If no such comparison, it is undefined.
244 If the comparison is not with a constant, it is zero. */
245
246static rtx *qty_comparison_const;
247
248/* Indexed by qty number, gives the quantity being compared against in a
249 comparison of known result. If no such comparison, if it undefined.
250 If the comparison is not with a register, it is -1. */
251
252static int *qty_comparison_qty;
253
254#ifdef HAVE_cc0
255/* For machines that have a CC0, we do not record its value in the hash
256 table since its use is guaranteed to be the insn immediately following
257 its definition and any other insn is presumed to invalidate it.
258
259 Instead, we store below the value last assigned to CC0. If it should
260 happen to be a constant, it is stored in preference to the actual
261 assigned value. In case it is a constant, we store the mode in which
262 the constant should be interpreted. */
263
264static rtx prev_insn_cc0;
265static enum machine_mode prev_insn_cc0_mode;
266#endif
267
268/* Previous actual insn. 0 if at first insn of basic block. */
269
270static rtx prev_insn;
271
272/* Insn being scanned. */
273
274static rtx this_insn;
275
71d306d1 276/* Index by register number, gives the quantity number
7afe21cc
RK
277 of the register's current contents. */
278
279static int *reg_qty;
280
71d306d1
DE
281/* Index by register number, gives the number of the next (or
282 previous) register in the chain of registers sharing the same
7afe21cc
RK
283 value.
284
285 Or -1 if this register is at the end of the chain.
286
287 If reg_qty[N] == N, reg_next_eqv[N] is undefined. */
288
289static int *reg_next_eqv;
290static int *reg_prev_eqv;
291
71d306d1 292/* Index by register number, gives the number of times
7afe21cc
RK
293 that register has been altered in the current basic block. */
294
295static int *reg_tick;
296
71d306d1 297/* Index by register number, gives the reg_tick value at which
7afe21cc
RK
298 rtx's containing this register are valid in the hash table.
299 If this does not equal the current reg_tick value, such expressions
300 existing in the hash table are invalid.
301 If this is -1, no expressions containing this register have been
302 entered in the table. */
303
304static int *reg_in_table;
305
306/* A HARD_REG_SET containing all the hard registers for which there is
307 currently a REG expression in the hash table. Note the difference
308 from the above variables, which indicate if the REG is mentioned in some
309 expression in the table. */
310
311static HARD_REG_SET hard_regs_in_table;
312
313/* A HARD_REG_SET containing all the hard registers that are invalidated
314 by a CALL_INSN. */
315
316static HARD_REG_SET regs_invalidated_by_call;
317
318/* Two vectors of ints:
319 one containing max_reg -1's; the other max_reg + 500 (an approximation
320 for max_qty) elements where element i contains i.
321 These are used to initialize various other vectors fast. */
322
323static int *all_minus_one;
324static int *consec_ints;
325
326/* CUID of insn that starts the basic block currently being cse-processed. */
327
328static int cse_basic_block_start;
329
330/* CUID of insn that ends the basic block currently being cse-processed. */
331
332static int cse_basic_block_end;
333
334/* Vector mapping INSN_UIDs to cuids.
d45cf215 335 The cuids are like uids but increase monotonically always.
7afe21cc
RK
336 We use them to see whether a reg is used outside a given basic block. */
337
906c4e36 338static int *uid_cuid;
7afe21cc 339
164c8956
RK
340/* Highest UID in UID_CUID. */
341static int max_uid;
342
7afe21cc
RK
343/* Get the cuid of an insn. */
344
345#define INSN_CUID(INSN) (uid_cuid[INSN_UID (INSN)])
346
347/* Nonzero if cse has altered conditional jump insns
348 in such a way that jump optimization should be redone. */
349
350static int cse_jumps_altered;
351
a5dfb4ee
RK
352/* Nonzero if we put a LABEL_REF into the hash table. Since we may have put
353 it into an INSN without a REG_LABEL, we have to rerun jump after CSE
354 to put in the note. */
355static int recorded_label_ref;
356
7afe21cc
RK
357/* canon_hash stores 1 in do_not_record
358 if it notices a reference to CC0, PC, or some other volatile
359 subexpression. */
360
361static int do_not_record;
362
7bac1be0
RK
363#ifdef LOAD_EXTEND_OP
364
365/* Scratch rtl used when looking for load-extended copy of a MEM. */
366static rtx memory_extend_rtx;
367#endif
368
7afe21cc
RK
369/* canon_hash stores 1 in hash_arg_in_memory
370 if it notices a reference to memory within the expression being hashed. */
371
372static int hash_arg_in_memory;
373
374/* canon_hash stores 1 in hash_arg_in_struct
375 if it notices a reference to memory that's part of a structure. */
376
377static int hash_arg_in_struct;
378
379/* The hash table contains buckets which are chains of `struct table_elt's,
380 each recording one expression's information.
381 That expression is in the `exp' field.
382
383 Those elements with the same hash code are chained in both directions
384 through the `next_same_hash' and `prev_same_hash' fields.
385
386 Each set of expressions with equivalent values
387 are on a two-way chain through the `next_same_value'
388 and `prev_same_value' fields, and all point with
389 the `first_same_value' field at the first element in
390 that chain. The chain is in order of increasing cost.
391 Each element's cost value is in its `cost' field.
392
393 The `in_memory' field is nonzero for elements that
394 involve any reference to memory. These elements are removed
395 whenever a write is done to an unidentified location in memory.
396 To be safe, we assume that a memory address is unidentified unless
397 the address is either a symbol constant or a constant plus
398 the frame pointer or argument pointer.
399
400 The `in_struct' field is nonzero for elements that
401 involve any reference to memory inside a structure or array.
402
403 The `related_value' field is used to connect related expressions
404 (that differ by adding an integer).
405 The related expressions are chained in a circular fashion.
406 `related_value' is zero for expressions for which this
407 chain is not useful.
408
409 The `cost' field stores the cost of this element's expression.
410
411 The `is_const' flag is set if the element is a constant (including
412 a fixed address).
413
414 The `flag' field is used as a temporary during some search routines.
415
416 The `mode' field is usually the same as GET_MODE (`exp'), but
417 if `exp' is a CONST_INT and has no machine mode then the `mode'
418 field is the mode it was being used as. Each constant is
419 recorded separately for each mode it is used with. */
420
421
422struct table_elt
423{
424 rtx exp;
425 struct table_elt *next_same_hash;
426 struct table_elt *prev_same_hash;
427 struct table_elt *next_same_value;
428 struct table_elt *prev_same_value;
429 struct table_elt *first_same_value;
430 struct table_elt *related_value;
431 int cost;
432 enum machine_mode mode;
433 char in_memory;
434 char in_struct;
435 char is_const;
436 char flag;
437};
438
7afe21cc
RK
439/* We don't want a lot of buckets, because we rarely have very many
440 things stored in the hash table, and a lot of buckets slows
441 down a lot of loops that happen frequently. */
442#define NBUCKETS 31
443
444/* Compute hash code of X in mode M. Special-case case where X is a pseudo
445 register (hard registers may require `do_not_record' to be set). */
446
447#define HASH(X, M) \
448 (GET_CODE (X) == REG && REGNO (X) >= FIRST_PSEUDO_REGISTER \
2197a88a 449 ? (((unsigned) REG << 7) + (unsigned) reg_qty[REGNO (X)]) % NBUCKETS \
7afe21cc
RK
450 : canon_hash (X, M) % NBUCKETS)
451
452/* Determine whether register number N is considered a fixed register for CSE.
453 It is desirable to replace other regs with fixed regs, to reduce need for
454 non-fixed hard regs.
455 A reg wins if it is either the frame pointer or designated as fixed,
456 but not if it is an overlapping register. */
457#ifdef OVERLAPPING_REGNO_P
458#define FIXED_REGNO_P(N) \
8bc169f2 459 (((N) == FRAME_POINTER_REGNUM || (N) == HARD_FRAME_POINTER_REGNUM \
6ab832bc 460 || fixed_regs[N] || global_regs[N]) \
7afe21cc
RK
461 && ! OVERLAPPING_REGNO_P ((N)))
462#else
463#define FIXED_REGNO_P(N) \
8bc169f2 464 ((N) == FRAME_POINTER_REGNUM || (N) == HARD_FRAME_POINTER_REGNUM \
6ab832bc 465 || fixed_regs[N] || global_regs[N])
7afe21cc
RK
466#endif
467
468/* Compute cost of X, as stored in the `cost' field of a table_elt. Fixed
ac07e066
RK
469 hard registers and pointers into the frame are the cheapest with a cost
470 of 0. Next come pseudos with a cost of one and other hard registers with
471 a cost of 2. Aside from these special cases, call `rtx_cost'. */
472
6ab832bc 473#define CHEAP_REGNO(N) \
8bc169f2
DE
474 ((N) == FRAME_POINTER_REGNUM || (N) == HARD_FRAME_POINTER_REGNUM \
475 || (N) == STACK_POINTER_REGNUM || (N) == ARG_POINTER_REGNUM \
476 || ((N) >= FIRST_VIRTUAL_REGISTER && (N) <= LAST_VIRTUAL_REGISTER) \
477 || ((N) < FIRST_PSEUDO_REGISTER \
e7bb59fa 478 && FIXED_REGNO_P (N) && REGNO_REG_CLASS (N) != NO_REGS))
7afe21cc 479
6ab832bc
RK
480/* A register is cheap if it is a user variable assigned to the register
481 or if its register number always corresponds to a cheap register. */
482
483#define CHEAP_REG(N) \
484 ((REG_USERVAR_P (N) && REGNO (N) < FIRST_PSEUDO_REGISTER) \
485 || CHEAP_REGNO (REGNO (N)))
486
38734e55
ILT
487#define COST(X) \
488 (GET_CODE (X) == REG \
489 ? (CHEAP_REG (X) ? 0 \
490 : REGNO (X) >= FIRST_PSEUDO_REGISTER ? 1 \
491 : 2) \
954a5693 492 : notreg_cost(X))
7afe21cc
RK
493
494/* Determine if the quantity number for register X represents a valid index
495 into the `qty_...' variables. */
496
497#define REGNO_QTY_VALID_P(N) (reg_qty[N] != (N))
498
499static struct table_elt *table[NBUCKETS];
500
501/* Chain of `struct table_elt's made so far for this function
502 but currently removed from the table. */
503
504static struct table_elt *free_element_chain;
505
506/* Number of `struct table_elt' structures made so far for this function. */
507
508static int n_elements_made;
509
510/* Maximum value `n_elements_made' has had so far in this compilation
511 for functions previously processed. */
512
513static int max_elements_made;
514
515/* Surviving equivalence class when two equivalence classes are merged
516 by recording the effects of a jump in the last insn. Zero if the
517 last insn was not a conditional jump. */
518
519static struct table_elt *last_jump_equiv_class;
520
521/* Set to the cost of a constant pool reference if one was found for a
522 symbolic constant. If this was found, it means we should try to
523 convert constants into constant pool entries if they don't fit in
524 the insn. */
525
526static int constant_pool_entries_cost;
527
6cd4575e
RK
528/* Define maximum length of a branch path. */
529
530#define PATHLENGTH 10
531
532/* This data describes a block that will be processed by cse_basic_block. */
533
534struct cse_basic_block_data {
535 /* Lowest CUID value of insns in block. */
536 int low_cuid;
537 /* Highest CUID value of insns in block. */
538 int high_cuid;
539 /* Total number of SETs in block. */
540 int nsets;
541 /* Last insn in the block. */
542 rtx last;
543 /* Size of current branch path, if any. */
544 int path_size;
545 /* Current branch path, indicating which branches will be taken. */
546 struct branch_path {
0f41302f 547 /* The branch insn. */
6cd4575e
RK
548 rtx branch;
549 /* Whether it should be taken or not. AROUND is the same as taken
550 except that it is used when the destination label is not preceded
551 by a BARRIER. */
552 enum taken {TAKEN, NOT_TAKEN, AROUND} status;
553 } path[PATHLENGTH];
554};
555
7afe21cc
RK
556/* Nonzero if X has the form (PLUS frame-pointer integer). We check for
557 virtual regs here because the simplify_*_operation routines are called
558 by integrate.c, which is called before virtual register instantiation. */
559
560#define FIXED_BASE_PLUS_P(X) \
8bc169f2
DE
561 ((X) == frame_pointer_rtx || (X) == hard_frame_pointer_rtx \
562 || (X) == arg_pointer_rtx \
7afe21cc
RK
563 || (X) == virtual_stack_vars_rtx \
564 || (X) == virtual_incoming_args_rtx \
565 || (GET_CODE (X) == PLUS && GET_CODE (XEXP (X, 1)) == CONST_INT \
566 && (XEXP (X, 0) == frame_pointer_rtx \
8bc169f2 567 || XEXP (X, 0) == hard_frame_pointer_rtx \
7afe21cc
RK
568 || XEXP (X, 0) == arg_pointer_rtx \
569 || XEXP (X, 0) == virtual_stack_vars_rtx \
e9a25f70
JL
570 || XEXP (X, 0) == virtual_incoming_args_rtx)) \
571 || GET_CODE (X) == ADDRESSOF)
7afe21cc 572
6f90e075
JW
573/* Similar, but also allows reference to the stack pointer.
574
575 This used to include FIXED_BASE_PLUS_P, however, we can't assume that
576 arg_pointer_rtx by itself is nonzero, because on at least one machine,
577 the i960, the arg pointer is zero when it is unused. */
7afe21cc
RK
578
579#define NONZERO_BASE_PLUS_P(X) \
8bc169f2 580 ((X) == frame_pointer_rtx || (X) == hard_frame_pointer_rtx \
6f90e075
JW
581 || (X) == virtual_stack_vars_rtx \
582 || (X) == virtual_incoming_args_rtx \
583 || (GET_CODE (X) == PLUS && GET_CODE (XEXP (X, 1)) == CONST_INT \
584 && (XEXP (X, 0) == frame_pointer_rtx \
8bc169f2 585 || XEXP (X, 0) == hard_frame_pointer_rtx \
6f90e075
JW
586 || XEXP (X, 0) == arg_pointer_rtx \
587 || XEXP (X, 0) == virtual_stack_vars_rtx \
588 || XEXP (X, 0) == virtual_incoming_args_rtx)) \
7afe21cc
RK
589 || (X) == stack_pointer_rtx \
590 || (X) == virtual_stack_dynamic_rtx \
591 || (X) == virtual_outgoing_args_rtx \
592 || (GET_CODE (X) == PLUS && GET_CODE (XEXP (X, 1)) == CONST_INT \
593 && (XEXP (X, 0) == stack_pointer_rtx \
594 || XEXP (X, 0) == virtual_stack_dynamic_rtx \
e9a25f70
JL
595 || XEXP (X, 0) == virtual_outgoing_args_rtx)) \
596 || GET_CODE (X) == ADDRESSOF)
7afe21cc 597
954a5693 598static int notreg_cost PROTO((rtx));
6cd4575e
RK
599static void new_basic_block PROTO((void));
600static void make_new_qty PROTO((int));
601static void make_regs_eqv PROTO((int, int));
602static void delete_reg_equiv PROTO((int));
603static int mention_regs PROTO((rtx));
604static int insert_regs PROTO((rtx, struct table_elt *, int));
605static void free_element PROTO((struct table_elt *));
2197a88a 606static void remove_from_table PROTO((struct table_elt *, unsigned));
6cd4575e 607static struct table_elt *get_element PROTO((void));
2197a88a
RK
608static struct table_elt *lookup PROTO((rtx, unsigned, enum machine_mode)),
609 *lookup_for_remove PROTO((rtx, unsigned, enum machine_mode));
6cd4575e 610static rtx lookup_as_function PROTO((rtx, enum rtx_code));
2197a88a 611static struct table_elt *insert PROTO((rtx, struct table_elt *, unsigned,
6cd4575e
RK
612 enum machine_mode));
613static void merge_equiv_classes PROTO((struct table_elt *,
614 struct table_elt *));
68c1e173 615static void invalidate PROTO((rtx, enum machine_mode));
9ae8ffe7 616static int cse_rtx_varies_p PROTO((rtx));
6cd4575e
RK
617static void remove_invalid_refs PROTO((int));
618static void rehash_using_reg PROTO((rtx));
9ae8ffe7 619static void invalidate_memory PROTO((void));
6cd4575e
RK
620static void invalidate_for_call PROTO((void));
621static rtx use_related_value PROTO((rtx, struct table_elt *));
2197a88a
RK
622static unsigned canon_hash PROTO((rtx, enum machine_mode));
623static unsigned safe_hash PROTO((rtx, enum machine_mode));
6cd4575e 624static int exp_equiv_p PROTO((rtx, rtx, int, int));
f451db89 625static void set_nonvarying_address_components PROTO((rtx, int, rtx *,
6500fb43
RK
626 HOST_WIDE_INT *,
627 HOST_WIDE_INT *));
6cd4575e 628static int refers_to_p PROTO((rtx, rtx));
6cd4575e
RK
629static rtx canon_reg PROTO((rtx, rtx));
630static void find_best_addr PROTO((rtx, rtx *));
631static enum rtx_code find_comparison_args PROTO((enum rtx_code, rtx *, rtx *,
632 enum machine_mode *,
633 enum machine_mode *));
96b0e481
RK
634static rtx cse_gen_binary PROTO((enum rtx_code, enum machine_mode,
635 rtx, rtx));
636static rtx simplify_plus_minus PROTO((enum rtx_code, enum machine_mode,
637 rtx, rtx));
6cd4575e
RK
638static rtx fold_rtx PROTO((rtx, rtx));
639static rtx equiv_constant PROTO((rtx));
640static void record_jump_equiv PROTO((rtx, int));
641static void record_jump_cond PROTO((enum rtx_code, enum machine_mode,
642 rtx, rtx, int));
643static void cse_insn PROTO((rtx, int));
9ae8ffe7
JL
644static int note_mem_written PROTO((rtx));
645static void invalidate_from_clobbers PROTO((rtx));
6cd4575e
RK
646static rtx cse_process_notes PROTO((rtx, rtx));
647static void cse_around_loop PROTO((rtx));
648static void invalidate_skipped_set PROTO((rtx, rtx));
649static void invalidate_skipped_block PROTO((rtx));
650static void cse_check_loop_start PROTO((rtx, rtx));
651static void cse_set_around_loop PROTO((rtx, rtx, rtx));
652static rtx cse_basic_block PROTO((rtx, rtx, struct branch_path *, int));
79644f06 653static void count_reg_usage PROTO((rtx, int *, rtx, int));
c407b802
RK
654
655extern int rtx_equal_function_value_matters;
7afe21cc
RK
656\f
657/* Return an estimate of the cost of computing rtx X.
658 One use is in cse, to decide which expression to keep in the hash table.
659 Another is in rtl generation, to pick the cheapest way to multiply.
660 Other uses like the latter are expected in the future. */
661
954a5693
RK
662/* Internal function, to compute cost when X is not a register; called
663 from COST macro to keep it simple. */
664
665static int
666notreg_cost (x)
667 rtx x;
668{
669 return ((GET_CODE (x) == SUBREG
670 && GET_CODE (SUBREG_REG (x)) == REG
671 && GET_MODE_CLASS (GET_MODE (x)) == MODE_INT
672 && GET_MODE_CLASS (GET_MODE (SUBREG_REG (x))) == MODE_INT
673 && (GET_MODE_SIZE (GET_MODE (x))
674 < GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))))
675 && subreg_lowpart_p (x)
676 && TRULY_NOOP_TRUNCATION (GET_MODE_BITSIZE (GET_MODE (x)),
677 GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (x)))))
678 ? (CHEAP_REG (SUBREG_REG (x)) ? 0
679 : (REGNO (SUBREG_REG (x)) >= FIRST_PSEUDO_REGISTER ? 1
680 : 2))
681 : rtx_cost (x, SET) * 2);
682}
683
7afe21cc
RK
684/* Return the right cost to give to an operation
685 to make the cost of the corresponding register-to-register instruction
686 N times that of a fast register-to-register instruction. */
687
688#define COSTS_N_INSNS(N) ((N) * 4 - 2)
689
690int
e5f6a288 691rtx_cost (x, outer_code)
7afe21cc 692 rtx x;
e5f6a288 693 enum rtx_code outer_code;
7afe21cc
RK
694{
695 register int i, j;
696 register enum rtx_code code;
697 register char *fmt;
698 register int total;
699
700 if (x == 0)
701 return 0;
702
703 /* Compute the default costs of certain things.
704 Note that RTX_COSTS can override the defaults. */
705
706 code = GET_CODE (x);
707 switch (code)
708 {
709 case MULT:
710 /* Count multiplication by 2**n as a shift,
711 because if we are considering it, we would output it as a shift. */
712 if (GET_CODE (XEXP (x, 1)) == CONST_INT
713 && exact_log2 (INTVAL (XEXP (x, 1))) >= 0)
714 total = 2;
715 else
716 total = COSTS_N_INSNS (5);
717 break;
718 case DIV:
719 case UDIV:
720 case MOD:
721 case UMOD:
722 total = COSTS_N_INSNS (7);
723 break;
724 case USE:
725 /* Used in loop.c and combine.c as a marker. */
726 total = 0;
727 break;
538b78e7
RS
728 case ASM_OPERANDS:
729 /* We don't want these to be used in substitutions because
730 we have no way of validating the resulting insn. So assign
731 anything containing an ASM_OPERANDS a very high cost. */
732 total = 1000;
733 break;
7afe21cc
RK
734 default:
735 total = 2;
736 }
737
738 switch (code)
739 {
740 case REG:
6ab832bc 741 return ! CHEAP_REG (x);
ac07e066 742
7afe21cc 743 case SUBREG:
fc3ffe83
RK
744 /* If we can't tie these modes, make this expensive. The larger
745 the mode, the more expensive it is. */
746 if (! MODES_TIEABLE_P (GET_MODE (x), GET_MODE (SUBREG_REG (x))))
747 return COSTS_N_INSNS (2
748 + GET_MODE_SIZE (GET_MODE (x)) / UNITS_PER_WORD);
7afe21cc
RK
749 return 2;
750#ifdef RTX_COSTS
e5f6a288 751 RTX_COSTS (x, code, outer_code);
7afe21cc 752#endif
e5f6a288 753 CONST_COSTS (x, code, outer_code);
8625fab5
KG
754
755 default:
756#ifdef DEFAULT_RTX_COSTS
757 DEFAULT_RTX_COSTS(x, code, outer_code);
758#endif
759 break;
7afe21cc
RK
760 }
761
762 /* Sum the costs of the sub-rtx's, plus cost of this operation,
763 which is already in total. */
764
765 fmt = GET_RTX_FORMAT (code);
766 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
767 if (fmt[i] == 'e')
e5f6a288 768 total += rtx_cost (XEXP (x, i), code);
7afe21cc
RK
769 else if (fmt[i] == 'E')
770 for (j = 0; j < XVECLEN (x, i); j++)
e5f6a288 771 total += rtx_cost (XVECEXP (x, i, j), code);
7afe21cc
RK
772
773 return total;
774}
775\f
776/* Clear the hash table and initialize each register with its own quantity,
777 for a new basic block. */
778
779static void
780new_basic_block ()
781{
782 register int i;
783
784 next_qty = max_reg;
785
4c9a05bc 786 bzero ((char *) reg_tick, max_reg * sizeof (int));
7afe21cc 787
4c9a05bc
RK
788 bcopy ((char *) all_minus_one, (char *) reg_in_table,
789 max_reg * sizeof (int));
790 bcopy ((char *) consec_ints, (char *) reg_qty, max_reg * sizeof (int));
7afe21cc
RK
791 CLEAR_HARD_REG_SET (hard_regs_in_table);
792
793 /* The per-quantity values used to be initialized here, but it is
794 much faster to initialize each as it is made in `make_new_qty'. */
795
796 for (i = 0; i < NBUCKETS; i++)
797 {
798 register struct table_elt *this, *next;
799 for (this = table[i]; this; this = next)
800 {
801 next = this->next_same_hash;
802 free_element (this);
803 }
804 }
805
4c9a05bc 806 bzero ((char *) table, sizeof table);
7afe21cc
RK
807
808 prev_insn = 0;
809
810#ifdef HAVE_cc0
811 prev_insn_cc0 = 0;
812#endif
813}
814
815/* Say that register REG contains a quantity not in any register before
816 and initialize that quantity. */
817
818static void
819make_new_qty (reg)
820 register int reg;
821{
822 register int q;
823
824 if (next_qty >= max_qty)
825 abort ();
826
827 q = reg_qty[reg] = next_qty++;
828 qty_first_reg[q] = reg;
829 qty_last_reg[q] = reg;
830 qty_const[q] = qty_const_insn[q] = 0;
831 qty_comparison_code[q] = UNKNOWN;
832
833 reg_next_eqv[reg] = reg_prev_eqv[reg] = -1;
834}
835
836/* Make reg NEW equivalent to reg OLD.
837 OLD is not changing; NEW is. */
838
839static void
840make_regs_eqv (new, old)
841 register int new, old;
842{
843 register int lastr, firstr;
844 register int q = reg_qty[old];
845
846 /* Nothing should become eqv until it has a "non-invalid" qty number. */
847 if (! REGNO_QTY_VALID_P (old))
848 abort ();
849
850 reg_qty[new] = q;
851 firstr = qty_first_reg[q];
852 lastr = qty_last_reg[q];
853
854 /* Prefer fixed hard registers to anything. Prefer pseudo regs to other
855 hard regs. Among pseudos, if NEW will live longer than any other reg
856 of the same qty, and that is beyond the current basic block,
857 make it the new canonical replacement for this qty. */
858 if (! (firstr < FIRST_PSEUDO_REGISTER && FIXED_REGNO_P (firstr))
859 /* Certain fixed registers might be of the class NO_REGS. This means
860 that not only can they not be allocated by the compiler, but
830a38ee 861 they cannot be used in substitutions or canonicalizations
7afe21cc
RK
862 either. */
863 && (new >= FIRST_PSEUDO_REGISTER || REGNO_REG_CLASS (new) != NO_REGS)
864 && ((new < FIRST_PSEUDO_REGISTER && FIXED_REGNO_P (new))
865 || (new >= FIRST_PSEUDO_REGISTER
866 && (firstr < FIRST_PSEUDO_REGISTER
b1f21e0a
MM
867 || ((uid_cuid[REGNO_LAST_UID (new)] > cse_basic_block_end
868 || (uid_cuid[REGNO_FIRST_UID (new)]
7afe21cc 869 < cse_basic_block_start))
b1f21e0a
MM
870 && (uid_cuid[REGNO_LAST_UID (new)]
871 > uid_cuid[REGNO_LAST_UID (firstr)]))))))
7afe21cc
RK
872 {
873 reg_prev_eqv[firstr] = new;
874 reg_next_eqv[new] = firstr;
875 reg_prev_eqv[new] = -1;
876 qty_first_reg[q] = new;
877 }
878 else
879 {
880 /* If NEW is a hard reg (known to be non-fixed), insert at end.
881 Otherwise, insert before any non-fixed hard regs that are at the
882 end. Registers of class NO_REGS cannot be used as an
883 equivalent for anything. */
884 while (lastr < FIRST_PSEUDO_REGISTER && reg_prev_eqv[lastr] >= 0
885 && (REGNO_REG_CLASS (lastr) == NO_REGS || ! FIXED_REGNO_P (lastr))
886 && new >= FIRST_PSEUDO_REGISTER)
887 lastr = reg_prev_eqv[lastr];
888 reg_next_eqv[new] = reg_next_eqv[lastr];
889 if (reg_next_eqv[lastr] >= 0)
890 reg_prev_eqv[reg_next_eqv[lastr]] = new;
891 else
892 qty_last_reg[q] = new;
893 reg_next_eqv[lastr] = new;
894 reg_prev_eqv[new] = lastr;
895 }
896}
897
898/* Remove REG from its equivalence class. */
899
900static void
901delete_reg_equiv (reg)
902 register int reg;
903{
7afe21cc 904 register int q = reg_qty[reg];
a4e262bc 905 register int p, n;
7afe21cc 906
a4e262bc 907 /* If invalid, do nothing. */
7afe21cc
RK
908 if (q == reg)
909 return;
910
a4e262bc
RK
911 p = reg_prev_eqv[reg];
912 n = reg_next_eqv[reg];
913
7afe21cc
RK
914 if (n != -1)
915 reg_prev_eqv[n] = p;
916 else
917 qty_last_reg[q] = p;
918 if (p != -1)
919 reg_next_eqv[p] = n;
920 else
921 qty_first_reg[q] = n;
922
923 reg_qty[reg] = reg;
924}
925
926/* Remove any invalid expressions from the hash table
927 that refer to any of the registers contained in expression X.
928
929 Make sure that newly inserted references to those registers
930 as subexpressions will be considered valid.
931
932 mention_regs is not called when a register itself
933 is being stored in the table.
934
935 Return 1 if we have done something that may have changed the hash code
936 of X. */
937
938static int
939mention_regs (x)
940 rtx x;
941{
942 register enum rtx_code code;
943 register int i, j;
944 register char *fmt;
945 register int changed = 0;
946
947 if (x == 0)
e5f6a288 948 return 0;
7afe21cc
RK
949
950 code = GET_CODE (x);
951 if (code == REG)
952 {
953 register int regno = REGNO (x);
954 register int endregno
955 = regno + (regno >= FIRST_PSEUDO_REGISTER ? 1
956 : HARD_REGNO_NREGS (regno, GET_MODE (x)));
957 int i;
958
959 for (i = regno; i < endregno; i++)
960 {
961 if (reg_in_table[i] >= 0 && reg_in_table[i] != reg_tick[i])
962 remove_invalid_refs (i);
963
964 reg_in_table[i] = reg_tick[i];
965 }
966
967 return 0;
968 }
969
970 /* If X is a comparison or a COMPARE and either operand is a register
971 that does not have a quantity, give it one. This is so that a later
972 call to record_jump_equiv won't cause X to be assigned a different
973 hash code and not found in the table after that call.
974
975 It is not necessary to do this here, since rehash_using_reg can
976 fix up the table later, but doing this here eliminates the need to
977 call that expensive function in the most common case where the only
978 use of the register is in the comparison. */
979
980 if (code == COMPARE || GET_RTX_CLASS (code) == '<')
981 {
982 if (GET_CODE (XEXP (x, 0)) == REG
983 && ! REGNO_QTY_VALID_P (REGNO (XEXP (x, 0))))
906c4e36 984 if (insert_regs (XEXP (x, 0), NULL_PTR, 0))
7afe21cc
RK
985 {
986 rehash_using_reg (XEXP (x, 0));
987 changed = 1;
988 }
989
990 if (GET_CODE (XEXP (x, 1)) == REG
991 && ! REGNO_QTY_VALID_P (REGNO (XEXP (x, 1))))
906c4e36 992 if (insert_regs (XEXP (x, 1), NULL_PTR, 0))
7afe21cc
RK
993 {
994 rehash_using_reg (XEXP (x, 1));
995 changed = 1;
996 }
997 }
998
999 fmt = GET_RTX_FORMAT (code);
1000 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1001 if (fmt[i] == 'e')
1002 changed |= mention_regs (XEXP (x, i));
1003 else if (fmt[i] == 'E')
1004 for (j = 0; j < XVECLEN (x, i); j++)
1005 changed |= mention_regs (XVECEXP (x, i, j));
1006
1007 return changed;
1008}
1009
1010/* Update the register quantities for inserting X into the hash table
1011 with a value equivalent to CLASSP.
1012 (If the class does not contain a REG, it is irrelevant.)
1013 If MODIFIED is nonzero, X is a destination; it is being modified.
1014 Note that delete_reg_equiv should be called on a register
1015 before insert_regs is done on that register with MODIFIED != 0.
1016
1017 Nonzero value means that elements of reg_qty have changed
1018 so X's hash code may be different. */
1019
1020static int
1021insert_regs (x, classp, modified)
1022 rtx x;
1023 struct table_elt *classp;
1024 int modified;
1025{
1026 if (GET_CODE (x) == REG)
1027 {
1028 register int regno = REGNO (x);
1029
1ff0c00d
RK
1030 /* If REGNO is in the equivalence table already but is of the
1031 wrong mode for that equivalence, don't do anything here. */
1032
1033 if (REGNO_QTY_VALID_P (regno)
1034 && qty_mode[reg_qty[regno]] != GET_MODE (x))
1035 return 0;
1036
1037 if (modified || ! REGNO_QTY_VALID_P (regno))
7afe21cc
RK
1038 {
1039 if (classp)
1040 for (classp = classp->first_same_value;
1041 classp != 0;
1042 classp = classp->next_same_value)
1043 if (GET_CODE (classp->exp) == REG
1044 && GET_MODE (classp->exp) == GET_MODE (x))
1045 {
1046 make_regs_eqv (regno, REGNO (classp->exp));
1047 return 1;
1048 }
1049
1050 make_new_qty (regno);
1051 qty_mode[reg_qty[regno]] = GET_MODE (x);
1052 return 1;
1053 }
cdf4112f
TG
1054
1055 return 0;
7afe21cc 1056 }
c610adec
RK
1057
1058 /* If X is a SUBREG, we will likely be inserting the inner register in the
1059 table. If that register doesn't have an assigned quantity number at
1060 this point but does later, the insertion that we will be doing now will
1061 not be accessible because its hash code will have changed. So assign
1062 a quantity number now. */
1063
1064 else if (GET_CODE (x) == SUBREG && GET_CODE (SUBREG_REG (x)) == REG
1065 && ! REGNO_QTY_VALID_P (REGNO (SUBREG_REG (x))))
1066 {
906c4e36 1067 insert_regs (SUBREG_REG (x), NULL_PTR, 0);
c610adec
RK
1068 mention_regs (SUBREG_REG (x));
1069 return 1;
1070 }
7afe21cc
RK
1071 else
1072 return mention_regs (x);
1073}
1074\f
1075/* Look in or update the hash table. */
1076
1077/* Put the element ELT on the list of free elements. */
1078
1079static void
1080free_element (elt)
1081 struct table_elt *elt;
1082{
1083 elt->next_same_hash = free_element_chain;
1084 free_element_chain = elt;
1085}
1086
1087/* Return an element that is free for use. */
1088
1089static struct table_elt *
1090get_element ()
1091{
1092 struct table_elt *elt = free_element_chain;
1093 if (elt)
1094 {
1095 free_element_chain = elt->next_same_hash;
1096 return elt;
1097 }
1098 n_elements_made++;
1099 return (struct table_elt *) oballoc (sizeof (struct table_elt));
1100}
1101
1102/* Remove table element ELT from use in the table.
1103 HASH is its hash code, made using the HASH macro.
1104 It's an argument because often that is known in advance
1105 and we save much time not recomputing it. */
1106
1107static void
1108remove_from_table (elt, hash)
1109 register struct table_elt *elt;
2197a88a 1110 unsigned hash;
7afe21cc
RK
1111{
1112 if (elt == 0)
1113 return;
1114
1115 /* Mark this element as removed. See cse_insn. */
1116 elt->first_same_value = 0;
1117
1118 /* Remove the table element from its equivalence class. */
1119
1120 {
1121 register struct table_elt *prev = elt->prev_same_value;
1122 register struct table_elt *next = elt->next_same_value;
1123
1124 if (next) next->prev_same_value = prev;
1125
1126 if (prev)
1127 prev->next_same_value = next;
1128 else
1129 {
1130 register struct table_elt *newfirst = next;
1131 while (next)
1132 {
1133 next->first_same_value = newfirst;
1134 next = next->next_same_value;
1135 }
1136 }
1137 }
1138
1139 /* Remove the table element from its hash bucket. */
1140
1141 {
1142 register struct table_elt *prev = elt->prev_same_hash;
1143 register struct table_elt *next = elt->next_same_hash;
1144
1145 if (next) next->prev_same_hash = prev;
1146
1147 if (prev)
1148 prev->next_same_hash = next;
1149 else if (table[hash] == elt)
1150 table[hash] = next;
1151 else
1152 {
1153 /* This entry is not in the proper hash bucket. This can happen
1154 when two classes were merged by `merge_equiv_classes'. Search
1155 for the hash bucket that it heads. This happens only very
1156 rarely, so the cost is acceptable. */
1157 for (hash = 0; hash < NBUCKETS; hash++)
1158 if (table[hash] == elt)
1159 table[hash] = next;
1160 }
1161 }
1162
1163 /* Remove the table element from its related-value circular chain. */
1164
1165 if (elt->related_value != 0 && elt->related_value != elt)
1166 {
1167 register struct table_elt *p = elt->related_value;
1168 while (p->related_value != elt)
1169 p = p->related_value;
1170 p->related_value = elt->related_value;
1171 if (p->related_value == p)
1172 p->related_value = 0;
1173 }
1174
1175 free_element (elt);
1176}
1177
1178/* Look up X in the hash table and return its table element,
1179 or 0 if X is not in the table.
1180
1181 MODE is the machine-mode of X, or if X is an integer constant
1182 with VOIDmode then MODE is the mode with which X will be used.
1183
1184 Here we are satisfied to find an expression whose tree structure
1185 looks like X. */
1186
1187static struct table_elt *
1188lookup (x, hash, mode)
1189 rtx x;
2197a88a 1190 unsigned hash;
7afe21cc
RK
1191 enum machine_mode mode;
1192{
1193 register struct table_elt *p;
1194
1195 for (p = table[hash]; p; p = p->next_same_hash)
1196 if (mode == p->mode && ((x == p->exp && GET_CODE (x) == REG)
1197 || exp_equiv_p (x, p->exp, GET_CODE (x) != REG, 0)))
1198 return p;
1199
1200 return 0;
1201}
1202
1203/* Like `lookup' but don't care whether the table element uses invalid regs.
1204 Also ignore discrepancies in the machine mode of a register. */
1205
1206static struct table_elt *
1207lookup_for_remove (x, hash, mode)
1208 rtx x;
2197a88a 1209 unsigned hash;
7afe21cc
RK
1210 enum machine_mode mode;
1211{
1212 register struct table_elt *p;
1213
1214 if (GET_CODE (x) == REG)
1215 {
1216 int regno = REGNO (x);
1217 /* Don't check the machine mode when comparing registers;
1218 invalidating (REG:SI 0) also invalidates (REG:DF 0). */
1219 for (p = table[hash]; p; p = p->next_same_hash)
1220 if (GET_CODE (p->exp) == REG
1221 && REGNO (p->exp) == regno)
1222 return p;
1223 }
1224 else
1225 {
1226 for (p = table[hash]; p; p = p->next_same_hash)
1227 if (mode == p->mode && (x == p->exp || exp_equiv_p (x, p->exp, 0, 0)))
1228 return p;
1229 }
1230
1231 return 0;
1232}
1233
1234/* Look for an expression equivalent to X and with code CODE.
1235 If one is found, return that expression. */
1236
1237static rtx
1238lookup_as_function (x, code)
1239 rtx x;
1240 enum rtx_code code;
1241{
1242 register struct table_elt *p = lookup (x, safe_hash (x, VOIDmode) % NBUCKETS,
1243 GET_MODE (x));
1244 if (p == 0)
1245 return 0;
1246
1247 for (p = p->first_same_value; p; p = p->next_same_value)
1248 {
1249 if (GET_CODE (p->exp) == code
1250 /* Make sure this is a valid entry in the table. */
1251 && exp_equiv_p (p->exp, p->exp, 1, 0))
1252 return p->exp;
1253 }
1254
1255 return 0;
1256}
1257
1258/* Insert X in the hash table, assuming HASH is its hash code
1259 and CLASSP is an element of the class it should go in
1260 (or 0 if a new class should be made).
1261 It is inserted at the proper position to keep the class in
1262 the order cheapest first.
1263
1264 MODE is the machine-mode of X, or if X is an integer constant
1265 with VOIDmode then MODE is the mode with which X will be used.
1266
1267 For elements of equal cheapness, the most recent one
1268 goes in front, except that the first element in the list
1269 remains first unless a cheaper element is added. The order of
1270 pseudo-registers does not matter, as canon_reg will be called to
830a38ee 1271 find the cheapest when a register is retrieved from the table.
7afe21cc
RK
1272
1273 The in_memory field in the hash table element is set to 0.
1274 The caller must set it nonzero if appropriate.
1275
1276 You should call insert_regs (X, CLASSP, MODIFY) before calling here,
1277 and if insert_regs returns a nonzero value
1278 you must then recompute its hash code before calling here.
1279
1280 If necessary, update table showing constant values of quantities. */
1281
1282#define CHEAPER(X,Y) ((X)->cost < (Y)->cost)
1283
1284static struct table_elt *
1285insert (x, classp, hash, mode)
1286 register rtx x;
1287 register struct table_elt *classp;
2197a88a 1288 unsigned hash;
7afe21cc
RK
1289 enum machine_mode mode;
1290{
1291 register struct table_elt *elt;
1292
1293 /* If X is a register and we haven't made a quantity for it,
1294 something is wrong. */
1295 if (GET_CODE (x) == REG && ! REGNO_QTY_VALID_P (REGNO (x)))
1296 abort ();
1297
1298 /* If X is a hard register, show it is being put in the table. */
1299 if (GET_CODE (x) == REG && REGNO (x) < FIRST_PSEUDO_REGISTER)
1300 {
1301 int regno = REGNO (x);
1302 int endregno = regno + HARD_REGNO_NREGS (regno, GET_MODE (x));
1303 int i;
1304
1305 for (i = regno; i < endregno; i++)
1306 SET_HARD_REG_BIT (hard_regs_in_table, i);
1307 }
1308
a5dfb4ee 1309 /* If X is a label, show we recorded it. */
970c9ace
RK
1310 if (GET_CODE (x) == LABEL_REF
1311 || (GET_CODE (x) == CONST && GET_CODE (XEXP (x, 0)) == PLUS
1312 && GET_CODE (XEXP (XEXP (x, 0), 0)) == LABEL_REF))
a5dfb4ee 1313 recorded_label_ref = 1;
7afe21cc
RK
1314
1315 /* Put an element for X into the right hash bucket. */
1316
1317 elt = get_element ();
1318 elt->exp = x;
1319 elt->cost = COST (x);
1320 elt->next_same_value = 0;
1321 elt->prev_same_value = 0;
1322 elt->next_same_hash = table[hash];
1323 elt->prev_same_hash = 0;
1324 elt->related_value = 0;
1325 elt->in_memory = 0;
1326 elt->mode = mode;
1327 elt->is_const = (CONSTANT_P (x)
1328 /* GNU C++ takes advantage of this for `this'
1329 (and other const values). */
1330 || (RTX_UNCHANGING_P (x)
1331 && GET_CODE (x) == REG
1332 && REGNO (x) >= FIRST_PSEUDO_REGISTER)
1333 || FIXED_BASE_PLUS_P (x));
1334
1335 if (table[hash])
1336 table[hash]->prev_same_hash = elt;
1337 table[hash] = elt;
1338
1339 /* Put it into the proper value-class. */
1340 if (classp)
1341 {
1342 classp = classp->first_same_value;
1343 if (CHEAPER (elt, classp))
1344 /* Insert at the head of the class */
1345 {
1346 register struct table_elt *p;
1347 elt->next_same_value = classp;
1348 classp->prev_same_value = elt;
1349 elt->first_same_value = elt;
1350
1351 for (p = classp; p; p = p->next_same_value)
1352 p->first_same_value = elt;
1353 }
1354 else
1355 {
1356 /* Insert not at head of the class. */
1357 /* Put it after the last element cheaper than X. */
1358 register struct table_elt *p, *next;
1359 for (p = classp; (next = p->next_same_value) && CHEAPER (next, elt);
1360 p = next);
1361 /* Put it after P and before NEXT. */
1362 elt->next_same_value = next;
1363 if (next)
1364 next->prev_same_value = elt;
1365 elt->prev_same_value = p;
1366 p->next_same_value = elt;
1367 elt->first_same_value = classp;
1368 }
1369 }
1370 else
1371 elt->first_same_value = elt;
1372
1373 /* If this is a constant being set equivalent to a register or a register
1374 being set equivalent to a constant, note the constant equivalence.
1375
1376 If this is a constant, it cannot be equivalent to a different constant,
1377 and a constant is the only thing that can be cheaper than a register. So
1378 we know the register is the head of the class (before the constant was
1379 inserted).
1380
1381 If this is a register that is not already known equivalent to a
1382 constant, we must check the entire class.
1383
1384 If this is a register that is already known equivalent to an insn,
1385 update `qty_const_insn' to show that `this_insn' is the latest
1386 insn making that quantity equivalent to the constant. */
1387
f353588a
RK
1388 if (elt->is_const && classp && GET_CODE (classp->exp) == REG
1389 && GET_CODE (x) != REG)
7afe21cc
RK
1390 {
1391 qty_const[reg_qty[REGNO (classp->exp)]]
1392 = gen_lowpart_if_possible (qty_mode[reg_qty[REGNO (classp->exp)]], x);
1393 qty_const_insn[reg_qty[REGNO (classp->exp)]] = this_insn;
1394 }
1395
f353588a
RK
1396 else if (GET_CODE (x) == REG && classp && ! qty_const[reg_qty[REGNO (x)]]
1397 && ! elt->is_const)
7afe21cc
RK
1398 {
1399 register struct table_elt *p;
1400
1401 for (p = classp; p != 0; p = p->next_same_value)
1402 {
f353588a 1403 if (p->is_const && GET_CODE (p->exp) != REG)
7afe21cc
RK
1404 {
1405 qty_const[reg_qty[REGNO (x)]]
1406 = gen_lowpart_if_possible (GET_MODE (x), p->exp);
1407 qty_const_insn[reg_qty[REGNO (x)]] = this_insn;
1408 break;
1409 }
1410 }
1411 }
1412
1413 else if (GET_CODE (x) == REG && qty_const[reg_qty[REGNO (x)]]
1414 && GET_MODE (x) == qty_mode[reg_qty[REGNO (x)]])
1415 qty_const_insn[reg_qty[REGNO (x)]] = this_insn;
1416
1417 /* If this is a constant with symbolic value,
1418 and it has a term with an explicit integer value,
1419 link it up with related expressions. */
1420 if (GET_CODE (x) == CONST)
1421 {
1422 rtx subexp = get_related_value (x);
2197a88a 1423 unsigned subhash;
7afe21cc
RK
1424 struct table_elt *subelt, *subelt_prev;
1425
1426 if (subexp != 0)
1427 {
1428 /* Get the integer-free subexpression in the hash table. */
1429 subhash = safe_hash (subexp, mode) % NBUCKETS;
1430 subelt = lookup (subexp, subhash, mode);
1431 if (subelt == 0)
906c4e36 1432 subelt = insert (subexp, NULL_PTR, subhash, mode);
7afe21cc
RK
1433 /* Initialize SUBELT's circular chain if it has none. */
1434 if (subelt->related_value == 0)
1435 subelt->related_value = subelt;
1436 /* Find the element in the circular chain that precedes SUBELT. */
1437 subelt_prev = subelt;
1438 while (subelt_prev->related_value != subelt)
1439 subelt_prev = subelt_prev->related_value;
1440 /* Put new ELT into SUBELT's circular chain just before SUBELT.
1441 This way the element that follows SUBELT is the oldest one. */
1442 elt->related_value = subelt_prev->related_value;
1443 subelt_prev->related_value = elt;
1444 }
1445 }
1446
1447 return elt;
1448}
1449\f
1450/* Given two equivalence classes, CLASS1 and CLASS2, put all the entries from
1451 CLASS2 into CLASS1. This is done when we have reached an insn which makes
1452 the two classes equivalent.
1453
1454 CLASS1 will be the surviving class; CLASS2 should not be used after this
1455 call.
1456
1457 Any invalid entries in CLASS2 will not be copied. */
1458
1459static void
1460merge_equiv_classes (class1, class2)
1461 struct table_elt *class1, *class2;
1462{
1463 struct table_elt *elt, *next, *new;
1464
1465 /* Ensure we start with the head of the classes. */
1466 class1 = class1->first_same_value;
1467 class2 = class2->first_same_value;
1468
1469 /* If they were already equal, forget it. */
1470 if (class1 == class2)
1471 return;
1472
1473 for (elt = class2; elt; elt = next)
1474 {
2197a88a 1475 unsigned hash;
7afe21cc
RK
1476 rtx exp = elt->exp;
1477 enum machine_mode mode = elt->mode;
1478
1479 next = elt->next_same_value;
1480
1481 /* Remove old entry, make a new one in CLASS1's class.
1482 Don't do this for invalid entries as we cannot find their
0f41302f 1483 hash code (it also isn't necessary). */
7afe21cc
RK
1484 if (GET_CODE (exp) == REG || exp_equiv_p (exp, exp, 1, 0))
1485 {
1486 hash_arg_in_memory = 0;
1487 hash_arg_in_struct = 0;
1488 hash = HASH (exp, mode);
1489
1490 if (GET_CODE (exp) == REG)
1491 delete_reg_equiv (REGNO (exp));
1492
1493 remove_from_table (elt, hash);
1494
1495 if (insert_regs (exp, class1, 0))
8ae2b8f6
JW
1496 {
1497 rehash_using_reg (exp);
1498 hash = HASH (exp, mode);
1499 }
7afe21cc
RK
1500 new = insert (exp, class1, hash, mode);
1501 new->in_memory = hash_arg_in_memory;
1502 new->in_struct = hash_arg_in_struct;
1503 }
1504 }
1505}
1506\f
1507/* Remove from the hash table, or mark as invalid,
1508 all expressions whose values could be altered by storing in X.
1509 X is a register, a subreg, or a memory reference with nonvarying address
1510 (because, when a memory reference with a varying address is stored in,
1511 all memory references are removed by invalidate_memory
1512 so specific invalidation is superfluous).
bb4034b3
JW
1513 FULL_MODE, if not VOIDmode, indicates that this much should be invalidated
1514 instead of just the amount indicated by the mode of X. This is only used
1515 for bitfield stores into memory.
7afe21cc
RK
1516
1517 A nonvarying address may be just a register or just
1518 a symbol reference, or it may be either of those plus
1519 a numeric offset. */
1520
1521static void
bb4034b3 1522invalidate (x, full_mode)
7afe21cc 1523 rtx x;
bb4034b3 1524 enum machine_mode full_mode;
7afe21cc
RK
1525{
1526 register int i;
1527 register struct table_elt *p;
7afe21cc
RK
1528
1529 /* If X is a register, dependencies on its contents
1530 are recorded through the qty number mechanism.
1531 Just change the qty number of the register,
1532 mark it as invalid for expressions that refer to it,
1533 and remove it itself. */
1534
1535 if (GET_CODE (x) == REG)
1536 {
1537 register int regno = REGNO (x);
2197a88a 1538 register unsigned hash = HASH (x, GET_MODE (x));
7afe21cc
RK
1539
1540 /* Remove REGNO from any quantity list it might be on and indicate
1541 that it's value might have changed. If it is a pseudo, remove its
1542 entry from the hash table.
1543
1544 For a hard register, we do the first two actions above for any
1545 additional hard registers corresponding to X. Then, if any of these
1546 registers are in the table, we must remove any REG entries that
1547 overlap these registers. */
1548
1549 delete_reg_equiv (regno);
1550 reg_tick[regno]++;
1551
1552 if (regno >= FIRST_PSEUDO_REGISTER)
85e4d983
RK
1553 {
1554 /* Because a register can be referenced in more than one mode,
1555 we might have to remove more than one table entry. */
1556
1557 struct table_elt *elt;
1558
2d8b0f3a 1559 while ((elt = lookup_for_remove (x, hash, GET_MODE (x))))
85e4d983
RK
1560 remove_from_table (elt, hash);
1561 }
7afe21cc
RK
1562 else
1563 {
54b1de55
RK
1564 HOST_WIDE_INT in_table
1565 = TEST_HARD_REG_BIT (hard_regs_in_table, regno);
7afe21cc
RK
1566 int endregno = regno + HARD_REGNO_NREGS (regno, GET_MODE (x));
1567 int tregno, tendregno;
1568 register struct table_elt *p, *next;
1569
1570 CLEAR_HARD_REG_BIT (hard_regs_in_table, regno);
1571
1572 for (i = regno + 1; i < endregno; i++)
1573 {
1574 in_table |= TEST_HARD_REG_BIT (hard_regs_in_table, i);
1575 CLEAR_HARD_REG_BIT (hard_regs_in_table, i);
1576 delete_reg_equiv (i);
1577 reg_tick[i]++;
1578 }
1579
1580 if (in_table)
1581 for (hash = 0; hash < NBUCKETS; hash++)
1582 for (p = table[hash]; p; p = next)
1583 {
1584 next = p->next_same_hash;
1585
1586 if (GET_CODE (p->exp) != REG
1587 || REGNO (p->exp) >= FIRST_PSEUDO_REGISTER)
1588 continue;
1589
1590 tregno = REGNO (p->exp);
1591 tendregno
1592 = tregno + HARD_REGNO_NREGS (tregno, GET_MODE (p->exp));
1593 if (tendregno > regno && tregno < endregno)
1594 remove_from_table (p, hash);
1595 }
1596 }
1597
1598 return;
1599 }
1600
1601 if (GET_CODE (x) == SUBREG)
1602 {
1603 if (GET_CODE (SUBREG_REG (x)) != REG)
1604 abort ();
bb4034b3 1605 invalidate (SUBREG_REG (x), VOIDmode);
7afe21cc
RK
1606 return;
1607 }
1608
1609 /* X is not a register; it must be a memory reference with
1610 a nonvarying address. Remove all hash table elements
1611 that refer to overlapping pieces of memory. */
1612
1613 if (GET_CODE (x) != MEM)
1614 abort ();
7afe21cc 1615
bb4034b3
JW
1616 if (full_mode == VOIDmode)
1617 full_mode = GET_MODE (x);
1618
7afe21cc
RK
1619 for (i = 0; i < NBUCKETS; i++)
1620 {
1621 register struct table_elt *next;
1622 for (p = table[i]; p; p = next)
1623 {
1624 next = p->next_same_hash;
9ae8ffe7
JL
1625 /* Invalidate ASM_OPERANDS which reference memory (this is easier
1626 than checking all the aliases). */
1627 if (p->in_memory
1628 && (GET_CODE (p->exp) != MEM
1629 || true_dependence (x, full_mode, p->exp, cse_rtx_varies_p)))
7afe21cc
RK
1630 remove_from_table (p, i);
1631 }
1632 }
1633}
1634
1635/* Remove all expressions that refer to register REGNO,
1636 since they are already invalid, and we are about to
1637 mark that register valid again and don't want the old
1638 expressions to reappear as valid. */
1639
1640static void
1641remove_invalid_refs (regno)
1642 int regno;
1643{
1644 register int i;
1645 register struct table_elt *p, *next;
1646
1647 for (i = 0; i < NBUCKETS; i++)
1648 for (p = table[i]; p; p = next)
1649 {
1650 next = p->next_same_hash;
1651 if (GET_CODE (p->exp) != REG
906c4e36 1652 && refers_to_regno_p (regno, regno + 1, p->exp, NULL_PTR))
7afe21cc
RK
1653 remove_from_table (p, i);
1654 }
1655}
1656\f
1657/* Recompute the hash codes of any valid entries in the hash table that
1658 reference X, if X is a register, or SUBREG_REG (X) if X is a SUBREG.
1659
1660 This is called when we make a jump equivalence. */
1661
1662static void
1663rehash_using_reg (x)
1664 rtx x;
1665{
1666 int i;
1667 struct table_elt *p, *next;
2197a88a 1668 unsigned hash;
7afe21cc
RK
1669
1670 if (GET_CODE (x) == SUBREG)
1671 x = SUBREG_REG (x);
1672
1673 /* If X is not a register or if the register is known not to be in any
1674 valid entries in the table, we have no work to do. */
1675
1676 if (GET_CODE (x) != REG
1677 || reg_in_table[REGNO (x)] < 0
1678 || reg_in_table[REGNO (x)] != reg_tick[REGNO (x)])
1679 return;
1680
1681 /* Scan all hash chains looking for valid entries that mention X.
1682 If we find one and it is in the wrong hash chain, move it. We can skip
1683 objects that are registers, since they are handled specially. */
1684
1685 for (i = 0; i < NBUCKETS; i++)
1686 for (p = table[i]; p; p = next)
1687 {
1688 next = p->next_same_hash;
1689 if (GET_CODE (p->exp) != REG && reg_mentioned_p (x, p->exp)
538b78e7 1690 && exp_equiv_p (p->exp, p->exp, 1, 0)
7afe21cc
RK
1691 && i != (hash = safe_hash (p->exp, p->mode) % NBUCKETS))
1692 {
1693 if (p->next_same_hash)
1694 p->next_same_hash->prev_same_hash = p->prev_same_hash;
1695
1696 if (p->prev_same_hash)
1697 p->prev_same_hash->next_same_hash = p->next_same_hash;
1698 else
1699 table[i] = p->next_same_hash;
1700
1701 p->next_same_hash = table[hash];
1702 p->prev_same_hash = 0;
1703 if (table[hash])
1704 table[hash]->prev_same_hash = p;
1705 table[hash] = p;
1706 }
1707 }
1708}
1709\f
7afe21cc
RK
1710/* Remove from the hash table any expression that is a call-clobbered
1711 register. Also update their TICK values. */
1712
1713static void
1714invalidate_for_call ()
1715{
1716 int regno, endregno;
1717 int i;
2197a88a 1718 unsigned hash;
7afe21cc
RK
1719 struct table_elt *p, *next;
1720 int in_table = 0;
1721
1722 /* Go through all the hard registers. For each that is clobbered in
1723 a CALL_INSN, remove the register from quantity chains and update
1724 reg_tick if defined. Also see if any of these registers is currently
1725 in the table. */
1726
1727 for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
1728 if (TEST_HARD_REG_BIT (regs_invalidated_by_call, regno))
1729 {
1730 delete_reg_equiv (regno);
1731 if (reg_tick[regno] >= 0)
1732 reg_tick[regno]++;
1733
0e227018 1734 in_table |= (TEST_HARD_REG_BIT (hard_regs_in_table, regno) != 0);
7afe21cc
RK
1735 }
1736
1737 /* In the case where we have no call-clobbered hard registers in the
1738 table, we are done. Otherwise, scan the table and remove any
1739 entry that overlaps a call-clobbered register. */
1740
1741 if (in_table)
1742 for (hash = 0; hash < NBUCKETS; hash++)
1743 for (p = table[hash]; p; p = next)
1744 {
1745 next = p->next_same_hash;
1746
9ae8ffe7
JL
1747 if (p->in_memory)
1748 {
1749 remove_from_table (p, hash);
1750 continue;
1751 }
1752
7afe21cc
RK
1753 if (GET_CODE (p->exp) != REG
1754 || REGNO (p->exp) >= FIRST_PSEUDO_REGISTER)
1755 continue;
1756
1757 regno = REGNO (p->exp);
1758 endregno = regno + HARD_REGNO_NREGS (regno, GET_MODE (p->exp));
1759
1760 for (i = regno; i < endregno; i++)
1761 if (TEST_HARD_REG_BIT (regs_invalidated_by_call, i))
1762 {
1763 remove_from_table (p, hash);
1764 break;
1765 }
1766 }
1767}
1768\f
1769/* Given an expression X of type CONST,
1770 and ELT which is its table entry (or 0 if it
1771 is not in the hash table),
1772 return an alternate expression for X as a register plus integer.
1773 If none can be found, return 0. */
1774
1775static rtx
1776use_related_value (x, elt)
1777 rtx x;
1778 struct table_elt *elt;
1779{
1780 register struct table_elt *relt = 0;
1781 register struct table_elt *p, *q;
906c4e36 1782 HOST_WIDE_INT offset;
7afe21cc
RK
1783
1784 /* First, is there anything related known?
1785 If we have a table element, we can tell from that.
1786 Otherwise, must look it up. */
1787
1788 if (elt != 0 && elt->related_value != 0)
1789 relt = elt;
1790 else if (elt == 0 && GET_CODE (x) == CONST)
1791 {
1792 rtx subexp = get_related_value (x);
1793 if (subexp != 0)
1794 relt = lookup (subexp,
1795 safe_hash (subexp, GET_MODE (subexp)) % NBUCKETS,
1796 GET_MODE (subexp));
1797 }
1798
1799 if (relt == 0)
1800 return 0;
1801
1802 /* Search all related table entries for one that has an
1803 equivalent register. */
1804
1805 p = relt;
1806 while (1)
1807 {
1808 /* This loop is strange in that it is executed in two different cases.
1809 The first is when X is already in the table. Then it is searching
1810 the RELATED_VALUE list of X's class (RELT). The second case is when
1811 X is not in the table. Then RELT points to a class for the related
1812 value.
1813
1814 Ensure that, whatever case we are in, that we ignore classes that have
1815 the same value as X. */
1816
1817 if (rtx_equal_p (x, p->exp))
1818 q = 0;
1819 else
1820 for (q = p->first_same_value; q; q = q->next_same_value)
1821 if (GET_CODE (q->exp) == REG)
1822 break;
1823
1824 if (q)
1825 break;
1826
1827 p = p->related_value;
1828
1829 /* We went all the way around, so there is nothing to be found.
1830 Alternatively, perhaps RELT was in the table for some other reason
1831 and it has no related values recorded. */
1832 if (p == relt || p == 0)
1833 break;
1834 }
1835
1836 if (q == 0)
1837 return 0;
1838
1839 offset = (get_integer_term (x) - get_integer_term (p->exp));
1840 /* Note: OFFSET may be 0 if P->xexp and X are related by commutativity. */
1841 return plus_constant (q->exp, offset);
1842}
1843\f
1844/* Hash an rtx. We are careful to make sure the value is never negative.
1845 Equivalent registers hash identically.
1846 MODE is used in hashing for CONST_INTs only;
1847 otherwise the mode of X is used.
1848
1849 Store 1 in do_not_record if any subexpression is volatile.
1850
1851 Store 1 in hash_arg_in_memory if X contains a MEM rtx
1852 which does not have the RTX_UNCHANGING_P bit set.
1853 In this case, also store 1 in hash_arg_in_struct
1854 if there is a MEM rtx which has the MEM_IN_STRUCT_P bit set.
1855
1856 Note that cse_insn knows that the hash code of a MEM expression
1857 is just (int) MEM plus the hash code of the address. */
1858
2197a88a 1859static unsigned
7afe21cc
RK
1860canon_hash (x, mode)
1861 rtx x;
1862 enum machine_mode mode;
1863{
1864 register int i, j;
2197a88a 1865 register unsigned hash = 0;
7afe21cc
RK
1866 register enum rtx_code code;
1867 register char *fmt;
1868
1869 /* repeat is used to turn tail-recursion into iteration. */
1870 repeat:
1871 if (x == 0)
1872 return hash;
1873
1874 code = GET_CODE (x);
1875 switch (code)
1876 {
1877 case REG:
1878 {
1879 register int regno = REGNO (x);
1880
1881 /* On some machines, we can't record any non-fixed hard register,
1882 because extending its life will cause reload problems. We
1883 consider ap, fp, and sp to be fixed for this purpose.
0f41302f 1884 On all machines, we can't record any global registers. */
7afe21cc
RK
1885
1886 if (regno < FIRST_PSEUDO_REGISTER
1887 && (global_regs[regno]
f95182a4
ILT
1888 || (SMALL_REGISTER_CLASSES
1889 && ! fixed_regs[regno]
7afe21cc 1890 && regno != FRAME_POINTER_REGNUM
8bc169f2 1891 && regno != HARD_FRAME_POINTER_REGNUM
7afe21cc 1892 && regno != ARG_POINTER_REGNUM
e9a25f70 1893 && regno != STACK_POINTER_REGNUM)))
7afe21cc
RK
1894 {
1895 do_not_record = 1;
1896 return 0;
1897 }
2197a88a
RK
1898 hash += ((unsigned) REG << 7) + (unsigned) reg_qty[regno];
1899 return hash;
7afe21cc
RK
1900 }
1901
1902 case CONST_INT:
2197a88a
RK
1903 {
1904 unsigned HOST_WIDE_INT tem = INTVAL (x);
1905 hash += ((unsigned) CONST_INT << 7) + (unsigned) mode + tem;
1906 return hash;
1907 }
7afe21cc
RK
1908
1909 case CONST_DOUBLE:
1910 /* This is like the general case, except that it only counts
1911 the integers representing the constant. */
2197a88a 1912 hash += (unsigned) code + (unsigned) GET_MODE (x);
969c8517
RK
1913 if (GET_MODE (x) != VOIDmode)
1914 for (i = 2; i < GET_RTX_LENGTH (CONST_DOUBLE); i++)
1915 {
1916 unsigned tem = XINT (x, i);
1917 hash += tem;
1918 }
1919 else
1920 hash += ((unsigned) CONST_DOUBLE_LOW (x)
1921 + (unsigned) CONST_DOUBLE_HIGH (x));
7afe21cc
RK
1922 return hash;
1923
1924 /* Assume there is only one rtx object for any given label. */
1925 case LABEL_REF:
3c543775 1926 hash
7bcac048 1927 += ((unsigned) LABEL_REF << 7) + (unsigned long) XEXP (x, 0);
2197a88a 1928 return hash;
7afe21cc
RK
1929
1930 case SYMBOL_REF:
3c543775 1931 hash
7bcac048 1932 += ((unsigned) SYMBOL_REF << 7) + (unsigned long) XSTR (x, 0);
2197a88a 1933 return hash;
7afe21cc
RK
1934
1935 case MEM:
1936 if (MEM_VOLATILE_P (x))
1937 {
1938 do_not_record = 1;
1939 return 0;
1940 }
9ad91d71 1941 if (! RTX_UNCHANGING_P (x) || FIXED_BASE_PLUS_P (XEXP (x, 0)))
7afe21cc
RK
1942 {
1943 hash_arg_in_memory = 1;
1944 if (MEM_IN_STRUCT_P (x)) hash_arg_in_struct = 1;
1945 }
1946 /* Now that we have already found this special case,
1947 might as well speed it up as much as possible. */
2197a88a 1948 hash += (unsigned) MEM;
7afe21cc
RK
1949 x = XEXP (x, 0);
1950 goto repeat;
1951
1952 case PRE_DEC:
1953 case PRE_INC:
1954 case POST_DEC:
1955 case POST_INC:
1956 case PC:
1957 case CC0:
1958 case CALL:
1959 case UNSPEC_VOLATILE:
1960 do_not_record = 1;
1961 return 0;
1962
1963 case ASM_OPERANDS:
1964 if (MEM_VOLATILE_P (x))
1965 {
1966 do_not_record = 1;
1967 return 0;
1968 }
e9a25f70
JL
1969 break;
1970
1971 default:
1972 break;
7afe21cc
RK
1973 }
1974
1975 i = GET_RTX_LENGTH (code) - 1;
2197a88a 1976 hash += (unsigned) code + (unsigned) GET_MODE (x);
7afe21cc
RK
1977 fmt = GET_RTX_FORMAT (code);
1978 for (; i >= 0; i--)
1979 {
1980 if (fmt[i] == 'e')
1981 {
1982 rtx tem = XEXP (x, i);
7afe21cc
RK
1983
1984 /* If we are about to do the last recursive call
1985 needed at this level, change it into iteration.
1986 This function is called enough to be worth it. */
1987 if (i == 0)
1988 {
1989 x = tem;
1990 goto repeat;
1991 }
1992 hash += canon_hash (tem, 0);
1993 }
1994 else if (fmt[i] == 'E')
1995 for (j = 0; j < XVECLEN (x, i); j++)
1996 hash += canon_hash (XVECEXP (x, i, j), 0);
1997 else if (fmt[i] == 's')
1998 {
2197a88a 1999 register unsigned char *p = (unsigned char *) XSTR (x, i);
7afe21cc
RK
2000 if (p)
2001 while (*p)
2197a88a 2002 hash += *p++;
7afe21cc
RK
2003 }
2004 else if (fmt[i] == 'i')
2005 {
2197a88a
RK
2006 register unsigned tem = XINT (x, i);
2007 hash += tem;
7afe21cc 2008 }
e9a25f70
JL
2009 else if (fmt[i] == '0')
2010 /* unused */;
7afe21cc
RK
2011 else
2012 abort ();
2013 }
2014 return hash;
2015}
2016
2017/* Like canon_hash but with no side effects. */
2018
2197a88a 2019static unsigned
7afe21cc
RK
2020safe_hash (x, mode)
2021 rtx x;
2022 enum machine_mode mode;
2023{
2024 int save_do_not_record = do_not_record;
2025 int save_hash_arg_in_memory = hash_arg_in_memory;
2026 int save_hash_arg_in_struct = hash_arg_in_struct;
2197a88a 2027 unsigned hash = canon_hash (x, mode);
7afe21cc
RK
2028 hash_arg_in_memory = save_hash_arg_in_memory;
2029 hash_arg_in_struct = save_hash_arg_in_struct;
2030 do_not_record = save_do_not_record;
2031 return hash;
2032}
2033\f
2034/* Return 1 iff X and Y would canonicalize into the same thing,
2035 without actually constructing the canonicalization of either one.
2036 If VALIDATE is nonzero,
2037 we assume X is an expression being processed from the rtl
2038 and Y was found in the hash table. We check register refs
2039 in Y for being marked as valid.
2040
2041 If EQUAL_VALUES is nonzero, we allow a register to match a constant value
2042 that is known to be in the register. Ordinarily, we don't allow them
2043 to match, because letting them match would cause unpredictable results
2044 in all the places that search a hash table chain for an equivalent
2045 for a given value. A possible equivalent that has different structure
2046 has its hash code computed from different data. Whether the hash code
2047 is the same as that of the the given value is pure luck. */
2048
2049static int
2050exp_equiv_p (x, y, validate, equal_values)
2051 rtx x, y;
2052 int validate;
2053 int equal_values;
2054{
906c4e36 2055 register int i, j;
7afe21cc
RK
2056 register enum rtx_code code;
2057 register char *fmt;
2058
2059 /* Note: it is incorrect to assume an expression is equivalent to itself
2060 if VALIDATE is nonzero. */
2061 if (x == y && !validate)
2062 return 1;
2063 if (x == 0 || y == 0)
2064 return x == y;
2065
2066 code = GET_CODE (x);
2067 if (code != GET_CODE (y))
2068 {
2069 if (!equal_values)
2070 return 0;
2071
2072 /* If X is a constant and Y is a register or vice versa, they may be
2073 equivalent. We only have to validate if Y is a register. */
2074 if (CONSTANT_P (x) && GET_CODE (y) == REG
2075 && REGNO_QTY_VALID_P (REGNO (y))
2076 && GET_MODE (y) == qty_mode[reg_qty[REGNO (y)]]
2077 && rtx_equal_p (x, qty_const[reg_qty[REGNO (y)]])
2078 && (! validate || reg_in_table[REGNO (y)] == reg_tick[REGNO (y)]))
2079 return 1;
2080
2081 if (CONSTANT_P (y) && code == REG
2082 && REGNO_QTY_VALID_P (REGNO (x))
2083 && GET_MODE (x) == qty_mode[reg_qty[REGNO (x)]]
2084 && rtx_equal_p (y, qty_const[reg_qty[REGNO (x)]]))
2085 return 1;
2086
2087 return 0;
2088 }
2089
2090 /* (MULT:SI x y) and (MULT:HI x y) are NOT equivalent. */
2091 if (GET_MODE (x) != GET_MODE (y))
2092 return 0;
2093
2094 switch (code)
2095 {
2096 case PC:
2097 case CC0:
2098 return x == y;
2099
2100 case CONST_INT:
58c8c593 2101 return INTVAL (x) == INTVAL (y);
7afe21cc
RK
2102
2103 case LABEL_REF:
7afe21cc
RK
2104 return XEXP (x, 0) == XEXP (y, 0);
2105
f54d4924
RK
2106 case SYMBOL_REF:
2107 return XSTR (x, 0) == XSTR (y, 0);
2108
7afe21cc
RK
2109 case REG:
2110 {
2111 int regno = REGNO (y);
2112 int endregno
2113 = regno + (regno >= FIRST_PSEUDO_REGISTER ? 1
2114 : HARD_REGNO_NREGS (regno, GET_MODE (y)));
2115 int i;
2116
2117 /* If the quantities are not the same, the expressions are not
2118 equivalent. If there are and we are not to validate, they
2119 are equivalent. Otherwise, ensure all regs are up-to-date. */
2120
2121 if (reg_qty[REGNO (x)] != reg_qty[regno])
2122 return 0;
2123
2124 if (! validate)
2125 return 1;
2126
2127 for (i = regno; i < endregno; i++)
2128 if (reg_in_table[i] != reg_tick[i])
2129 return 0;
2130
2131 return 1;
2132 }
2133
2134 /* For commutative operations, check both orders. */
2135 case PLUS:
2136 case MULT:
2137 case AND:
2138 case IOR:
2139 case XOR:
2140 case NE:
2141 case EQ:
2142 return ((exp_equiv_p (XEXP (x, 0), XEXP (y, 0), validate, equal_values)
2143 && exp_equiv_p (XEXP (x, 1), XEXP (y, 1),
2144 validate, equal_values))
2145 || (exp_equiv_p (XEXP (x, 0), XEXP (y, 1),
2146 validate, equal_values)
2147 && exp_equiv_p (XEXP (x, 1), XEXP (y, 0),
2148 validate, equal_values)));
e9a25f70
JL
2149
2150 default:
2151 break;
7afe21cc
RK
2152 }
2153
2154 /* Compare the elements. If any pair of corresponding elements
2155 fail to match, return 0 for the whole things. */
2156
2157 fmt = GET_RTX_FORMAT (code);
2158 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
2159 {
906c4e36 2160 switch (fmt[i])
7afe21cc 2161 {
906c4e36 2162 case 'e':
7afe21cc
RK
2163 if (! exp_equiv_p (XEXP (x, i), XEXP (y, i), validate, equal_values))
2164 return 0;
906c4e36
RK
2165 break;
2166
2167 case 'E':
7afe21cc
RK
2168 if (XVECLEN (x, i) != XVECLEN (y, i))
2169 return 0;
2170 for (j = 0; j < XVECLEN (x, i); j++)
2171 if (! exp_equiv_p (XVECEXP (x, i, j), XVECEXP (y, i, j),
2172 validate, equal_values))
2173 return 0;
906c4e36
RK
2174 break;
2175
2176 case 's':
7afe21cc
RK
2177 if (strcmp (XSTR (x, i), XSTR (y, i)))
2178 return 0;
906c4e36
RK
2179 break;
2180
2181 case 'i':
7afe21cc
RK
2182 if (XINT (x, i) != XINT (y, i))
2183 return 0;
906c4e36
RK
2184 break;
2185
2186 case 'w':
2187 if (XWINT (x, i) != XWINT (y, i))
2188 return 0;
2189 break;
2190
2191 case '0':
2192 break;
2193
2194 default:
2195 abort ();
7afe21cc 2196 }
906c4e36
RK
2197 }
2198
7afe21cc
RK
2199 return 1;
2200}
2201\f
2202/* Return 1 iff any subexpression of X matches Y.
2203 Here we do not require that X or Y be valid (for registers referred to)
2204 for being in the hash table. */
2205
6cd4575e 2206static int
7afe21cc
RK
2207refers_to_p (x, y)
2208 rtx x, y;
2209{
2210 register int i;
2211 register enum rtx_code code;
2212 register char *fmt;
2213
2214 repeat:
2215 if (x == y)
2216 return 1;
2217 if (x == 0 || y == 0)
2218 return 0;
2219
2220 code = GET_CODE (x);
2221 /* If X as a whole has the same code as Y, they may match.
2222 If so, return 1. */
2223 if (code == GET_CODE (y))
2224 {
2225 if (exp_equiv_p (x, y, 0, 1))
2226 return 1;
2227 }
2228
2229 /* X does not match, so try its subexpressions. */
2230
2231 fmt = GET_RTX_FORMAT (code);
2232 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
2233 if (fmt[i] == 'e')
2234 {
2235 if (i == 0)
2236 {
2237 x = XEXP (x, 0);
2238 goto repeat;
2239 }
2240 else
2241 if (refers_to_p (XEXP (x, i), y))
2242 return 1;
2243 }
2244 else if (fmt[i] == 'E')
2245 {
2246 int j;
2247 for (j = 0; j < XVECLEN (x, i); j++)
2248 if (refers_to_p (XVECEXP (x, i, j), y))
2249 return 1;
2250 }
2251
2252 return 0;
2253}
2254\f
f451db89
JL
2255/* Given ADDR and SIZE (a memory address, and the size of the memory reference),
2256 set PBASE, PSTART, and PEND which correspond to the base of the address,
2257 the starting offset, and ending offset respectively.
2258
bb4034b3 2259 ADDR is known to be a nonvarying address. */
f451db89 2260
bb4034b3
JW
2261/* ??? Despite what the comments say, this function is in fact frequently
2262 passed varying addresses. This does not appear to cause any problems. */
f451db89
JL
2263
2264static void
2265set_nonvarying_address_components (addr, size, pbase, pstart, pend)
2266 rtx addr;
2267 int size;
2268 rtx *pbase;
6500fb43 2269 HOST_WIDE_INT *pstart, *pend;
f451db89
JL
2270{
2271 rtx base;
c85663b1 2272 HOST_WIDE_INT start, end;
f451db89
JL
2273
2274 base = addr;
2275 start = 0;
2276 end = 0;
2277
2278 /* Registers with nonvarying addresses usually have constant equivalents;
2279 but the frame pointer register is also possible. */
2280 if (GET_CODE (base) == REG
2281 && qty_const != 0
2282 && REGNO_QTY_VALID_P (REGNO (base))
2283 && qty_mode[reg_qty[REGNO (base)]] == GET_MODE (base)
2284 && qty_const[reg_qty[REGNO (base)]] != 0)
2285 base = qty_const[reg_qty[REGNO (base)]];
2286 else if (GET_CODE (base) == PLUS
2287 && GET_CODE (XEXP (base, 1)) == CONST_INT
2288 && GET_CODE (XEXP (base, 0)) == REG
2289 && qty_const != 0
2290 && REGNO_QTY_VALID_P (REGNO (XEXP (base, 0)))
2291 && (qty_mode[reg_qty[REGNO (XEXP (base, 0))]]
2292 == GET_MODE (XEXP (base, 0)))
2293 && qty_const[reg_qty[REGNO (XEXP (base, 0))]])
2294 {
2295 start = INTVAL (XEXP (base, 1));
2296 base = qty_const[reg_qty[REGNO (XEXP (base, 0))]];
2297 }
9c6b0bae 2298 /* This can happen as the result of virtual register instantiation,
abc95ed3 2299 if the initial offset is too large to be a valid address. */
9c6b0bae
RK
2300 else if (GET_CODE (base) == PLUS
2301 && GET_CODE (XEXP (base, 0)) == REG
2302 && GET_CODE (XEXP (base, 1)) == REG
2303 && qty_const != 0
2304 && REGNO_QTY_VALID_P (REGNO (XEXP (base, 0)))
2305 && (qty_mode[reg_qty[REGNO (XEXP (base, 0))]]
2306 == GET_MODE (XEXP (base, 0)))
2307 && qty_const[reg_qty[REGNO (XEXP (base, 0))]]
2308 && REGNO_QTY_VALID_P (REGNO (XEXP (base, 1)))
2309 && (qty_mode[reg_qty[REGNO (XEXP (base, 1))]]
2310 == GET_MODE (XEXP (base, 1)))
2311 && qty_const[reg_qty[REGNO (XEXP (base, 1))]])
2312 {
2313 rtx tem = qty_const[reg_qty[REGNO (XEXP (base, 1))]];
2314 base = qty_const[reg_qty[REGNO (XEXP (base, 0))]];
2315
2316 /* One of the two values must be a constant. */
2317 if (GET_CODE (base) != CONST_INT)
2318 {
2319 if (GET_CODE (tem) != CONST_INT)
2320 abort ();
2321 start = INTVAL (tem);
2322 }
2323 else
2324 {
2325 start = INTVAL (base);
2326 base = tem;
2327 }
2328 }
f451db89 2329
c85663b1
RK
2330 /* Handle everything that we can find inside an address that has been
2331 viewed as constant. */
f451db89 2332
c85663b1 2333 while (1)
f451db89 2334 {
c85663b1
RK
2335 /* If no part of this switch does a "continue", the code outside
2336 will exit this loop. */
2337
2338 switch (GET_CODE (base))
2339 {
2340 case LO_SUM:
2341 /* By definition, operand1 of a LO_SUM is the associated constant
2342 address. Use the associated constant address as the base
2343 instead. */
2344 base = XEXP (base, 1);
2345 continue;
2346
2347 case CONST:
2348 /* Strip off CONST. */
2349 base = XEXP (base, 0);
2350 continue;
2351
2352 case PLUS:
2353 if (GET_CODE (XEXP (base, 1)) == CONST_INT)
2354 {
2355 start += INTVAL (XEXP (base, 1));
2356 base = XEXP (base, 0);
2357 continue;
2358 }
2359 break;
2360
2361 case AND:
2362 /* Handle the case of an AND which is the negative of a power of
2363 two. This is used to represent unaligned memory operations. */
2364 if (GET_CODE (XEXP (base, 1)) == CONST_INT
2365 && exact_log2 (- INTVAL (XEXP (base, 1))) > 0)
2366 {
2367 set_nonvarying_address_components (XEXP (base, 0), size,
2368 pbase, pstart, pend);
2369
2370 /* Assume the worst misalignment. START is affected, but not
2371 END, so compensate but adjusting SIZE. Don't lose any
2372 constant we already had. */
2373
2374 size = *pend - *pstart - INTVAL (XEXP (base, 1)) - 1;
89046535
RK
2375 start += *pstart + INTVAL (XEXP (base, 1)) + 1;
2376 end += *pend;
c85663b1
RK
2377 base = *pbase;
2378 }
2379 break;
e9a25f70
JL
2380
2381 default:
2382 break;
c85663b1
RK
2383 }
2384
2385 break;
f451db89
JL
2386 }
2387
336d6f0a
RK
2388 if (GET_CODE (base) == CONST_INT)
2389 {
2390 start += INTVAL (base);
2391 base = const0_rtx;
2392 }
2393
f451db89
JL
2394 end = start + size;
2395
2396 /* Set the return values. */
2397 *pbase = base;
2398 *pstart = start;
2399 *pend = end;
2400}
2401
9ae8ffe7
JL
2402/* Return 1 if X has a value that can vary even between two
2403 executions of the program. 0 means X can be compared reliably
2404 against certain constants or near-constants. */
7afe21cc
RK
2405
2406static int
9ae8ffe7
JL
2407cse_rtx_varies_p (x)
2408 register rtx x;
7afe21cc
RK
2409{
2410 /* We need not check for X and the equivalence class being of the same
2411 mode because if X is equivalent to a constant in some mode, it
2412 doesn't vary in any mode. */
2413
9ae8ffe7
JL
2414 if (GET_CODE (x) == REG
2415 && REGNO_QTY_VALID_P (REGNO (x))
2416 && GET_MODE (x) == qty_mode[reg_qty[REGNO (x)]]
2417 && qty_const[reg_qty[REGNO (x)]] != 0)
7afe21cc
RK
2418 return 0;
2419
9ae8ffe7
JL
2420 if (GET_CODE (x) == PLUS
2421 && GET_CODE (XEXP (x, 1)) == CONST_INT
2422 && GET_CODE (XEXP (x, 0)) == REG
2423 && REGNO_QTY_VALID_P (REGNO (XEXP (x, 0)))
2424 && (GET_MODE (XEXP (x, 0))
2425 == qty_mode[reg_qty[REGNO (XEXP (x, 0))]])
2426 && qty_const[reg_qty[REGNO (XEXP (x, 0))]])
7afe21cc
RK
2427 return 0;
2428
9c6b0bae
RK
2429 /* This can happen as the result of virtual register instantiation, if
2430 the initial constant is too large to be a valid address. This gives
2431 us a three instruction sequence, load large offset into a register,
2432 load fp minus a constant into a register, then a MEM which is the
2433 sum of the two `constant' registers. */
9ae8ffe7
JL
2434 if (GET_CODE (x) == PLUS
2435 && GET_CODE (XEXP (x, 0)) == REG
2436 && GET_CODE (XEXP (x, 1)) == REG
2437 && REGNO_QTY_VALID_P (REGNO (XEXP (x, 0)))
2438 && (GET_MODE (XEXP (x, 0))
2439 == qty_mode[reg_qty[REGNO (XEXP (x, 0))]])
2440 && qty_const[reg_qty[REGNO (XEXP (x, 0))]]
2441 && REGNO_QTY_VALID_P (REGNO (XEXP (x, 1)))
2442 && (GET_MODE (XEXP (x, 1))
2443 == qty_mode[reg_qty[REGNO (XEXP (x, 1))]])
2444 && qty_const[reg_qty[REGNO (XEXP (x, 1))]])
9c6b0bae
RK
2445 return 0;
2446
9ae8ffe7 2447 return rtx_varies_p (x);
7afe21cc
RK
2448}
2449\f
2450/* Canonicalize an expression:
2451 replace each register reference inside it
2452 with the "oldest" equivalent register.
2453
2454 If INSN is non-zero and we are replacing a pseudo with a hard register
7722328e
RK
2455 or vice versa, validate_change is used to ensure that INSN remains valid
2456 after we make our substitution. The calls are made with IN_GROUP non-zero
2457 so apply_change_group must be called upon the outermost return from this
2458 function (unless INSN is zero). The result of apply_change_group can
2459 generally be discarded since the changes we are making are optional. */
7afe21cc
RK
2460
2461static rtx
2462canon_reg (x, insn)
2463 rtx x;
2464 rtx insn;
2465{
2466 register int i;
2467 register enum rtx_code code;
2468 register char *fmt;
2469
2470 if (x == 0)
2471 return x;
2472
2473 code = GET_CODE (x);
2474 switch (code)
2475 {
2476 case PC:
2477 case CC0:
2478 case CONST:
2479 case CONST_INT:
2480 case CONST_DOUBLE:
2481 case SYMBOL_REF:
2482 case LABEL_REF:
2483 case ADDR_VEC:
2484 case ADDR_DIFF_VEC:
2485 return x;
2486
2487 case REG:
2488 {
2489 register int first;
2490
2491 /* Never replace a hard reg, because hard regs can appear
2492 in more than one machine mode, and we must preserve the mode
2493 of each occurrence. Also, some hard regs appear in
2494 MEMs that are shared and mustn't be altered. Don't try to
2495 replace any reg that maps to a reg of class NO_REGS. */
2496 if (REGNO (x) < FIRST_PSEUDO_REGISTER
2497 || ! REGNO_QTY_VALID_P (REGNO (x)))
2498 return x;
2499
2500 first = qty_first_reg[reg_qty[REGNO (x)]];
2501 return (first >= FIRST_PSEUDO_REGISTER ? regno_reg_rtx[first]
2502 : REGNO_REG_CLASS (first) == NO_REGS ? x
38a448ca 2503 : gen_rtx_REG (qty_mode[reg_qty[REGNO (x)]], first));
7afe21cc 2504 }
e9a25f70
JL
2505
2506 default:
2507 break;
7afe21cc
RK
2508 }
2509
2510 fmt = GET_RTX_FORMAT (code);
2511 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
2512 {
2513 register int j;
2514
2515 if (fmt[i] == 'e')
2516 {
2517 rtx new = canon_reg (XEXP (x, i), insn);
58873255 2518 int insn_code;
7afe21cc
RK
2519
2520 /* If replacing pseudo with hard reg or vice versa, ensure the
178c39f6 2521 insn remains valid. Likewise if the insn has MATCH_DUPs. */
aee9dc31
RS
2522 if (insn != 0 && new != 0
2523 && GET_CODE (new) == REG && GET_CODE (XEXP (x, i)) == REG
178c39f6
RK
2524 && (((REGNO (new) < FIRST_PSEUDO_REGISTER)
2525 != (REGNO (XEXP (x, i)) < FIRST_PSEUDO_REGISTER))
58873255
RK
2526 || (insn_code = recog_memoized (insn)) < 0
2527 || insn_n_dups[insn_code] > 0))
77fa0940 2528 validate_change (insn, &XEXP (x, i), new, 1);
7afe21cc
RK
2529 else
2530 XEXP (x, i) = new;
2531 }
2532 else if (fmt[i] == 'E')
2533 for (j = 0; j < XVECLEN (x, i); j++)
2534 XVECEXP (x, i, j) = canon_reg (XVECEXP (x, i, j), insn);
2535 }
2536
2537 return x;
2538}
2539\f
a2cabb29 2540/* LOC is a location within INSN that is an operand address (the contents of
7afe21cc
RK
2541 a MEM). Find the best equivalent address to use that is valid for this
2542 insn.
2543
2544 On most CISC machines, complicated address modes are costly, and rtx_cost
2545 is a good approximation for that cost. However, most RISC machines have
2546 only a few (usually only one) memory reference formats. If an address is
2547 valid at all, it is often just as cheap as any other address. Hence, for
2548 RISC machines, we use the configuration macro `ADDRESS_COST' to compare the
2549 costs of various addresses. For two addresses of equal cost, choose the one
2550 with the highest `rtx_cost' value as that has the potential of eliminating
2551 the most insns. For equal costs, we choose the first in the equivalence
2552 class. Note that we ignore the fact that pseudo registers are cheaper
2553 than hard registers here because we would also prefer the pseudo registers.
2554 */
2555
6cd4575e 2556static void
7afe21cc
RK
2557find_best_addr (insn, loc)
2558 rtx insn;
2559 rtx *loc;
2560{
2561 struct table_elt *elt, *p;
2562 rtx addr = *loc;
7afe21cc
RK
2563 int found_better = 1;
2564 int save_do_not_record = do_not_record;
2565 int save_hash_arg_in_memory = hash_arg_in_memory;
2566 int save_hash_arg_in_struct = hash_arg_in_struct;
7afe21cc
RK
2567 int addr_volatile;
2568 int regno;
2197a88a 2569 unsigned hash;
7afe21cc
RK
2570
2571 /* Do not try to replace constant addresses or addresses of local and
2572 argument slots. These MEM expressions are made only once and inserted
2573 in many instructions, as well as being used to control symbol table
2574 output. It is not safe to clobber them.
2575
2576 There are some uncommon cases where the address is already in a register
2577 for some reason, but we cannot take advantage of that because we have
2578 no easy way to unshare the MEM. In addition, looking up all stack
2579 addresses is costly. */
2580 if ((GET_CODE (addr) == PLUS
2581 && GET_CODE (XEXP (addr, 0)) == REG
2582 && GET_CODE (XEXP (addr, 1)) == CONST_INT
2583 && (regno = REGNO (XEXP (addr, 0)),
8bc169f2
DE
2584 regno == FRAME_POINTER_REGNUM || regno == HARD_FRAME_POINTER_REGNUM
2585 || regno == ARG_POINTER_REGNUM))
7afe21cc 2586 || (GET_CODE (addr) == REG
8bc169f2
DE
2587 && (regno = REGNO (addr), regno == FRAME_POINTER_REGNUM
2588 || regno == HARD_FRAME_POINTER_REGNUM
2589 || regno == ARG_POINTER_REGNUM))
e9a25f70 2590 || GET_CODE (addr) == ADDRESSOF
7afe21cc
RK
2591 || CONSTANT_ADDRESS_P (addr))
2592 return;
2593
2594 /* If this address is not simply a register, try to fold it. This will
2595 sometimes simplify the expression. Many simplifications
2596 will not be valid, but some, usually applying the associative rule, will
2597 be valid and produce better code. */
8c87f107
RK
2598 if (GET_CODE (addr) != REG)
2599 {
2600 rtx folded = fold_rtx (copy_rtx (addr), NULL_RTX);
2601
2602 if (1
2603#ifdef ADDRESS_COST
2604 && (ADDRESS_COST (folded) < ADDRESS_COST (addr)
2605 || (ADDRESS_COST (folded) == ADDRESS_COST (addr)
9a252d29 2606 && rtx_cost (folded, MEM) > rtx_cost (addr, MEM)))
8c87f107 2607#else
9a252d29 2608 && rtx_cost (folded, MEM) < rtx_cost (addr, MEM)
8c87f107
RK
2609#endif
2610 && validate_change (insn, loc, folded, 0))
2611 addr = folded;
2612 }
7afe21cc 2613
42495ca0
RK
2614 /* If this address is not in the hash table, we can't look for equivalences
2615 of the whole address. Also, ignore if volatile. */
2616
7afe21cc 2617 do_not_record = 0;
2197a88a 2618 hash = HASH (addr, Pmode);
7afe21cc
RK
2619 addr_volatile = do_not_record;
2620 do_not_record = save_do_not_record;
2621 hash_arg_in_memory = save_hash_arg_in_memory;
2622 hash_arg_in_struct = save_hash_arg_in_struct;
2623
2624 if (addr_volatile)
2625 return;
2626
2197a88a 2627 elt = lookup (addr, hash, Pmode);
7afe21cc 2628
7afe21cc 2629#ifndef ADDRESS_COST
42495ca0
RK
2630 if (elt)
2631 {
2d8b0f3a 2632 int our_cost = elt->cost;
42495ca0
RK
2633
2634 /* Find the lowest cost below ours that works. */
2635 for (elt = elt->first_same_value; elt; elt = elt->next_same_value)
2636 if (elt->cost < our_cost
2637 && (GET_CODE (elt->exp) == REG
2638 || exp_equiv_p (elt->exp, elt->exp, 1, 0))
2639 && validate_change (insn, loc,
906c4e36 2640 canon_reg (copy_rtx (elt->exp), NULL_RTX), 0))
42495ca0
RK
2641 return;
2642 }
2643#else
7afe21cc 2644
42495ca0
RK
2645 if (elt)
2646 {
2647 /* We need to find the best (under the criteria documented above) entry
2648 in the class that is valid. We use the `flag' field to indicate
2649 choices that were invalid and iterate until we can't find a better
2650 one that hasn't already been tried. */
7afe21cc 2651
42495ca0
RK
2652 for (p = elt->first_same_value; p; p = p->next_same_value)
2653 p->flag = 0;
7afe21cc 2654
42495ca0
RK
2655 while (found_better)
2656 {
2657 int best_addr_cost = ADDRESS_COST (*loc);
2658 int best_rtx_cost = (elt->cost + 1) >> 1;
2659 struct table_elt *best_elt = elt;
2660
2661 found_better = 0;
2662 for (p = elt->first_same_value; p; p = p->next_same_value)
2663 if (! p->flag
2664 && (GET_CODE (p->exp) == REG
2665 || exp_equiv_p (p->exp, p->exp, 1, 0))
2666 && (ADDRESS_COST (p->exp) < best_addr_cost
2667 || (ADDRESS_COST (p->exp) == best_addr_cost
2668 && (p->cost + 1) >> 1 > best_rtx_cost)))
2669 {
2670 found_better = 1;
2671 best_addr_cost = ADDRESS_COST (p->exp);
2672 best_rtx_cost = (p->cost + 1) >> 1;
2673 best_elt = p;
2674 }
7afe21cc 2675
42495ca0
RK
2676 if (found_better)
2677 {
2678 if (validate_change (insn, loc,
906c4e36
RK
2679 canon_reg (copy_rtx (best_elt->exp),
2680 NULL_RTX), 0))
42495ca0
RK
2681 return;
2682 else
2683 best_elt->flag = 1;
2684 }
2685 }
2686 }
7afe21cc 2687
42495ca0
RK
2688 /* If the address is a binary operation with the first operand a register
2689 and the second a constant, do the same as above, but looking for
2690 equivalences of the register. Then try to simplify before checking for
2691 the best address to use. This catches a few cases: First is when we
2692 have REG+const and the register is another REG+const. We can often merge
2693 the constants and eliminate one insn and one register. It may also be
2694 that a machine has a cheap REG+REG+const. Finally, this improves the
2695 code on the Alpha for unaligned byte stores. */
2696
2697 if (flag_expensive_optimizations
2698 && (GET_RTX_CLASS (GET_CODE (*loc)) == '2'
2699 || GET_RTX_CLASS (GET_CODE (*loc)) == 'c')
2700 && GET_CODE (XEXP (*loc, 0)) == REG
2701 && GET_CODE (XEXP (*loc, 1)) == CONST_INT)
7afe21cc 2702 {
42495ca0
RK
2703 rtx c = XEXP (*loc, 1);
2704
2705 do_not_record = 0;
2197a88a 2706 hash = HASH (XEXP (*loc, 0), Pmode);
42495ca0
RK
2707 do_not_record = save_do_not_record;
2708 hash_arg_in_memory = save_hash_arg_in_memory;
2709 hash_arg_in_struct = save_hash_arg_in_struct;
2710
2197a88a 2711 elt = lookup (XEXP (*loc, 0), hash, Pmode);
42495ca0
RK
2712 if (elt == 0)
2713 return;
2714
2715 /* We need to find the best (under the criteria documented above) entry
2716 in the class that is valid. We use the `flag' field to indicate
2717 choices that were invalid and iterate until we can't find a better
2718 one that hasn't already been tried. */
7afe21cc 2719
7afe21cc 2720 for (p = elt->first_same_value; p; p = p->next_same_value)
42495ca0 2721 p->flag = 0;
7afe21cc 2722
42495ca0 2723 while (found_better)
7afe21cc 2724 {
42495ca0
RK
2725 int best_addr_cost = ADDRESS_COST (*loc);
2726 int best_rtx_cost = (COST (*loc) + 1) >> 1;
2727 struct table_elt *best_elt = elt;
2728 rtx best_rtx = *loc;
f6516aee
JW
2729 int count;
2730
2731 /* This is at worst case an O(n^2) algorithm, so limit our search
2732 to the first 32 elements on the list. This avoids trouble
2733 compiling code with very long basic blocks that can easily
2734 call cse_gen_binary so many times that we run out of memory. */
42495ca0
RK
2735
2736 found_better = 0;
f6516aee
JW
2737 for (p = elt->first_same_value, count = 0;
2738 p && count < 32;
2739 p = p->next_same_value, count++)
42495ca0
RK
2740 if (! p->flag
2741 && (GET_CODE (p->exp) == REG
2742 || exp_equiv_p (p->exp, p->exp, 1, 0)))
2743 {
96b0e481 2744 rtx new = cse_gen_binary (GET_CODE (*loc), Pmode, p->exp, c);
42495ca0
RK
2745
2746 if ((ADDRESS_COST (new) < best_addr_cost
2747 || (ADDRESS_COST (new) == best_addr_cost
2748 && (COST (new) + 1) >> 1 > best_rtx_cost)))
2749 {
2750 found_better = 1;
2751 best_addr_cost = ADDRESS_COST (new);
2752 best_rtx_cost = (COST (new) + 1) >> 1;
2753 best_elt = p;
2754 best_rtx = new;
2755 }
2756 }
2757
2758 if (found_better)
2759 {
2760 if (validate_change (insn, loc,
906c4e36
RK
2761 canon_reg (copy_rtx (best_rtx),
2762 NULL_RTX), 0))
42495ca0
RK
2763 return;
2764 else
2765 best_elt->flag = 1;
2766 }
7afe21cc
RK
2767 }
2768 }
2769#endif
2770}
2771\f
2772/* Given an operation (CODE, *PARG1, *PARG2), where code is a comparison
2773 operation (EQ, NE, GT, etc.), follow it back through the hash table and
2774 what values are being compared.
2775
2776 *PARG1 and *PARG2 are updated to contain the rtx representing the values
2777 actually being compared. For example, if *PARG1 was (cc0) and *PARG2
2778 was (const_int 0), *PARG1 and *PARG2 will be set to the objects that were
2779 compared to produce cc0.
2780
2781 The return value is the comparison operator and is either the code of
2782 A or the code corresponding to the inverse of the comparison. */
2783
2784static enum rtx_code
13c9910f 2785find_comparison_args (code, parg1, parg2, pmode1, pmode2)
7afe21cc
RK
2786 enum rtx_code code;
2787 rtx *parg1, *parg2;
13c9910f 2788 enum machine_mode *pmode1, *pmode2;
7afe21cc
RK
2789{
2790 rtx arg1, arg2;
2791
2792 arg1 = *parg1, arg2 = *parg2;
2793
2794 /* If ARG2 is const0_rtx, see what ARG1 is equivalent to. */
2795
b2796a4b 2796 while (arg2 == CONST0_RTX (GET_MODE (arg1)))
7afe21cc
RK
2797 {
2798 /* Set non-zero when we find something of interest. */
2799 rtx x = 0;
2800 int reverse_code = 0;
2801 struct table_elt *p = 0;
2802
2803 /* If arg1 is a COMPARE, extract the comparison arguments from it.
2804 On machines with CC0, this is the only case that can occur, since
2805 fold_rtx will return the COMPARE or item being compared with zero
2806 when given CC0. */
2807
2808 if (GET_CODE (arg1) == COMPARE && arg2 == const0_rtx)
2809 x = arg1;
2810
2811 /* If ARG1 is a comparison operator and CODE is testing for
2812 STORE_FLAG_VALUE, get the inner arguments. */
2813
2814 else if (GET_RTX_CLASS (GET_CODE (arg1)) == '<')
2815 {
c610adec
RK
2816 if (code == NE
2817 || (GET_MODE_CLASS (GET_MODE (arg1)) == MODE_INT
2818 && code == LT && STORE_FLAG_VALUE == -1)
2819#ifdef FLOAT_STORE_FLAG_VALUE
2820 || (GET_MODE_CLASS (GET_MODE (arg1)) == MODE_FLOAT
2821 && FLOAT_STORE_FLAG_VALUE < 0)
2822#endif
2823 )
7afe21cc 2824 x = arg1;
c610adec
RK
2825 else if (code == EQ
2826 || (GET_MODE_CLASS (GET_MODE (arg1)) == MODE_INT
2827 && code == GE && STORE_FLAG_VALUE == -1)
2828#ifdef FLOAT_STORE_FLAG_VALUE
2829 || (GET_MODE_CLASS (GET_MODE (arg1)) == MODE_FLOAT
2830 && FLOAT_STORE_FLAG_VALUE < 0)
2831#endif
2832 )
7afe21cc
RK
2833 x = arg1, reverse_code = 1;
2834 }
2835
2836 /* ??? We could also check for
2837
2838 (ne (and (eq (...) (const_int 1))) (const_int 0))
2839
2840 and related forms, but let's wait until we see them occurring. */
2841
2842 if (x == 0)
2843 /* Look up ARG1 in the hash table and see if it has an equivalence
2844 that lets us see what is being compared. */
2845 p = lookup (arg1, safe_hash (arg1, GET_MODE (arg1)) % NBUCKETS,
2846 GET_MODE (arg1));
2847 if (p) p = p->first_same_value;
2848
2849 for (; p; p = p->next_same_value)
2850 {
2851 enum machine_mode inner_mode = GET_MODE (p->exp);
2852
2853 /* If the entry isn't valid, skip it. */
2854 if (! exp_equiv_p (p->exp, p->exp, 1, 0))
2855 continue;
2856
2857 if (GET_CODE (p->exp) == COMPARE
2858 /* Another possibility is that this machine has a compare insn
2859 that includes the comparison code. In that case, ARG1 would
2860 be equivalent to a comparison operation that would set ARG1 to
2861 either STORE_FLAG_VALUE or zero. If this is an NE operation,
2862 ORIG_CODE is the actual comparison being done; if it is an EQ,
2863 we must reverse ORIG_CODE. On machine with a negative value
2864 for STORE_FLAG_VALUE, also look at LT and GE operations. */
2865 || ((code == NE
2866 || (code == LT
c610adec 2867 && GET_MODE_CLASS (inner_mode) == MODE_INT
906c4e36
RK
2868 && (GET_MODE_BITSIZE (inner_mode)
2869 <= HOST_BITS_PER_WIDE_INT)
7afe21cc 2870 && (STORE_FLAG_VALUE
906c4e36
RK
2871 & ((HOST_WIDE_INT) 1
2872 << (GET_MODE_BITSIZE (inner_mode) - 1))))
c610adec
RK
2873#ifdef FLOAT_STORE_FLAG_VALUE
2874 || (code == LT
2875 && GET_MODE_CLASS (inner_mode) == MODE_FLOAT
2876 && FLOAT_STORE_FLAG_VALUE < 0)
2877#endif
2878 )
7afe21cc
RK
2879 && GET_RTX_CLASS (GET_CODE (p->exp)) == '<'))
2880 {
2881 x = p->exp;
2882 break;
2883 }
2884 else if ((code == EQ
2885 || (code == GE
c610adec 2886 && GET_MODE_CLASS (inner_mode) == MODE_INT
906c4e36
RK
2887 && (GET_MODE_BITSIZE (inner_mode)
2888 <= HOST_BITS_PER_WIDE_INT)
7afe21cc 2889 && (STORE_FLAG_VALUE
906c4e36
RK
2890 & ((HOST_WIDE_INT) 1
2891 << (GET_MODE_BITSIZE (inner_mode) - 1))))
c610adec
RK
2892#ifdef FLOAT_STORE_FLAG_VALUE
2893 || (code == GE
2894 && GET_MODE_CLASS (inner_mode) == MODE_FLOAT
2895 && FLOAT_STORE_FLAG_VALUE < 0)
2896#endif
2897 )
7afe21cc
RK
2898 && GET_RTX_CLASS (GET_CODE (p->exp)) == '<')
2899 {
2900 reverse_code = 1;
2901 x = p->exp;
2902 break;
2903 }
2904
2905 /* If this is fp + constant, the equivalent is a better operand since
2906 it may let us predict the value of the comparison. */
2907 else if (NONZERO_BASE_PLUS_P (p->exp))
2908 {
2909 arg1 = p->exp;
2910 continue;
2911 }
2912 }
2913
2914 /* If we didn't find a useful equivalence for ARG1, we are done.
2915 Otherwise, set up for the next iteration. */
2916 if (x == 0)
2917 break;
2918
2919 arg1 = XEXP (x, 0), arg2 = XEXP (x, 1);
2920 if (GET_RTX_CLASS (GET_CODE (x)) == '<')
2921 code = GET_CODE (x);
2922
2923 if (reverse_code)
2924 code = reverse_condition (code);
2925 }
2926
13c9910f
RS
2927 /* Return our results. Return the modes from before fold_rtx
2928 because fold_rtx might produce const_int, and then it's too late. */
2929 *pmode1 = GET_MODE (arg1), *pmode2 = GET_MODE (arg2);
7afe21cc
RK
2930 *parg1 = fold_rtx (arg1, 0), *parg2 = fold_rtx (arg2, 0);
2931
2932 return code;
2933}
2934\f
2935/* Try to simplify a unary operation CODE whose output mode is to be
2936 MODE with input operand OP whose mode was originally OP_MODE.
2937 Return zero if no simplification can be made. */
2938
2939rtx
2940simplify_unary_operation (code, mode, op, op_mode)
2941 enum rtx_code code;
2942 enum machine_mode mode;
2943 rtx op;
2944 enum machine_mode op_mode;
2945{
2946 register int width = GET_MODE_BITSIZE (mode);
2947
2948 /* The order of these tests is critical so that, for example, we don't
2949 check the wrong mode (input vs. output) for a conversion operation,
2950 such as FIX. At some point, this should be simplified. */
2951
62c0ea12 2952#if !defined(REAL_IS_NOT_DOUBLE) || defined(REAL_ARITHMETIC)
7afe21cc 2953
62c0ea12
RK
2954 if (code == FLOAT && GET_MODE (op) == VOIDmode
2955 && (GET_CODE (op) == CONST_DOUBLE || GET_CODE (op) == CONST_INT))
7afe21cc 2956 {
62c0ea12 2957 HOST_WIDE_INT hv, lv;
7afe21cc
RK
2958 REAL_VALUE_TYPE d;
2959
62c0ea12
RK
2960 if (GET_CODE (op) == CONST_INT)
2961 lv = INTVAL (op), hv = INTVAL (op) < 0 ? -1 : 0;
2962 else
7ac4a266 2963 lv = CONST_DOUBLE_LOW (op), hv = CONST_DOUBLE_HIGH (op);
7afe21cc
RK
2964
2965#ifdef REAL_ARITHMETIC
2ebcccf3 2966 REAL_VALUE_FROM_INT (d, lv, hv, mode);
7afe21cc 2967#else
62c0ea12 2968 if (hv < 0)
7afe21cc 2969 {
62c0ea12 2970 d = (double) (~ hv);
906c4e36
RK
2971 d *= ((double) ((HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT / 2))
2972 * (double) ((HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT / 2)));
62c0ea12 2973 d += (double) (unsigned HOST_WIDE_INT) (~ lv);
7afe21cc
RK
2974 d = (- d - 1.0);
2975 }
2976 else
2977 {
62c0ea12 2978 d = (double) hv;
906c4e36
RK
2979 d *= ((double) ((HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT / 2))
2980 * (double) ((HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT / 2)));
62c0ea12 2981 d += (double) (unsigned HOST_WIDE_INT) lv;
7afe21cc
RK
2982 }
2983#endif /* REAL_ARITHMETIC */
940fd0b5 2984 d = real_value_truncate (mode, d);
7afe21cc
RK
2985 return CONST_DOUBLE_FROM_REAL_VALUE (d, mode);
2986 }
62c0ea12
RK
2987 else if (code == UNSIGNED_FLOAT && GET_MODE (op) == VOIDmode
2988 && (GET_CODE (op) == CONST_DOUBLE || GET_CODE (op) == CONST_INT))
7afe21cc 2989 {
62c0ea12 2990 HOST_WIDE_INT hv, lv;
7afe21cc
RK
2991 REAL_VALUE_TYPE d;
2992
62c0ea12
RK
2993 if (GET_CODE (op) == CONST_INT)
2994 lv = INTVAL (op), hv = INTVAL (op) < 0 ? -1 : 0;
2995 else
7ac4a266 2996 lv = CONST_DOUBLE_LOW (op), hv = CONST_DOUBLE_HIGH (op);
62c0ea12 2997
a9c6464d
RK
2998 if (op_mode == VOIDmode)
2999 {
3000 /* We don't know how to interpret negative-looking numbers in
3001 this case, so don't try to fold those. */
3002 if (hv < 0)
3003 return 0;
3004 }
3005 else if (GET_MODE_BITSIZE (op_mode) >= HOST_BITS_PER_WIDE_INT * 2)
62c0ea12
RK
3006 ;
3007 else
3008 hv = 0, lv &= GET_MODE_MASK (op_mode);
3009
7afe21cc 3010#ifdef REAL_ARITHMETIC
2ebcccf3 3011 REAL_VALUE_FROM_UNSIGNED_INT (d, lv, hv, mode);
7afe21cc 3012#else
62c0ea12 3013
138cec59 3014 d = (double) (unsigned HOST_WIDE_INT) hv;
906c4e36
RK
3015 d *= ((double) ((HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT / 2))
3016 * (double) ((HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT / 2)));
62c0ea12 3017 d += (double) (unsigned HOST_WIDE_INT) lv;
7afe21cc 3018#endif /* REAL_ARITHMETIC */
940fd0b5 3019 d = real_value_truncate (mode, d);
7afe21cc
RK
3020 return CONST_DOUBLE_FROM_REAL_VALUE (d, mode);
3021 }
3022#endif
3023
f89e32e9
RK
3024 if (GET_CODE (op) == CONST_INT
3025 && width <= HOST_BITS_PER_WIDE_INT && width > 0)
7afe21cc 3026 {
906c4e36
RK
3027 register HOST_WIDE_INT arg0 = INTVAL (op);
3028 register HOST_WIDE_INT val;
7afe21cc
RK
3029
3030 switch (code)
3031 {
3032 case NOT:
3033 val = ~ arg0;
3034 break;
3035
3036 case NEG:
3037 val = - arg0;
3038 break;
3039
3040 case ABS:
3041 val = (arg0 >= 0 ? arg0 : - arg0);
3042 break;
3043
3044 case FFS:
3045 /* Don't use ffs here. Instead, get low order bit and then its
3046 number. If arg0 is zero, this will return 0, as desired. */
3047 arg0 &= GET_MODE_MASK (mode);
3048 val = exact_log2 (arg0 & (- arg0)) + 1;
3049 break;
3050
3051 case TRUNCATE:
3052 val = arg0;
3053 break;
3054
3055 case ZERO_EXTEND:
3056 if (op_mode == VOIDmode)
3057 op_mode = mode;
82a5e898 3058 if (GET_MODE_BITSIZE (op_mode) == HOST_BITS_PER_WIDE_INT)
d80e9fd7
RS
3059 {
3060 /* If we were really extending the mode,
3061 we would have to distinguish between zero-extension
3062 and sign-extension. */
3063 if (width != GET_MODE_BITSIZE (op_mode))
3064 abort ();
3065 val = arg0;
3066 }
82a5e898
CH
3067 else if (GET_MODE_BITSIZE (op_mode) < HOST_BITS_PER_WIDE_INT)
3068 val = arg0 & ~((HOST_WIDE_INT) (-1) << GET_MODE_BITSIZE (op_mode));
7afe21cc
RK
3069 else
3070 return 0;
3071 break;
3072
3073 case SIGN_EXTEND:
3074 if (op_mode == VOIDmode)
3075 op_mode = mode;
82a5e898 3076 if (GET_MODE_BITSIZE (op_mode) == HOST_BITS_PER_WIDE_INT)
d80e9fd7
RS
3077 {
3078 /* If we were really extending the mode,
3079 we would have to distinguish between zero-extension
3080 and sign-extension. */
3081 if (width != GET_MODE_BITSIZE (op_mode))
3082 abort ();
3083 val = arg0;
3084 }
f12564b4 3085 else if (GET_MODE_BITSIZE (op_mode) < HOST_BITS_PER_WIDE_INT)
7afe21cc 3086 {
82a5e898
CH
3087 val
3088 = arg0 & ~((HOST_WIDE_INT) (-1) << GET_MODE_BITSIZE (op_mode));
3089 if (val
3090 & ((HOST_WIDE_INT) 1 << (GET_MODE_BITSIZE (op_mode) - 1)))
3091 val -= (HOST_WIDE_INT) 1 << GET_MODE_BITSIZE (op_mode);
7afe21cc
RK
3092 }
3093 else
3094 return 0;
3095 break;
3096
d45cf215
RS
3097 case SQRT:
3098 return 0;
3099
7afe21cc
RK
3100 default:
3101 abort ();
3102 }
3103
3104 /* Clear the bits that don't belong in our mode,
3105 unless they and our sign bit are all one.
3106 So we get either a reasonable negative value or a reasonable
3107 unsigned value for this mode. */
906c4e36
RK
3108 if (width < HOST_BITS_PER_WIDE_INT
3109 && ((val & ((HOST_WIDE_INT) (-1) << (width - 1)))
3110 != ((HOST_WIDE_INT) (-1) << (width - 1))))
4879acf6 3111 val &= ((HOST_WIDE_INT) 1 << width) - 1;
7afe21cc 3112
906c4e36 3113 return GEN_INT (val);
7afe21cc
RK
3114 }
3115
3116 /* We can do some operations on integer CONST_DOUBLEs. Also allow
0f41302f 3117 for a DImode operation on a CONST_INT. */
8e0ac43b 3118 else if (GET_MODE (op) == VOIDmode && width <= HOST_BITS_PER_INT * 2
7afe21cc
RK
3119 && (GET_CODE (op) == CONST_DOUBLE || GET_CODE (op) == CONST_INT))
3120 {
906c4e36 3121 HOST_WIDE_INT l1, h1, lv, hv;
7afe21cc
RK
3122
3123 if (GET_CODE (op) == CONST_DOUBLE)
3124 l1 = CONST_DOUBLE_LOW (op), h1 = CONST_DOUBLE_HIGH (op);
3125 else
3126 l1 = INTVAL (op), h1 = l1 < 0 ? -1 : 0;
3127
3128 switch (code)
3129 {
3130 case NOT:
3131 lv = ~ l1;
3132 hv = ~ h1;
3133 break;
3134
3135 case NEG:
3136 neg_double (l1, h1, &lv, &hv);
3137 break;
3138
3139 case ABS:
3140 if (h1 < 0)
3141 neg_double (l1, h1, &lv, &hv);
3142 else
3143 lv = l1, hv = h1;
3144 break;
3145
3146 case FFS:
3147 hv = 0;
3148 if (l1 == 0)
906c4e36 3149 lv = HOST_BITS_PER_WIDE_INT + exact_log2 (h1 & (-h1)) + 1;
7afe21cc
RK
3150 else
3151 lv = exact_log2 (l1 & (-l1)) + 1;
3152 break;
3153
3154 case TRUNCATE:
8e0ac43b 3155 /* This is just a change-of-mode, so do nothing. */
d50d63c0 3156 lv = l1, hv = h1;
7afe21cc
RK
3157 break;
3158
f72aed24
RS
3159 case ZERO_EXTEND:
3160 if (op_mode == VOIDmode
906c4e36 3161 || GET_MODE_BITSIZE (op_mode) > HOST_BITS_PER_WIDE_INT)
f72aed24
RS
3162 return 0;
3163
3164 hv = 0;
3165 lv = l1 & GET_MODE_MASK (op_mode);
3166 break;
3167
3168 case SIGN_EXTEND:
3169 if (op_mode == VOIDmode
906c4e36 3170 || GET_MODE_BITSIZE (op_mode) > HOST_BITS_PER_WIDE_INT)
f72aed24
RS
3171 return 0;
3172 else
3173 {
3174 lv = l1 & GET_MODE_MASK (op_mode);
906c4e36
RK
3175 if (GET_MODE_BITSIZE (op_mode) < HOST_BITS_PER_WIDE_INT
3176 && (lv & ((HOST_WIDE_INT) 1
3177 << (GET_MODE_BITSIZE (op_mode) - 1))) != 0)
3178 lv -= (HOST_WIDE_INT) 1 << GET_MODE_BITSIZE (op_mode);
f72aed24 3179
906c4e36 3180 hv = (lv < 0) ? ~ (HOST_WIDE_INT) 0 : 0;
f72aed24
RS
3181 }
3182 break;
3183
d45cf215
RS
3184 case SQRT:
3185 return 0;
3186
7afe21cc
RK
3187 default:
3188 return 0;
3189 }
3190
3191 return immed_double_const (lv, hv, mode);
3192 }
3193
3194#if ! defined (REAL_IS_NOT_DOUBLE) || defined (REAL_ARITHMETIC)
3195 else if (GET_CODE (op) == CONST_DOUBLE
3196 && GET_MODE_CLASS (mode) == MODE_FLOAT)
3197 {
3198 REAL_VALUE_TYPE d;
3199 jmp_buf handler;
3200 rtx x;
3201
3202 if (setjmp (handler))
3203 /* There used to be a warning here, but that is inadvisable.
3204 People may want to cause traps, and the natural way
3205 to do it should not get a warning. */
3206 return 0;
3207
3208 set_float_handler (handler);
3209
3210 REAL_VALUE_FROM_CONST_DOUBLE (d, op);
3211
3212 switch (code)
3213 {
3214 case NEG:
3215 d = REAL_VALUE_NEGATE (d);
3216 break;
3217
3218 case ABS:
8b3686ed 3219 if (REAL_VALUE_NEGATIVE (d))
7afe21cc
RK
3220 d = REAL_VALUE_NEGATE (d);
3221 break;
3222
3223 case FLOAT_TRUNCATE:
d3159aee 3224 d = real_value_truncate (mode, d);
7afe21cc
RK
3225 break;
3226
3227 case FLOAT_EXTEND:
3228 /* All this does is change the mode. */
3229 break;
3230
3231 case FIX:
d3159aee 3232 d = REAL_VALUE_RNDZINT (d);
7afe21cc
RK
3233 break;
3234
3235 case UNSIGNED_FIX:
d3159aee 3236 d = REAL_VALUE_UNSIGNED_RNDZINT (d);
7afe21cc
RK
3237 break;
3238
d45cf215
RS
3239 case SQRT:
3240 return 0;
3241
7afe21cc
RK
3242 default:
3243 abort ();
3244 }
3245
560c94a2 3246 x = CONST_DOUBLE_FROM_REAL_VALUE (d, mode);
906c4e36 3247 set_float_handler (NULL_PTR);
7afe21cc
RK
3248 return x;
3249 }
8e0ac43b
RK
3250
3251 else if (GET_CODE (op) == CONST_DOUBLE
3252 && GET_MODE_CLASS (GET_MODE (op)) == MODE_FLOAT
3253 && GET_MODE_CLASS (mode) == MODE_INT
906c4e36 3254 && width <= HOST_BITS_PER_WIDE_INT && width > 0)
7afe21cc
RK
3255 {
3256 REAL_VALUE_TYPE d;
3257 jmp_buf handler;
906c4e36 3258 HOST_WIDE_INT val;
7afe21cc
RK
3259
3260 if (setjmp (handler))
3261 return 0;
3262
3263 set_float_handler (handler);
3264
3265 REAL_VALUE_FROM_CONST_DOUBLE (d, op);
3266
3267 switch (code)
3268 {
3269 case FIX:
3270 val = REAL_VALUE_FIX (d);
3271 break;
3272
3273 case UNSIGNED_FIX:
3274 val = REAL_VALUE_UNSIGNED_FIX (d);
3275 break;
3276
3277 default:
3278 abort ();
3279 }
3280
906c4e36 3281 set_float_handler (NULL_PTR);
7afe21cc
RK
3282
3283 /* Clear the bits that don't belong in our mode,
3284 unless they and our sign bit are all one.
3285 So we get either a reasonable negative value or a reasonable
3286 unsigned value for this mode. */
906c4e36
RK
3287 if (width < HOST_BITS_PER_WIDE_INT
3288 && ((val & ((HOST_WIDE_INT) (-1) << (width - 1)))
3289 != ((HOST_WIDE_INT) (-1) << (width - 1))))
3290 val &= ((HOST_WIDE_INT) 1 << width) - 1;
7afe21cc 3291
ad89d6f6
TG
3292 /* If this would be an entire word for the target, but is not for
3293 the host, then sign-extend on the host so that the number will look
3294 the same way on the host that it would on the target.
3295
3296 For example, when building a 64 bit alpha hosted 32 bit sparc
3297 targeted compiler, then we want the 32 bit unsigned value -1 to be
3298 represented as a 64 bit value -1, and not as 0x00000000ffffffff.
3299 The later confuses the sparc backend. */
3300
3301 if (BITS_PER_WORD < HOST_BITS_PER_WIDE_INT && BITS_PER_WORD == width
3302 && (val & ((HOST_WIDE_INT) 1 << (width - 1))))
3303 val |= ((HOST_WIDE_INT) (-1) << width);
3304
906c4e36 3305 return GEN_INT (val);
7afe21cc
RK
3306 }
3307#endif
a6acbe15
RS
3308 /* This was formerly used only for non-IEEE float.
3309 eggert@twinsun.com says it is safe for IEEE also. */
3310 else
7afe21cc
RK
3311 {
3312 /* There are some simplifications we can do even if the operands
a6acbe15 3313 aren't constant. */
7afe21cc
RK
3314 switch (code)
3315 {
3316 case NEG:
3317 case NOT:
3318 /* (not (not X)) == X, similarly for NEG. */
3319 if (GET_CODE (op) == code)
3320 return XEXP (op, 0);
3321 break;
3322
3323 case SIGN_EXTEND:
3324 /* (sign_extend (truncate (minus (label_ref L1) (label_ref L2))))
3325 becomes just the MINUS if its mode is MODE. This allows
3326 folding switch statements on machines using casesi (such as
3327 the Vax). */
3328 if (GET_CODE (op) == TRUNCATE
3329 && GET_MODE (XEXP (op, 0)) == mode
3330 && GET_CODE (XEXP (op, 0)) == MINUS
3331 && GET_CODE (XEXP (XEXP (op, 0), 0)) == LABEL_REF
3332 && GET_CODE (XEXP (XEXP (op, 0), 1)) == LABEL_REF)
3333 return XEXP (op, 0);
cceb347c
RK
3334
3335#ifdef POINTERS_EXTEND_UNSIGNED
3336 if (! POINTERS_EXTEND_UNSIGNED
3337 && mode == Pmode && GET_MODE (op) == ptr_mode
3338 && CONSTANT_P (op))
3339 return convert_memory_address (Pmode, op);
3340#endif
3341 break;
3342
3343#ifdef POINTERS_EXTEND_UNSIGNED
3344 case ZERO_EXTEND:
3345 if (POINTERS_EXTEND_UNSIGNED
3346 && mode == Pmode && GET_MODE (op) == ptr_mode
3347 && CONSTANT_P (op))
3348 return convert_memory_address (Pmode, op);
7afe21cc 3349 break;
cceb347c 3350#endif
e9a25f70
JL
3351
3352 default:
3353 break;
7afe21cc
RK
3354 }
3355
3356 return 0;
3357 }
7afe21cc
RK
3358}
3359\f
3360/* Simplify a binary operation CODE with result mode MODE, operating on OP0
3361 and OP1. Return 0 if no simplification is possible.
3362
3363 Don't use this for relational operations such as EQ or LT.
3364 Use simplify_relational_operation instead. */
3365
3366rtx
3367simplify_binary_operation (code, mode, op0, op1)
3368 enum rtx_code code;
3369 enum machine_mode mode;
3370 rtx op0, op1;
3371{
906c4e36
RK
3372 register HOST_WIDE_INT arg0, arg1, arg0s, arg1s;
3373 HOST_WIDE_INT val;
7afe21cc 3374 int width = GET_MODE_BITSIZE (mode);
96b0e481 3375 rtx tem;
7afe21cc
RK
3376
3377 /* Relational operations don't work here. We must know the mode
3378 of the operands in order to do the comparison correctly.
3379 Assuming a full word can give incorrect results.
3380 Consider comparing 128 with -128 in QImode. */
3381
3382 if (GET_RTX_CLASS (code) == '<')
3383 abort ();
3384
3385#if ! defined (REAL_IS_NOT_DOUBLE) || defined (REAL_ARITHMETIC)
3386 if (GET_MODE_CLASS (mode) == MODE_FLOAT
3387 && GET_CODE (op0) == CONST_DOUBLE && GET_CODE (op1) == CONST_DOUBLE
3388 && mode == GET_MODE (op0) && mode == GET_MODE (op1))
3389 {
3390 REAL_VALUE_TYPE f0, f1, value;
3391 jmp_buf handler;
3392
3393 if (setjmp (handler))
3394 return 0;
3395
3396 set_float_handler (handler);
3397
3398 REAL_VALUE_FROM_CONST_DOUBLE (f0, op0);
3399 REAL_VALUE_FROM_CONST_DOUBLE (f1, op1);
5352b11a
RS
3400 f0 = real_value_truncate (mode, f0);
3401 f1 = real_value_truncate (mode, f1);
7afe21cc
RK
3402
3403#ifdef REAL_ARITHMETIC
956d6950
JL
3404#ifndef REAL_INFINITY
3405 if (code == DIV && REAL_VALUES_EQUAL (f1, dconst0))
3406 return 0;
3407#endif
d3159aee 3408 REAL_ARITHMETIC (value, rtx_to_tree_code (code), f0, f1);
7afe21cc
RK
3409#else
3410 switch (code)
3411 {
3412 case PLUS:
3413 value = f0 + f1;
3414 break;
3415 case MINUS:
3416 value = f0 - f1;
3417 break;
3418 case MULT:
3419 value = f0 * f1;
3420 break;
3421 case DIV:
3422#ifndef REAL_INFINITY
3423 if (f1 == 0)
21d12b80 3424 return 0;
7afe21cc
RK
3425#endif
3426 value = f0 / f1;
3427 break;
3428 case SMIN:
3429 value = MIN (f0, f1);
3430 break;
3431 case SMAX:
3432 value = MAX (f0, f1);
3433 break;
3434 default:
3435 abort ();
3436 }
3437#endif
3438
5352b11a 3439 value = real_value_truncate (mode, value);
831522a4 3440 set_float_handler (NULL_PTR);
560c94a2 3441 return CONST_DOUBLE_FROM_REAL_VALUE (value, mode);
7afe21cc 3442 }
6076248a 3443#endif /* not REAL_IS_NOT_DOUBLE, or REAL_ARITHMETIC */
7afe21cc
RK
3444
3445 /* We can fold some multi-word operations. */
6076248a 3446 if (GET_MODE_CLASS (mode) == MODE_INT
33085906 3447 && width == HOST_BITS_PER_WIDE_INT * 2
fe873240 3448 && (GET_CODE (op0) == CONST_DOUBLE || GET_CODE (op0) == CONST_INT)
6076248a 3449 && (GET_CODE (op1) == CONST_DOUBLE || GET_CODE (op1) == CONST_INT))
7afe21cc 3450 {
906c4e36 3451 HOST_WIDE_INT l1, l2, h1, h2, lv, hv;
7afe21cc 3452
fe873240
RK
3453 if (GET_CODE (op0) == CONST_DOUBLE)
3454 l1 = CONST_DOUBLE_LOW (op0), h1 = CONST_DOUBLE_HIGH (op0);
3455 else
3456 l1 = INTVAL (op0), h1 = l1 < 0 ? -1 : 0;
7afe21cc
RK
3457
3458 if (GET_CODE (op1) == CONST_DOUBLE)
3459 l2 = CONST_DOUBLE_LOW (op1), h2 = CONST_DOUBLE_HIGH (op1);
3460 else
3461 l2 = INTVAL (op1), h2 = l2 < 0 ? -1 : 0;
3462
3463 switch (code)
3464 {
3465 case MINUS:
3466 /* A - B == A + (-B). */
3467 neg_double (l2, h2, &lv, &hv);
3468 l2 = lv, h2 = hv;
3469
0f41302f 3470 /* .. fall through ... */
7afe21cc
RK
3471
3472 case PLUS:
3473 add_double (l1, h1, l2, h2, &lv, &hv);
3474 break;
3475
3476 case MULT:
3477 mul_double (l1, h1, l2, h2, &lv, &hv);
3478 break;
3479
3480 case DIV: case MOD: case UDIV: case UMOD:
3481 /* We'd need to include tree.h to do this and it doesn't seem worth
3482 it. */
3483 return 0;
3484
3485 case AND:
3486 lv = l1 & l2, hv = h1 & h2;
3487 break;
3488
3489 case IOR:
3490 lv = l1 | l2, hv = h1 | h2;
3491 break;
3492
3493 case XOR:
3494 lv = l1 ^ l2, hv = h1 ^ h2;
3495 break;
3496
3497 case SMIN:
906c4e36
RK
3498 if (h1 < h2
3499 || (h1 == h2
3500 && ((unsigned HOST_WIDE_INT) l1
3501 < (unsigned HOST_WIDE_INT) l2)))
7afe21cc
RK
3502 lv = l1, hv = h1;
3503 else
3504 lv = l2, hv = h2;
3505 break;
3506
3507 case SMAX:
906c4e36
RK
3508 if (h1 > h2
3509 || (h1 == h2
3510 && ((unsigned HOST_WIDE_INT) l1
3511 > (unsigned HOST_WIDE_INT) l2)))
7afe21cc
RK
3512 lv = l1, hv = h1;
3513 else
3514 lv = l2, hv = h2;
3515 break;
3516
3517 case UMIN:
906c4e36
RK
3518 if ((unsigned HOST_WIDE_INT) h1 < (unsigned HOST_WIDE_INT) h2
3519 || (h1 == h2
3520 && ((unsigned HOST_WIDE_INT) l1
3521 < (unsigned HOST_WIDE_INT) l2)))
7afe21cc
RK
3522 lv = l1, hv = h1;
3523 else
3524 lv = l2, hv = h2;
3525 break;
3526
3527 case UMAX:
906c4e36
RK
3528 if ((unsigned HOST_WIDE_INT) h1 > (unsigned HOST_WIDE_INT) h2
3529 || (h1 == h2
3530 && ((unsigned HOST_WIDE_INT) l1
3531 > (unsigned HOST_WIDE_INT) l2)))
7afe21cc
RK
3532 lv = l1, hv = h1;
3533 else
3534 lv = l2, hv = h2;
3535 break;
3536
3537 case LSHIFTRT: case ASHIFTRT:
45620ed4 3538 case ASHIFT:
7afe21cc
RK
3539 case ROTATE: case ROTATERT:
3540#ifdef SHIFT_COUNT_TRUNCATED
85c0a556
RK
3541 if (SHIFT_COUNT_TRUNCATED)
3542 l2 &= (GET_MODE_BITSIZE (mode) - 1), h2 = 0;
7afe21cc
RK
3543#endif
3544
3545 if (h2 != 0 || l2 < 0 || l2 >= GET_MODE_BITSIZE (mode))
3546 return 0;
3547
3548 if (code == LSHIFTRT || code == ASHIFTRT)
3549 rshift_double (l1, h1, l2, GET_MODE_BITSIZE (mode), &lv, &hv,
3550 code == ASHIFTRT);
45620ed4
RK
3551 else if (code == ASHIFT)
3552 lshift_double (l1, h1, l2, GET_MODE_BITSIZE (mode), &lv, &hv, 1);
7afe21cc
RK
3553 else if (code == ROTATE)
3554 lrotate_double (l1, h1, l2, GET_MODE_BITSIZE (mode), &lv, &hv);
3555 else /* code == ROTATERT */
3556 rrotate_double (l1, h1, l2, GET_MODE_BITSIZE (mode), &lv, &hv);
3557 break;
3558
3559 default:
3560 return 0;
3561 }
3562
3563 return immed_double_const (lv, hv, mode);
3564 }
7afe21cc
RK
3565
3566 if (GET_CODE (op0) != CONST_INT || GET_CODE (op1) != CONST_INT
906c4e36 3567 || width > HOST_BITS_PER_WIDE_INT || width == 0)
7afe21cc
RK
3568 {
3569 /* Even if we can't compute a constant result,
3570 there are some cases worth simplifying. */
3571
3572 switch (code)
3573 {
3574 case PLUS:
3575 /* In IEEE floating point, x+0 is not the same as x. Similarly
3576 for the other optimizations below. */
3577 if (TARGET_FLOAT_FORMAT == IEEE_FLOAT_FORMAT
a83afb65 3578 && FLOAT_MODE_P (mode) && ! flag_fast_math)
7afe21cc
RK
3579 break;
3580
3581 if (op1 == CONST0_RTX (mode))
3582 return op0;
3583
7afe21cc
RK
3584 /* ((-a) + b) -> (b - a) and similarly for (a + (-b)) */
3585 if (GET_CODE (op0) == NEG)
96b0e481 3586 return cse_gen_binary (MINUS, mode, op1, XEXP (op0, 0));
7afe21cc 3587 else if (GET_CODE (op1) == NEG)
96b0e481 3588 return cse_gen_binary (MINUS, mode, op0, XEXP (op1, 0));
7afe21cc 3589
96b0e481
RK
3590 /* Handle both-operands-constant cases. We can only add
3591 CONST_INTs to constants since the sum of relocatable symbols
fe873240
RK
3592 can't be handled by most assemblers. Don't add CONST_INT
3593 to CONST_INT since overflow won't be computed properly if wider
3594 than HOST_BITS_PER_WIDE_INT. */
7afe21cc 3595
fe873240
RK
3596 if (CONSTANT_P (op0) && GET_MODE (op0) != VOIDmode
3597 && GET_CODE (op1) == CONST_INT)
96b0e481 3598 return plus_constant (op0, INTVAL (op1));
fe873240
RK
3599 else if (CONSTANT_P (op1) && GET_MODE (op1) != VOIDmode
3600 && GET_CODE (op0) == CONST_INT)
96b0e481 3601 return plus_constant (op1, INTVAL (op0));
7afe21cc 3602
30d69925
RK
3603 /* See if this is something like X * C - X or vice versa or
3604 if the multiplication is written as a shift. If so, we can
3605 distribute and make a new multiply, shift, or maybe just
3606 have X (if C is 2 in the example above). But don't make
3607 real multiply if we didn't have one before. */
3608
3609 if (! FLOAT_MODE_P (mode))
3610 {
3611 HOST_WIDE_INT coeff0 = 1, coeff1 = 1;
3612 rtx lhs = op0, rhs = op1;
3613 int had_mult = 0;
3614
3615 if (GET_CODE (lhs) == NEG)
3616 coeff0 = -1, lhs = XEXP (lhs, 0);
3617 else if (GET_CODE (lhs) == MULT
3618 && GET_CODE (XEXP (lhs, 1)) == CONST_INT)
3619 {
3620 coeff0 = INTVAL (XEXP (lhs, 1)), lhs = XEXP (lhs, 0);
3621 had_mult = 1;
3622 }
3623 else if (GET_CODE (lhs) == ASHIFT
3624 && GET_CODE (XEXP (lhs, 1)) == CONST_INT
3625 && INTVAL (XEXP (lhs, 1)) >= 0
3626 && INTVAL (XEXP (lhs, 1)) < HOST_BITS_PER_WIDE_INT)
3627 {
3628 coeff0 = ((HOST_WIDE_INT) 1) << INTVAL (XEXP (lhs, 1));
3629 lhs = XEXP (lhs, 0);
3630 }
3631
3632 if (GET_CODE (rhs) == NEG)
3633 coeff1 = -1, rhs = XEXP (rhs, 0);
3634 else if (GET_CODE (rhs) == MULT
3635 && GET_CODE (XEXP (rhs, 1)) == CONST_INT)
3636 {
3637 coeff1 = INTVAL (XEXP (rhs, 1)), rhs = XEXP (rhs, 0);
3638 had_mult = 1;
3639 }
3640 else if (GET_CODE (rhs) == ASHIFT
3641 && GET_CODE (XEXP (rhs, 1)) == CONST_INT
3642 && INTVAL (XEXP (rhs, 1)) >= 0
3643 && INTVAL (XEXP (rhs, 1)) < HOST_BITS_PER_WIDE_INT)
3644 {
3645 coeff1 = ((HOST_WIDE_INT) 1) << INTVAL (XEXP (rhs, 1));
3646 rhs = XEXP (rhs, 0);
3647 }
3648
3649 if (rtx_equal_p (lhs, rhs))
3650 {
3651 tem = cse_gen_binary (MULT, mode, lhs,
3652 GEN_INT (coeff0 + coeff1));
3653 return (GET_CODE (tem) == MULT && ! had_mult) ? 0 : tem;
3654 }
3655 }
3656
96b0e481
RK
3657 /* If one of the operands is a PLUS or a MINUS, see if we can
3658 simplify this by the associative law.
3659 Don't use the associative law for floating point.
3660 The inaccuracy makes it nonassociative,
3661 and subtle programs can break if operations are associated. */
7afe21cc 3662
cbf6a543 3663 if (INTEGRAL_MODE_P (mode)
96b0e481
RK
3664 && (GET_CODE (op0) == PLUS || GET_CODE (op0) == MINUS
3665 || GET_CODE (op1) == PLUS || GET_CODE (op1) == MINUS)
3666 && (tem = simplify_plus_minus (code, mode, op0, op1)) != 0)
3667 return tem;
7afe21cc
RK
3668 break;
3669
3670 case COMPARE:
3671#ifdef HAVE_cc0
3672 /* Convert (compare FOO (const_int 0)) to FOO unless we aren't
3673 using cc0, in which case we want to leave it as a COMPARE
3674 so we can distinguish it from a register-register-copy.
3675
3676 In IEEE floating point, x-0 is not the same as x. */
3677
3678 if ((TARGET_FLOAT_FORMAT != IEEE_FLOAT_FORMAT
a83afb65 3679 || ! FLOAT_MODE_P (mode) || flag_fast_math)
7afe21cc
RK
3680 && op1 == CONST0_RTX (mode))
3681 return op0;
3682#else
3683 /* Do nothing here. */
3684#endif
3685 break;
3686
3687 case MINUS:
21648b45
RK
3688 /* None of these optimizations can be done for IEEE
3689 floating point. */
3690 if (TARGET_FLOAT_FORMAT == IEEE_FLOAT_FORMAT
a83afb65 3691 && FLOAT_MODE_P (mode) && ! flag_fast_math)
21648b45
RK
3692 break;
3693
a83afb65
RK
3694 /* We can't assume x-x is 0 even with non-IEEE floating point,
3695 but since it is zero except in very strange circumstances, we
3696 will treat it as zero with -ffast-math. */
7afe21cc
RK
3697 if (rtx_equal_p (op0, op1)
3698 && ! side_effects_p (op0)
a83afb65
RK
3699 && (! FLOAT_MODE_P (mode) || flag_fast_math))
3700 return CONST0_RTX (mode);
7afe21cc
RK
3701
3702 /* Change subtraction from zero into negation. */
3703 if (op0 == CONST0_RTX (mode))
38a448ca 3704 return gen_rtx_NEG (mode, op1);
7afe21cc 3705
96b0e481
RK
3706 /* (-1 - a) is ~a. */
3707 if (op0 == constm1_rtx)
38a448ca 3708 return gen_rtx_NOT (mode, op1);
96b0e481 3709
7afe21cc
RK
3710 /* Subtracting 0 has no effect. */
3711 if (op1 == CONST0_RTX (mode))
3712 return op0;
3713
30d69925
RK
3714 /* See if this is something like X * C - X or vice versa or
3715 if the multiplication is written as a shift. If so, we can
3716 distribute and make a new multiply, shift, or maybe just
3717 have X (if C is 2 in the example above). But don't make
3718 real multiply if we didn't have one before. */
3719
3720 if (! FLOAT_MODE_P (mode))
3721 {
3722 HOST_WIDE_INT coeff0 = 1, coeff1 = 1;
3723 rtx lhs = op0, rhs = op1;
3724 int had_mult = 0;
3725
3726 if (GET_CODE (lhs) == NEG)
3727 coeff0 = -1, lhs = XEXP (lhs, 0);
3728 else if (GET_CODE (lhs) == MULT
3729 && GET_CODE (XEXP (lhs, 1)) == CONST_INT)
3730 {
3731 coeff0 = INTVAL (XEXP (lhs, 1)), lhs = XEXP (lhs, 0);
3732 had_mult = 1;
3733 }
3734 else if (GET_CODE (lhs) == ASHIFT
3735 && GET_CODE (XEXP (lhs, 1)) == CONST_INT
3736 && INTVAL (XEXP (lhs, 1)) >= 0
3737 && INTVAL (XEXP (lhs, 1)) < HOST_BITS_PER_WIDE_INT)
3738 {
3739 coeff0 = ((HOST_WIDE_INT) 1) << INTVAL (XEXP (lhs, 1));
3740 lhs = XEXP (lhs, 0);
3741 }
3742
3743 if (GET_CODE (rhs) == NEG)
3744 coeff1 = - 1, rhs = XEXP (rhs, 0);
3745 else if (GET_CODE (rhs) == MULT
3746 && GET_CODE (XEXP (rhs, 1)) == CONST_INT)
3747 {
3748 coeff1 = INTVAL (XEXP (rhs, 1)), rhs = XEXP (rhs, 0);
3749 had_mult = 1;
3750 }
3751 else if (GET_CODE (rhs) == ASHIFT
3752 && GET_CODE (XEXP (rhs, 1)) == CONST_INT
3753 && INTVAL (XEXP (rhs, 1)) >= 0
3754 && INTVAL (XEXP (rhs, 1)) < HOST_BITS_PER_WIDE_INT)
3755 {
3756 coeff1 = ((HOST_WIDE_INT) 1) << INTVAL (XEXP (rhs, 1));
3757 rhs = XEXP (rhs, 0);
3758 }
3759
3760 if (rtx_equal_p (lhs, rhs))
3761 {
3762 tem = cse_gen_binary (MULT, mode, lhs,
3763 GEN_INT (coeff0 - coeff1));
3764 return (GET_CODE (tem) == MULT && ! had_mult) ? 0 : tem;
3765 }
3766 }
3767
7afe21cc
RK
3768 /* (a - (-b)) -> (a + b). */
3769 if (GET_CODE (op1) == NEG)
96b0e481 3770 return cse_gen_binary (PLUS, mode, op0, XEXP (op1, 0));
7afe21cc 3771
96b0e481
RK
3772 /* If one of the operands is a PLUS or a MINUS, see if we can
3773 simplify this by the associative law.
3774 Don't use the associative law for floating point.
7afe21cc
RK
3775 The inaccuracy makes it nonassociative,
3776 and subtle programs can break if operations are associated. */
7afe21cc 3777
cbf6a543 3778 if (INTEGRAL_MODE_P (mode)
96b0e481
RK
3779 && (GET_CODE (op0) == PLUS || GET_CODE (op0) == MINUS
3780 || GET_CODE (op1) == PLUS || GET_CODE (op1) == MINUS)
3781 && (tem = simplify_plus_minus (code, mode, op0, op1)) != 0)
3782 return tem;
7afe21cc
RK
3783
3784 /* Don't let a relocatable value get a negative coeff. */
b5a09c41 3785 if (GET_CODE (op1) == CONST_INT && GET_MODE (op0) != VOIDmode)
7afe21cc 3786 return plus_constant (op0, - INTVAL (op1));
29d72c4b
TG
3787
3788 /* (x - (x & y)) -> (x & ~y) */
3789 if (GET_CODE (op1) == AND)
3790 {
3791 if (rtx_equal_p (op0, XEXP (op1, 0)))
38a448ca 3792 return cse_gen_binary (AND, mode, op0, gen_rtx_NOT (mode, XEXP (op1, 1)));
29d72c4b 3793 if (rtx_equal_p (op0, XEXP (op1, 1)))
38a448ca 3794 return cse_gen_binary (AND, mode, op0, gen_rtx_NOT (mode, XEXP (op1, 0)));
29d72c4b 3795 }
7afe21cc
RK
3796 break;
3797
3798 case MULT:
3799 if (op1 == constm1_rtx)
3800 {
96b0e481 3801 tem = simplify_unary_operation (NEG, mode, op0, mode);
7afe21cc 3802
38a448ca 3803 return tem ? tem : gen_rtx_NEG (mode, op0);
7afe21cc
RK
3804 }
3805
3806 /* In IEEE floating point, x*0 is not always 0. */
3807 if ((TARGET_FLOAT_FORMAT != IEEE_FLOAT_FORMAT
a83afb65 3808 || ! FLOAT_MODE_P (mode) || flag_fast_math)
7afe21cc
RK
3809 && op1 == CONST0_RTX (mode)
3810 && ! side_effects_p (op0))
3811 return op1;
3812
3813 /* In IEEE floating point, x*1 is not equivalent to x for nans.
3814 However, ANSI says we can drop signals,
3815 so we can do this anyway. */
3816 if (op1 == CONST1_RTX (mode))
3817 return op0;
3818
c407b802
RK
3819 /* Convert multiply by constant power of two into shift unless
3820 we are still generating RTL. This test is a kludge. */
7afe21cc 3821 if (GET_CODE (op1) == CONST_INT
c407b802 3822 && (val = exact_log2 (INTVAL (op1))) >= 0
2d917903
JW
3823 /* If the mode is larger than the host word size, and the
3824 uppermost bit is set, then this isn't a power of two due
3825 to implicit sign extension. */
3826 && (width <= HOST_BITS_PER_WIDE_INT
3827 || val != HOST_BITS_PER_WIDE_INT - 1)
c407b802 3828 && ! rtx_equal_function_value_matters)
38a448ca 3829 return gen_rtx_ASHIFT (mode, op0, GEN_INT (val));
7afe21cc
RK
3830
3831 if (GET_CODE (op1) == CONST_DOUBLE
3832 && GET_MODE_CLASS (GET_MODE (op1)) == MODE_FLOAT)
3833 {
3834 REAL_VALUE_TYPE d;
5a3d4bef
RK
3835 jmp_buf handler;
3836 int op1is2, op1ism1;
3837
3838 if (setjmp (handler))
3839 return 0;
3840
3841 set_float_handler (handler);
7afe21cc 3842 REAL_VALUE_FROM_CONST_DOUBLE (d, op1);
5a3d4bef
RK
3843 op1is2 = REAL_VALUES_EQUAL (d, dconst2);
3844 op1ism1 = REAL_VALUES_EQUAL (d, dconstm1);
3845 set_float_handler (NULL_PTR);
7afe21cc
RK
3846
3847 /* x*2 is x+x and x*(-1) is -x */
5a3d4bef 3848 if (op1is2 && GET_MODE (op0) == mode)
38a448ca 3849 return gen_rtx_PLUS (mode, op0, copy_rtx (op0));
7afe21cc 3850
5a3d4bef 3851 else if (op1ism1 && GET_MODE (op0) == mode)
38a448ca 3852 return gen_rtx_NEG (mode, op0);
7afe21cc
RK
3853 }
3854 break;
3855
3856 case IOR:
3857 if (op1 == const0_rtx)
3858 return op0;
3859 if (GET_CODE (op1) == CONST_INT
3860 && (INTVAL (op1) & GET_MODE_MASK (mode)) == GET_MODE_MASK (mode))
3861 return op1;
3862 if (rtx_equal_p (op0, op1) && ! side_effects_p (op0))
3863 return op0;
3864 /* A | (~A) -> -1 */
3865 if (((GET_CODE (op0) == NOT && rtx_equal_p (XEXP (op0, 0), op1))
3866 || (GET_CODE (op1) == NOT && rtx_equal_p (XEXP (op1, 0), op0)))
31dcf83f 3867 && ! side_effects_p (op0)
8e7e5365 3868 && GET_MODE_CLASS (mode) != MODE_CC)
7afe21cc
RK
3869 return constm1_rtx;
3870 break;
3871
3872 case XOR:
3873 if (op1 == const0_rtx)
3874 return op0;
3875 if (GET_CODE (op1) == CONST_INT
3876 && (INTVAL (op1) & GET_MODE_MASK (mode)) == GET_MODE_MASK (mode))
38a448ca 3877 return gen_rtx_NOT (mode, op0);
31dcf83f 3878 if (op0 == op1 && ! side_effects_p (op0)
8e7e5365 3879 && GET_MODE_CLASS (mode) != MODE_CC)
7afe21cc
RK
3880 return const0_rtx;
3881 break;
3882
3883 case AND:
3884 if (op1 == const0_rtx && ! side_effects_p (op0))
3885 return const0_rtx;
3886 if (GET_CODE (op1) == CONST_INT
3887 && (INTVAL (op1) & GET_MODE_MASK (mode)) == GET_MODE_MASK (mode))
3888 return op0;
31dcf83f 3889 if (op0 == op1 && ! side_effects_p (op0)
8e7e5365 3890 && GET_MODE_CLASS (mode) != MODE_CC)
7afe21cc
RK
3891 return op0;
3892 /* A & (~A) -> 0 */
3893 if (((GET_CODE (op0) == NOT && rtx_equal_p (XEXP (op0, 0), op1))
3894 || (GET_CODE (op1) == NOT && rtx_equal_p (XEXP (op1, 0), op0)))
709ab4fc 3895 && ! side_effects_p (op0)
8e7e5365 3896 && GET_MODE_CLASS (mode) != MODE_CC)
7afe21cc
RK
3897 return const0_rtx;
3898 break;
3899
3900 case UDIV:
3901 /* Convert divide by power of two into shift (divide by 1 handled
3902 below). */
3903 if (GET_CODE (op1) == CONST_INT
3904 && (arg1 = exact_log2 (INTVAL (op1))) > 0)
38a448ca 3905 return gen_rtx_LSHIFTRT (mode, op0, GEN_INT (arg1));
7afe21cc 3906
0f41302f 3907 /* ... fall through ... */
7afe21cc
RK
3908
3909 case DIV:
3910 if (op1 == CONST1_RTX (mode))
3911 return op0;
e7a522ba
RS
3912
3913 /* In IEEE floating point, 0/x is not always 0. */
3914 if ((TARGET_FLOAT_FORMAT != IEEE_FLOAT_FORMAT
a83afb65 3915 || ! FLOAT_MODE_P (mode) || flag_fast_math)
e7a522ba
RS
3916 && op0 == CONST0_RTX (mode)
3917 && ! side_effects_p (op1))
7afe21cc 3918 return op0;
e7a522ba 3919
7afe21cc 3920#if ! defined (REAL_IS_NOT_DOUBLE) || defined (REAL_ARITHMETIC)
a83afb65
RK
3921 /* Change division by a constant into multiplication. Only do
3922 this with -ffast-math until an expert says it is safe in
3923 general. */
7afe21cc
RK
3924 else if (GET_CODE (op1) == CONST_DOUBLE
3925 && GET_MODE_CLASS (GET_MODE (op1)) == MODE_FLOAT
a83afb65
RK
3926 && op1 != CONST0_RTX (mode)
3927 && flag_fast_math)
7afe21cc
RK
3928 {
3929 REAL_VALUE_TYPE d;
3930 REAL_VALUE_FROM_CONST_DOUBLE (d, op1);
a83afb65
RK
3931
3932 if (! REAL_VALUES_EQUAL (d, dconst0))
3933 {
7afe21cc 3934#if defined (REAL_ARITHMETIC)
a83afb65 3935 REAL_ARITHMETIC (d, rtx_to_tree_code (DIV), dconst1, d);
38a448ca
RH
3936 return gen_rtx_MULT (mode, op0,
3937 CONST_DOUBLE_FROM_REAL_VALUE (d, mode));
7afe21cc 3938#else
38a448ca
RH
3939 return gen_rtx_MULT (mode, op0,
3940 CONST_DOUBLE_FROM_REAL_VALUE (1./d, mode));
7afe21cc 3941#endif
a83afb65
RK
3942 }
3943 }
7afe21cc
RK
3944#endif
3945 break;
3946
3947 case UMOD:
3948 /* Handle modulus by power of two (mod with 1 handled below). */
3949 if (GET_CODE (op1) == CONST_INT
3950 && exact_log2 (INTVAL (op1)) > 0)
38a448ca 3951 return gen_rtx_AND (mode, op0, GEN_INT (INTVAL (op1) - 1));
7afe21cc 3952
0f41302f 3953 /* ... fall through ... */
7afe21cc
RK
3954
3955 case MOD:
3956 if ((op0 == const0_rtx || op1 == const1_rtx)
3957 && ! side_effects_p (op0) && ! side_effects_p (op1))
3958 return const0_rtx;
3959 break;
3960
3961 case ROTATERT:
3962 case ROTATE:
3963 /* Rotating ~0 always results in ~0. */
906c4e36 3964 if (GET_CODE (op0) == CONST_INT && width <= HOST_BITS_PER_WIDE_INT
7afe21cc
RK
3965 && INTVAL (op0) == GET_MODE_MASK (mode)
3966 && ! side_effects_p (op1))
3967 return op0;
3968
0f41302f 3969 /* ... fall through ... */
7afe21cc 3970
7afe21cc
RK
3971 case ASHIFT:
3972 case ASHIFTRT:
3973 case LSHIFTRT:
3974 if (op1 == const0_rtx)
3975 return op0;
3976 if (op0 == const0_rtx && ! side_effects_p (op1))
3977 return op0;
3978 break;
3979
3980 case SMIN:
906c4e36
RK
3981 if (width <= HOST_BITS_PER_WIDE_INT && GET_CODE (op1) == CONST_INT
3982 && INTVAL (op1) == (HOST_WIDE_INT) 1 << (width -1)
7afe21cc
RK
3983 && ! side_effects_p (op0))
3984 return op1;
3985 else if (rtx_equal_p (op0, op1) && ! side_effects_p (op0))
3986 return op0;
3987 break;
3988
3989 case SMAX:
906c4e36 3990 if (width <= HOST_BITS_PER_WIDE_INT && GET_CODE (op1) == CONST_INT
dbbe6445
RK
3991 && (INTVAL (op1)
3992 == (unsigned HOST_WIDE_INT) GET_MODE_MASK (mode) >> 1)
7afe21cc
RK
3993 && ! side_effects_p (op0))
3994 return op1;
3995 else if (rtx_equal_p (op0, op1) && ! side_effects_p (op0))
3996 return op0;
3997 break;
3998
3999 case UMIN:
4000 if (op1 == const0_rtx && ! side_effects_p (op0))
4001 return op1;
4002 else if (rtx_equal_p (op0, op1) && ! side_effects_p (op0))
4003 return op0;
4004 break;
4005
4006 case UMAX:
4007 if (op1 == constm1_rtx && ! side_effects_p (op0))
4008 return op1;
4009 else if (rtx_equal_p (op0, op1) && ! side_effects_p (op0))
4010 return op0;
4011 break;
4012
4013 default:
4014 abort ();
4015 }
4016
4017 return 0;
4018 }
4019
4020 /* Get the integer argument values in two forms:
4021 zero-extended in ARG0, ARG1 and sign-extended in ARG0S, ARG1S. */
4022
4023 arg0 = INTVAL (op0);
4024 arg1 = INTVAL (op1);
4025
906c4e36 4026 if (width < HOST_BITS_PER_WIDE_INT)
7afe21cc 4027 {
906c4e36
RK
4028 arg0 &= ((HOST_WIDE_INT) 1 << width) - 1;
4029 arg1 &= ((HOST_WIDE_INT) 1 << width) - 1;
7afe21cc
RK
4030
4031 arg0s = arg0;
906c4e36
RK
4032 if (arg0s & ((HOST_WIDE_INT) 1 << (width - 1)))
4033 arg0s |= ((HOST_WIDE_INT) (-1) << width);
7afe21cc
RK
4034
4035 arg1s = arg1;
906c4e36
RK
4036 if (arg1s & ((HOST_WIDE_INT) 1 << (width - 1)))
4037 arg1s |= ((HOST_WIDE_INT) (-1) << width);
7afe21cc
RK
4038 }
4039 else
4040 {
4041 arg0s = arg0;
4042 arg1s = arg1;
4043 }
4044
4045 /* Compute the value of the arithmetic. */
4046
4047 switch (code)
4048 {
4049 case PLUS:
538b78e7 4050 val = arg0s + arg1s;
7afe21cc
RK
4051 break;
4052
4053 case MINUS:
538b78e7 4054 val = arg0s - arg1s;
7afe21cc
RK
4055 break;
4056
4057 case MULT:
4058 val = arg0s * arg1s;
4059 break;
4060
4061 case DIV:
4062 if (arg1s == 0)
4063 return 0;
4064 val = arg0s / arg1s;
4065 break;
4066
4067 case MOD:
4068 if (arg1s == 0)
4069 return 0;
4070 val = arg0s % arg1s;
4071 break;
4072
4073 case UDIV:
4074 if (arg1 == 0)
4075 return 0;
906c4e36 4076 val = (unsigned HOST_WIDE_INT) arg0 / arg1;
7afe21cc
RK
4077 break;
4078
4079 case UMOD:
4080 if (arg1 == 0)
4081 return 0;
906c4e36 4082 val = (unsigned HOST_WIDE_INT) arg0 % arg1;
7afe21cc
RK
4083 break;
4084
4085 case AND:
4086 val = arg0 & arg1;
4087 break;
4088
4089 case IOR:
4090 val = arg0 | arg1;
4091 break;
4092
4093 case XOR:
4094 val = arg0 ^ arg1;
4095 break;
4096
4097 case LSHIFTRT:
4098 /* If shift count is undefined, don't fold it; let the machine do
4099 what it wants. But truncate it if the machine will do that. */
4100 if (arg1 < 0)
4101 return 0;
4102
4103#ifdef SHIFT_COUNT_TRUNCATED
85c0a556 4104 if (SHIFT_COUNT_TRUNCATED)
4d61f8c5 4105 arg1 %= width;
7afe21cc
RK
4106#endif
4107
906c4e36 4108 val = ((unsigned HOST_WIDE_INT) arg0) >> arg1;
7afe21cc
RK
4109 break;
4110
4111 case ASHIFT:
7afe21cc
RK
4112 if (arg1 < 0)
4113 return 0;
4114
4115#ifdef SHIFT_COUNT_TRUNCATED
85c0a556 4116 if (SHIFT_COUNT_TRUNCATED)
4d61f8c5 4117 arg1 %= width;
7afe21cc
RK
4118#endif
4119
906c4e36 4120 val = ((unsigned HOST_WIDE_INT) arg0) << arg1;
7afe21cc
RK
4121 break;
4122
4123 case ASHIFTRT:
4124 if (arg1 < 0)
4125 return 0;
4126
4127#ifdef SHIFT_COUNT_TRUNCATED
85c0a556 4128 if (SHIFT_COUNT_TRUNCATED)
4d61f8c5 4129 arg1 %= width;
7afe21cc
RK
4130#endif
4131
7afe21cc 4132 val = arg0s >> arg1;
2166571b
RS
4133
4134 /* Bootstrap compiler may not have sign extended the right shift.
4135 Manually extend the sign to insure bootstrap cc matches gcc. */
4136 if (arg0s < 0 && arg1 > 0)
4137 val |= ((HOST_WIDE_INT) -1) << (HOST_BITS_PER_WIDE_INT - arg1);
4138
7afe21cc
RK
4139 break;
4140
4141 case ROTATERT:
4142 if (arg1 < 0)
4143 return 0;
4144
4145 arg1 %= width;
906c4e36
RK
4146 val = ((((unsigned HOST_WIDE_INT) arg0) << (width - arg1))
4147 | (((unsigned HOST_WIDE_INT) arg0) >> arg1));
7afe21cc
RK
4148 break;
4149
4150 case ROTATE:
4151 if (arg1 < 0)
4152 return 0;
4153
4154 arg1 %= width;
906c4e36
RK
4155 val = ((((unsigned HOST_WIDE_INT) arg0) << arg1)
4156 | (((unsigned HOST_WIDE_INT) arg0) >> (width - arg1)));
7afe21cc
RK
4157 break;
4158
4159 case COMPARE:
4160 /* Do nothing here. */
4161 return 0;
4162
830a38ee
RS
4163 case SMIN:
4164 val = arg0s <= arg1s ? arg0s : arg1s;
4165 break;
4166
4167 case UMIN:
906c4e36
RK
4168 val = ((unsigned HOST_WIDE_INT) arg0
4169 <= (unsigned HOST_WIDE_INT) arg1 ? arg0 : arg1);
830a38ee
RS
4170 break;
4171
4172 case SMAX:
4173 val = arg0s > arg1s ? arg0s : arg1s;
4174 break;
4175
4176 case UMAX:
906c4e36
RK
4177 val = ((unsigned HOST_WIDE_INT) arg0
4178 > (unsigned HOST_WIDE_INT) arg1 ? arg0 : arg1);
830a38ee
RS
4179 break;
4180
7afe21cc
RK
4181 default:
4182 abort ();
4183 }
4184
4185 /* Clear the bits that don't belong in our mode, unless they and our sign
4186 bit are all one. So we get either a reasonable negative value or a
4187 reasonable unsigned value for this mode. */
906c4e36
RK
4188 if (width < HOST_BITS_PER_WIDE_INT
4189 && ((val & ((HOST_WIDE_INT) (-1) << (width - 1)))
4190 != ((HOST_WIDE_INT) (-1) << (width - 1))))
4191 val &= ((HOST_WIDE_INT) 1 << width) - 1;
4192
ad89d6f6
TG
4193 /* If this would be an entire word for the target, but is not for
4194 the host, then sign-extend on the host so that the number will look
4195 the same way on the host that it would on the target.
4196
4197 For example, when building a 64 bit alpha hosted 32 bit sparc
4198 targeted compiler, then we want the 32 bit unsigned value -1 to be
4199 represented as a 64 bit value -1, and not as 0x00000000ffffffff.
4200 The later confuses the sparc backend. */
4201
4202 if (BITS_PER_WORD < HOST_BITS_PER_WIDE_INT && BITS_PER_WORD == width
4203 && (val & ((HOST_WIDE_INT) 1 << (width - 1))))
4204 val |= ((HOST_WIDE_INT) (-1) << width);
4205
906c4e36 4206 return GEN_INT (val);
7afe21cc
RK
4207}
4208\f
96b0e481
RK
4209/* Simplify a PLUS or MINUS, at least one of whose operands may be another
4210 PLUS or MINUS.
4211
4212 Rather than test for specific case, we do this by a brute-force method
4213 and do all possible simplifications until no more changes occur. Then
4214 we rebuild the operation. */
4215
4216static rtx
4217simplify_plus_minus (code, mode, op0, op1)
4218 enum rtx_code code;
4219 enum machine_mode mode;
4220 rtx op0, op1;
4221{
4222 rtx ops[8];
4223 int negs[8];
4224 rtx result, tem;
fb5c8ce6 4225 int n_ops = 2, input_ops = 2, input_consts = 0, n_consts = 0;
96b0e481 4226 int first = 1, negate = 0, changed;
fb5c8ce6 4227 int i, j;
96b0e481 4228
4c9a05bc 4229 bzero ((char *) ops, sizeof ops);
96b0e481
RK
4230
4231 /* Set up the two operands and then expand them until nothing has been
4232 changed. If we run out of room in our array, give up; this should
4233 almost never happen. */
4234
4235 ops[0] = op0, ops[1] = op1, negs[0] = 0, negs[1] = (code == MINUS);
4236
4237 changed = 1;
4238 while (changed)
4239 {
4240 changed = 0;
4241
4242 for (i = 0; i < n_ops; i++)
4243 switch (GET_CODE (ops[i]))
4244 {
4245 case PLUS:
4246 case MINUS:
4247 if (n_ops == 7)
4248 return 0;
4249
4250 ops[n_ops] = XEXP (ops[i], 1);
4251 negs[n_ops++] = GET_CODE (ops[i]) == MINUS ? !negs[i] : negs[i];
4252 ops[i] = XEXP (ops[i], 0);
b7d9299b 4253 input_ops++;
96b0e481
RK
4254 changed = 1;
4255 break;
4256
4257 case NEG:
4258 ops[i] = XEXP (ops[i], 0);
4259 negs[i] = ! negs[i];
4260 changed = 1;
4261 break;
4262
4263 case CONST:
4264 ops[i] = XEXP (ops[i], 0);
fb5c8ce6 4265 input_consts++;
96b0e481
RK
4266 changed = 1;
4267 break;
4268
4269 case NOT:
4270 /* ~a -> (-a - 1) */
4271 if (n_ops != 7)
4272 {
4273 ops[n_ops] = constm1_rtx;
5931019b 4274 negs[n_ops++] = negs[i];
96b0e481
RK
4275 ops[i] = XEXP (ops[i], 0);
4276 negs[i] = ! negs[i];
4277 changed = 1;
4278 }
4279 break;
4280
4281 case CONST_INT:
4282 if (negs[i])
4283 ops[i] = GEN_INT (- INTVAL (ops[i])), negs[i] = 0, changed = 1;
4284 break;
e9a25f70
JL
4285
4286 default:
4287 break;
96b0e481
RK
4288 }
4289 }
4290
4291 /* If we only have two operands, we can't do anything. */
4292 if (n_ops <= 2)
4293 return 0;
4294
4295 /* Now simplify each pair of operands until nothing changes. The first
4296 time through just simplify constants against each other. */
4297
4298 changed = 1;
4299 while (changed)
4300 {
4301 changed = first;
4302
4303 for (i = 0; i < n_ops - 1; i++)
4304 for (j = i + 1; j < n_ops; j++)
4305 if (ops[i] != 0 && ops[j] != 0
4306 && (! first || (CONSTANT_P (ops[i]) && CONSTANT_P (ops[j]))))
4307 {
4308 rtx lhs = ops[i], rhs = ops[j];
4309 enum rtx_code ncode = PLUS;
4310
4311 if (negs[i] && ! negs[j])
4312 lhs = ops[j], rhs = ops[i], ncode = MINUS;
4313 else if (! negs[i] && negs[j])
4314 ncode = MINUS;
4315
4316 tem = simplify_binary_operation (ncode, mode, lhs, rhs);
b7d9299b 4317 if (tem)
96b0e481
RK
4318 {
4319 ops[i] = tem, ops[j] = 0;
4320 negs[i] = negs[i] && negs[j];
4321 if (GET_CODE (tem) == NEG)
4322 ops[i] = XEXP (tem, 0), negs[i] = ! negs[i];
4323
4324 if (GET_CODE (ops[i]) == CONST_INT && negs[i])
4325 ops[i] = GEN_INT (- INTVAL (ops[i])), negs[i] = 0;
4326 changed = 1;
4327 }
4328 }
4329
4330 first = 0;
4331 }
4332
4333 /* Pack all the operands to the lower-numbered entries and give up if
91a60f37 4334 we didn't reduce the number of operands we had. Make sure we
fb5c8ce6
RK
4335 count a CONST as two operands. If we have the same number of
4336 operands, but have made more CONSTs than we had, this is also
4337 an improvement, so accept it. */
91a60f37 4338
fb5c8ce6 4339 for (i = 0, j = 0; j < n_ops; j++)
96b0e481 4340 if (ops[j] != 0)
91a60f37
RK
4341 {
4342 ops[i] = ops[j], negs[i++] = negs[j];
4343 if (GET_CODE (ops[j]) == CONST)
fb5c8ce6 4344 n_consts++;
91a60f37 4345 }
96b0e481 4346
fb5c8ce6
RK
4347 if (i + n_consts > input_ops
4348 || (i + n_consts == input_ops && n_consts <= input_consts))
96b0e481
RK
4349 return 0;
4350
4351 n_ops = i;
4352
4353 /* If we have a CONST_INT, put it last. */
4354 for (i = 0; i < n_ops - 1; i++)
4355 if (GET_CODE (ops[i]) == CONST_INT)
4356 {
4357 tem = ops[n_ops - 1], ops[n_ops - 1] = ops[i] , ops[i] = tem;
4358 j = negs[n_ops - 1], negs[n_ops - 1] = negs[i], negs[i] = j;
4359 }
4360
4361 /* Put a non-negated operand first. If there aren't any, make all
4362 operands positive and negate the whole thing later. */
4363 for (i = 0; i < n_ops && negs[i]; i++)
4364 ;
4365
4366 if (i == n_ops)
4367 {
4368 for (i = 0; i < n_ops; i++)
4369 negs[i] = 0;
4370 negate = 1;
4371 }
4372 else if (i != 0)
4373 {
4374 tem = ops[0], ops[0] = ops[i], ops[i] = tem;
4375 j = negs[0], negs[0] = negs[i], negs[i] = j;
4376 }
4377
4378 /* Now make the result by performing the requested operations. */
4379 result = ops[0];
4380 for (i = 1; i < n_ops; i++)
4381 result = cse_gen_binary (negs[i] ? MINUS : PLUS, mode, result, ops[i]);
4382
38a448ca 4383 return negate ? gen_rtx_NEG (mode, result) : result;
96b0e481
RK
4384}
4385\f
4386/* Make a binary operation by properly ordering the operands and
4387 seeing if the expression folds. */
4388
4389static rtx
4390cse_gen_binary (code, mode, op0, op1)
4391 enum rtx_code code;
4392 enum machine_mode mode;
4393 rtx op0, op1;
4394{
4395 rtx tem;
4396
4397 /* Put complex operands first and constants second if commutative. */
4398 if (GET_RTX_CLASS (code) == 'c'
4399 && ((CONSTANT_P (op0) && GET_CODE (op1) != CONST_INT)
4400 || (GET_RTX_CLASS (GET_CODE (op0)) == 'o'
4401 && GET_RTX_CLASS (GET_CODE (op1)) != 'o')
4402 || (GET_CODE (op0) == SUBREG
4403 && GET_RTX_CLASS (GET_CODE (SUBREG_REG (op0))) == 'o'
4404 && GET_RTX_CLASS (GET_CODE (op1)) != 'o')))
4405 tem = op0, op0 = op1, op1 = tem;
4406
4407 /* If this simplifies, do it. */
4408 tem = simplify_binary_operation (code, mode, op0, op1);
4409
4410 if (tem)
4411 return tem;
4412
4413 /* Handle addition and subtraction of CONST_INT specially. Otherwise,
4414 just form the operation. */
4415
4416 if (code == PLUS && GET_CODE (op1) == CONST_INT
4417 && GET_MODE (op0) != VOIDmode)
4418 return plus_constant (op0, INTVAL (op1));
4419 else if (code == MINUS && GET_CODE (op1) == CONST_INT
4420 && GET_MODE (op0) != VOIDmode)
4421 return plus_constant (op0, - INTVAL (op1));
4422 else
38a448ca 4423 return gen_rtx_fmt_ee (code, mode, op0, op1);
96b0e481
RK
4424}
4425\f
7afe21cc 4426/* Like simplify_binary_operation except used for relational operators.
a432f20d
RK
4427 MODE is the mode of the operands, not that of the result. If MODE
4428 is VOIDmode, both operands must also be VOIDmode and we compare the
4429 operands in "infinite precision".
4430
4431 If no simplification is possible, this function returns zero. Otherwise,
4432 it returns either const_true_rtx or const0_rtx. */
7afe21cc
RK
4433
4434rtx
4435simplify_relational_operation (code, mode, op0, op1)
4436 enum rtx_code code;
4437 enum machine_mode mode;
4438 rtx op0, op1;
4439{
a432f20d
RK
4440 int equal, op0lt, op0ltu, op1lt, op1ltu;
4441 rtx tem;
7afe21cc
RK
4442
4443 /* If op0 is a compare, extract the comparison arguments from it. */
4444 if (GET_CODE (op0) == COMPARE && op1 == const0_rtx)
4445 op1 = XEXP (op0, 1), op0 = XEXP (op0, 0);
4446
28bad1cb
RK
4447 /* We can't simplify MODE_CC values since we don't know what the
4448 actual comparison is. */
4449 if (GET_MODE_CLASS (GET_MODE (op0)) == MODE_CC
4450#ifdef HAVE_cc0
4451 || op0 == cc0_rtx
4452#endif
4453 )
31dcf83f
RS
4454 return 0;
4455
a432f20d
RK
4456 /* For integer comparisons of A and B maybe we can simplify A - B and can
4457 then simplify a comparison of that with zero. If A and B are both either
4458 a register or a CONST_INT, this can't help; testing for these cases will
4459 prevent infinite recursion here and speed things up.
4460
c27b5c62
JW
4461 If CODE is an unsigned comparison, then we can never do this optimization,
4462 because it gives an incorrect result if the subtraction wraps around zero.
4463 ANSI C defines unsigned operations such that they never overflow, and
4464 thus such cases can not be ignored. */
a432f20d
RK
4465
4466 if (INTEGRAL_MODE_P (mode) && op1 != const0_rtx
4467 && ! ((GET_CODE (op0) == REG || GET_CODE (op0) == CONST_INT)
4468 && (GET_CODE (op1) == REG || GET_CODE (op1) == CONST_INT))
4469 && 0 != (tem = simplify_binary_operation (MINUS, mode, op0, op1))
c27b5c62 4470 && code != GTU && code != GEU && code != LTU && code != LEU)
a432f20d
RK
4471 return simplify_relational_operation (signed_condition (code),
4472 mode, tem, const0_rtx);
4473
4474 /* For non-IEEE floating-point, if the two operands are equal, we know the
4475 result. */
4476 if (rtx_equal_p (op0, op1)
4477 && (TARGET_FLOAT_FORMAT != IEEE_FLOAT_FORMAT
4478 || ! FLOAT_MODE_P (GET_MODE (op0)) || flag_fast_math))
4479 equal = 1, op0lt = 0, op0ltu = 0, op1lt = 0, op1ltu = 0;
4480
4481 /* If the operands are floating-point constants, see if we can fold
4482 the result. */
6076248a 4483#if ! defined (REAL_IS_NOT_DOUBLE) || defined (REAL_ARITHMETIC)
a432f20d
RK
4484 else if (GET_CODE (op0) == CONST_DOUBLE && GET_CODE (op1) == CONST_DOUBLE
4485 && GET_MODE_CLASS (GET_MODE (op0)) == MODE_FLOAT)
4486 {
4487 REAL_VALUE_TYPE d0, d1;
4488 jmp_buf handler;
4489
4490 if (setjmp (handler))
4491 return 0;
7afe21cc 4492
a432f20d
RK
4493 set_float_handler (handler);
4494 REAL_VALUE_FROM_CONST_DOUBLE (d0, op0);
4495 REAL_VALUE_FROM_CONST_DOUBLE (d1, op1);
4496 equal = REAL_VALUES_EQUAL (d0, d1);
4497 op0lt = op0ltu = REAL_VALUES_LESS (d0, d1);
4498 op1lt = op1ltu = REAL_VALUES_LESS (d1, d0);
4499 set_float_handler (NULL_PTR);
4500 }
4501#endif /* not REAL_IS_NOT_DOUBLE, or REAL_ARITHMETIC */
7afe21cc 4502
a432f20d
RK
4503 /* Otherwise, see if the operands are both integers. */
4504 else if ((GET_MODE_CLASS (mode) == MODE_INT || mode == VOIDmode)
4505 && (GET_CODE (op0) == CONST_DOUBLE || GET_CODE (op0) == CONST_INT)
4506 && (GET_CODE (op1) == CONST_DOUBLE || GET_CODE (op1) == CONST_INT))
4507 {
4508 int width = GET_MODE_BITSIZE (mode);
64812ded
RK
4509 HOST_WIDE_INT l0s, h0s, l1s, h1s;
4510 unsigned HOST_WIDE_INT l0u, h0u, l1u, h1u;
7afe21cc 4511
a432f20d
RK
4512 /* Get the two words comprising each integer constant. */
4513 if (GET_CODE (op0) == CONST_DOUBLE)
4514 {
4515 l0u = l0s = CONST_DOUBLE_LOW (op0);
4516 h0u = h0s = CONST_DOUBLE_HIGH (op0);
7afe21cc 4517 }
a432f20d 4518 else
6076248a 4519 {
a432f20d 4520 l0u = l0s = INTVAL (op0);
cb3bb2a7 4521 h0u = h0s = l0s < 0 ? -1 : 0;
a432f20d 4522 }
6076248a 4523
a432f20d
RK
4524 if (GET_CODE (op1) == CONST_DOUBLE)
4525 {
4526 l1u = l1s = CONST_DOUBLE_LOW (op1);
4527 h1u = h1s = CONST_DOUBLE_HIGH (op1);
4528 }
4529 else
4530 {
4531 l1u = l1s = INTVAL (op1);
cb3bb2a7 4532 h1u = h1s = l1s < 0 ? -1 : 0;
a432f20d
RK
4533 }
4534
4535 /* If WIDTH is nonzero and smaller than HOST_BITS_PER_WIDE_INT,
4536 we have to sign or zero-extend the values. */
4537 if (width != 0 && width <= HOST_BITS_PER_WIDE_INT)
4538 h0u = h1u = 0, h0s = l0s < 0 ? -1 : 0, h1s = l1s < 0 ? -1 : 0;
6076248a 4539
a432f20d
RK
4540 if (width != 0 && width < HOST_BITS_PER_WIDE_INT)
4541 {
4542 l0u &= ((HOST_WIDE_INT) 1 << width) - 1;
4543 l1u &= ((HOST_WIDE_INT) 1 << width) - 1;
6076248a 4544
a432f20d
RK
4545 if (l0s & ((HOST_WIDE_INT) 1 << (width - 1)))
4546 l0s |= ((HOST_WIDE_INT) (-1) << width);
6076248a 4547
a432f20d
RK
4548 if (l1s & ((HOST_WIDE_INT) 1 << (width - 1)))
4549 l1s |= ((HOST_WIDE_INT) (-1) << width);
6076248a
RK
4550 }
4551
a432f20d
RK
4552 equal = (h0u == h1u && l0u == l1u);
4553 op0lt = (h0s < h1s || (h0s == h1s && l0s < l1s));
4554 op1lt = (h1s < h0s || (h1s == h0s && l1s < l0s));
4555 op0ltu = (h0u < h1u || (h0u == h1u && l0u < l1u));
4556 op1ltu = (h1u < h0u || (h1u == h0u && l1u < l0u));
4557 }
4558
4559 /* Otherwise, there are some code-specific tests we can make. */
4560 else
4561 {
7afe21cc
RK
4562 switch (code)
4563 {
4564 case EQ:
a432f20d
RK
4565 /* References to the frame plus a constant or labels cannot
4566 be zero, but a SYMBOL_REF can due to #pragma weak. */
4567 if (((NONZERO_BASE_PLUS_P (op0) && op1 == const0_rtx)
4568 || GET_CODE (op0) == LABEL_REF)
1a7c818b 4569#if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
a432f20d
RK
4570 /* On some machines, the ap reg can be 0 sometimes. */
4571 && op0 != arg_pointer_rtx
7afe21cc 4572#endif
a432f20d
RK
4573 )
4574 return const0_rtx;
4575 break;
7afe21cc
RK
4576
4577 case NE:
a432f20d
RK
4578 if (((NONZERO_BASE_PLUS_P (op0) && op1 == const0_rtx)
4579 || GET_CODE (op0) == LABEL_REF)
1a7c818b 4580#if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
a432f20d 4581 && op0 != arg_pointer_rtx
7afe21cc 4582#endif
a432f20d 4583 )
7afe21cc
RK
4584 return const_true_rtx;
4585 break;
4586
4587 case GEU:
a432f20d
RK
4588 /* Unsigned values are never negative. */
4589 if (op1 == const0_rtx)
7afe21cc
RK
4590 return const_true_rtx;
4591 break;
4592
4593 case LTU:
a432f20d 4594 if (op1 == const0_rtx)
7afe21cc
RK
4595 return const0_rtx;
4596 break;
4597
4598 case LEU:
4599 /* Unsigned values are never greater than the largest
4600 unsigned value. */
4601 if (GET_CODE (op1) == CONST_INT
4602 && INTVAL (op1) == GET_MODE_MASK (mode)
a432f20d
RK
4603 && INTEGRAL_MODE_P (mode))
4604 return const_true_rtx;
7afe21cc
RK
4605 break;
4606
4607 case GTU:
4608 if (GET_CODE (op1) == CONST_INT
4609 && INTVAL (op1) == GET_MODE_MASK (mode)
cbf6a543 4610 && INTEGRAL_MODE_P (mode))
7afe21cc
RK
4611 return const0_rtx;
4612 break;
e9a25f70
JL
4613
4614 default:
4615 break;
7afe21cc
RK
4616 }
4617
4618 return 0;
4619 }
4620
a432f20d
RK
4621 /* If we reach here, EQUAL, OP0LT, OP0LTU, OP1LT, and OP1LTU are set
4622 as appropriate. */
7afe21cc
RK
4623 switch (code)
4624 {
7afe21cc 4625 case EQ:
a432f20d
RK
4626 return equal ? const_true_rtx : const0_rtx;
4627 case NE:
4628 return ! equal ? const_true_rtx : const0_rtx;
7afe21cc 4629 case LT:
a432f20d 4630 return op0lt ? const_true_rtx : const0_rtx;
7afe21cc 4631 case GT:
a432f20d 4632 return op1lt ? const_true_rtx : const0_rtx;
7afe21cc 4633 case LTU:
a432f20d 4634 return op0ltu ? const_true_rtx : const0_rtx;
7afe21cc 4635 case GTU:
a432f20d
RK
4636 return op1ltu ? const_true_rtx : const0_rtx;
4637 case LE:
4638 return equal || op0lt ? const_true_rtx : const0_rtx;
4639 case GE:
4640 return equal || op1lt ? const_true_rtx : const0_rtx;
4641 case LEU:
4642 return equal || op0ltu ? const_true_rtx : const0_rtx;
4643 case GEU:
4644 return equal || op1ltu ? const_true_rtx : const0_rtx;
e9a25f70
JL
4645 default:
4646 abort ();
7afe21cc 4647 }
7afe21cc
RK
4648}
4649\f
4650/* Simplify CODE, an operation with result mode MODE and three operands,
4651 OP0, OP1, and OP2. OP0_MODE was the mode of OP0 before it became
4652 a constant. Return 0 if no simplifications is possible. */
4653
4654rtx
4655simplify_ternary_operation (code, mode, op0_mode, op0, op1, op2)
4656 enum rtx_code code;
4657 enum machine_mode mode, op0_mode;
4658 rtx op0, op1, op2;
4659{
4660 int width = GET_MODE_BITSIZE (mode);
4661
4662 /* VOIDmode means "infinite" precision. */
4663 if (width == 0)
906c4e36 4664 width = HOST_BITS_PER_WIDE_INT;
7afe21cc
RK
4665
4666 switch (code)
4667 {
4668 case SIGN_EXTRACT:
4669 case ZERO_EXTRACT:
4670 if (GET_CODE (op0) == CONST_INT
4671 && GET_CODE (op1) == CONST_INT
4672 && GET_CODE (op2) == CONST_INT
4673 && INTVAL (op1) + INTVAL (op2) <= GET_MODE_BITSIZE (op0_mode)
906c4e36 4674 && width <= HOST_BITS_PER_WIDE_INT)
7afe21cc
RK
4675 {
4676 /* Extracting a bit-field from a constant */
906c4e36 4677 HOST_WIDE_INT val = INTVAL (op0);
7afe21cc 4678
f76b9db2
ILT
4679 if (BITS_BIG_ENDIAN)
4680 val >>= (GET_MODE_BITSIZE (op0_mode)
4681 - INTVAL (op2) - INTVAL (op1));
4682 else
4683 val >>= INTVAL (op2);
4684
906c4e36 4685 if (HOST_BITS_PER_WIDE_INT != INTVAL (op1))
7afe21cc
RK
4686 {
4687 /* First zero-extend. */
906c4e36 4688 val &= ((HOST_WIDE_INT) 1 << INTVAL (op1)) - 1;
7afe21cc 4689 /* If desired, propagate sign bit. */
906c4e36
RK
4690 if (code == SIGN_EXTRACT
4691 && (val & ((HOST_WIDE_INT) 1 << (INTVAL (op1) - 1))))
4692 val |= ~ (((HOST_WIDE_INT) 1 << INTVAL (op1)) - 1);
7afe21cc
RK
4693 }
4694
4695 /* Clear the bits that don't belong in our mode,
4696 unless they and our sign bit are all one.
4697 So we get either a reasonable negative value or a reasonable
4698 unsigned value for this mode. */
906c4e36
RK
4699 if (width < HOST_BITS_PER_WIDE_INT
4700 && ((val & ((HOST_WIDE_INT) (-1) << (width - 1)))
4701 != ((HOST_WIDE_INT) (-1) << (width - 1))))
4702 val &= ((HOST_WIDE_INT) 1 << width) - 1;
7afe21cc 4703
906c4e36 4704 return GEN_INT (val);
7afe21cc
RK
4705 }
4706 break;
4707
4708 case IF_THEN_ELSE:
4709 if (GET_CODE (op0) == CONST_INT)
4710 return op0 != const0_rtx ? op1 : op2;
3bf1b082
JW
4711
4712 /* Convert a == b ? b : a to "a". */
4713 if (GET_CODE (op0) == NE && ! side_effects_p (op0)
4714 && rtx_equal_p (XEXP (op0, 0), op1)
4715 && rtx_equal_p (XEXP (op0, 1), op2))
4716 return op1;
4717 else if (GET_CODE (op0) == EQ && ! side_effects_p (op0)
4718 && rtx_equal_p (XEXP (op0, 1), op1)
4719 && rtx_equal_p (XEXP (op0, 0), op2))
4720 return op2;
e82ad93d 4721 else if (GET_RTX_CLASS (GET_CODE (op0)) == '<' && ! side_effects_p (op0))
ed1ecb19
JL
4722 {
4723 rtx temp;
4724 temp = simplify_relational_operation (GET_CODE (op0), op0_mode,
4725 XEXP (op0, 0), XEXP (op0, 1));
4726 /* See if any simplifications were possible. */
4727 if (temp == const0_rtx)
4728 return op2;
4729 else if (temp == const1_rtx)
4730 return op1;
4731 }
7afe21cc
RK
4732 break;
4733
4734 default:
4735 abort ();
4736 }
4737
4738 return 0;
4739}
4740\f
4741/* If X is a nontrivial arithmetic operation on an argument
4742 for which a constant value can be determined, return
4743 the result of operating on that value, as a constant.
4744 Otherwise, return X, possibly with one or more operands
4745 modified by recursive calls to this function.
4746
e7bb59fa
RK
4747 If X is a register whose contents are known, we do NOT
4748 return those contents here. equiv_constant is called to
4749 perform that task.
7afe21cc
RK
4750
4751 INSN is the insn that we may be modifying. If it is 0, make a copy
4752 of X before modifying it. */
4753
4754static rtx
4755fold_rtx (x, insn)
4756 rtx x;
4757 rtx insn;
4758{
4759 register enum rtx_code code;
4760 register enum machine_mode mode;
4761 register char *fmt;
906c4e36 4762 register int i;
7afe21cc
RK
4763 rtx new = 0;
4764 int copied = 0;
4765 int must_swap = 0;
4766
4767 /* Folded equivalents of first two operands of X. */
4768 rtx folded_arg0;
4769 rtx folded_arg1;
4770
4771 /* Constant equivalents of first three operands of X;
4772 0 when no such equivalent is known. */
4773 rtx const_arg0;
4774 rtx const_arg1;
4775 rtx const_arg2;
4776
4777 /* The mode of the first operand of X. We need this for sign and zero
4778 extends. */
4779 enum machine_mode mode_arg0;
4780
4781 if (x == 0)
4782 return x;
4783
4784 mode = GET_MODE (x);
4785 code = GET_CODE (x);
4786 switch (code)
4787 {
4788 case CONST:
4789 case CONST_INT:
4790 case CONST_DOUBLE:
4791 case SYMBOL_REF:
4792 case LABEL_REF:
4793 case REG:
4794 /* No use simplifying an EXPR_LIST
4795 since they are used only for lists of args
4796 in a function call's REG_EQUAL note. */
4797 case EXPR_LIST:
956d6950
JL
4798 /* Changing anything inside an ADDRESSOF is incorrect; we don't
4799 want to (e.g.,) make (addressof (const_int 0)) just because
4800 the location is known to be zero. */
4801 case ADDRESSOF:
7afe21cc
RK
4802 return x;
4803
4804#ifdef HAVE_cc0
4805 case CC0:
4806 return prev_insn_cc0;
4807#endif
4808
4809 case PC:
4810 /* If the next insn is a CODE_LABEL followed by a jump table,
4811 PC's value is a LABEL_REF pointing to that label. That
4812 lets us fold switch statements on the Vax. */
4813 if (insn && GET_CODE (insn) == JUMP_INSN)
4814 {
4815 rtx next = next_nonnote_insn (insn);
4816
4817 if (next && GET_CODE (next) == CODE_LABEL
4818 && NEXT_INSN (next) != 0
4819 && GET_CODE (NEXT_INSN (next)) == JUMP_INSN
4820 && (GET_CODE (PATTERN (NEXT_INSN (next))) == ADDR_VEC
4821 || GET_CODE (PATTERN (NEXT_INSN (next))) == ADDR_DIFF_VEC))
38a448ca 4822 return gen_rtx_LABEL_REF (Pmode, next);
7afe21cc
RK
4823 }
4824 break;
4825
4826 case SUBREG:
c610adec
RK
4827 /* See if we previously assigned a constant value to this SUBREG. */
4828 if ((new = lookup_as_function (x, CONST_INT)) != 0
4829 || (new = lookup_as_function (x, CONST_DOUBLE)) != 0)
7afe21cc
RK
4830 return new;
4831
4b980e20
RK
4832 /* If this is a paradoxical SUBREG, we have no idea what value the
4833 extra bits would have. However, if the operand is equivalent
4834 to a SUBREG whose operand is the same as our mode, and all the
4835 modes are within a word, we can just use the inner operand
31c85c78
RK
4836 because these SUBREGs just say how to treat the register.
4837
4838 Similarly if we find an integer constant. */
4b980e20 4839
e5f6a288 4840 if (GET_MODE_SIZE (mode) > GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))))
4b980e20
RK
4841 {
4842 enum machine_mode imode = GET_MODE (SUBREG_REG (x));
4843 struct table_elt *elt;
4844
4845 if (GET_MODE_SIZE (mode) <= UNITS_PER_WORD
4846 && GET_MODE_SIZE (imode) <= UNITS_PER_WORD
4847 && (elt = lookup (SUBREG_REG (x), HASH (SUBREG_REG (x), imode),
4848 imode)) != 0)
31c85c78
RK
4849 for (elt = elt->first_same_value;
4850 elt; elt = elt->next_same_value)
4851 {
4852 if (CONSTANT_P (elt->exp)
4853 && GET_MODE (elt->exp) == VOIDmode)
4854 return elt->exp;
4855
4b980e20
RK
4856 if (GET_CODE (elt->exp) == SUBREG
4857 && GET_MODE (SUBREG_REG (elt->exp)) == mode
906c4e36 4858 && exp_equiv_p (elt->exp, elt->exp, 1, 0))
4b980e20
RK
4859 return copy_rtx (SUBREG_REG (elt->exp));
4860 }
4861
4862 return x;
4863 }
e5f6a288 4864
7afe21cc
RK
4865 /* Fold SUBREG_REG. If it changed, see if we can simplify the SUBREG.
4866 We might be able to if the SUBREG is extracting a single word in an
4867 integral mode or extracting the low part. */
4868
4869 folded_arg0 = fold_rtx (SUBREG_REG (x), insn);
4870 const_arg0 = equiv_constant (folded_arg0);
4871 if (const_arg0)
4872 folded_arg0 = const_arg0;
4873
4874 if (folded_arg0 != SUBREG_REG (x))
4875 {
4876 new = 0;
4877
4878 if (GET_MODE_CLASS (mode) == MODE_INT
4879 && GET_MODE_SIZE (mode) == UNITS_PER_WORD
4880 && GET_MODE (SUBREG_REG (x)) != VOIDmode)
4881 new = operand_subword (folded_arg0, SUBREG_WORD (x), 0,
4882 GET_MODE (SUBREG_REG (x)));
4883 if (new == 0 && subreg_lowpart_p (x))
4884 new = gen_lowpart_if_possible (mode, folded_arg0);
4885 if (new)
4886 return new;
4887 }
e5f6a288
RK
4888
4889 /* If this is a narrowing SUBREG and our operand is a REG, see if
858a47b1 4890 we can find an equivalence for REG that is an arithmetic operation
e5f6a288
RK
4891 in a wider mode where both operands are paradoxical SUBREGs
4892 from objects of our result mode. In that case, we couldn't report
4893 an equivalent value for that operation, since we don't know what the
4894 extra bits will be. But we can find an equivalence for this SUBREG
4895 by folding that operation is the narrow mode. This allows us to
4896 fold arithmetic in narrow modes when the machine only supports
4b980e20
RK
4897 word-sized arithmetic.
4898
4899 Also look for a case where we have a SUBREG whose operand is the
4900 same as our result. If both modes are smaller than a word, we
4901 are simply interpreting a register in different modes and we
4902 can use the inner value. */
e5f6a288
RK
4903
4904 if (GET_CODE (folded_arg0) == REG
e8d76a39
RS
4905 && GET_MODE_SIZE (mode) < GET_MODE_SIZE (GET_MODE (folded_arg0))
4906 && subreg_lowpart_p (x))
e5f6a288
RK
4907 {
4908 struct table_elt *elt;
4909
4910 /* We can use HASH here since we know that canon_hash won't be
4911 called. */
4912 elt = lookup (folded_arg0,
4913 HASH (folded_arg0, GET_MODE (folded_arg0)),
4914 GET_MODE (folded_arg0));
4915
4916 if (elt)
4917 elt = elt->first_same_value;
4918
4919 for (; elt; elt = elt->next_same_value)
4920 {
e8d76a39
RS
4921 enum rtx_code eltcode = GET_CODE (elt->exp);
4922
e5f6a288
RK
4923 /* Just check for unary and binary operations. */
4924 if (GET_RTX_CLASS (GET_CODE (elt->exp)) == '1'
4925 && GET_CODE (elt->exp) != SIGN_EXTEND
4926 && GET_CODE (elt->exp) != ZERO_EXTEND
4927 && GET_CODE (XEXP (elt->exp, 0)) == SUBREG
4928 && GET_MODE (SUBREG_REG (XEXP (elt->exp, 0))) == mode)
4929 {
4930 rtx op0 = SUBREG_REG (XEXP (elt->exp, 0));
4931
4932 if (GET_CODE (op0) != REG && ! CONSTANT_P (op0))
906c4e36 4933 op0 = fold_rtx (op0, NULL_RTX);
e5f6a288
RK
4934
4935 op0 = equiv_constant (op0);
4936 if (op0)
4937 new = simplify_unary_operation (GET_CODE (elt->exp), mode,
4938 op0, mode);
4939 }
4940 else if ((GET_RTX_CLASS (GET_CODE (elt->exp)) == '2'
4941 || GET_RTX_CLASS (GET_CODE (elt->exp)) == 'c')
e8d76a39
RS
4942 && eltcode != DIV && eltcode != MOD
4943 && eltcode != UDIV && eltcode != UMOD
4944 && eltcode != ASHIFTRT && eltcode != LSHIFTRT
4945 && eltcode != ROTATE && eltcode != ROTATERT
e5f6a288
RK
4946 && ((GET_CODE (XEXP (elt->exp, 0)) == SUBREG
4947 && (GET_MODE (SUBREG_REG (XEXP (elt->exp, 0)))
4948 == mode))
4949 || CONSTANT_P (XEXP (elt->exp, 0)))
4950 && ((GET_CODE (XEXP (elt->exp, 1)) == SUBREG
4951 && (GET_MODE (SUBREG_REG (XEXP (elt->exp, 1)))
4952 == mode))
4953 || CONSTANT_P (XEXP (elt->exp, 1))))
4954 {
4955 rtx op0 = gen_lowpart_common (mode, XEXP (elt->exp, 0));
4956 rtx op1 = gen_lowpart_common (mode, XEXP (elt->exp, 1));
4957
4958 if (op0 && GET_CODE (op0) != REG && ! CONSTANT_P (op0))
906c4e36 4959 op0 = fold_rtx (op0, NULL_RTX);
e5f6a288
RK
4960
4961 if (op0)
4962 op0 = equiv_constant (op0);
4963
4964 if (op1 && GET_CODE (op1) != REG && ! CONSTANT_P (op1))
906c4e36 4965 op1 = fold_rtx (op1, NULL_RTX);
e5f6a288
RK
4966
4967 if (op1)
4968 op1 = equiv_constant (op1);
4969
76fb0b60
RS
4970 /* If we are looking for the low SImode part of
4971 (ashift:DI c (const_int 32)), it doesn't work
4972 to compute that in SImode, because a 32-bit shift
4973 in SImode is unpredictable. We know the value is 0. */
4974 if (op0 && op1
45620ed4 4975 && GET_CODE (elt->exp) == ASHIFT
76fb0b60
RS
4976 && GET_CODE (op1) == CONST_INT
4977 && INTVAL (op1) >= GET_MODE_BITSIZE (mode))
4978 {
4979 if (INTVAL (op1) < GET_MODE_BITSIZE (GET_MODE (elt->exp)))
4980
4981 /* If the count fits in the inner mode's width,
4982 but exceeds the outer mode's width,
4983 the value will get truncated to 0
4984 by the subreg. */
4985 new = const0_rtx;
4986 else
4987 /* If the count exceeds even the inner mode's width,
4988 don't fold this expression. */
4989 new = 0;
4990 }
4991 else if (op0 && op1)
e5f6a288
RK
4992 new = simplify_binary_operation (GET_CODE (elt->exp), mode,
4993 op0, op1);
4994 }
4995
4b980e20
RK
4996 else if (GET_CODE (elt->exp) == SUBREG
4997 && GET_MODE (SUBREG_REG (elt->exp)) == mode
4998 && (GET_MODE_SIZE (GET_MODE (folded_arg0))
4999 <= UNITS_PER_WORD)
906c4e36 5000 && exp_equiv_p (elt->exp, elt->exp, 1, 0))
4b980e20
RK
5001 new = copy_rtx (SUBREG_REG (elt->exp));
5002
e5f6a288
RK
5003 if (new)
5004 return new;
5005 }
5006 }
5007
7afe21cc
RK
5008 return x;
5009
5010 case NOT:
5011 case NEG:
5012 /* If we have (NOT Y), see if Y is known to be (NOT Z).
5013 If so, (NOT Y) simplifies to Z. Similarly for NEG. */
5014 new = lookup_as_function (XEXP (x, 0), code);
5015 if (new)
5016 return fold_rtx (copy_rtx (XEXP (new, 0)), insn);
5017 break;
13c9910f 5018
7afe21cc
RK
5019 case MEM:
5020 /* If we are not actually processing an insn, don't try to find the
5021 best address. Not only don't we care, but we could modify the
5022 MEM in an invalid way since we have no insn to validate against. */
5023 if (insn != 0)
5024 find_best_addr (insn, &XEXP (x, 0));
5025
5026 {
5027 /* Even if we don't fold in the insn itself,
5028 we can safely do so here, in hopes of getting a constant. */
906c4e36 5029 rtx addr = fold_rtx (XEXP (x, 0), NULL_RTX);
7afe21cc 5030 rtx base = 0;
906c4e36 5031 HOST_WIDE_INT offset = 0;
7afe21cc
RK
5032
5033 if (GET_CODE (addr) == REG
5034 && REGNO_QTY_VALID_P (REGNO (addr))
5035 && GET_MODE (addr) == qty_mode[reg_qty[REGNO (addr)]]
5036 && qty_const[reg_qty[REGNO (addr)]] != 0)
5037 addr = qty_const[reg_qty[REGNO (addr)]];
5038
5039 /* If address is constant, split it into a base and integer offset. */
5040 if (GET_CODE (addr) == SYMBOL_REF || GET_CODE (addr) == LABEL_REF)
5041 base = addr;
5042 else if (GET_CODE (addr) == CONST && GET_CODE (XEXP (addr, 0)) == PLUS
5043 && GET_CODE (XEXP (XEXP (addr, 0), 1)) == CONST_INT)
5044 {
5045 base = XEXP (XEXP (addr, 0), 0);
5046 offset = INTVAL (XEXP (XEXP (addr, 0), 1));
5047 }
5048 else if (GET_CODE (addr) == LO_SUM
5049 && GET_CODE (XEXP (addr, 1)) == SYMBOL_REF)
5050 base = XEXP (addr, 1);
e9a25f70 5051 else if (GET_CODE (addr) == ADDRESSOF)
956d6950 5052 return change_address (x, VOIDmode, addr);
7afe21cc
RK
5053
5054 /* If this is a constant pool reference, we can fold it into its
5055 constant to allow better value tracking. */
5056 if (base && GET_CODE (base) == SYMBOL_REF
5057 && CONSTANT_POOL_ADDRESS_P (base))
5058 {
5059 rtx constant = get_pool_constant (base);
5060 enum machine_mode const_mode = get_pool_mode (base);
5061 rtx new;
5062
5063 if (CONSTANT_P (constant) && GET_CODE (constant) != CONST_INT)
5064 constant_pool_entries_cost = COST (constant);
5065
5066 /* If we are loading the full constant, we have an equivalence. */
5067 if (offset == 0 && mode == const_mode)
5068 return constant;
5069
9faa82d8 5070 /* If this actually isn't a constant (weird!), we can't do
7afe21cc
RK
5071 anything. Otherwise, handle the two most common cases:
5072 extracting a word from a multi-word constant, and extracting
5073 the low-order bits. Other cases don't seem common enough to
5074 worry about. */
5075 if (! CONSTANT_P (constant))
5076 return x;
5077
5078 if (GET_MODE_CLASS (mode) == MODE_INT
5079 && GET_MODE_SIZE (mode) == UNITS_PER_WORD
5080 && offset % UNITS_PER_WORD == 0
5081 && (new = operand_subword (constant,
5082 offset / UNITS_PER_WORD,
5083 0, const_mode)) != 0)
5084 return new;
5085
5086 if (((BYTES_BIG_ENDIAN
5087 && offset == GET_MODE_SIZE (GET_MODE (constant)) - 1)
5088 || (! BYTES_BIG_ENDIAN && offset == 0))
5089 && (new = gen_lowpart_if_possible (mode, constant)) != 0)
5090 return new;
5091 }
5092
5093 /* If this is a reference to a label at a known position in a jump
5094 table, we also know its value. */
5095 if (base && GET_CODE (base) == LABEL_REF)
5096 {
5097 rtx label = XEXP (base, 0);
5098 rtx table_insn = NEXT_INSN (label);
5099
5100 if (table_insn && GET_CODE (table_insn) == JUMP_INSN
5101 && GET_CODE (PATTERN (table_insn)) == ADDR_VEC)
5102 {
5103 rtx table = PATTERN (table_insn);
5104
5105 if (offset >= 0
5106 && (offset / GET_MODE_SIZE (GET_MODE (table))
5107 < XVECLEN (table, 0)))
5108 return XVECEXP (table, 0,
5109 offset / GET_MODE_SIZE (GET_MODE (table)));
5110 }
5111 if (table_insn && GET_CODE (table_insn) == JUMP_INSN
5112 && GET_CODE (PATTERN (table_insn)) == ADDR_DIFF_VEC)
5113 {
5114 rtx table = PATTERN (table_insn);
5115
5116 if (offset >= 0
5117 && (offset / GET_MODE_SIZE (GET_MODE (table))
5118 < XVECLEN (table, 1)))
5119 {
5120 offset /= GET_MODE_SIZE (GET_MODE (table));
38a448ca
RH
5121 new = gen_rtx_MINUS (Pmode, XVECEXP (table, 1, offset),
5122 XEXP (table, 0));
7afe21cc
RK
5123
5124 if (GET_MODE (table) != Pmode)
38a448ca 5125 new = gen_rtx_TRUNCATE (GET_MODE (table), new);
7afe21cc 5126
67a37737
RK
5127 /* Indicate this is a constant. This isn't a
5128 valid form of CONST, but it will only be used
5129 to fold the next insns and then discarded, so
5130 it should be safe. */
38a448ca 5131 return gen_rtx_CONST (GET_MODE (new), new);
7afe21cc
RK
5132 }
5133 }
5134 }
5135
5136 return x;
5137 }
9255709c
RK
5138
5139 case ASM_OPERANDS:
5140 for (i = XVECLEN (x, 3) - 1; i >= 0; i--)
5141 validate_change (insn, &XVECEXP (x, 3, i),
5142 fold_rtx (XVECEXP (x, 3, i), insn), 0);
5143 break;
e9a25f70
JL
5144
5145 default:
5146 break;
7afe21cc
RK
5147 }
5148
5149 const_arg0 = 0;
5150 const_arg1 = 0;
5151 const_arg2 = 0;
5152 mode_arg0 = VOIDmode;
5153
5154 /* Try folding our operands.
5155 Then see which ones have constant values known. */
5156
5157 fmt = GET_RTX_FORMAT (code);
5158 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
5159 if (fmt[i] == 'e')
5160 {
5161 rtx arg = XEXP (x, i);
5162 rtx folded_arg = arg, const_arg = 0;
5163 enum machine_mode mode_arg = GET_MODE (arg);
5164 rtx cheap_arg, expensive_arg;
5165 rtx replacements[2];
5166 int j;
5167
5168 /* Most arguments are cheap, so handle them specially. */
5169 switch (GET_CODE (arg))
5170 {
5171 case REG:
5172 /* This is the same as calling equiv_constant; it is duplicated
5173 here for speed. */
5174 if (REGNO_QTY_VALID_P (REGNO (arg))
5175 && qty_const[reg_qty[REGNO (arg)]] != 0
5176 && GET_CODE (qty_const[reg_qty[REGNO (arg)]]) != REG
5177 && GET_CODE (qty_const[reg_qty[REGNO (arg)]]) != PLUS)
5178 const_arg
5179 = gen_lowpart_if_possible (GET_MODE (arg),
5180 qty_const[reg_qty[REGNO (arg)]]);
5181 break;
5182
5183 case CONST:
5184 case CONST_INT:
5185 case SYMBOL_REF:
5186 case LABEL_REF:
5187 case CONST_DOUBLE:
5188 const_arg = arg;
5189 break;
5190
5191#ifdef HAVE_cc0
5192 case CC0:
5193 folded_arg = prev_insn_cc0;
5194 mode_arg = prev_insn_cc0_mode;
5195 const_arg = equiv_constant (folded_arg);
5196 break;
5197#endif
5198
5199 default:
5200 folded_arg = fold_rtx (arg, insn);
5201 const_arg = equiv_constant (folded_arg);
5202 }
5203
5204 /* For the first three operands, see if the operand
5205 is constant or equivalent to a constant. */
5206 switch (i)
5207 {
5208 case 0:
5209 folded_arg0 = folded_arg;
5210 const_arg0 = const_arg;
5211 mode_arg0 = mode_arg;
5212 break;
5213 case 1:
5214 folded_arg1 = folded_arg;
5215 const_arg1 = const_arg;
5216 break;
5217 case 2:
5218 const_arg2 = const_arg;
5219 break;
5220 }
5221
5222 /* Pick the least expensive of the folded argument and an
5223 equivalent constant argument. */
5224 if (const_arg == 0 || const_arg == folded_arg
5225 || COST (const_arg) > COST (folded_arg))
5226 cheap_arg = folded_arg, expensive_arg = const_arg;
5227 else
5228 cheap_arg = const_arg, expensive_arg = folded_arg;
5229
5230 /* Try to replace the operand with the cheapest of the two
5231 possibilities. If it doesn't work and this is either of the first
5232 two operands of a commutative operation, try swapping them.
5233 If THAT fails, try the more expensive, provided it is cheaper
5234 than what is already there. */
5235
5236 if (cheap_arg == XEXP (x, i))
5237 continue;
5238
5239 if (insn == 0 && ! copied)
5240 {
5241 x = copy_rtx (x);
5242 copied = 1;
5243 }
5244
5245 replacements[0] = cheap_arg, replacements[1] = expensive_arg;
5246 for (j = 0;
5247 j < 2 && replacements[j]
5248 && COST (replacements[j]) < COST (XEXP (x, i));
5249 j++)
5250 {
5251 if (validate_change (insn, &XEXP (x, i), replacements[j], 0))
5252 break;
5253
5254 if (code == NE || code == EQ || GET_RTX_CLASS (code) == 'c')
5255 {
5256 validate_change (insn, &XEXP (x, i), XEXP (x, 1 - i), 1);
5257 validate_change (insn, &XEXP (x, 1 - i), replacements[j], 1);
5258
5259 if (apply_change_group ())
5260 {
5261 /* Swap them back to be invalid so that this loop can
5262 continue and flag them to be swapped back later. */
5263 rtx tem;
5264
5265 tem = XEXP (x, 0); XEXP (x, 0) = XEXP (x, 1);
5266 XEXP (x, 1) = tem;
5267 must_swap = 1;
5268 break;
5269 }
5270 }
5271 }
5272 }
5273
2d8b0f3a
JL
5274 else
5275 {
5276 if (fmt[i] == 'E')
5277 /* Don't try to fold inside of a vector of expressions.
5278 Doing nothing is harmless. */
5279 {;}
5280 }
7afe21cc
RK
5281
5282 /* If a commutative operation, place a constant integer as the second
5283 operand unless the first operand is also a constant integer. Otherwise,
5284 place any constant second unless the first operand is also a constant. */
5285
5286 if (code == EQ || code == NE || GET_RTX_CLASS (code) == 'c')
5287 {
5288 if (must_swap || (const_arg0
5289 && (const_arg1 == 0
5290 || (GET_CODE (const_arg0) == CONST_INT
5291 && GET_CODE (const_arg1) != CONST_INT))))
5292 {
5293 register rtx tem = XEXP (x, 0);
5294
5295 if (insn == 0 && ! copied)
5296 {
5297 x = copy_rtx (x);
5298 copied = 1;
5299 }
5300
5301 validate_change (insn, &XEXP (x, 0), XEXP (x, 1), 1);
5302 validate_change (insn, &XEXP (x, 1), tem, 1);
5303 if (apply_change_group ())
5304 {
5305 tem = const_arg0, const_arg0 = const_arg1, const_arg1 = tem;
5306 tem = folded_arg0, folded_arg0 = folded_arg1, folded_arg1 = tem;
5307 }
5308 }
5309 }
5310
5311 /* If X is an arithmetic operation, see if we can simplify it. */
5312
5313 switch (GET_RTX_CLASS (code))
5314 {
5315 case '1':
67a37737
RK
5316 {
5317 int is_const = 0;
5318
5319 /* We can't simplify extension ops unless we know the
5320 original mode. */
5321 if ((code == ZERO_EXTEND || code == SIGN_EXTEND)
5322 && mode_arg0 == VOIDmode)
5323 break;
5324
5325 /* If we had a CONST, strip it off and put it back later if we
5326 fold. */
5327 if (const_arg0 != 0 && GET_CODE (const_arg0) == CONST)
5328 is_const = 1, const_arg0 = XEXP (const_arg0, 0);
5329
5330 new = simplify_unary_operation (code, mode,
5331 const_arg0 ? const_arg0 : folded_arg0,
5332 mode_arg0);
5333 if (new != 0 && is_const)
38a448ca 5334 new = gen_rtx_CONST (mode, new);
67a37737 5335 }
7afe21cc
RK
5336 break;
5337
5338 case '<':
5339 /* See what items are actually being compared and set FOLDED_ARG[01]
5340 to those values and CODE to the actual comparison code. If any are
5341 constant, set CONST_ARG0 and CONST_ARG1 appropriately. We needn't
5342 do anything if both operands are already known to be constant. */
5343
5344 if (const_arg0 == 0 || const_arg1 == 0)
5345 {
5346 struct table_elt *p0, *p1;
c610adec 5347 rtx true = const_true_rtx, false = const0_rtx;
13c9910f 5348 enum machine_mode mode_arg1;
c610adec
RK
5349
5350#ifdef FLOAT_STORE_FLAG_VALUE
c7c955ee 5351 if (GET_MODE_CLASS (mode) == MODE_FLOAT)
c610adec 5352 {
560c94a2
RK
5353 true = CONST_DOUBLE_FROM_REAL_VALUE (FLOAT_STORE_FLAG_VALUE,
5354 mode);
c610adec
RK
5355 false = CONST0_RTX (mode);
5356 }
5357#endif
7afe21cc 5358
13c9910f
RS
5359 code = find_comparison_args (code, &folded_arg0, &folded_arg1,
5360 &mode_arg0, &mode_arg1);
7afe21cc
RK
5361 const_arg0 = equiv_constant (folded_arg0);
5362 const_arg1 = equiv_constant (folded_arg1);
5363
13c9910f
RS
5364 /* If the mode is VOIDmode or a MODE_CC mode, we don't know
5365 what kinds of things are being compared, so we can't do
5366 anything with this comparison. */
7afe21cc
RK
5367
5368 if (mode_arg0 == VOIDmode || GET_MODE_CLASS (mode_arg0) == MODE_CC)
5369 break;
5370
0f41302f
MS
5371 /* If we do not now have two constants being compared, see
5372 if we can nevertheless deduce some things about the
5373 comparison. */
7afe21cc
RK
5374 if (const_arg0 == 0 || const_arg1 == 0)
5375 {
0f41302f
MS
5376 /* Is FOLDED_ARG0 frame-pointer plus a constant? Or
5377 non-explicit constant? These aren't zero, but we
5378 don't know their sign. */
7afe21cc
RK
5379 if (const_arg1 == const0_rtx
5380 && (NONZERO_BASE_PLUS_P (folded_arg0)
5381#if 0 /* Sad to say, on sysvr4, #pragma weak can make a symbol address
5382 come out as 0. */
5383 || GET_CODE (folded_arg0) == SYMBOL_REF
5384#endif
5385 || GET_CODE (folded_arg0) == LABEL_REF
5386 || GET_CODE (folded_arg0) == CONST))
5387 {
5388 if (code == EQ)
c610adec 5389 return false;
7afe21cc 5390 else if (code == NE)
c610adec 5391 return true;
7afe21cc
RK
5392 }
5393
5394 /* See if the two operands are the same. We don't do this
5395 for IEEE floating-point since we can't assume x == x
5396 since x might be a NaN. */
5397
5398 if ((TARGET_FLOAT_FORMAT != IEEE_FLOAT_FORMAT
a83afb65 5399 || ! FLOAT_MODE_P (mode_arg0) || flag_fast_math)
7afe21cc
RK
5400 && (folded_arg0 == folded_arg1
5401 || (GET_CODE (folded_arg0) == REG
5402 && GET_CODE (folded_arg1) == REG
5403 && (reg_qty[REGNO (folded_arg0)]
5404 == reg_qty[REGNO (folded_arg1)]))
5405 || ((p0 = lookup (folded_arg0,
5406 (safe_hash (folded_arg0, mode_arg0)
5407 % NBUCKETS), mode_arg0))
5408 && (p1 = lookup (folded_arg1,
5409 (safe_hash (folded_arg1, mode_arg0)
5410 % NBUCKETS), mode_arg0))
5411 && p0->first_same_value == p1->first_same_value)))
5412 return ((code == EQ || code == LE || code == GE
5413 || code == LEU || code == GEU)
c610adec 5414 ? true : false);
7afe21cc
RK
5415
5416 /* If FOLDED_ARG0 is a register, see if the comparison we are
5417 doing now is either the same as we did before or the reverse
5418 (we only check the reverse if not floating-point). */
5419 else if (GET_CODE (folded_arg0) == REG)
5420 {
5421 int qty = reg_qty[REGNO (folded_arg0)];
5422
5423 if (REGNO_QTY_VALID_P (REGNO (folded_arg0))
5424 && (comparison_dominates_p (qty_comparison_code[qty], code)
5425 || (comparison_dominates_p (qty_comparison_code[qty],
5426 reverse_condition (code))
cbf6a543 5427 && ! FLOAT_MODE_P (mode_arg0)))
7afe21cc
RK
5428 && (rtx_equal_p (qty_comparison_const[qty], folded_arg1)
5429 || (const_arg1
5430 && rtx_equal_p (qty_comparison_const[qty],
5431 const_arg1))
5432 || (GET_CODE (folded_arg1) == REG
5433 && (reg_qty[REGNO (folded_arg1)]
5434 == qty_comparison_qty[qty]))))
5435 return (comparison_dominates_p (qty_comparison_code[qty],
5436 code)
c610adec 5437 ? true : false);
7afe21cc
RK
5438 }
5439 }
5440 }
5441
5442 /* If we are comparing against zero, see if the first operand is
5443 equivalent to an IOR with a constant. If so, we may be able to
5444 determine the result of this comparison. */
5445
5446 if (const_arg1 == const0_rtx)
5447 {
5448 rtx y = lookup_as_function (folded_arg0, IOR);
5449 rtx inner_const;
5450
5451 if (y != 0
5452 && (inner_const = equiv_constant (XEXP (y, 1))) != 0
5453 && GET_CODE (inner_const) == CONST_INT
5454 && INTVAL (inner_const) != 0)
5455 {
5456 int sign_bitnum = GET_MODE_BITSIZE (mode_arg0) - 1;
906c4e36
RK
5457 int has_sign = (HOST_BITS_PER_WIDE_INT >= sign_bitnum
5458 && (INTVAL (inner_const)
5459 & ((HOST_WIDE_INT) 1 << sign_bitnum)));
c610adec
RK
5460 rtx true = const_true_rtx, false = const0_rtx;
5461
5462#ifdef FLOAT_STORE_FLAG_VALUE
c7c955ee 5463 if (GET_MODE_CLASS (mode) == MODE_FLOAT)
c610adec 5464 {
560c94a2
RK
5465 true = CONST_DOUBLE_FROM_REAL_VALUE (FLOAT_STORE_FLAG_VALUE,
5466 mode);
c610adec
RK
5467 false = CONST0_RTX (mode);
5468 }
5469#endif
7afe21cc
RK
5470
5471 switch (code)
5472 {
5473 case EQ:
c610adec 5474 return false;
7afe21cc 5475 case NE:
c610adec 5476 return true;
7afe21cc
RK
5477 case LT: case LE:
5478 if (has_sign)
c610adec 5479 return true;
7afe21cc
RK
5480 break;
5481 case GT: case GE:
5482 if (has_sign)
c610adec 5483 return false;
7afe21cc 5484 break;
e9a25f70
JL
5485 default:
5486 break;
7afe21cc
RK
5487 }
5488 }
5489 }
5490
5491 new = simplify_relational_operation (code, mode_arg0,
5492 const_arg0 ? const_arg0 : folded_arg0,
5493 const_arg1 ? const_arg1 : folded_arg1);
c610adec
RK
5494#ifdef FLOAT_STORE_FLAG_VALUE
5495 if (new != 0 && GET_MODE_CLASS (mode) == MODE_FLOAT)
5496 new = ((new == const0_rtx) ? CONST0_RTX (mode)
560c94a2 5497 : CONST_DOUBLE_FROM_REAL_VALUE (FLOAT_STORE_FLAG_VALUE, mode));
c610adec 5498#endif
7afe21cc
RK
5499 break;
5500
5501 case '2':
5502 case 'c':
5503 switch (code)
5504 {
5505 case PLUS:
5506 /* If the second operand is a LABEL_REF, see if the first is a MINUS
5507 with that LABEL_REF as its second operand. If so, the result is
5508 the first operand of that MINUS. This handles switches with an
5509 ADDR_DIFF_VEC table. */
5510 if (const_arg1 && GET_CODE (const_arg1) == LABEL_REF)
5511 {
e650cbda
RK
5512 rtx y
5513 = GET_CODE (folded_arg0) == MINUS ? folded_arg0
5514 : lookup_as_function (folded_arg0, MINUS);
7afe21cc
RK
5515
5516 if (y != 0 && GET_CODE (XEXP (y, 1)) == LABEL_REF
5517 && XEXP (XEXP (y, 1), 0) == XEXP (const_arg1, 0))
5518 return XEXP (y, 0);
67a37737
RK
5519
5520 /* Now try for a CONST of a MINUS like the above. */
e650cbda
RK
5521 if ((y = (GET_CODE (folded_arg0) == CONST ? folded_arg0
5522 : lookup_as_function (folded_arg0, CONST))) != 0
67a37737
RK
5523 && GET_CODE (XEXP (y, 0)) == MINUS
5524 && GET_CODE (XEXP (XEXP (y, 0), 1)) == LABEL_REF
5525 && XEXP (XEXP (XEXP (y, 0),1), 0) == XEXP (const_arg1, 0))
5526 return XEXP (XEXP (y, 0), 0);
7afe21cc 5527 }
c2cc0778 5528
e650cbda
RK
5529 /* Likewise if the operands are in the other order. */
5530 if (const_arg0 && GET_CODE (const_arg0) == LABEL_REF)
5531 {
5532 rtx y
5533 = GET_CODE (folded_arg1) == MINUS ? folded_arg1
5534 : lookup_as_function (folded_arg1, MINUS);
5535
5536 if (y != 0 && GET_CODE (XEXP (y, 1)) == LABEL_REF
5537 && XEXP (XEXP (y, 1), 0) == XEXP (const_arg0, 0))
5538 return XEXP (y, 0);
5539
5540 /* Now try for a CONST of a MINUS like the above. */
5541 if ((y = (GET_CODE (folded_arg1) == CONST ? folded_arg1
5542 : lookup_as_function (folded_arg1, CONST))) != 0
5543 && GET_CODE (XEXP (y, 0)) == MINUS
5544 && GET_CODE (XEXP (XEXP (y, 0), 1)) == LABEL_REF
5545 && XEXP (XEXP (XEXP (y, 0),1), 0) == XEXP (const_arg0, 0))
5546 return XEXP (XEXP (y, 0), 0);
5547 }
5548
c2cc0778
RK
5549 /* If second operand is a register equivalent to a negative
5550 CONST_INT, see if we can find a register equivalent to the
5551 positive constant. Make a MINUS if so. Don't do this for
5d595063 5552 a non-negative constant since we might then alternate between
c2cc0778 5553 chosing positive and negative constants. Having the positive
5d595063
RK
5554 constant previously-used is the more common case. Be sure
5555 the resulting constant is non-negative; if const_arg1 were
5556 the smallest negative number this would overflow: depending
5557 on the mode, this would either just be the same value (and
5558 hence not save anything) or be incorrect. */
5559 if (const_arg1 != 0 && GET_CODE (const_arg1) == CONST_INT
5560 && INTVAL (const_arg1) < 0
5561 && - INTVAL (const_arg1) >= 0
5562 && GET_CODE (folded_arg1) == REG)
c2cc0778
RK
5563 {
5564 rtx new_const = GEN_INT (- INTVAL (const_arg1));
5565 struct table_elt *p
5566 = lookup (new_const, safe_hash (new_const, mode) % NBUCKETS,
5567 mode);
5568
5569 if (p)
5570 for (p = p->first_same_value; p; p = p->next_same_value)
5571 if (GET_CODE (p->exp) == REG)
5572 return cse_gen_binary (MINUS, mode, folded_arg0,
5573 canon_reg (p->exp, NULL_RTX));
5574 }
13c9910f
RS
5575 goto from_plus;
5576
5577 case MINUS:
5578 /* If we have (MINUS Y C), see if Y is known to be (PLUS Z C2).
5579 If so, produce (PLUS Z C2-C). */
5580 if (const_arg1 != 0 && GET_CODE (const_arg1) == CONST_INT)
5581 {
5582 rtx y = lookup_as_function (XEXP (x, 0), PLUS);
5583 if (y && GET_CODE (XEXP (y, 1)) == CONST_INT)
f3becefd
RK
5584 return fold_rtx (plus_constant (copy_rtx (y),
5585 -INTVAL (const_arg1)),
a3b5c94a 5586 NULL_RTX);
13c9910f 5587 }
7afe21cc 5588
0f41302f 5589 /* ... fall through ... */
7afe21cc 5590
13c9910f 5591 from_plus:
7afe21cc
RK
5592 case SMIN: case SMAX: case UMIN: case UMAX:
5593 case IOR: case AND: case XOR:
5594 case MULT: case DIV: case UDIV:
5595 case ASHIFT: case LSHIFTRT: case ASHIFTRT:
5596 /* If we have (<op> <reg> <const_int>) for an associative OP and REG
5597 is known to be of similar form, we may be able to replace the
5598 operation with a combined operation. This may eliminate the
5599 intermediate operation if every use is simplified in this way.
5600 Note that the similar optimization done by combine.c only works
5601 if the intermediate operation's result has only one reference. */
5602
5603 if (GET_CODE (folded_arg0) == REG
5604 && const_arg1 && GET_CODE (const_arg1) == CONST_INT)
5605 {
5606 int is_shift
5607 = (code == ASHIFT || code == ASHIFTRT || code == LSHIFTRT);
5608 rtx y = lookup_as_function (folded_arg0, code);
5609 rtx inner_const;
5610 enum rtx_code associate_code;
5611 rtx new_const;
5612
5613 if (y == 0
5614 || 0 == (inner_const
5615 = equiv_constant (fold_rtx (XEXP (y, 1), 0)))
5616 || GET_CODE (inner_const) != CONST_INT
5617 /* If we have compiled a statement like
5618 "if (x == (x & mask1))", and now are looking at
5619 "x & mask2", we will have a case where the first operand
5620 of Y is the same as our first operand. Unless we detect
5621 this case, an infinite loop will result. */
5622 || XEXP (y, 0) == folded_arg0)
5623 break;
5624
5625 /* Don't associate these operations if they are a PLUS with the
5626 same constant and it is a power of two. These might be doable
5627 with a pre- or post-increment. Similarly for two subtracts of
5628 identical powers of two with post decrement. */
5629
5630 if (code == PLUS && INTVAL (const_arg1) == INTVAL (inner_const)
5631 && (0
5632#if defined(HAVE_PRE_INCREMENT) || defined(HAVE_POST_INCREMENT)
5633 || exact_log2 (INTVAL (const_arg1)) >= 0
5634#endif
5635#if defined(HAVE_PRE_DECREMENT) || defined(HAVE_POST_DECREMENT)
5636 || exact_log2 (- INTVAL (const_arg1)) >= 0
5637#endif
5638 ))
5639 break;
5640
5641 /* Compute the code used to compose the constants. For example,
5642 A/C1/C2 is A/(C1 * C2), so if CODE == DIV, we want MULT. */
5643
5644 associate_code
5645 = (code == MULT || code == DIV || code == UDIV ? MULT
5646 : is_shift || code == PLUS || code == MINUS ? PLUS : code);
5647
5648 new_const = simplify_binary_operation (associate_code, mode,
5649 const_arg1, inner_const);
5650
5651 if (new_const == 0)
5652 break;
5653
5654 /* If we are associating shift operations, don't let this
4908e508
RS
5655 produce a shift of the size of the object or larger.
5656 This could occur when we follow a sign-extend by a right
5657 shift on a machine that does a sign-extend as a pair
5658 of shifts. */
7afe21cc
RK
5659
5660 if (is_shift && GET_CODE (new_const) == CONST_INT
4908e508
RS
5661 && INTVAL (new_const) >= GET_MODE_BITSIZE (mode))
5662 {
5663 /* As an exception, we can turn an ASHIFTRT of this
5664 form into a shift of the number of bits - 1. */
5665 if (code == ASHIFTRT)
5666 new_const = GEN_INT (GET_MODE_BITSIZE (mode) - 1);
5667 else
5668 break;
5669 }
7afe21cc
RK
5670
5671 y = copy_rtx (XEXP (y, 0));
5672
5673 /* If Y contains our first operand (the most common way this
5674 can happen is if Y is a MEM), we would do into an infinite
5675 loop if we tried to fold it. So don't in that case. */
5676
5677 if (! reg_mentioned_p (folded_arg0, y))
5678 y = fold_rtx (y, insn);
5679
96b0e481 5680 return cse_gen_binary (code, mode, y, new_const);
7afe21cc 5681 }
e9a25f70
JL
5682 break;
5683
5684 default:
5685 break;
7afe21cc
RK
5686 }
5687
5688 new = simplify_binary_operation (code, mode,
5689 const_arg0 ? const_arg0 : folded_arg0,
5690 const_arg1 ? const_arg1 : folded_arg1);
5691 break;
5692
5693 case 'o':
5694 /* (lo_sum (high X) X) is simply X. */
5695 if (code == LO_SUM && const_arg0 != 0
5696 && GET_CODE (const_arg0) == HIGH
5697 && rtx_equal_p (XEXP (const_arg0, 0), const_arg1))
5698 return const_arg1;
5699 break;
5700
5701 case '3':
5702 case 'b':
5703 new = simplify_ternary_operation (code, mode, mode_arg0,
5704 const_arg0 ? const_arg0 : folded_arg0,
5705 const_arg1 ? const_arg1 : folded_arg1,
5706 const_arg2 ? const_arg2 : XEXP (x, 2));
5707 break;
5708 }
5709
5710 return new ? new : x;
5711}
5712\f
5713/* Return a constant value currently equivalent to X.
5714 Return 0 if we don't know one. */
5715
5716static rtx
5717equiv_constant (x)
5718 rtx x;
5719{
5720 if (GET_CODE (x) == REG
5721 && REGNO_QTY_VALID_P (REGNO (x))
5722 && qty_const[reg_qty[REGNO (x)]])
5723 x = gen_lowpart_if_possible (GET_MODE (x), qty_const[reg_qty[REGNO (x)]]);
5724
5725 if (x != 0 && CONSTANT_P (x))
5726 return x;
5727
fc3ffe83
RK
5728 /* If X is a MEM, try to fold it outside the context of any insn to see if
5729 it might be equivalent to a constant. That handles the case where it
5730 is a constant-pool reference. Then try to look it up in the hash table
5731 in case it is something whose value we have seen before. */
5732
5733 if (GET_CODE (x) == MEM)
5734 {
5735 struct table_elt *elt;
5736
906c4e36 5737 x = fold_rtx (x, NULL_RTX);
fc3ffe83
RK
5738 if (CONSTANT_P (x))
5739 return x;
5740
5741 elt = lookup (x, safe_hash (x, GET_MODE (x)) % NBUCKETS, GET_MODE (x));
5742 if (elt == 0)
5743 return 0;
5744
5745 for (elt = elt->first_same_value; elt; elt = elt->next_same_value)
5746 if (elt->is_const && CONSTANT_P (elt->exp))
5747 return elt->exp;
5748 }
5749
7afe21cc
RK
5750 return 0;
5751}
5752\f
5753/* Assuming that X is an rtx (e.g., MEM, REG or SUBREG) for a fixed-point
5754 number, return an rtx (MEM, SUBREG, or CONST_INT) that refers to the
5755 least-significant part of X.
5756 MODE specifies how big a part of X to return.
5757
5758 If the requested operation cannot be done, 0 is returned.
5759
5760 This is similar to gen_lowpart in emit-rtl.c. */
5761
5762rtx
5763gen_lowpart_if_possible (mode, x)
5764 enum machine_mode mode;
5765 register rtx x;
5766{
5767 rtx result = gen_lowpart_common (mode, x);
5768
5769 if (result)
5770 return result;
5771 else if (GET_CODE (x) == MEM)
5772 {
5773 /* This is the only other case we handle. */
5774 register int offset = 0;
5775 rtx new;
5776
f76b9db2
ILT
5777 if (WORDS_BIG_ENDIAN)
5778 offset = (MAX (GET_MODE_SIZE (GET_MODE (x)), UNITS_PER_WORD)
5779 - MAX (GET_MODE_SIZE (mode), UNITS_PER_WORD));
5780 if (BYTES_BIG_ENDIAN)
5781 /* Adjust the address so that the address-after-the-data is
5782 unchanged. */
5783 offset -= (MIN (UNITS_PER_WORD, GET_MODE_SIZE (mode))
5784 - MIN (UNITS_PER_WORD, GET_MODE_SIZE (GET_MODE (x))));
38a448ca 5785 new = gen_rtx_MEM (mode, plus_constant (XEXP (x, 0), offset));
7afe21cc
RK
5786 if (! memory_address_p (mode, XEXP (new, 0)))
5787 return 0;
5788 MEM_VOLATILE_P (new) = MEM_VOLATILE_P (x);
5789 RTX_UNCHANGING_P (new) = RTX_UNCHANGING_P (x);
5790 MEM_IN_STRUCT_P (new) = MEM_IN_STRUCT_P (x);
5791 return new;
5792 }
5793 else
5794 return 0;
5795}
5796\f
5797/* Given INSN, a jump insn, TAKEN indicates if we are following the "taken"
5798 branch. It will be zero if not.
5799
5800 In certain cases, this can cause us to add an equivalence. For example,
5801 if we are following the taken case of
5802 if (i == 2)
5803 we can add the fact that `i' and '2' are now equivalent.
5804
5805 In any case, we can record that this comparison was passed. If the same
5806 comparison is seen later, we will know its value. */
5807
5808static void
5809record_jump_equiv (insn, taken)
5810 rtx insn;
5811 int taken;
5812{
5813 int cond_known_true;
5814 rtx op0, op1;
13c9910f 5815 enum machine_mode mode, mode0, mode1;
7afe21cc
RK
5816 int reversed_nonequality = 0;
5817 enum rtx_code code;
5818
5819 /* Ensure this is the right kind of insn. */
5820 if (! condjump_p (insn) || simplejump_p (insn))
5821 return;
5822
5823 /* See if this jump condition is known true or false. */
5824 if (taken)
5825 cond_known_true = (XEXP (SET_SRC (PATTERN (insn)), 2) == pc_rtx);
5826 else
5827 cond_known_true = (XEXP (SET_SRC (PATTERN (insn)), 1) == pc_rtx);
5828
5829 /* Get the type of comparison being done and the operands being compared.
5830 If we had to reverse a non-equality condition, record that fact so we
5831 know that it isn't valid for floating-point. */
5832 code = GET_CODE (XEXP (SET_SRC (PATTERN (insn)), 0));
5833 op0 = fold_rtx (XEXP (XEXP (SET_SRC (PATTERN (insn)), 0), 0), insn);
5834 op1 = fold_rtx (XEXP (XEXP (SET_SRC (PATTERN (insn)), 0), 1), insn);
5835
13c9910f 5836 code = find_comparison_args (code, &op0, &op1, &mode0, &mode1);
7afe21cc
RK
5837 if (! cond_known_true)
5838 {
5839 reversed_nonequality = (code != EQ && code != NE);
5840 code = reverse_condition (code);
5841 }
5842
5843 /* The mode is the mode of the non-constant. */
13c9910f
RS
5844 mode = mode0;
5845 if (mode1 != VOIDmode)
5846 mode = mode1;
7afe21cc
RK
5847
5848 record_jump_cond (code, mode, op0, op1, reversed_nonequality);
5849}
5850
5851/* We know that comparison CODE applied to OP0 and OP1 in MODE is true.
5852 REVERSED_NONEQUALITY is nonzero if CODE had to be swapped.
5853 Make any useful entries we can with that information. Called from
5854 above function and called recursively. */
5855
5856static void
5857record_jump_cond (code, mode, op0, op1, reversed_nonequality)
5858 enum rtx_code code;
5859 enum machine_mode mode;
5860 rtx op0, op1;
5861 int reversed_nonequality;
5862{
2197a88a 5863 unsigned op0_hash, op1_hash;
7afe21cc
RK
5864 int op0_in_memory, op0_in_struct, op1_in_memory, op1_in_struct;
5865 struct table_elt *op0_elt, *op1_elt;
5866
5867 /* If OP0 and OP1 are known equal, and either is a paradoxical SUBREG,
5868 we know that they are also equal in the smaller mode (this is also
5869 true for all smaller modes whether or not there is a SUBREG, but
5870 is not worth testing for with no SUBREG. */
5871
2e794ee8 5872 /* Note that GET_MODE (op0) may not equal MODE. */
7afe21cc 5873 if (code == EQ && GET_CODE (op0) == SUBREG
2e794ee8
RS
5874 && (GET_MODE_SIZE (GET_MODE (op0))
5875 > GET_MODE_SIZE (GET_MODE (SUBREG_REG (op0)))))
7afe21cc
RK
5876 {
5877 enum machine_mode inner_mode = GET_MODE (SUBREG_REG (op0));
5878 rtx tem = gen_lowpart_if_possible (inner_mode, op1);
5879
5880 record_jump_cond (code, mode, SUBREG_REG (op0),
38a448ca 5881 tem ? tem : gen_rtx_SUBREG (inner_mode, op1, 0),
7afe21cc
RK
5882 reversed_nonequality);
5883 }
5884
5885 if (code == EQ && GET_CODE (op1) == SUBREG
2e794ee8
RS
5886 && (GET_MODE_SIZE (GET_MODE (op1))
5887 > GET_MODE_SIZE (GET_MODE (SUBREG_REG (op1)))))
7afe21cc
RK
5888 {
5889 enum machine_mode inner_mode = GET_MODE (SUBREG_REG (op1));
5890 rtx tem = gen_lowpart_if_possible (inner_mode, op0);
5891
5892 record_jump_cond (code, mode, SUBREG_REG (op1),
38a448ca 5893 tem ? tem : gen_rtx_SUBREG (inner_mode, op0, 0),
7afe21cc
RK
5894 reversed_nonequality);
5895 }
5896
5897 /* Similarly, if this is an NE comparison, and either is a SUBREG
5898 making a smaller mode, we know the whole thing is also NE. */
5899
2e794ee8
RS
5900 /* Note that GET_MODE (op0) may not equal MODE;
5901 if we test MODE instead, we can get an infinite recursion
5902 alternating between two modes each wider than MODE. */
5903
7afe21cc
RK
5904 if (code == NE && GET_CODE (op0) == SUBREG
5905 && subreg_lowpart_p (op0)
2e794ee8
RS
5906 && (GET_MODE_SIZE (GET_MODE (op0))
5907 < GET_MODE_SIZE (GET_MODE (SUBREG_REG (op0)))))
7afe21cc
RK
5908 {
5909 enum machine_mode inner_mode = GET_MODE (SUBREG_REG (op0));
5910 rtx tem = gen_lowpart_if_possible (inner_mode, op1);
5911
5912 record_jump_cond (code, mode, SUBREG_REG (op0),
38a448ca 5913 tem ? tem : gen_rtx_SUBREG (inner_mode, op1, 0),
7afe21cc
RK
5914 reversed_nonequality);
5915 }
5916
5917 if (code == NE && GET_CODE (op1) == SUBREG
5918 && subreg_lowpart_p (op1)
2e794ee8
RS
5919 && (GET_MODE_SIZE (GET_MODE (op1))
5920 < GET_MODE_SIZE (GET_MODE (SUBREG_REG (op1)))))
7afe21cc
RK
5921 {
5922 enum machine_mode inner_mode = GET_MODE (SUBREG_REG (op1));
5923 rtx tem = gen_lowpart_if_possible (inner_mode, op0);
5924
5925 record_jump_cond (code, mode, SUBREG_REG (op1),
38a448ca 5926 tem ? tem : gen_rtx_SUBREG (inner_mode, op0, 0),
7afe21cc
RK
5927 reversed_nonequality);
5928 }
5929
5930 /* Hash both operands. */
5931
5932 do_not_record = 0;
5933 hash_arg_in_memory = 0;
5934 hash_arg_in_struct = 0;
2197a88a 5935 op0_hash = HASH (op0, mode);
7afe21cc
RK
5936 op0_in_memory = hash_arg_in_memory;
5937 op0_in_struct = hash_arg_in_struct;
5938
5939 if (do_not_record)
5940 return;
5941
5942 do_not_record = 0;
5943 hash_arg_in_memory = 0;
5944 hash_arg_in_struct = 0;
2197a88a 5945 op1_hash = HASH (op1, mode);
7afe21cc
RK
5946 op1_in_memory = hash_arg_in_memory;
5947 op1_in_struct = hash_arg_in_struct;
5948
5949 if (do_not_record)
5950 return;
5951
5952 /* Look up both operands. */
2197a88a
RK
5953 op0_elt = lookup (op0, op0_hash, mode);
5954 op1_elt = lookup (op1, op1_hash, mode);
7afe21cc 5955
af3869c1
RK
5956 /* If both operands are already equivalent or if they are not in the
5957 table but are identical, do nothing. */
5958 if ((op0_elt != 0 && op1_elt != 0
5959 && op0_elt->first_same_value == op1_elt->first_same_value)
5960 || op0 == op1 || rtx_equal_p (op0, op1))
5961 return;
5962
7afe21cc 5963 /* If we aren't setting two things equal all we can do is save this
b2796a4b
RK
5964 comparison. Similarly if this is floating-point. In the latter
5965 case, OP1 might be zero and both -0.0 and 0.0 are equal to it.
5966 If we record the equality, we might inadvertently delete code
5967 whose intent was to change -0 to +0. */
5968
cbf6a543 5969 if (code != EQ || FLOAT_MODE_P (GET_MODE (op0)))
7afe21cc
RK
5970 {
5971 /* If we reversed a floating-point comparison, if OP0 is not a
5972 register, or if OP1 is neither a register or constant, we can't
5973 do anything. */
5974
5975 if (GET_CODE (op1) != REG)
5976 op1 = equiv_constant (op1);
5977
cbf6a543 5978 if ((reversed_nonequality && FLOAT_MODE_P (mode))
7afe21cc
RK
5979 || GET_CODE (op0) != REG || op1 == 0)
5980 return;
5981
5982 /* Put OP0 in the hash table if it isn't already. This gives it a
5983 new quantity number. */
5984 if (op0_elt == 0)
5985 {
906c4e36 5986 if (insert_regs (op0, NULL_PTR, 0))
7afe21cc
RK
5987 {
5988 rehash_using_reg (op0);
2197a88a 5989 op0_hash = HASH (op0, mode);
2bb81c86
RK
5990
5991 /* If OP0 is contained in OP1, this changes its hash code
5992 as well. Faster to rehash than to check, except
5993 for the simple case of a constant. */
5994 if (! CONSTANT_P (op1))
2197a88a 5995 op1_hash = HASH (op1,mode);
7afe21cc
RK
5996 }
5997
2197a88a 5998 op0_elt = insert (op0, NULL_PTR, op0_hash, mode);
7afe21cc
RK
5999 op0_elt->in_memory = op0_in_memory;
6000 op0_elt->in_struct = op0_in_struct;
6001 }
6002
6003 qty_comparison_code[reg_qty[REGNO (op0)]] = code;
6004 if (GET_CODE (op1) == REG)
6005 {
5d5ea909 6006 /* Look it up again--in case op0 and op1 are the same. */
2197a88a 6007 op1_elt = lookup (op1, op1_hash, mode);
5d5ea909 6008
7afe21cc
RK
6009 /* Put OP1 in the hash table so it gets a new quantity number. */
6010 if (op1_elt == 0)
6011 {
906c4e36 6012 if (insert_regs (op1, NULL_PTR, 0))
7afe21cc
RK
6013 {
6014 rehash_using_reg (op1);
2197a88a 6015 op1_hash = HASH (op1, mode);
7afe21cc
RK
6016 }
6017
2197a88a 6018 op1_elt = insert (op1, NULL_PTR, op1_hash, mode);
7afe21cc
RK
6019 op1_elt->in_memory = op1_in_memory;
6020 op1_elt->in_struct = op1_in_struct;
6021 }
6022
6023 qty_comparison_qty[reg_qty[REGNO (op0)]] = reg_qty[REGNO (op1)];
6024 qty_comparison_const[reg_qty[REGNO (op0)]] = 0;
6025 }
6026 else
6027 {
6028 qty_comparison_qty[reg_qty[REGNO (op0)]] = -1;
6029 qty_comparison_const[reg_qty[REGNO (op0)]] = op1;
6030 }
6031
6032 return;
6033 }
6034
eb5ad42a
RS
6035 /* If either side is still missing an equivalence, make it now,
6036 then merge the equivalences. */
7afe21cc 6037
7afe21cc
RK
6038 if (op0_elt == 0)
6039 {
eb5ad42a 6040 if (insert_regs (op0, NULL_PTR, 0))
7afe21cc
RK
6041 {
6042 rehash_using_reg (op0);
2197a88a 6043 op0_hash = HASH (op0, mode);
7afe21cc
RK
6044 }
6045
2197a88a 6046 op0_elt = insert (op0, NULL_PTR, op0_hash, mode);
7afe21cc
RK
6047 op0_elt->in_memory = op0_in_memory;
6048 op0_elt->in_struct = op0_in_struct;
7afe21cc
RK
6049 }
6050
6051 if (op1_elt == 0)
6052 {
eb5ad42a 6053 if (insert_regs (op1, NULL_PTR, 0))
7afe21cc
RK
6054 {
6055 rehash_using_reg (op1);
2197a88a 6056 op1_hash = HASH (op1, mode);
7afe21cc
RK
6057 }
6058
2197a88a 6059 op1_elt = insert (op1, NULL_PTR, op1_hash, mode);
7afe21cc
RK
6060 op1_elt->in_memory = op1_in_memory;
6061 op1_elt->in_struct = op1_in_struct;
7afe21cc 6062 }
eb5ad42a
RS
6063
6064 merge_equiv_classes (op0_elt, op1_elt);
6065 last_jump_equiv_class = op0_elt;
7afe21cc
RK
6066}
6067\f
6068/* CSE processing for one instruction.
6069 First simplify sources and addresses of all assignments
6070 in the instruction, using previously-computed equivalents values.
6071 Then install the new sources and destinations in the table
6072 of available values.
6073
6074 If IN_LIBCALL_BLOCK is nonzero, don't record any equivalence made in
6075 the insn. */
6076
6077/* Data on one SET contained in the instruction. */
6078
6079struct set
6080{
6081 /* The SET rtx itself. */
6082 rtx rtl;
6083 /* The SET_SRC of the rtx (the original value, if it is changing). */
6084 rtx src;
6085 /* The hash-table element for the SET_SRC of the SET. */
6086 struct table_elt *src_elt;
2197a88a
RK
6087 /* Hash value for the SET_SRC. */
6088 unsigned src_hash;
6089 /* Hash value for the SET_DEST. */
6090 unsigned dest_hash;
7afe21cc
RK
6091 /* The SET_DEST, with SUBREG, etc., stripped. */
6092 rtx inner_dest;
6093 /* Place where the pointer to the INNER_DEST was found. */
6094 rtx *inner_dest_loc;
6095 /* Nonzero if the SET_SRC is in memory. */
6096 char src_in_memory;
6097 /* Nonzero if the SET_SRC is in a structure. */
6098 char src_in_struct;
6099 /* Nonzero if the SET_SRC contains something
6100 whose value cannot be predicted and understood. */
6101 char src_volatile;
6102 /* Original machine mode, in case it becomes a CONST_INT. */
6103 enum machine_mode mode;
6104 /* A constant equivalent for SET_SRC, if any. */
6105 rtx src_const;
2197a88a
RK
6106 /* Hash value of constant equivalent for SET_SRC. */
6107 unsigned src_const_hash;
7afe21cc
RK
6108 /* Table entry for constant equivalent for SET_SRC, if any. */
6109 struct table_elt *src_const_elt;
6110};
6111
6112static void
6113cse_insn (insn, in_libcall_block)
6114 rtx insn;
6115 int in_libcall_block;
6116{
6117 register rtx x = PATTERN (insn);
7afe21cc 6118 register int i;
92f9aa51 6119 rtx tem;
7afe21cc
RK
6120 register int n_sets = 0;
6121
2d8b0f3a 6122#ifdef HAVE_cc0
7afe21cc
RK
6123 /* Records what this insn does to set CC0. */
6124 rtx this_insn_cc0 = 0;
135d84b8 6125 enum machine_mode this_insn_cc0_mode = VOIDmode;
2d8b0f3a 6126#endif
7afe21cc
RK
6127
6128 rtx src_eqv = 0;
6129 struct table_elt *src_eqv_elt = 0;
6130 int src_eqv_volatile;
6131 int src_eqv_in_memory;
6132 int src_eqv_in_struct;
2197a88a 6133 unsigned src_eqv_hash;
7afe21cc
RK
6134
6135 struct set *sets;
6136
6137 this_insn = insn;
7afe21cc
RK
6138
6139 /* Find all the SETs and CLOBBERs in this instruction.
6140 Record all the SETs in the array `set' and count them.
6141 Also determine whether there is a CLOBBER that invalidates
6142 all memory references, or all references at varying addresses. */
6143
f1e7c95f
RK
6144 if (GET_CODE (insn) == CALL_INSN)
6145 {
6146 for (tem = CALL_INSN_FUNCTION_USAGE (insn); tem; tem = XEXP (tem, 1))
6147 if (GET_CODE (XEXP (tem, 0)) == CLOBBER)
bb4034b3 6148 invalidate (SET_DEST (XEXP (tem, 0)), VOIDmode);
f1e7c95f
RK
6149 }
6150
7afe21cc
RK
6151 if (GET_CODE (x) == SET)
6152 {
6153 sets = (struct set *) alloca (sizeof (struct set));
6154 sets[0].rtl = x;
6155
6156 /* Ignore SETs that are unconditional jumps.
6157 They never need cse processing, so this does not hurt.
6158 The reason is not efficiency but rather
6159 so that we can test at the end for instructions
6160 that have been simplified to unconditional jumps
6161 and not be misled by unchanged instructions
6162 that were unconditional jumps to begin with. */
6163 if (SET_DEST (x) == pc_rtx
6164 && GET_CODE (SET_SRC (x)) == LABEL_REF)
6165 ;
6166
6167 /* Don't count call-insns, (set (reg 0) (call ...)), as a set.
6168 The hard function value register is used only once, to copy to
6169 someplace else, so it isn't worth cse'ing (and on 80386 is unsafe)!
6170 Ensure we invalidate the destination register. On the 80386 no
7722328e 6171 other code would invalidate it since it is a fixed_reg.
0f41302f 6172 We need not check the return of apply_change_group; see canon_reg. */
7afe21cc
RK
6173
6174 else if (GET_CODE (SET_SRC (x)) == CALL)
6175 {
6176 canon_reg (SET_SRC (x), insn);
77fa0940 6177 apply_change_group ();
7afe21cc 6178 fold_rtx (SET_SRC (x), insn);
bb4034b3 6179 invalidate (SET_DEST (x), VOIDmode);
7afe21cc
RK
6180 }
6181 else
6182 n_sets = 1;
6183 }
6184 else if (GET_CODE (x) == PARALLEL)
6185 {
6186 register int lim = XVECLEN (x, 0);
6187
6188 sets = (struct set *) alloca (lim * sizeof (struct set));
6189
6190 /* Find all regs explicitly clobbered in this insn,
6191 and ensure they are not replaced with any other regs
6192 elsewhere in this insn.
6193 When a reg that is clobbered is also used for input,
6194 we should presume that that is for a reason,
6195 and we should not substitute some other register
6196 which is not supposed to be clobbered.
6197 Therefore, this loop cannot be merged into the one below
830a38ee 6198 because a CALL may precede a CLOBBER and refer to the
7afe21cc
RK
6199 value clobbered. We must not let a canonicalization do
6200 anything in that case. */
6201 for (i = 0; i < lim; i++)
6202 {
6203 register rtx y = XVECEXP (x, 0, i);
2708da92
RS
6204 if (GET_CODE (y) == CLOBBER)
6205 {
6206 rtx clobbered = XEXP (y, 0);
6207
6208 if (GET_CODE (clobbered) == REG
6209 || GET_CODE (clobbered) == SUBREG)
bb4034b3 6210 invalidate (clobbered, VOIDmode);
2708da92
RS
6211 else if (GET_CODE (clobbered) == STRICT_LOW_PART
6212 || GET_CODE (clobbered) == ZERO_EXTRACT)
bb4034b3 6213 invalidate (XEXP (clobbered, 0), GET_MODE (clobbered));
2708da92 6214 }
7afe21cc
RK
6215 }
6216
6217 for (i = 0; i < lim; i++)
6218 {
6219 register rtx y = XVECEXP (x, 0, i);
6220 if (GET_CODE (y) == SET)
6221 {
7722328e
RK
6222 /* As above, we ignore unconditional jumps and call-insns and
6223 ignore the result of apply_change_group. */
7afe21cc
RK
6224 if (GET_CODE (SET_SRC (y)) == CALL)
6225 {
6226 canon_reg (SET_SRC (y), insn);
77fa0940 6227 apply_change_group ();
7afe21cc 6228 fold_rtx (SET_SRC (y), insn);
bb4034b3 6229 invalidate (SET_DEST (y), VOIDmode);
7afe21cc
RK
6230 }
6231 else if (SET_DEST (y) == pc_rtx
6232 && GET_CODE (SET_SRC (y)) == LABEL_REF)
6233 ;
6234 else
6235 sets[n_sets++].rtl = y;
6236 }
6237 else if (GET_CODE (y) == CLOBBER)
6238 {
9ae8ffe7 6239 /* If we clobber memory, canon the address.
7afe21cc
RK
6240 This does nothing when a register is clobbered
6241 because we have already invalidated the reg. */
6242 if (GET_CODE (XEXP (y, 0)) == MEM)
9ae8ffe7 6243 canon_reg (XEXP (y, 0), NULL_RTX);
7afe21cc
RK
6244 }
6245 else if (GET_CODE (y) == USE
6246 && ! (GET_CODE (XEXP (y, 0)) == REG
6247 && REGNO (XEXP (y, 0)) < FIRST_PSEUDO_REGISTER))
906c4e36 6248 canon_reg (y, NULL_RTX);
7afe21cc
RK
6249 else if (GET_CODE (y) == CALL)
6250 {
7722328e
RK
6251 /* The result of apply_change_group can be ignored; see
6252 canon_reg. */
7afe21cc 6253 canon_reg (y, insn);
77fa0940 6254 apply_change_group ();
7afe21cc
RK
6255 fold_rtx (y, insn);
6256 }
6257 }
6258 }
6259 else if (GET_CODE (x) == CLOBBER)
6260 {
6261 if (GET_CODE (XEXP (x, 0)) == MEM)
9ae8ffe7 6262 canon_reg (XEXP (x, 0), NULL_RTX);
7afe21cc
RK
6263 }
6264
6265 /* Canonicalize a USE of a pseudo register or memory location. */
6266 else if (GET_CODE (x) == USE
6267 && ! (GET_CODE (XEXP (x, 0)) == REG
6268 && REGNO (XEXP (x, 0)) < FIRST_PSEUDO_REGISTER))
906c4e36 6269 canon_reg (XEXP (x, 0), NULL_RTX);
7afe21cc
RK
6270 else if (GET_CODE (x) == CALL)
6271 {
7722328e 6272 /* The result of apply_change_group can be ignored; see canon_reg. */
7afe21cc 6273 canon_reg (x, insn);
77fa0940 6274 apply_change_group ();
7afe21cc
RK
6275 fold_rtx (x, insn);
6276 }
6277
7b3ab05e
JW
6278 /* Store the equivalent value in SRC_EQV, if different, or if the DEST
6279 is a STRICT_LOW_PART. The latter condition is necessary because SRC_EQV
6280 is handled specially for this case, and if it isn't set, then there will
9faa82d8 6281 be no equivalence for the destination. */
92f9aa51
RK
6282 if (n_sets == 1 && REG_NOTES (insn) != 0
6283 && (tem = find_reg_note (insn, REG_EQUAL, NULL_RTX)) != 0
7b3ab05e
JW
6284 && (! rtx_equal_p (XEXP (tem, 0), SET_SRC (sets[0].rtl))
6285 || GET_CODE (SET_DEST (sets[0].rtl)) == STRICT_LOW_PART))
92f9aa51 6286 src_eqv = canon_reg (XEXP (tem, 0), NULL_RTX);
7afe21cc
RK
6287
6288 /* Canonicalize sources and addresses of destinations.
6289 We do this in a separate pass to avoid problems when a MATCH_DUP is
6290 present in the insn pattern. In that case, we want to ensure that
6291 we don't break the duplicate nature of the pattern. So we will replace
6292 both operands at the same time. Otherwise, we would fail to find an
6293 equivalent substitution in the loop calling validate_change below.
7afe21cc
RK
6294
6295 We used to suppress canonicalization of DEST if it appears in SRC,
77fa0940 6296 but we don't do this any more. */
7afe21cc
RK
6297
6298 for (i = 0; i < n_sets; i++)
6299 {
6300 rtx dest = SET_DEST (sets[i].rtl);
6301 rtx src = SET_SRC (sets[i].rtl);
6302 rtx new = canon_reg (src, insn);
58873255 6303 int insn_code;
7afe21cc 6304
77fa0940
RK
6305 if ((GET_CODE (new) == REG && GET_CODE (src) == REG
6306 && ((REGNO (new) < FIRST_PSEUDO_REGISTER)
6307 != (REGNO (src) < FIRST_PSEUDO_REGISTER)))
58873255
RK
6308 || (insn_code = recog_memoized (insn)) < 0
6309 || insn_n_dups[insn_code] > 0)
77fa0940 6310 validate_change (insn, &SET_SRC (sets[i].rtl), new, 1);
7afe21cc
RK
6311 else
6312 SET_SRC (sets[i].rtl) = new;
6313
6314 if (GET_CODE (dest) == ZERO_EXTRACT || GET_CODE (dest) == SIGN_EXTRACT)
6315 {
6316 validate_change (insn, &XEXP (dest, 1),
77fa0940 6317 canon_reg (XEXP (dest, 1), insn), 1);
7afe21cc 6318 validate_change (insn, &XEXP (dest, 2),
77fa0940 6319 canon_reg (XEXP (dest, 2), insn), 1);
7afe21cc
RK
6320 }
6321
6322 while (GET_CODE (dest) == SUBREG || GET_CODE (dest) == STRICT_LOW_PART
6323 || GET_CODE (dest) == ZERO_EXTRACT
6324 || GET_CODE (dest) == SIGN_EXTRACT)
6325 dest = XEXP (dest, 0);
6326
6327 if (GET_CODE (dest) == MEM)
6328 canon_reg (dest, insn);
6329 }
6330
77fa0940
RK
6331 /* Now that we have done all the replacements, we can apply the change
6332 group and see if they all work. Note that this will cause some
6333 canonicalizations that would have worked individually not to be applied
6334 because some other canonicalization didn't work, but this should not
7722328e
RK
6335 occur often.
6336
6337 The result of apply_change_group can be ignored; see canon_reg. */
77fa0940
RK
6338
6339 apply_change_group ();
6340
7afe21cc
RK
6341 /* Set sets[i].src_elt to the class each source belongs to.
6342 Detect assignments from or to volatile things
6343 and set set[i] to zero so they will be ignored
6344 in the rest of this function.
6345
6346 Nothing in this loop changes the hash table or the register chains. */
6347
6348 for (i = 0; i < n_sets; i++)
6349 {
6350 register rtx src, dest;
6351 register rtx src_folded;
6352 register struct table_elt *elt = 0, *p;
6353 enum machine_mode mode;
6354 rtx src_eqv_here;
6355 rtx src_const = 0;
6356 rtx src_related = 0;
6357 struct table_elt *src_const_elt = 0;
6358 int src_cost = 10000, src_eqv_cost = 10000, src_folded_cost = 10000;
6359 int src_related_cost = 10000, src_elt_cost = 10000;
6360 /* Set non-zero if we need to call force_const_mem on with the
6361 contents of src_folded before using it. */
6362 int src_folded_force_flag = 0;
6363
6364 dest = SET_DEST (sets[i].rtl);
6365 src = SET_SRC (sets[i].rtl);
6366
6367 /* If SRC is a constant that has no machine mode,
6368 hash it with the destination's machine mode.
6369 This way we can keep different modes separate. */
6370
6371 mode = GET_MODE (src) == VOIDmode ? GET_MODE (dest) : GET_MODE (src);
6372 sets[i].mode = mode;
6373
6374 if (src_eqv)
6375 {
6376 enum machine_mode eqvmode = mode;
6377 if (GET_CODE (dest) == STRICT_LOW_PART)
6378 eqvmode = GET_MODE (SUBREG_REG (XEXP (dest, 0)));
6379 do_not_record = 0;
6380 hash_arg_in_memory = 0;
6381 hash_arg_in_struct = 0;
6382 src_eqv = fold_rtx (src_eqv, insn);
2197a88a 6383 src_eqv_hash = HASH (src_eqv, eqvmode);
7afe21cc
RK
6384
6385 /* Find the equivalence class for the equivalent expression. */
6386
6387 if (!do_not_record)
2197a88a 6388 src_eqv_elt = lookup (src_eqv, src_eqv_hash, eqvmode);
7afe21cc
RK
6389
6390 src_eqv_volatile = do_not_record;
6391 src_eqv_in_memory = hash_arg_in_memory;
6392 src_eqv_in_struct = hash_arg_in_struct;
6393 }
6394
6395 /* If this is a STRICT_LOW_PART assignment, src_eqv corresponds to the
6396 value of the INNER register, not the destination. So it is not
3826a3da 6397 a valid substitution for the source. But save it for later. */
7afe21cc
RK
6398 if (GET_CODE (dest) == STRICT_LOW_PART)
6399 src_eqv_here = 0;
6400 else
6401 src_eqv_here = src_eqv;
6402
6403 /* Simplify and foldable subexpressions in SRC. Then get the fully-
6404 simplified result, which may not necessarily be valid. */
6405 src_folded = fold_rtx (src, insn);
6406
e6a125a0
RK
6407#if 0
6408 /* ??? This caused bad code to be generated for the m68k port with -O2.
6409 Suppose src is (CONST_INT -1), and that after truncation src_folded
6410 is (CONST_INT 3). Suppose src_folded is then used for src_const.
6411 At the end we will add src and src_const to the same equivalence
6412 class. We now have 3 and -1 on the same equivalence class. This
6413 causes later instructions to be mis-optimized. */
7afe21cc
RK
6414 /* If storing a constant in a bitfield, pre-truncate the constant
6415 so we will be able to record it later. */
6416 if (GET_CODE (SET_DEST (sets[i].rtl)) == ZERO_EXTRACT
6417 || GET_CODE (SET_DEST (sets[i].rtl)) == SIGN_EXTRACT)
6418 {
6419 rtx width = XEXP (SET_DEST (sets[i].rtl), 1);
6420
6421 if (GET_CODE (src) == CONST_INT
6422 && GET_CODE (width) == CONST_INT
906c4e36
RK
6423 && INTVAL (width) < HOST_BITS_PER_WIDE_INT
6424 && (INTVAL (src) & ((HOST_WIDE_INT) (-1) << INTVAL (width))))
6425 src_folded
6426 = GEN_INT (INTVAL (src) & (((HOST_WIDE_INT) 1
6427 << INTVAL (width)) - 1));
7afe21cc 6428 }
e6a125a0 6429#endif
7afe21cc
RK
6430
6431 /* Compute SRC's hash code, and also notice if it
6432 should not be recorded at all. In that case,
6433 prevent any further processing of this assignment. */
6434 do_not_record = 0;
6435 hash_arg_in_memory = 0;
6436 hash_arg_in_struct = 0;
6437
6438 sets[i].src = src;
2197a88a 6439 sets[i].src_hash = HASH (src, mode);
7afe21cc
RK
6440 sets[i].src_volatile = do_not_record;
6441 sets[i].src_in_memory = hash_arg_in_memory;
6442 sets[i].src_in_struct = hash_arg_in_struct;
6443
50196afa
RK
6444 /* If SRC is a MEM, there is a REG_EQUIV note for SRC, and DEST is
6445 a pseudo that is set more than once, do not record SRC. Using
6446 SRC as a replacement for anything else will be incorrect in that
6447 situation. Note that this usually occurs only for stack slots,
956d6950 6448 in which case all the RTL would be referring to SRC, so we don't
50196afa
RK
6449 lose any optimization opportunities by not having SRC in the
6450 hash table. */
6451
6452 if (GET_CODE (src) == MEM
6453 && find_reg_note (insn, REG_EQUIV, src) != 0
6454 && GET_CODE (dest) == REG
6455 && REGNO (dest) >= FIRST_PSEUDO_REGISTER
b1f21e0a 6456 && REG_N_SETS (REGNO (dest)) != 1)
50196afa
RK
6457 sets[i].src_volatile = 1;
6458
0dadecf6
RK
6459#if 0
6460 /* It is no longer clear why we used to do this, but it doesn't
6461 appear to still be needed. So let's try without it since this
6462 code hurts cse'ing widened ops. */
7afe21cc
RK
6463 /* If source is a perverse subreg (such as QI treated as an SI),
6464 treat it as volatile. It may do the work of an SI in one context
6465 where the extra bits are not being used, but cannot replace an SI
6466 in general. */
6467 if (GET_CODE (src) == SUBREG
6468 && (GET_MODE_SIZE (GET_MODE (src))
6469 > GET_MODE_SIZE (GET_MODE (SUBREG_REG (src)))))
6470 sets[i].src_volatile = 1;
0dadecf6 6471#endif
7afe21cc
RK
6472
6473 /* Locate all possible equivalent forms for SRC. Try to replace
6474 SRC in the insn with each cheaper equivalent.
6475
6476 We have the following types of equivalents: SRC itself, a folded
6477 version, a value given in a REG_EQUAL note, or a value related
6478 to a constant.
6479
6480 Each of these equivalents may be part of an additional class
6481 of equivalents (if more than one is in the table, they must be in
6482 the same class; we check for this).
6483
6484 If the source is volatile, we don't do any table lookups.
6485
6486 We note any constant equivalent for possible later use in a
6487 REG_NOTE. */
6488
6489 if (!sets[i].src_volatile)
2197a88a 6490 elt = lookup (src, sets[i].src_hash, mode);
7afe21cc
RK
6491
6492 sets[i].src_elt = elt;
6493
6494 if (elt && src_eqv_here && src_eqv_elt)
6495 {
6496 if (elt->first_same_value != src_eqv_elt->first_same_value)
6497 {
6498 /* The REG_EQUAL is indicating that two formerly distinct
6499 classes are now equivalent. So merge them. */
6500 merge_equiv_classes (elt, src_eqv_elt);
2197a88a
RK
6501 src_eqv_hash = HASH (src_eqv, elt->mode);
6502 src_eqv_elt = lookup (src_eqv, src_eqv_hash, elt->mode);
7afe21cc
RK
6503 }
6504
6505 src_eqv_here = 0;
6506 }
6507
6508 else if (src_eqv_elt)
6509 elt = src_eqv_elt;
6510
6511 /* Try to find a constant somewhere and record it in `src_const'.
6512 Record its table element, if any, in `src_const_elt'. Look in
6513 any known equivalences first. (If the constant is not in the
2197a88a 6514 table, also set `sets[i].src_const_hash'). */
7afe21cc
RK
6515 if (elt)
6516 for (p = elt->first_same_value; p; p = p->next_same_value)
6517 if (p->is_const)
6518 {
6519 src_const = p->exp;
6520 src_const_elt = elt;
6521 break;
6522 }
6523
6524 if (src_const == 0
6525 && (CONSTANT_P (src_folded)
6526 /* Consider (minus (label_ref L1) (label_ref L2)) as
6527 "constant" here so we will record it. This allows us
6528 to fold switch statements when an ADDR_DIFF_VEC is used. */
6529 || (GET_CODE (src_folded) == MINUS
6530 && GET_CODE (XEXP (src_folded, 0)) == LABEL_REF
6531 && GET_CODE (XEXP (src_folded, 1)) == LABEL_REF)))
6532 src_const = src_folded, src_const_elt = elt;
6533 else if (src_const == 0 && src_eqv_here && CONSTANT_P (src_eqv_here))
6534 src_const = src_eqv_here, src_const_elt = src_eqv_elt;
6535
6536 /* If we don't know if the constant is in the table, get its
6537 hash code and look it up. */
6538 if (src_const && src_const_elt == 0)
6539 {
2197a88a
RK
6540 sets[i].src_const_hash = HASH (src_const, mode);
6541 src_const_elt = lookup (src_const, sets[i].src_const_hash, mode);
7afe21cc
RK
6542 }
6543
6544 sets[i].src_const = src_const;
6545 sets[i].src_const_elt = src_const_elt;
6546
6547 /* If the constant and our source are both in the table, mark them as
6548 equivalent. Otherwise, if a constant is in the table but the source
6549 isn't, set ELT to it. */
6550 if (src_const_elt && elt
6551 && src_const_elt->first_same_value != elt->first_same_value)
6552 merge_equiv_classes (elt, src_const_elt);
6553 else if (src_const_elt && elt == 0)
6554 elt = src_const_elt;
6555
6556 /* See if there is a register linearly related to a constant
6557 equivalent of SRC. */
6558 if (src_const
6559 && (GET_CODE (src_const) == CONST
6560 || (src_const_elt && src_const_elt->related_value != 0)))
6561 {
6562 src_related = use_related_value (src_const, src_const_elt);
6563 if (src_related)
6564 {
6565 struct table_elt *src_related_elt
6566 = lookup (src_related, HASH (src_related, mode), mode);
6567 if (src_related_elt && elt)
6568 {
6569 if (elt->first_same_value
6570 != src_related_elt->first_same_value)
6571 /* This can occur when we previously saw a CONST
6572 involving a SYMBOL_REF and then see the SYMBOL_REF
6573 twice. Merge the involved classes. */
6574 merge_equiv_classes (elt, src_related_elt);
6575
6576 src_related = 0;
6577 src_related_elt = 0;
6578 }
6579 else if (src_related_elt && elt == 0)
6580 elt = src_related_elt;
6581 }
6582 }
6583
e4600702
RK
6584 /* See if we have a CONST_INT that is already in a register in a
6585 wider mode. */
6586
6587 if (src_const && src_related == 0 && GET_CODE (src_const) == CONST_INT
6588 && GET_MODE_CLASS (mode) == MODE_INT
6589 && GET_MODE_BITSIZE (mode) < BITS_PER_WORD)
6590 {
6591 enum machine_mode wider_mode;
6592
6593 for (wider_mode = GET_MODE_WIDER_MODE (mode);
6594 GET_MODE_BITSIZE (wider_mode) <= BITS_PER_WORD
6595 && src_related == 0;
6596 wider_mode = GET_MODE_WIDER_MODE (wider_mode))
6597 {
6598 struct table_elt *const_elt
6599 = lookup (src_const, HASH (src_const, wider_mode), wider_mode);
6600
6601 if (const_elt == 0)
6602 continue;
6603
6604 for (const_elt = const_elt->first_same_value;
6605 const_elt; const_elt = const_elt->next_same_value)
6606 if (GET_CODE (const_elt->exp) == REG)
6607 {
6608 src_related = gen_lowpart_if_possible (mode,
6609 const_elt->exp);
6610 break;
6611 }
6612 }
6613 }
6614
d45cf215
RS
6615 /* Another possibility is that we have an AND with a constant in
6616 a mode narrower than a word. If so, it might have been generated
6617 as part of an "if" which would narrow the AND. If we already
6618 have done the AND in a wider mode, we can use a SUBREG of that
6619 value. */
6620
6621 if (flag_expensive_optimizations && ! src_related
6622 && GET_CODE (src) == AND && GET_CODE (XEXP (src, 1)) == CONST_INT
6623 && GET_MODE_SIZE (mode) < UNITS_PER_WORD)
6624 {
6625 enum machine_mode tmode;
38a448ca 6626 rtx new_and = gen_rtx_AND (VOIDmode, NULL_RTX, XEXP (src, 1));
d45cf215
RS
6627
6628 for (tmode = GET_MODE_WIDER_MODE (mode);
6629 GET_MODE_SIZE (tmode) <= UNITS_PER_WORD;
6630 tmode = GET_MODE_WIDER_MODE (tmode))
6631 {
6632 rtx inner = gen_lowpart_if_possible (tmode, XEXP (src, 0));
6633 struct table_elt *larger_elt;
6634
6635 if (inner)
6636 {
6637 PUT_MODE (new_and, tmode);
6638 XEXP (new_and, 0) = inner;
6639 larger_elt = lookup (new_and, HASH (new_and, tmode), tmode);
6640 if (larger_elt == 0)
6641 continue;
6642
6643 for (larger_elt = larger_elt->first_same_value;
6644 larger_elt; larger_elt = larger_elt->next_same_value)
6645 if (GET_CODE (larger_elt->exp) == REG)
6646 {
6647 src_related
6648 = gen_lowpart_if_possible (mode, larger_elt->exp);
6649 break;
6650 }
6651
6652 if (src_related)
6653 break;
6654 }
6655 }
6656 }
7bac1be0
RK
6657
6658#ifdef LOAD_EXTEND_OP
6659 /* See if a MEM has already been loaded with a widening operation;
6660 if it has, we can use a subreg of that. Many CISC machines
6661 also have such operations, but this is only likely to be
6662 beneficial these machines. */
6663
6664 if (flag_expensive_optimizations && src_related == 0
6665 && (GET_MODE_SIZE (mode) < UNITS_PER_WORD)
6666 && GET_MODE_CLASS (mode) == MODE_INT
6667 && GET_CODE (src) == MEM && ! do_not_record
6668 && LOAD_EXTEND_OP (mode) != NIL)
6669 {
6670 enum machine_mode tmode;
6671
6672 /* Set what we are trying to extend and the operation it might
6673 have been extended with. */
6674 PUT_CODE (memory_extend_rtx, LOAD_EXTEND_OP (mode));
6675 XEXP (memory_extend_rtx, 0) = src;
6676
6677 for (tmode = GET_MODE_WIDER_MODE (mode);
6678 GET_MODE_SIZE (tmode) <= UNITS_PER_WORD;
6679 tmode = GET_MODE_WIDER_MODE (tmode))
6680 {
6681 struct table_elt *larger_elt;
6682
6683 PUT_MODE (memory_extend_rtx, tmode);
6684 larger_elt = lookup (memory_extend_rtx,
6685 HASH (memory_extend_rtx, tmode), tmode);
6686 if (larger_elt == 0)
6687 continue;
6688
6689 for (larger_elt = larger_elt->first_same_value;
6690 larger_elt; larger_elt = larger_elt->next_same_value)
6691 if (GET_CODE (larger_elt->exp) == REG)
6692 {
6693 src_related = gen_lowpart_if_possible (mode,
6694 larger_elt->exp);
6695 break;
6696 }
6697
6698 if (src_related)
6699 break;
6700 }
6701 }
6702#endif /* LOAD_EXTEND_OP */
6703
7afe21cc
RK
6704 if (src == src_folded)
6705 src_folded = 0;
6706
6707 /* At this point, ELT, if non-zero, points to a class of expressions
6708 equivalent to the source of this SET and SRC, SRC_EQV, SRC_FOLDED,
6709 and SRC_RELATED, if non-zero, each contain additional equivalent
6710 expressions. Prune these latter expressions by deleting expressions
6711 already in the equivalence class.
6712
6713 Check for an equivalent identical to the destination. If found,
6714 this is the preferred equivalent since it will likely lead to
6715 elimination of the insn. Indicate this by placing it in
6716 `src_related'. */
6717
6718 if (elt) elt = elt->first_same_value;
6719 for (p = elt; p; p = p->next_same_value)
6720 {
6721 enum rtx_code code = GET_CODE (p->exp);
6722
6723 /* If the expression is not valid, ignore it. Then we do not
6724 have to check for validity below. In most cases, we can use
6725 `rtx_equal_p', since canonicalization has already been done. */
6726 if (code != REG && ! exp_equiv_p (p->exp, p->exp, 1, 0))
6727 continue;
6728
5a03c8c4
RK
6729 /* Also skip paradoxical subregs, unless that's what we're
6730 looking for. */
6731 if (code == SUBREG
6732 && (GET_MODE_SIZE (GET_MODE (p->exp))
6733 > GET_MODE_SIZE (GET_MODE (SUBREG_REG (p->exp))))
6734 && ! (src != 0
6735 && GET_CODE (src) == SUBREG
6736 && GET_MODE (src) == GET_MODE (p->exp)
6737 && (GET_MODE_SIZE (GET_MODE (SUBREG_REG (src)))
6738 < GET_MODE_SIZE (GET_MODE (SUBREG_REG (p->exp))))))
6739 continue;
6740
7afe21cc
RK
6741 if (src && GET_CODE (src) == code && rtx_equal_p (src, p->exp))
6742 src = 0;
6743 else if (src_folded && GET_CODE (src_folded) == code
6744 && rtx_equal_p (src_folded, p->exp))
6745 src_folded = 0;
6746 else if (src_eqv_here && GET_CODE (src_eqv_here) == code
6747 && rtx_equal_p (src_eqv_here, p->exp))
6748 src_eqv_here = 0;
6749 else if (src_related && GET_CODE (src_related) == code
6750 && rtx_equal_p (src_related, p->exp))
6751 src_related = 0;
6752
6753 /* This is the same as the destination of the insns, we want
6754 to prefer it. Copy it to src_related. The code below will
6755 then give it a negative cost. */
6756 if (GET_CODE (dest) == code && rtx_equal_p (p->exp, dest))
6757 src_related = dest;
6758
6759 }
6760
6761 /* Find the cheapest valid equivalent, trying all the available
6762 possibilities. Prefer items not in the hash table to ones
6763 that are when they are equal cost. Note that we can never
6764 worsen an insn as the current contents will also succeed.
05c33dd8 6765 If we find an equivalent identical to the destination, use it as best,
0f41302f 6766 since this insn will probably be eliminated in that case. */
7afe21cc
RK
6767 if (src)
6768 {
6769 if (rtx_equal_p (src, dest))
6770 src_cost = -1;
6771 else
6772 src_cost = COST (src);
6773 }
6774
6775 if (src_eqv_here)
6776 {
6777 if (rtx_equal_p (src_eqv_here, dest))
6778 src_eqv_cost = -1;
6779 else
6780 src_eqv_cost = COST (src_eqv_here);
6781 }
6782
6783 if (src_folded)
6784 {
6785 if (rtx_equal_p (src_folded, dest))
6786 src_folded_cost = -1;
6787 else
6788 src_folded_cost = COST (src_folded);
6789 }
6790
6791 if (src_related)
6792 {
6793 if (rtx_equal_p (src_related, dest))
6794 src_related_cost = -1;
6795 else
6796 src_related_cost = COST (src_related);
6797 }
6798
6799 /* If this was an indirect jump insn, a known label will really be
6800 cheaper even though it looks more expensive. */
6801 if (dest == pc_rtx && src_const && GET_CODE (src_const) == LABEL_REF)
6802 src_folded = src_const, src_folded_cost = -1;
6803
6804 /* Terminate loop when replacement made. This must terminate since
6805 the current contents will be tested and will always be valid. */
6806 while (1)
6807 {
6808 rtx trial;
6809
6810 /* Skip invalid entries. */
6811 while (elt && GET_CODE (elt->exp) != REG
6812 && ! exp_equiv_p (elt->exp, elt->exp, 1, 0))
6813 elt = elt->next_same_value;
5a03c8c4
RK
6814
6815 /* A paradoxical subreg would be bad here: it'll be the right
6816 size, but later may be adjusted so that the upper bits aren't
6817 what we want. So reject it. */
6818 if (elt != 0
6819 && GET_CODE (elt->exp) == SUBREG
6820 && (GET_MODE_SIZE (GET_MODE (elt->exp))
6821 > GET_MODE_SIZE (GET_MODE (SUBREG_REG (elt->exp))))
6822 /* It is okay, though, if the rtx we're trying to match
6823 will ignore any of the bits we can't predict. */
6824 && ! (src != 0
6825 && GET_CODE (src) == SUBREG
6826 && GET_MODE (src) == GET_MODE (elt->exp)
6827 && (GET_MODE_SIZE (GET_MODE (SUBREG_REG (src)))
6828 < GET_MODE_SIZE (GET_MODE (SUBREG_REG (elt->exp))))))
6829 {
6830 elt = elt->next_same_value;
6831 continue;
6832 }
7afe21cc
RK
6833
6834 if (elt) src_elt_cost = elt->cost;
6835
6836 /* Find cheapest and skip it for the next time. For items
6837 of equal cost, use this order:
6838 src_folded, src, src_eqv, src_related and hash table entry. */
6839 if (src_folded_cost <= src_cost
6840 && src_folded_cost <= src_eqv_cost
6841 && src_folded_cost <= src_related_cost
6842 && src_folded_cost <= src_elt_cost)
6843 {
6844 trial = src_folded, src_folded_cost = 10000;
6845 if (src_folded_force_flag)
6846 trial = force_const_mem (mode, trial);
6847 }
6848 else if (src_cost <= src_eqv_cost
6849 && src_cost <= src_related_cost
6850 && src_cost <= src_elt_cost)
6851 trial = src, src_cost = 10000;
6852 else if (src_eqv_cost <= src_related_cost
6853 && src_eqv_cost <= src_elt_cost)
0af62b41 6854 trial = copy_rtx (src_eqv_here), src_eqv_cost = 10000;
7afe21cc 6855 else if (src_related_cost <= src_elt_cost)
0af62b41 6856 trial = copy_rtx (src_related), src_related_cost = 10000;
7afe21cc
RK
6857 else
6858 {
05c33dd8 6859 trial = copy_rtx (elt->exp);
7afe21cc
RK
6860 elt = elt->next_same_value;
6861 src_elt_cost = 10000;
6862 }
6863
6864 /* We don't normally have an insn matching (set (pc) (pc)), so
6865 check for this separately here. We will delete such an
6866 insn below.
6867
6868 Tablejump insns contain a USE of the table, so simply replacing
6869 the operand with the constant won't match. This is simply an
6870 unconditional branch, however, and is therefore valid. Just
6871 insert the substitution here and we will delete and re-emit
6872 the insn later. */
6873
6874 if (n_sets == 1 && dest == pc_rtx
6875 && (trial == pc_rtx
6876 || (GET_CODE (trial) == LABEL_REF
6877 && ! condjump_p (insn))))
6878 {
6879 /* If TRIAL is a label in front of a jump table, we are
6880 really falling through the switch (this is how casesi
6881 insns work), so we must branch around the table. */
6882 if (GET_CODE (trial) == CODE_LABEL
6883 && NEXT_INSN (trial) != 0
6884 && GET_CODE (NEXT_INSN (trial)) == JUMP_INSN
6885 && (GET_CODE (PATTERN (NEXT_INSN (trial))) == ADDR_DIFF_VEC
6886 || GET_CODE (PATTERN (NEXT_INSN (trial))) == ADDR_VEC))
6887
38a448ca 6888 trial = gen_rtx_LABEL_REF (Pmode, get_label_after (trial));
7afe21cc
RK
6889
6890 SET_SRC (sets[i].rtl) = trial;
44333223 6891 cse_jumps_altered = 1;
7afe21cc
RK
6892 break;
6893 }
6894
6895 /* Look for a substitution that makes a valid insn. */
6896 else if (validate_change (insn, &SET_SRC (sets[i].rtl), trial, 0))
05c33dd8 6897 {
7722328e
RK
6898 /* The result of apply_change_group can be ignored; see
6899 canon_reg. */
6900
6901 validate_change (insn, &SET_SRC (sets[i].rtl),
6902 canon_reg (SET_SRC (sets[i].rtl), insn),
6903 1);
6702af89 6904 apply_change_group ();
05c33dd8
RK
6905 break;
6906 }
7afe21cc
RK
6907
6908 /* If we previously found constant pool entries for
6909 constants and this is a constant, try making a
6910 pool entry. Put it in src_folded unless we already have done
6911 this since that is where it likely came from. */
6912
6913 else if (constant_pool_entries_cost
6914 && CONSTANT_P (trial)
1bbd065b
RK
6915 && ! (GET_CODE (trial) == CONST
6916 && GET_CODE (XEXP (trial, 0)) == TRUNCATE)
6917 && (src_folded == 0
6918 || (GET_CODE (src_folded) != MEM
6919 && ! src_folded_force_flag))
9ae8ffe7
JL
6920 && GET_MODE_CLASS (mode) != MODE_CC
6921 && mode != VOIDmode)
7afe21cc
RK
6922 {
6923 src_folded_force_flag = 1;
6924 src_folded = trial;
6925 src_folded_cost = constant_pool_entries_cost;
6926 }
6927 }
6928
6929 src = SET_SRC (sets[i].rtl);
6930
6931 /* In general, it is good to have a SET with SET_SRC == SET_DEST.
6932 However, there is an important exception: If both are registers
6933 that are not the head of their equivalence class, replace SET_SRC
6934 with the head of the class. If we do not do this, we will have
6935 both registers live over a portion of the basic block. This way,
6936 their lifetimes will likely abut instead of overlapping. */
6937 if (GET_CODE (dest) == REG
6938 && REGNO_QTY_VALID_P (REGNO (dest))
6939 && qty_mode[reg_qty[REGNO (dest)]] == GET_MODE (dest)
6940 && qty_first_reg[reg_qty[REGNO (dest)]] != REGNO (dest)
6941 && GET_CODE (src) == REG && REGNO (src) == REGNO (dest)
6942 /* Don't do this if the original insn had a hard reg as
6943 SET_SRC. */
6944 && (GET_CODE (sets[i].src) != REG
6945 || REGNO (sets[i].src) >= FIRST_PSEUDO_REGISTER))
6946 /* We can't call canon_reg here because it won't do anything if
6947 SRC is a hard register. */
6948 {
6949 int first = qty_first_reg[reg_qty[REGNO (src)]];
6950
6951 src = SET_SRC (sets[i].rtl)
6952 = first >= FIRST_PSEUDO_REGISTER ? regno_reg_rtx[first]
38a448ca 6953 : gen_rtx_REG (GET_MODE (src), first);
7afe21cc
RK
6954
6955 /* If we had a constant that is cheaper than what we are now
6956 setting SRC to, use that constant. We ignored it when we
6957 thought we could make this into a no-op. */
6958 if (src_const && COST (src_const) < COST (src)
6959 && validate_change (insn, &SET_SRC (sets[i].rtl), src_const, 0))
6960 src = src_const;
6961 }
6962
6963 /* If we made a change, recompute SRC values. */
6964 if (src != sets[i].src)
6965 {
6966 do_not_record = 0;
6967 hash_arg_in_memory = 0;
6968 hash_arg_in_struct = 0;
6969 sets[i].src = src;
2197a88a 6970 sets[i].src_hash = HASH (src, mode);
7afe21cc
RK
6971 sets[i].src_volatile = do_not_record;
6972 sets[i].src_in_memory = hash_arg_in_memory;
6973 sets[i].src_in_struct = hash_arg_in_struct;
2197a88a 6974 sets[i].src_elt = lookup (src, sets[i].src_hash, mode);
7afe21cc
RK
6975 }
6976
6977 /* If this is a single SET, we are setting a register, and we have an
6978 equivalent constant, we want to add a REG_NOTE. We don't want
6979 to write a REG_EQUAL note for a constant pseudo since verifying that
d45cf215 6980 that pseudo hasn't been eliminated is a pain. Such a note also
7afe21cc
RK
6981 won't help anything. */
6982 if (n_sets == 1 && src_const && GET_CODE (dest) == REG
6983 && GET_CODE (src_const) != REG)
6984 {
92f9aa51 6985 tem = find_reg_note (insn, REG_EQUAL, NULL_RTX);
7afe21cc
RK
6986
6987 /* Record the actual constant value in a REG_EQUAL note, making
6988 a new one if one does not already exist. */
6989 if (tem)
6990 XEXP (tem, 0) = src_const;
6991 else
38a448ca
RH
6992 REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_EQUAL,
6993 src_const, REG_NOTES (insn));
7afe21cc
RK
6994
6995 /* If storing a constant value in a register that
6996 previously held the constant value 0,
6997 record this fact with a REG_WAS_0 note on this insn.
6998
6999 Note that the *register* is required to have previously held 0,
7000 not just any register in the quantity and we must point to the
7001 insn that set that register to zero.
7002
7003 Rather than track each register individually, we just see if
7004 the last set for this quantity was for this register. */
7005
7006 if (REGNO_QTY_VALID_P (REGNO (dest))
7007 && qty_const[reg_qty[REGNO (dest)]] == const0_rtx)
7008 {
7009 /* See if we previously had a REG_WAS_0 note. */
906c4e36 7010 rtx note = find_reg_note (insn, REG_WAS_0, NULL_RTX);
7afe21cc
RK
7011 rtx const_insn = qty_const_insn[reg_qty[REGNO (dest)]];
7012
7013 if ((tem = single_set (const_insn)) != 0
7014 && rtx_equal_p (SET_DEST (tem), dest))
7015 {
7016 if (note)
7017 XEXP (note, 0) = const_insn;
7018 else
38a448ca
RH
7019 REG_NOTES (insn) = gen_rtx_INSN_LIST (REG_WAS_0,
7020 const_insn,
7021 REG_NOTES (insn));
7afe21cc
RK
7022 }
7023 }
7024 }
7025
7026 /* Now deal with the destination. */
7027 do_not_record = 0;
7028 sets[i].inner_dest_loc = &SET_DEST (sets[0].rtl);
7029
7030 /* Look within any SIGN_EXTRACT or ZERO_EXTRACT
7031 to the MEM or REG within it. */
7032 while (GET_CODE (dest) == SIGN_EXTRACT
7033 || GET_CODE (dest) == ZERO_EXTRACT
7034 || GET_CODE (dest) == SUBREG
7035 || GET_CODE (dest) == STRICT_LOW_PART)
7036 {
7037 sets[i].inner_dest_loc = &XEXP (dest, 0);
7038 dest = XEXP (dest, 0);
7039 }
7040
7041 sets[i].inner_dest = dest;
7042
7043 if (GET_CODE (dest) == MEM)
7044 {
9ae8ffe7
JL
7045#ifdef PUSH_ROUNDING
7046 /* Stack pushes invalidate the stack pointer. */
7047 rtx addr = XEXP (dest, 0);
7048 if ((GET_CODE (addr) == PRE_DEC || GET_CODE (addr) == PRE_INC
7049 || GET_CODE (addr) == POST_DEC || GET_CODE (addr) == POST_INC)
7050 && XEXP (addr, 0) == stack_pointer_rtx)
7051 invalidate (stack_pointer_rtx, Pmode);
7052#endif
7afe21cc 7053 dest = fold_rtx (dest, insn);
7afe21cc
RK
7054 }
7055
7056 /* Compute the hash code of the destination now,
7057 before the effects of this instruction are recorded,
7058 since the register values used in the address computation
7059 are those before this instruction. */
2197a88a 7060 sets[i].dest_hash = HASH (dest, mode);
7afe21cc
RK
7061
7062 /* Don't enter a bit-field in the hash table
7063 because the value in it after the store
7064 may not equal what was stored, due to truncation. */
7065
7066 if (GET_CODE (SET_DEST (sets[i].rtl)) == ZERO_EXTRACT
7067 || GET_CODE (SET_DEST (sets[i].rtl)) == SIGN_EXTRACT)
7068 {
7069 rtx width = XEXP (SET_DEST (sets[i].rtl), 1);
7070
7071 if (src_const != 0 && GET_CODE (src_const) == CONST_INT
7072 && GET_CODE (width) == CONST_INT
906c4e36
RK
7073 && INTVAL (width) < HOST_BITS_PER_WIDE_INT
7074 && ! (INTVAL (src_const)
7075 & ((HOST_WIDE_INT) (-1) << INTVAL (width))))
7afe21cc
RK
7076 /* Exception: if the value is constant,
7077 and it won't be truncated, record it. */
7078 ;
7079 else
7080 {
7081 /* This is chosen so that the destination will be invalidated
7082 but no new value will be recorded.
7083 We must invalidate because sometimes constant
7084 values can be recorded for bitfields. */
7085 sets[i].src_elt = 0;
7086 sets[i].src_volatile = 1;
7087 src_eqv = 0;
7088 src_eqv_elt = 0;
7089 }
7090 }
7091
7092 /* If only one set in a JUMP_INSN and it is now a no-op, we can delete
7093 the insn. */
7094 else if (n_sets == 1 && dest == pc_rtx && src == pc_rtx)
7095 {
7096 PUT_CODE (insn, NOTE);
7097 NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED;
7098 NOTE_SOURCE_FILE (insn) = 0;
7099 cse_jumps_altered = 1;
7100 /* One less use of the label this insn used to jump to. */
85c3ba60
JL
7101 if (JUMP_LABEL (insn) != 0)
7102 --LABEL_NUSES (JUMP_LABEL (insn));
7afe21cc
RK
7103 /* No more processing for this set. */
7104 sets[i].rtl = 0;
7105 }
7106
7107 /* If this SET is now setting PC to a label, we know it used to
7108 be a conditional or computed branch. So we see if we can follow
7109 it. If it was a computed branch, delete it and re-emit. */
7110 else if (dest == pc_rtx && GET_CODE (src) == LABEL_REF)
7111 {
7112 rtx p;
7113
7114 /* If this is not in the format for a simple branch and
7115 we are the only SET in it, re-emit it. */
7116 if (! simplejump_p (insn) && n_sets == 1)
7117 {
7118 rtx new = emit_jump_insn_before (gen_jump (XEXP (src, 0)), insn);
7119 JUMP_LABEL (new) = XEXP (src, 0);
7120 LABEL_NUSES (XEXP (src, 0))++;
7121 delete_insn (insn);
7122 insn = new;
7123 }
31dcf83f
RS
7124 else
7125 /* Otherwise, force rerecognition, since it probably had
7126 a different pattern before.
7127 This shouldn't really be necessary, since whatever
7128 changed the source value above should have done this.
7129 Until the right place is found, might as well do this here. */
7130 INSN_CODE (insn) = -1;
7afe21cc
RK
7131
7132 /* Now that we've converted this jump to an unconditional jump,
7133 there is dead code after it. Delete the dead code until we
7134 reach a BARRIER, the end of the function, or a label. Do
7135 not delete NOTEs except for NOTE_INSN_DELETED since later
7136 phases assume these notes are retained. */
7137
7138 p = insn;
7139
7140 while (NEXT_INSN (p) != 0
7141 && GET_CODE (NEXT_INSN (p)) != BARRIER
7142 && GET_CODE (NEXT_INSN (p)) != CODE_LABEL)
7143 {
7144 if (GET_CODE (NEXT_INSN (p)) != NOTE
7145 || NOTE_LINE_NUMBER (NEXT_INSN (p)) == NOTE_INSN_DELETED)
7146 delete_insn (NEXT_INSN (p));
7147 else
7148 p = NEXT_INSN (p);
7149 }
7150
7151 /* If we don't have a BARRIER immediately after INSN, put one there.
7152 Much code assumes that there are no NOTEs between a JUMP_INSN and
7153 BARRIER. */
7154
7155 if (NEXT_INSN (insn) == 0
7156 || GET_CODE (NEXT_INSN (insn)) != BARRIER)
783e5bca 7157 emit_barrier_before (NEXT_INSN (insn));
7afe21cc
RK
7158
7159 /* We might have two BARRIERs separated by notes. Delete the second
7160 one if so. */
7161
538b78e7
RS
7162 if (p != insn && NEXT_INSN (p) != 0
7163 && GET_CODE (NEXT_INSN (p)) == BARRIER)
7afe21cc
RK
7164 delete_insn (NEXT_INSN (p));
7165
7166 cse_jumps_altered = 1;
7167 sets[i].rtl = 0;
7168 }
7169
c2a47e48
RK
7170 /* If destination is volatile, invalidate it and then do no further
7171 processing for this assignment. */
7afe21cc
RK
7172
7173 else if (do_not_record)
c2a47e48
RK
7174 {
7175 if (GET_CODE (dest) == REG || GET_CODE (dest) == SUBREG
7176 || GET_CODE (dest) == MEM)
bb4034b3 7177 invalidate (dest, VOIDmode);
2708da92
RS
7178 else if (GET_CODE (dest) == STRICT_LOW_PART
7179 || GET_CODE (dest) == ZERO_EXTRACT)
bb4034b3 7180 invalidate (XEXP (dest, 0), GET_MODE (dest));
c2a47e48
RK
7181 sets[i].rtl = 0;
7182 }
7afe21cc
RK
7183
7184 if (sets[i].rtl != 0 && dest != SET_DEST (sets[i].rtl))
2197a88a 7185 sets[i].dest_hash = HASH (SET_DEST (sets[i].rtl), mode);
7afe21cc
RK
7186
7187#ifdef HAVE_cc0
7188 /* If setting CC0, record what it was set to, or a constant, if it
7189 is equivalent to a constant. If it is being set to a floating-point
7190 value, make a COMPARE with the appropriate constant of 0. If we
7191 don't do this, later code can interpret this as a test against
7192 const0_rtx, which can cause problems if we try to put it into an
7193 insn as a floating-point operand. */
7194 if (dest == cc0_rtx)
7195 {
7196 this_insn_cc0 = src_const && mode != VOIDmode ? src_const : src;
7197 this_insn_cc0_mode = mode;
cbf6a543 7198 if (FLOAT_MODE_P (mode))
38a448ca
RH
7199 this_insn_cc0 = gen_rtx_COMPARE (VOIDmode, this_insn_cc0,
7200 CONST0_RTX (mode));
7afe21cc
RK
7201 }
7202#endif
7203 }
7204
7205 /* Now enter all non-volatile source expressions in the hash table
7206 if they are not already present.
7207 Record their equivalence classes in src_elt.
7208 This way we can insert the corresponding destinations into
7209 the same classes even if the actual sources are no longer in them
7210 (having been invalidated). */
7211
7212 if (src_eqv && src_eqv_elt == 0 && sets[0].rtl != 0 && ! src_eqv_volatile
7213 && ! rtx_equal_p (src_eqv, SET_DEST (sets[0].rtl)))
7214 {
7215 register struct table_elt *elt;
7216 register struct table_elt *classp = sets[0].src_elt;
7217 rtx dest = SET_DEST (sets[0].rtl);
7218 enum machine_mode eqvmode = GET_MODE (dest);
7219
7220 if (GET_CODE (dest) == STRICT_LOW_PART)
7221 {
7222 eqvmode = GET_MODE (SUBREG_REG (XEXP (dest, 0)));
7223 classp = 0;
7224 }
7225 if (insert_regs (src_eqv, classp, 0))
8ae2b8f6
JW
7226 {
7227 rehash_using_reg (src_eqv);
7228 src_eqv_hash = HASH (src_eqv, eqvmode);
7229 }
2197a88a 7230 elt = insert (src_eqv, classp, src_eqv_hash, eqvmode);
7afe21cc
RK
7231 elt->in_memory = src_eqv_in_memory;
7232 elt->in_struct = src_eqv_in_struct;
7233 src_eqv_elt = elt;
f7911249
JW
7234
7235 /* Check to see if src_eqv_elt is the same as a set source which
7236 does not yet have an elt, and if so set the elt of the set source
7237 to src_eqv_elt. */
7238 for (i = 0; i < n_sets; i++)
7239 if (sets[i].rtl && sets[i].src_elt == 0
7240 && rtx_equal_p (SET_SRC (sets[i].rtl), src_eqv))
7241 sets[i].src_elt = src_eqv_elt;
7afe21cc
RK
7242 }
7243
7244 for (i = 0; i < n_sets; i++)
7245 if (sets[i].rtl && ! sets[i].src_volatile
7246 && ! rtx_equal_p (SET_SRC (sets[i].rtl), SET_DEST (sets[i].rtl)))
7247 {
7248 if (GET_CODE (SET_DEST (sets[i].rtl)) == STRICT_LOW_PART)
7249 {
7250 /* REG_EQUAL in setting a STRICT_LOW_PART
7251 gives an equivalent for the entire destination register,
7252 not just for the subreg being stored in now.
7253 This is a more interesting equivalence, so we arrange later
7254 to treat the entire reg as the destination. */
7255 sets[i].src_elt = src_eqv_elt;
2197a88a 7256 sets[i].src_hash = src_eqv_hash;
7afe21cc
RK
7257 }
7258 else
7259 {
7260 /* Insert source and constant equivalent into hash table, if not
7261 already present. */
7262 register struct table_elt *classp = src_eqv_elt;
7263 register rtx src = sets[i].src;
7264 register rtx dest = SET_DEST (sets[i].rtl);
7265 enum machine_mode mode
7266 = GET_MODE (src) == VOIDmode ? GET_MODE (dest) : GET_MODE (src);
7267
7268 if (sets[i].src_elt == 0)
7269 {
7270 register struct table_elt *elt;
7271
7272 /* Note that these insert_regs calls cannot remove
7273 any of the src_elt's, because they would have failed to
7274 match if not still valid. */
7275 if (insert_regs (src, classp, 0))
8ae2b8f6
JW
7276 {
7277 rehash_using_reg (src);
7278 sets[i].src_hash = HASH (src, mode);
7279 }
2197a88a 7280 elt = insert (src, classp, sets[i].src_hash, mode);
7afe21cc
RK
7281 elt->in_memory = sets[i].src_in_memory;
7282 elt->in_struct = sets[i].src_in_struct;
7283 sets[i].src_elt = classp = elt;
7284 }
7285
7286 if (sets[i].src_const && sets[i].src_const_elt == 0
7287 && src != sets[i].src_const
7288 && ! rtx_equal_p (sets[i].src_const, src))
7289 sets[i].src_elt = insert (sets[i].src_const, classp,
2197a88a 7290 sets[i].src_const_hash, mode);
7afe21cc
RK
7291 }
7292 }
7293 else if (sets[i].src_elt == 0)
7294 /* If we did not insert the source into the hash table (e.g., it was
7295 volatile), note the equivalence class for the REG_EQUAL value, if any,
7296 so that the destination goes into that class. */
7297 sets[i].src_elt = src_eqv_elt;
7298
9ae8ffe7 7299 invalidate_from_clobbers (x);
77fa0940
RK
7300
7301 /* Some registers are invalidated by subroutine calls. Memory is
7302 invalidated by non-constant calls. */
7303
7afe21cc
RK
7304 if (GET_CODE (insn) == CALL_INSN)
7305 {
77fa0940 7306 if (! CONST_CALL_P (insn))
9ae8ffe7 7307 invalidate_memory ();
7afe21cc
RK
7308 invalidate_for_call ();
7309 }
7310
7311 /* Now invalidate everything set by this instruction.
7312 If a SUBREG or other funny destination is being set,
7313 sets[i].rtl is still nonzero, so here we invalidate the reg
7314 a part of which is being set. */
7315
7316 for (i = 0; i < n_sets; i++)
7317 if (sets[i].rtl)
7318 {
bb4034b3
JW
7319 /* We can't use the inner dest, because the mode associated with
7320 a ZERO_EXTRACT is significant. */
7321 register rtx dest = SET_DEST (sets[i].rtl);
7afe21cc
RK
7322
7323 /* Needed for registers to remove the register from its
7324 previous quantity's chain.
7325 Needed for memory if this is a nonvarying address, unless
7326 we have just done an invalidate_memory that covers even those. */
7327 if (GET_CODE (dest) == REG || GET_CODE (dest) == SUBREG
9ae8ffe7 7328 || GET_CODE (dest) == MEM)
bb4034b3 7329 invalidate (dest, VOIDmode);
2708da92
RS
7330 else if (GET_CODE (dest) == STRICT_LOW_PART
7331 || GET_CODE (dest) == ZERO_EXTRACT)
bb4034b3 7332 invalidate (XEXP (dest, 0), GET_MODE (dest));
7afe21cc
RK
7333 }
7334
7335 /* Make sure registers mentioned in destinations
7336 are safe for use in an expression to be inserted.
7337 This removes from the hash table
7338 any invalid entry that refers to one of these registers.
7339
7340 We don't care about the return value from mention_regs because
7341 we are going to hash the SET_DEST values unconditionally. */
7342
7343 for (i = 0; i < n_sets; i++)
7344 if (sets[i].rtl && GET_CODE (SET_DEST (sets[i].rtl)) != REG)
7345 mention_regs (SET_DEST (sets[i].rtl));
7346
7347 /* We may have just removed some of the src_elt's from the hash table.
7348 So replace each one with the current head of the same class. */
7349
7350 for (i = 0; i < n_sets; i++)
7351 if (sets[i].rtl)
7352 {
7353 if (sets[i].src_elt && sets[i].src_elt->first_same_value == 0)
7354 /* If elt was removed, find current head of same class,
7355 or 0 if nothing remains of that class. */
7356 {
7357 register struct table_elt *elt = sets[i].src_elt;
7358
7359 while (elt && elt->prev_same_value)
7360 elt = elt->prev_same_value;
7361
7362 while (elt && elt->first_same_value == 0)
7363 elt = elt->next_same_value;
7364 sets[i].src_elt = elt ? elt->first_same_value : 0;
7365 }
7366 }
7367
7368 /* Now insert the destinations into their equivalence classes. */
7369
7370 for (i = 0; i < n_sets; i++)
7371 if (sets[i].rtl)
7372 {
7373 register rtx dest = SET_DEST (sets[i].rtl);
7374 register struct table_elt *elt;
7375
7376 /* Don't record value if we are not supposed to risk allocating
7377 floating-point values in registers that might be wider than
7378 memory. */
7379 if ((flag_float_store
7380 && GET_CODE (dest) == MEM
cbf6a543 7381 && FLOAT_MODE_P (GET_MODE (dest)))
bc4ddc77
JW
7382 /* Don't record BLKmode values, because we don't know the
7383 size of it, and can't be sure that other BLKmode values
7384 have the same or smaller size. */
7385 || GET_MODE (dest) == BLKmode
7afe21cc
RK
7386 /* Don't record values of destinations set inside a libcall block
7387 since we might delete the libcall. Things should have been set
7388 up so we won't want to reuse such a value, but we play it safe
7389 here. */
7390 || in_libcall_block
7391 /* If we didn't put a REG_EQUAL value or a source into the hash
7392 table, there is no point is recording DEST. */
1a8e9a8e
RK
7393 || sets[i].src_elt == 0
7394 /* If DEST is a paradoxical SUBREG and SRC is a ZERO_EXTEND
7395 or SIGN_EXTEND, don't record DEST since it can cause
7396 some tracking to be wrong.
7397
7398 ??? Think about this more later. */
7399 || (GET_CODE (dest) == SUBREG
7400 && (GET_MODE_SIZE (GET_MODE (dest))
7401 > GET_MODE_SIZE (GET_MODE (SUBREG_REG (dest))))
7402 && (GET_CODE (sets[i].src) == SIGN_EXTEND
7403 || GET_CODE (sets[i].src) == ZERO_EXTEND)))
7afe21cc
RK
7404 continue;
7405
7406 /* STRICT_LOW_PART isn't part of the value BEING set,
7407 and neither is the SUBREG inside it.
7408 Note that in this case SETS[I].SRC_ELT is really SRC_EQV_ELT. */
7409 if (GET_CODE (dest) == STRICT_LOW_PART)
7410 dest = SUBREG_REG (XEXP (dest, 0));
7411
c610adec 7412 if (GET_CODE (dest) == REG || GET_CODE (dest) == SUBREG)
7afe21cc
RK
7413 /* Registers must also be inserted into chains for quantities. */
7414 if (insert_regs (dest, sets[i].src_elt, 1))
8ae2b8f6
JW
7415 {
7416 /* If `insert_regs' changes something, the hash code must be
7417 recalculated. */
7418 rehash_using_reg (dest);
7419 sets[i].dest_hash = HASH (dest, GET_MODE (dest));
7420 }
7afe21cc
RK
7421
7422 elt = insert (dest, sets[i].src_elt,
2197a88a 7423 sets[i].dest_hash, GET_MODE (dest));
c256df0b 7424 elt->in_memory = (GET_CODE (sets[i].inner_dest) == MEM
9ad91d71
RK
7425 && (! RTX_UNCHANGING_P (sets[i].inner_dest)
7426 || FIXED_BASE_PLUS_P (XEXP (sets[i].inner_dest,
7427 0))));
c256df0b 7428
7afe21cc
RK
7429 if (elt->in_memory)
7430 {
7431 /* This implicitly assumes a whole struct
7432 need not have MEM_IN_STRUCT_P.
7433 But a whole struct is *supposed* to have MEM_IN_STRUCT_P. */
7434 elt->in_struct = (MEM_IN_STRUCT_P (sets[i].inner_dest)
7435 || sets[i].inner_dest != SET_DEST (sets[i].rtl));
7436 }
7437
fc3ffe83
RK
7438 /* If we have (set (subreg:m1 (reg:m2 foo) 0) (bar:m1)), M1 is no
7439 narrower than M2, and both M1 and M2 are the same number of words,
7440 we are also doing (set (reg:m2 foo) (subreg:m2 (bar:m1) 0)) so
7441 make that equivalence as well.
7afe21cc
RK
7442
7443 However, BAR may have equivalences for which gen_lowpart_if_possible
7444 will produce a simpler value than gen_lowpart_if_possible applied to
7445 BAR (e.g., if BAR was ZERO_EXTENDed from M2), so we will scan all
7446 BAR's equivalences. If we don't get a simplified form, make
7447 the SUBREG. It will not be used in an equivalence, but will
7448 cause two similar assignments to be detected.
7449
7450 Note the loop below will find SUBREG_REG (DEST) since we have
7451 already entered SRC and DEST of the SET in the table. */
7452
7453 if (GET_CODE (dest) == SUBREG
6cdbaec4
RK
7454 && (((GET_MODE_SIZE (GET_MODE (SUBREG_REG (dest))) - 1)
7455 / UNITS_PER_WORD)
7456 == (GET_MODE_SIZE (GET_MODE (dest)) - 1)/ UNITS_PER_WORD)
7afe21cc
RK
7457 && (GET_MODE_SIZE (GET_MODE (dest))
7458 >= GET_MODE_SIZE (GET_MODE (SUBREG_REG (dest))))
7459 && sets[i].src_elt != 0)
7460 {
7461 enum machine_mode new_mode = GET_MODE (SUBREG_REG (dest));
7462 struct table_elt *elt, *classp = 0;
7463
7464 for (elt = sets[i].src_elt->first_same_value; elt;
7465 elt = elt->next_same_value)
7466 {
7467 rtx new_src = 0;
2197a88a 7468 unsigned src_hash;
7afe21cc
RK
7469 struct table_elt *src_elt;
7470
7471 /* Ignore invalid entries. */
7472 if (GET_CODE (elt->exp) != REG
7473 && ! exp_equiv_p (elt->exp, elt->exp, 1, 0))
7474 continue;
7475
7476 new_src = gen_lowpart_if_possible (new_mode, elt->exp);
7477 if (new_src == 0)
38a448ca 7478 new_src = gen_rtx_SUBREG (new_mode, elt->exp, 0);
7afe21cc
RK
7479
7480 src_hash = HASH (new_src, new_mode);
7481 src_elt = lookup (new_src, src_hash, new_mode);
7482
7483 /* Put the new source in the hash table is if isn't
7484 already. */
7485 if (src_elt == 0)
7486 {
7487 if (insert_regs (new_src, classp, 0))
8ae2b8f6
JW
7488 {
7489 rehash_using_reg (new_src);
7490 src_hash = HASH (new_src, new_mode);
7491 }
7afe21cc
RK
7492 src_elt = insert (new_src, classp, src_hash, new_mode);
7493 src_elt->in_memory = elt->in_memory;
7494 src_elt->in_struct = elt->in_struct;
7495 }
7496 else if (classp && classp != src_elt->first_same_value)
7497 /* Show that two things that we've seen before are
7498 actually the same. */
7499 merge_equiv_classes (src_elt, classp);
7500
7501 classp = src_elt->first_same_value;
da932f04
JL
7502 /* Ignore invalid entries. */
7503 while (classp
7504 && GET_CODE (classp->exp) != REG
7505 && ! exp_equiv_p (classp->exp, classp->exp, 1, 0))
7506 classp = classp->next_same_value;
7afe21cc
RK
7507 }
7508 }
7509 }
7510
7511 /* Special handling for (set REG0 REG1)
7512 where REG0 is the "cheapest", cheaper than REG1.
7513 After cse, REG1 will probably not be used in the sequel,
7514 so (if easily done) change this insn to (set REG1 REG0) and
7515 replace REG1 with REG0 in the previous insn that computed their value.
7516 Then REG1 will become a dead store and won't cloud the situation
7517 for later optimizations.
7518
7519 Do not make this change if REG1 is a hard register, because it will
7520 then be used in the sequel and we may be changing a two-operand insn
7521 into a three-operand insn.
7522
7523 Also do not do this if we are operating on a copy of INSN. */
7524
7525 if (n_sets == 1 && sets[0].rtl && GET_CODE (SET_DEST (sets[0].rtl)) == REG
7526 && NEXT_INSN (PREV_INSN (insn)) == insn
7527 && GET_CODE (SET_SRC (sets[0].rtl)) == REG
7528 && REGNO (SET_SRC (sets[0].rtl)) >= FIRST_PSEUDO_REGISTER
7529 && REGNO_QTY_VALID_P (REGNO (SET_SRC (sets[0].rtl)))
7530 && (qty_first_reg[reg_qty[REGNO (SET_SRC (sets[0].rtl))]]
7531 == REGNO (SET_DEST (sets[0].rtl))))
7532 {
7533 rtx prev = PREV_INSN (insn);
7534 while (prev && GET_CODE (prev) == NOTE)
7535 prev = PREV_INSN (prev);
7536
7537 if (prev && GET_CODE (prev) == INSN && GET_CODE (PATTERN (prev)) == SET
7538 && SET_DEST (PATTERN (prev)) == SET_SRC (sets[0].rtl))
7539 {
7540 rtx dest = SET_DEST (sets[0].rtl);
906c4e36 7541 rtx note = find_reg_note (prev, REG_EQUIV, NULL_RTX);
7afe21cc
RK
7542
7543 validate_change (prev, & SET_DEST (PATTERN (prev)), dest, 1);
7544 validate_change (insn, & SET_DEST (sets[0].rtl),
7545 SET_SRC (sets[0].rtl), 1);
7546 validate_change (insn, & SET_SRC (sets[0].rtl), dest, 1);
7547 apply_change_group ();
7548
7549 /* If REG1 was equivalent to a constant, REG0 is not. */
7550 if (note)
7551 PUT_REG_NOTE_KIND (note, REG_EQUAL);
7552
7553 /* If there was a REG_WAS_0 note on PREV, remove it. Move
7554 any REG_WAS_0 note on INSN to PREV. */
906c4e36 7555 note = find_reg_note (prev, REG_WAS_0, NULL_RTX);
7afe21cc
RK
7556 if (note)
7557 remove_note (prev, note);
7558
906c4e36 7559 note = find_reg_note (insn, REG_WAS_0, NULL_RTX);
7afe21cc
RK
7560 if (note)
7561 {
7562 remove_note (insn, note);
7563 XEXP (note, 1) = REG_NOTES (prev);
7564 REG_NOTES (prev) = note;
7565 }
98369a0f
RK
7566
7567 /* If INSN has a REG_EQUAL note, and this note mentions REG0,
7568 then we must delete it, because the value in REG0 has changed. */
7569 note = find_reg_note (insn, REG_EQUAL, NULL_RTX);
7570 if (note && reg_mentioned_p (dest, XEXP (note, 0)))
7571 remove_note (insn, note);
7afe21cc
RK
7572 }
7573 }
7574
7575 /* If this is a conditional jump insn, record any known equivalences due to
7576 the condition being tested. */
7577
7578 last_jump_equiv_class = 0;
7579 if (GET_CODE (insn) == JUMP_INSN
7580 && n_sets == 1 && GET_CODE (x) == SET
7581 && GET_CODE (SET_SRC (x)) == IF_THEN_ELSE)
7582 record_jump_equiv (insn, 0);
7583
7584#ifdef HAVE_cc0
7585 /* If the previous insn set CC0 and this insn no longer references CC0,
7586 delete the previous insn. Here we use the fact that nothing expects CC0
7587 to be valid over an insn, which is true until the final pass. */
7588 if (prev_insn && GET_CODE (prev_insn) == INSN
7589 && (tem = single_set (prev_insn)) != 0
7590 && SET_DEST (tem) == cc0_rtx
7591 && ! reg_mentioned_p (cc0_rtx, x))
7592 {
7593 PUT_CODE (prev_insn, NOTE);
7594 NOTE_LINE_NUMBER (prev_insn) = NOTE_INSN_DELETED;
7595 NOTE_SOURCE_FILE (prev_insn) = 0;
7596 }
7597
7598 prev_insn_cc0 = this_insn_cc0;
7599 prev_insn_cc0_mode = this_insn_cc0_mode;
7600#endif
7601
7602 prev_insn = insn;
7603}
7604\f
9ae8ffe7 7605/* Remove from the ahsh table all expressions that reference memory. */
7afe21cc 7606static void
9ae8ffe7 7607invalidate_memory ()
7afe21cc 7608{
9ae8ffe7
JL
7609 register int i;
7610 register struct table_elt *p, *next;
7afe21cc 7611
9ae8ffe7
JL
7612 for (i = 0; i < NBUCKETS; i++)
7613 for (p = table[i]; p; p = next)
7614 {
7615 next = p->next_same_hash;
7616 if (p->in_memory)
7617 remove_from_table (p, i);
7618 }
7619}
7620
7621/* XXX ??? The name of this function bears little resemblance to
7622 what this function actually does. FIXME. */
7623static int
7624note_mem_written (addr)
7625 register rtx addr;
7626{
7627 /* Pushing or popping the stack invalidates just the stack pointer. */
7628 if ((GET_CODE (addr) == PRE_DEC || GET_CODE (addr) == PRE_INC
7629 || GET_CODE (addr) == POST_DEC || GET_CODE (addr) == POST_INC)
7630 && GET_CODE (XEXP (addr, 0)) == REG
7631 && REGNO (XEXP (addr, 0)) == STACK_POINTER_REGNUM)
7afe21cc 7632 {
9ae8ffe7
JL
7633 if (reg_tick[STACK_POINTER_REGNUM] >= 0)
7634 reg_tick[STACK_POINTER_REGNUM]++;
7635
7636 /* This should be *very* rare. */
7637 if (TEST_HARD_REG_BIT (hard_regs_in_table, STACK_POINTER_REGNUM))
7638 invalidate (stack_pointer_rtx, VOIDmode);
7639 return 1;
7afe21cc 7640 }
9ae8ffe7 7641 return 0;
7afe21cc
RK
7642}
7643
7644/* Perform invalidation on the basis of everything about an insn
7645 except for invalidating the actual places that are SET in it.
7646 This includes the places CLOBBERed, and anything that might
7647 alias with something that is SET or CLOBBERed.
7648
7afe21cc
RK
7649 X is the pattern of the insn. */
7650
7651static void
9ae8ffe7 7652invalidate_from_clobbers (x)
7afe21cc
RK
7653 rtx x;
7654{
7afe21cc
RK
7655 if (GET_CODE (x) == CLOBBER)
7656 {
7657 rtx ref = XEXP (x, 0);
9ae8ffe7
JL
7658 if (ref)
7659 {
7660 if (GET_CODE (ref) == REG || GET_CODE (ref) == SUBREG
7661 || GET_CODE (ref) == MEM)
7662 invalidate (ref, VOIDmode);
7663 else if (GET_CODE (ref) == STRICT_LOW_PART
7664 || GET_CODE (ref) == ZERO_EXTRACT)
7665 invalidate (XEXP (ref, 0), GET_MODE (ref));
7666 }
7afe21cc
RK
7667 }
7668 else if (GET_CODE (x) == PARALLEL)
7669 {
7670 register int i;
7671 for (i = XVECLEN (x, 0) - 1; i >= 0; i--)
7672 {
7673 register rtx y = XVECEXP (x, 0, i);
7674 if (GET_CODE (y) == CLOBBER)
7675 {
7676 rtx ref = XEXP (y, 0);
9ae8ffe7
JL
7677 if (GET_CODE (ref) == REG || GET_CODE (ref) == SUBREG
7678 || GET_CODE (ref) == MEM)
7679 invalidate (ref, VOIDmode);
7680 else if (GET_CODE (ref) == STRICT_LOW_PART
7681 || GET_CODE (ref) == ZERO_EXTRACT)
7682 invalidate (XEXP (ref, 0), GET_MODE (ref));
7afe21cc
RK
7683 }
7684 }
7685 }
7686}
7687\f
7688/* Process X, part of the REG_NOTES of an insn. Look at any REG_EQUAL notes
7689 and replace any registers in them with either an equivalent constant
7690 or the canonical form of the register. If we are inside an address,
7691 only do this if the address remains valid.
7692
7693 OBJECT is 0 except when within a MEM in which case it is the MEM.
7694
7695 Return the replacement for X. */
7696
7697static rtx
7698cse_process_notes (x, object)
7699 rtx x;
7700 rtx object;
7701{
7702 enum rtx_code code = GET_CODE (x);
7703 char *fmt = GET_RTX_FORMAT (code);
7afe21cc
RK
7704 int i;
7705
7706 switch (code)
7707 {
7708 case CONST_INT:
7709 case CONST:
7710 case SYMBOL_REF:
7711 case LABEL_REF:
7712 case CONST_DOUBLE:
7713 case PC:
7714 case CC0:
7715 case LO_SUM:
7716 return x;
7717
7718 case MEM:
7719 XEXP (x, 0) = cse_process_notes (XEXP (x, 0), x);
7720 return x;
7721
7722 case EXPR_LIST:
7723 case INSN_LIST:
7724 if (REG_NOTE_KIND (x) == REG_EQUAL)
906c4e36 7725 XEXP (x, 0) = cse_process_notes (XEXP (x, 0), NULL_RTX);
7afe21cc 7726 if (XEXP (x, 1))
906c4e36 7727 XEXP (x, 1) = cse_process_notes (XEXP (x, 1), NULL_RTX);
7afe21cc
RK
7728 return x;
7729
e4890d45
RS
7730 case SIGN_EXTEND:
7731 case ZERO_EXTEND:
0b0ee36c 7732 case SUBREG:
e4890d45
RS
7733 {
7734 rtx new = cse_process_notes (XEXP (x, 0), object);
7735 /* We don't substitute VOIDmode constants into these rtx,
7736 since they would impede folding. */
7737 if (GET_MODE (new) != VOIDmode)
7738 validate_change (object, &XEXP (x, 0), new, 0);
7739 return x;
7740 }
7741
7afe21cc
RK
7742 case REG:
7743 i = reg_qty[REGNO (x)];
7744
7745 /* Return a constant or a constant register. */
7746 if (REGNO_QTY_VALID_P (REGNO (x))
7747 && qty_const[i] != 0
7748 && (CONSTANT_P (qty_const[i])
7749 || GET_CODE (qty_const[i]) == REG))
7750 {
7751 rtx new = gen_lowpart_if_possible (GET_MODE (x), qty_const[i]);
7752 if (new)
7753 return new;
7754 }
7755
7756 /* Otherwise, canonicalize this register. */
906c4e36 7757 return canon_reg (x, NULL_RTX);
e9a25f70
JL
7758
7759 default:
7760 break;
7afe21cc
RK
7761 }
7762
7763 for (i = 0; i < GET_RTX_LENGTH (code); i++)
7764 if (fmt[i] == 'e')
7765 validate_change (object, &XEXP (x, i),
7fe34fdf 7766 cse_process_notes (XEXP (x, i), object), 0);
7afe21cc
RK
7767
7768 return x;
7769}
7770\f
7771/* Find common subexpressions between the end test of a loop and the beginning
7772 of the loop. LOOP_START is the CODE_LABEL at the start of a loop.
7773
7774 Often we have a loop where an expression in the exit test is used
7775 in the body of the loop. For example "while (*p) *q++ = *p++;".
7776 Because of the way we duplicate the loop exit test in front of the loop,
7777 however, we don't detect that common subexpression. This will be caught
7778 when global cse is implemented, but this is a quite common case.
7779
7780 This function handles the most common cases of these common expressions.
7781 It is called after we have processed the basic block ending with the
7782 NOTE_INSN_LOOP_END note that ends a loop and the previous JUMP_INSN
7783 jumps to a label used only once. */
7784
7785static void
7786cse_around_loop (loop_start)
7787 rtx loop_start;
7788{
7789 rtx insn;
7790 int i;
7791 struct table_elt *p;
7792
7793 /* If the jump at the end of the loop doesn't go to the start, we don't
7794 do anything. */
7795 for (insn = PREV_INSN (loop_start);
7796 insn && (GET_CODE (insn) == NOTE && NOTE_LINE_NUMBER (insn) >= 0);
7797 insn = PREV_INSN (insn))
7798 ;
7799
7800 if (insn == 0
7801 || GET_CODE (insn) != NOTE
7802 || NOTE_LINE_NUMBER (insn) != NOTE_INSN_LOOP_BEG)
7803 return;
7804
7805 /* If the last insn of the loop (the end test) was an NE comparison,
7806 we will interpret it as an EQ comparison, since we fell through
f72aed24 7807 the loop. Any equivalences resulting from that comparison are
7afe21cc
RK
7808 therefore not valid and must be invalidated. */
7809 if (last_jump_equiv_class)
7810 for (p = last_jump_equiv_class->first_same_value; p;
7811 p = p->next_same_value)
51723711
KG
7812 {
7813 if (GET_CODE (p->exp) == MEM || GET_CODE (p->exp) == REG
7814 || (GET_CODE (p->exp) == SUBREG
7815 && GET_CODE (SUBREG_REG (p->exp)) == REG))
7816 invalidate (p->exp, VOIDmode);
7817 else if (GET_CODE (p->exp) == STRICT_LOW_PART
7818 || GET_CODE (p->exp) == ZERO_EXTRACT)
7819 invalidate (XEXP (p->exp, 0), GET_MODE (p->exp));
7820 }
7afe21cc
RK
7821
7822 /* Process insns starting after LOOP_START until we hit a CALL_INSN or
7823 a CODE_LABEL (we could handle a CALL_INSN, but it isn't worth it).
7824
7825 The only thing we do with SET_DEST is invalidate entries, so we
7826 can safely process each SET in order. It is slightly less efficient
556c714b
JW
7827 to do so, but we only want to handle the most common cases.
7828
7829 The gen_move_insn call in cse_set_around_loop may create new pseudos.
7830 These pseudos won't have valid entries in any of the tables indexed
7831 by register number, such as reg_qty. We avoid out-of-range array
7832 accesses by not processing any instructions created after cse started. */
7afe21cc
RK
7833
7834 for (insn = NEXT_INSN (loop_start);
7835 GET_CODE (insn) != CALL_INSN && GET_CODE (insn) != CODE_LABEL
556c714b 7836 && INSN_UID (insn) < max_insn_uid
7afe21cc
RK
7837 && ! (GET_CODE (insn) == NOTE
7838 && NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_END);
7839 insn = NEXT_INSN (insn))
7840 {
7841 if (GET_RTX_CLASS (GET_CODE (insn)) == 'i'
7842 && (GET_CODE (PATTERN (insn)) == SET
7843 || GET_CODE (PATTERN (insn)) == CLOBBER))
7844 cse_set_around_loop (PATTERN (insn), insn, loop_start);
7845 else if (GET_RTX_CLASS (GET_CODE (insn)) == 'i'
7846 && GET_CODE (PATTERN (insn)) == PARALLEL)
7847 for (i = XVECLEN (PATTERN (insn), 0) - 1; i >= 0; i--)
7848 if (GET_CODE (XVECEXP (PATTERN (insn), 0, i)) == SET
7849 || GET_CODE (XVECEXP (PATTERN (insn), 0, i)) == CLOBBER)
7850 cse_set_around_loop (XVECEXP (PATTERN (insn), 0, i), insn,
7851 loop_start);
7852 }
7853}
7854\f
8b3686ed
RK
7855/* Process one SET of an insn that was skipped. We ignore CLOBBERs
7856 since they are done elsewhere. This function is called via note_stores. */
7857
7858static void
7859invalidate_skipped_set (dest, set)
7860 rtx set;
7861 rtx dest;
7862{
9ae8ffe7
JL
7863 enum rtx_code code = GET_CODE (dest);
7864
7865 if (code == MEM
7866 && ! note_mem_written (dest) /* If this is not a stack push ... */
7867 /* There are times when an address can appear varying and be a PLUS
7868 during this scan when it would be a fixed address were we to know
7869 the proper equivalences. So invalidate all memory if there is
7870 a BLKmode or nonscalar memory reference or a reference to a
7871 variable address. */
7872 && (MEM_IN_STRUCT_P (dest) || GET_MODE (dest) == BLKmode
7873 || cse_rtx_varies_p (XEXP (dest, 0))))
7874 {
7875 invalidate_memory ();
7876 return;
7877 }
ffcf6393 7878
f47c02fa
RK
7879 if (GET_CODE (set) == CLOBBER
7880#ifdef HAVE_cc0
7881 || dest == cc0_rtx
7882#endif
7883 || dest == pc_rtx)
7884 return;
7885
9ae8ffe7 7886 if (code == STRICT_LOW_PART || code == ZERO_EXTRACT)
bb4034b3 7887 invalidate (XEXP (dest, 0), GET_MODE (dest));
9ae8ffe7
JL
7888 else if (code == REG || code == SUBREG || code == MEM)
7889 invalidate (dest, VOIDmode);
8b3686ed
RK
7890}
7891
7892/* Invalidate all insns from START up to the end of the function or the
7893 next label. This called when we wish to CSE around a block that is
7894 conditionally executed. */
7895
7896static void
7897invalidate_skipped_block (start)
7898 rtx start;
7899{
7900 rtx insn;
8b3686ed
RK
7901
7902 for (insn = start; insn && GET_CODE (insn) != CODE_LABEL;
7903 insn = NEXT_INSN (insn))
7904 {
7905 if (GET_RTX_CLASS (GET_CODE (insn)) != 'i')
7906 continue;
7907
8b3686ed
RK
7908 if (GET_CODE (insn) == CALL_INSN)
7909 {
9ae8ffe7
JL
7910 if (! CONST_CALL_P (insn))
7911 invalidate_memory ();
8b3686ed 7912 invalidate_for_call ();
8b3686ed
RK
7913 }
7914
7915 note_stores (PATTERN (insn), invalidate_skipped_set);
8b3686ed
RK
7916 }
7917}
7918\f
7afe21cc
RK
7919/* Used for communication between the following two routines; contains a
7920 value to be checked for modification. */
7921
7922static rtx cse_check_loop_start_value;
7923
7924/* If modifying X will modify the value in CSE_CHECK_LOOP_START_VALUE,
7925 indicate that fact by setting CSE_CHECK_LOOP_START_VALUE to 0. */
7926
7927static void
7928cse_check_loop_start (x, set)
7929 rtx x;
7930 rtx set;
7931{
7932 if (cse_check_loop_start_value == 0
7933 || GET_CODE (x) == CC0 || GET_CODE (x) == PC)
7934 return;
7935
7936 if ((GET_CODE (x) == MEM && GET_CODE (cse_check_loop_start_value) == MEM)
7937 || reg_overlap_mentioned_p (x, cse_check_loop_start_value))
7938 cse_check_loop_start_value = 0;
7939}
7940
7941/* X is a SET or CLOBBER contained in INSN that was found near the start of
7942 a loop that starts with the label at LOOP_START.
7943
7944 If X is a SET, we see if its SET_SRC is currently in our hash table.
7945 If so, we see if it has a value equal to some register used only in the
7946 loop exit code (as marked by jump.c).
7947
7948 If those two conditions are true, we search backwards from the start of
7949 the loop to see if that same value was loaded into a register that still
7950 retains its value at the start of the loop.
7951
7952 If so, we insert an insn after the load to copy the destination of that
7953 load into the equivalent register and (try to) replace our SET_SRC with that
7954 register.
7955
7956 In any event, we invalidate whatever this SET or CLOBBER modifies. */
7957
7958static void
7959cse_set_around_loop (x, insn, loop_start)
7960 rtx x;
7961 rtx insn;
7962 rtx loop_start;
7963{
7afe21cc 7964 struct table_elt *src_elt;
7afe21cc
RK
7965
7966 /* If this is a SET, see if we can replace SET_SRC, but ignore SETs that
7967 are setting PC or CC0 or whose SET_SRC is already a register. */
7968 if (GET_CODE (x) == SET
7969 && GET_CODE (SET_DEST (x)) != PC && GET_CODE (SET_DEST (x)) != CC0
7970 && GET_CODE (SET_SRC (x)) != REG)
7971 {
7972 src_elt = lookup (SET_SRC (x),
7973 HASH (SET_SRC (x), GET_MODE (SET_DEST (x))),
7974 GET_MODE (SET_DEST (x)));
7975
7976 if (src_elt)
7977 for (src_elt = src_elt->first_same_value; src_elt;
7978 src_elt = src_elt->next_same_value)
7979 if (GET_CODE (src_elt->exp) == REG && REG_LOOP_TEST_P (src_elt->exp)
7980 && COST (src_elt->exp) < COST (SET_SRC (x)))
7981 {
7982 rtx p, set;
7983
7984 /* Look for an insn in front of LOOP_START that sets
7985 something in the desired mode to SET_SRC (x) before we hit
7986 a label or CALL_INSN. */
7987
7988 for (p = prev_nonnote_insn (loop_start);
7989 p && GET_CODE (p) != CALL_INSN
7990 && GET_CODE (p) != CODE_LABEL;
7991 p = prev_nonnote_insn (p))
7992 if ((set = single_set (p)) != 0
7993 && GET_CODE (SET_DEST (set)) == REG
7994 && GET_MODE (SET_DEST (set)) == src_elt->mode
7995 && rtx_equal_p (SET_SRC (set), SET_SRC (x)))
7996 {
7997 /* We now have to ensure that nothing between P
7998 and LOOP_START modified anything referenced in
7999 SET_SRC (x). We know that nothing within the loop
8000 can modify it, or we would have invalidated it in
8001 the hash table. */
8002 rtx q;
8003
8004 cse_check_loop_start_value = SET_SRC (x);
8005 for (q = p; q != loop_start; q = NEXT_INSN (q))
8006 if (GET_RTX_CLASS (GET_CODE (q)) == 'i')
8007 note_stores (PATTERN (q), cse_check_loop_start);
8008
8009 /* If nothing was changed and we can replace our
8010 SET_SRC, add an insn after P to copy its destination
8011 to what we will be replacing SET_SRC with. */
8012 if (cse_check_loop_start_value
8013 && validate_change (insn, &SET_SRC (x),
8014 src_elt->exp, 0))
8015 emit_insn_after (gen_move_insn (src_elt->exp,
8016 SET_DEST (set)),
8017 p);
8018 break;
8019 }
8020 }
8021 }
8022
8023 /* Now invalidate anything modified by X. */
9ae8ffe7 8024 note_mem_written (SET_DEST (x));
7afe21cc 8025
9ae8ffe7 8026 /* See comment on similar code in cse_insn for explanation of these tests. */
7afe21cc 8027 if (GET_CODE (SET_DEST (x)) == REG || GET_CODE (SET_DEST (x)) == SUBREG
9ae8ffe7 8028 || GET_CODE (SET_DEST (x)) == MEM)
bb4034b3 8029 invalidate (SET_DEST (x), VOIDmode);
2708da92
RS
8030 else if (GET_CODE (SET_DEST (x)) == STRICT_LOW_PART
8031 || GET_CODE (SET_DEST (x)) == ZERO_EXTRACT)
bb4034b3 8032 invalidate (XEXP (SET_DEST (x), 0), GET_MODE (SET_DEST (x)));
7afe21cc
RK
8033}
8034\f
8035/* Find the end of INSN's basic block and return its range,
8036 the total number of SETs in all the insns of the block, the last insn of the
8037 block, and the branch path.
8038
8039 The branch path indicates which branches should be followed. If a non-zero
8040 path size is specified, the block should be rescanned and a different set
8041 of branches will be taken. The branch path is only used if
8b3686ed 8042 FLAG_CSE_FOLLOW_JUMPS or FLAG_CSE_SKIP_BLOCKS is non-zero.
7afe21cc
RK
8043
8044 DATA is a pointer to a struct cse_basic_block_data, defined below, that is
8045 used to describe the block. It is filled in with the information about
8046 the current block. The incoming structure's branch path, if any, is used
8047 to construct the output branch path. */
8048
7afe21cc 8049void
8b3686ed 8050cse_end_of_basic_block (insn, data, follow_jumps, after_loop, skip_blocks)
7afe21cc
RK
8051 rtx insn;
8052 struct cse_basic_block_data *data;
8053 int follow_jumps;
8054 int after_loop;
8b3686ed 8055 int skip_blocks;
7afe21cc
RK
8056{
8057 rtx p = insn, q;
8058 int nsets = 0;
8059 int low_cuid = INSN_CUID (insn), high_cuid = INSN_CUID (insn);
fc3ffe83 8060 rtx next = GET_RTX_CLASS (GET_CODE (insn)) == 'i' ? insn : next_real_insn (insn);
7afe21cc
RK
8061 int path_size = data->path_size;
8062 int path_entry = 0;
8063 int i;
8064
8065 /* Update the previous branch path, if any. If the last branch was
8066 previously TAKEN, mark it NOT_TAKEN. If it was previously NOT_TAKEN,
8067 shorten the path by one and look at the previous branch. We know that
8068 at least one branch must have been taken if PATH_SIZE is non-zero. */
8069 while (path_size > 0)
8070 {
8b3686ed 8071 if (data->path[path_size - 1].status != NOT_TAKEN)
7afe21cc
RK
8072 {
8073 data->path[path_size - 1].status = NOT_TAKEN;
8074 break;
8075 }
8076 else
8077 path_size--;
8078 }
8079
8080 /* Scan to end of this basic block. */
8081 while (p && GET_CODE (p) != CODE_LABEL)
8082 {
8083 /* Don't cse out the end of a loop. This makes a difference
8084 only for the unusual loops that always execute at least once;
8085 all other loops have labels there so we will stop in any case.
8086 Cse'ing out the end of the loop is dangerous because it
8087 might cause an invariant expression inside the loop
8088 to be reused after the end of the loop. This would make it
8089 hard to move the expression out of the loop in loop.c,
8090 especially if it is one of several equivalent expressions
8091 and loop.c would like to eliminate it.
8092
8093 If we are running after loop.c has finished, we can ignore
8094 the NOTE_INSN_LOOP_END. */
8095
8096 if (! after_loop && GET_CODE (p) == NOTE
8097 && NOTE_LINE_NUMBER (p) == NOTE_INSN_LOOP_END)
8098 break;
8099
8100 /* Don't cse over a call to setjmp; on some machines (eg vax)
8101 the regs restored by the longjmp come from
8102 a later time than the setjmp. */
8103 if (GET_CODE (p) == NOTE
8104 && NOTE_LINE_NUMBER (p) == NOTE_INSN_SETJMP)
8105 break;
8106
8107 /* A PARALLEL can have lots of SETs in it,
8108 especially if it is really an ASM_OPERANDS. */
8109 if (GET_RTX_CLASS (GET_CODE (p)) == 'i'
8110 && GET_CODE (PATTERN (p)) == PARALLEL)
8111 nsets += XVECLEN (PATTERN (p), 0);
8112 else if (GET_CODE (p) != NOTE)
8113 nsets += 1;
8114
164c8956
RK
8115 /* Ignore insns made by CSE; they cannot affect the boundaries of
8116 the basic block. */
8117
8118 if (INSN_UID (p) <= max_uid && INSN_CUID (p) > high_cuid)
8b3686ed 8119 high_cuid = INSN_CUID (p);
164c8956
RK
8120 if (INSN_UID (p) <= max_uid && INSN_CUID (p) < low_cuid)
8121 low_cuid = INSN_CUID (p);
7afe21cc
RK
8122
8123 /* See if this insn is in our branch path. If it is and we are to
8124 take it, do so. */
8125 if (path_entry < path_size && data->path[path_entry].branch == p)
8126 {
8b3686ed 8127 if (data->path[path_entry].status != NOT_TAKEN)
7afe21cc
RK
8128 p = JUMP_LABEL (p);
8129
8130 /* Point to next entry in path, if any. */
8131 path_entry++;
8132 }
8133
8134 /* If this is a conditional jump, we can follow it if -fcse-follow-jumps
8135 was specified, we haven't reached our maximum path length, there are
8136 insns following the target of the jump, this is the only use of the
8b3686ed
RK
8137 jump label, and the target label is preceded by a BARRIER.
8138
8139 Alternatively, we can follow the jump if it branches around a
8140 block of code and there are no other branches into the block.
8141 In this case invalidate_skipped_block will be called to invalidate any
8142 registers set in the block when following the jump. */
8143
8144 else if ((follow_jumps || skip_blocks) && path_size < PATHLENGTH - 1
7afe21cc
RK
8145 && GET_CODE (p) == JUMP_INSN
8146 && GET_CODE (PATTERN (p)) == SET
8147 && GET_CODE (SET_SRC (PATTERN (p))) == IF_THEN_ELSE
85c3ba60 8148 && JUMP_LABEL (p) != 0
7afe21cc
RK
8149 && LABEL_NUSES (JUMP_LABEL (p)) == 1
8150 && NEXT_INSN (JUMP_LABEL (p)) != 0)
8151 {
8152 for (q = PREV_INSN (JUMP_LABEL (p)); q; q = PREV_INSN (q))
8153 if ((GET_CODE (q) != NOTE
8154 || NOTE_LINE_NUMBER (q) == NOTE_INSN_LOOP_END
8155 || NOTE_LINE_NUMBER (q) == NOTE_INSN_SETJMP)
8156 && (GET_CODE (q) != CODE_LABEL || LABEL_NUSES (q) != 0))
8157 break;
8158
8159 /* If we ran into a BARRIER, this code is an extension of the
8160 basic block when the branch is taken. */
8b3686ed 8161 if (follow_jumps && q != 0 && GET_CODE (q) == BARRIER)
7afe21cc
RK
8162 {
8163 /* Don't allow ourself to keep walking around an
8164 always-executed loop. */
fc3ffe83
RK
8165 if (next_real_insn (q) == next)
8166 {
8167 p = NEXT_INSN (p);
8168 continue;
8169 }
7afe21cc
RK
8170
8171 /* Similarly, don't put a branch in our path more than once. */
8172 for (i = 0; i < path_entry; i++)
8173 if (data->path[i].branch == p)
8174 break;
8175
8176 if (i != path_entry)
8177 break;
8178
8179 data->path[path_entry].branch = p;
8180 data->path[path_entry++].status = TAKEN;
8181
8182 /* This branch now ends our path. It was possible that we
8183 didn't see this branch the last time around (when the
8184 insn in front of the target was a JUMP_INSN that was
8185 turned into a no-op). */
8186 path_size = path_entry;
8187
8188 p = JUMP_LABEL (p);
8189 /* Mark block so we won't scan it again later. */
8190 PUT_MODE (NEXT_INSN (p), QImode);
8191 }
8b3686ed
RK
8192 /* Detect a branch around a block of code. */
8193 else if (skip_blocks && q != 0 && GET_CODE (q) != CODE_LABEL)
8194 {
8195 register rtx tmp;
8196
fc3ffe83
RK
8197 if (next_real_insn (q) == next)
8198 {
8199 p = NEXT_INSN (p);
8200 continue;
8201 }
8b3686ed
RK
8202
8203 for (i = 0; i < path_entry; i++)
8204 if (data->path[i].branch == p)
8205 break;
8206
8207 if (i != path_entry)
8208 break;
8209
8210 /* This is no_labels_between_p (p, q) with an added check for
8211 reaching the end of a function (in case Q precedes P). */
8212 for (tmp = NEXT_INSN (p); tmp && tmp != q; tmp = NEXT_INSN (tmp))
8213 if (GET_CODE (tmp) == CODE_LABEL)
8214 break;
8215
8216 if (tmp == q)
8217 {
8218 data->path[path_entry].branch = p;
8219 data->path[path_entry++].status = AROUND;
8220
8221 path_size = path_entry;
8222
8223 p = JUMP_LABEL (p);
8224 /* Mark block so we won't scan it again later. */
8225 PUT_MODE (NEXT_INSN (p), QImode);
8226 }
8227 }
7afe21cc 8228 }
7afe21cc
RK
8229 p = NEXT_INSN (p);
8230 }
8231
8232 data->low_cuid = low_cuid;
8233 data->high_cuid = high_cuid;
8234 data->nsets = nsets;
8235 data->last = p;
8236
8237 /* If all jumps in the path are not taken, set our path length to zero
8238 so a rescan won't be done. */
8239 for (i = path_size - 1; i >= 0; i--)
8b3686ed 8240 if (data->path[i].status != NOT_TAKEN)
7afe21cc
RK
8241 break;
8242
8243 if (i == -1)
8244 data->path_size = 0;
8245 else
8246 data->path_size = path_size;
8247
8248 /* End the current branch path. */
8249 data->path[path_size].branch = 0;
8250}
8251\f
7afe21cc
RK
8252/* Perform cse on the instructions of a function.
8253 F is the first instruction.
8254 NREGS is one plus the highest pseudo-reg number used in the instruction.
8255
8256 AFTER_LOOP is 1 if this is the cse call done after loop optimization
8257 (only if -frerun-cse-after-loop).
8258
8259 Returns 1 if jump_optimize should be redone due to simplifications
8260 in conditional jump instructions. */
8261
8262int
8263cse_main (f, nregs, after_loop, file)
8264 rtx f;
8265 int nregs;
8266 int after_loop;
8267 FILE *file;
8268{
8269 struct cse_basic_block_data val;
8270 register rtx insn = f;
8271 register int i;
8272
8273 cse_jumps_altered = 0;
a5dfb4ee 8274 recorded_label_ref = 0;
7afe21cc
RK
8275 constant_pool_entries_cost = 0;
8276 val.path_size = 0;
8277
8278 init_recog ();
9ae8ffe7 8279 init_alias_analysis ();
7afe21cc
RK
8280
8281 max_reg = nregs;
8282
556c714b
JW
8283 max_insn_uid = get_max_uid ();
8284
7afe21cc
RK
8285 all_minus_one = (int *) alloca (nregs * sizeof (int));
8286 consec_ints = (int *) alloca (nregs * sizeof (int));
8287
8288 for (i = 0; i < nregs; i++)
8289 {
8290 all_minus_one[i] = -1;
8291 consec_ints[i] = i;
8292 }
8293
8294 reg_next_eqv = (int *) alloca (nregs * sizeof (int));
8295 reg_prev_eqv = (int *) alloca (nregs * sizeof (int));
8296 reg_qty = (int *) alloca (nregs * sizeof (int));
8297 reg_in_table = (int *) alloca (nregs * sizeof (int));
8298 reg_tick = (int *) alloca (nregs * sizeof (int));
8299
7bac1be0
RK
8300#ifdef LOAD_EXTEND_OP
8301
8302 /* Allocate scratch rtl here. cse_insn will fill in the memory reference
8303 and change the code and mode as appropriate. */
38a448ca 8304 memory_extend_rtx = gen_rtx_ZERO_EXTEND (VOIDmode, NULL_RTX);
7bac1be0
RK
8305#endif
8306
7afe21cc
RK
8307 /* Discard all the free elements of the previous function
8308 since they are allocated in the temporarily obstack. */
4c9a05bc 8309 bzero ((char *) table, sizeof table);
7afe21cc
RK
8310 free_element_chain = 0;
8311 n_elements_made = 0;
8312
8313 /* Find the largest uid. */
8314
164c8956
RK
8315 max_uid = get_max_uid ();
8316 uid_cuid = (int *) alloca ((max_uid + 1) * sizeof (int));
4c9a05bc 8317 bzero ((char *) uid_cuid, (max_uid + 1) * sizeof (int));
7afe21cc
RK
8318
8319 /* Compute the mapping from uids to cuids.
8320 CUIDs are numbers assigned to insns, like uids,
8321 except that cuids increase monotonically through the code.
8322 Don't assign cuids to line-number NOTEs, so that the distance in cuids
8323 between two insns is not affected by -g. */
8324
8325 for (insn = f, i = 0; insn; insn = NEXT_INSN (insn))
8326 {
8327 if (GET_CODE (insn) != NOTE
8328 || NOTE_LINE_NUMBER (insn) < 0)
8329 INSN_CUID (insn) = ++i;
8330 else
8331 /* Give a line number note the same cuid as preceding insn. */
8332 INSN_CUID (insn) = i;
8333 }
8334
8335 /* Initialize which registers are clobbered by calls. */
8336
8337 CLEAR_HARD_REG_SET (regs_invalidated_by_call);
8338
8339 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
8340 if ((call_used_regs[i]
8341 /* Used to check !fixed_regs[i] here, but that isn't safe;
8342 fixed regs are still call-clobbered, and sched can get
8343 confused if they can "live across calls".
8344
8345 The frame pointer is always preserved across calls. The arg
8346 pointer is if it is fixed. The stack pointer usually is, unless
8347 RETURN_POPS_ARGS, in which case an explicit CLOBBER
8348 will be present. If we are generating PIC code, the PIC offset
8349 table register is preserved across calls. */
8350
8351 && i != STACK_POINTER_REGNUM
8352 && i != FRAME_POINTER_REGNUM
8bc169f2
DE
8353#if HARD_FRAME_POINTER_REGNUM != FRAME_POINTER_REGNUM
8354 && i != HARD_FRAME_POINTER_REGNUM
8355#endif
7afe21cc
RK
8356#if ARG_POINTER_REGNUM != FRAME_POINTER_REGNUM
8357 && ! (i == ARG_POINTER_REGNUM && fixed_regs[i])
8358#endif
be8fe470 8359#if defined (PIC_OFFSET_TABLE_REGNUM) && !defined (PIC_OFFSET_TABLE_REG_CALL_CLOBBERED)
7afe21cc
RK
8360 && ! (i == PIC_OFFSET_TABLE_REGNUM && flag_pic)
8361#endif
8362 )
8363 || global_regs[i])
8364 SET_HARD_REG_BIT (regs_invalidated_by_call, i);
8365
8366 /* Loop over basic blocks.
8367 Compute the maximum number of qty's needed for each basic block
8368 (which is 2 for each SET). */
8369 insn = f;
8370 while (insn)
8371 {
8b3686ed
RK
8372 cse_end_of_basic_block (insn, &val, flag_cse_follow_jumps, after_loop,
8373 flag_cse_skip_blocks);
7afe21cc
RK
8374
8375 /* If this basic block was already processed or has no sets, skip it. */
8376 if (val.nsets == 0 || GET_MODE (insn) == QImode)
8377 {
8378 PUT_MODE (insn, VOIDmode);
8379 insn = (val.last ? NEXT_INSN (val.last) : 0);
8380 val.path_size = 0;
8381 continue;
8382 }
8383
8384 cse_basic_block_start = val.low_cuid;
8385 cse_basic_block_end = val.high_cuid;
8386 max_qty = val.nsets * 2;
8387
8388 if (file)
8389 fprintf (file, ";; Processing block from %d to %d, %d sets.\n",
8390 INSN_UID (insn), val.last ? INSN_UID (val.last) : 0,
8391 val.nsets);
8392
8393 /* Make MAX_QTY bigger to give us room to optimize
8394 past the end of this basic block, if that should prove useful. */
8395 if (max_qty < 500)
8396 max_qty = 500;
8397
8398 max_qty += max_reg;
8399
8400 /* If this basic block is being extended by following certain jumps,
8401 (see `cse_end_of_basic_block'), we reprocess the code from the start.
8402 Otherwise, we start after this basic block. */
8403 if (val.path_size > 0)
8404 cse_basic_block (insn, val.last, val.path, 0);
8405 else
8406 {
8407 int old_cse_jumps_altered = cse_jumps_altered;
8408 rtx temp;
8409
8410 /* When cse changes a conditional jump to an unconditional
8411 jump, we want to reprocess the block, since it will give
8412 us a new branch path to investigate. */
8413 cse_jumps_altered = 0;
8414 temp = cse_basic_block (insn, val.last, val.path, ! after_loop);
8b3686ed
RK
8415 if (cse_jumps_altered == 0
8416 || (flag_cse_follow_jumps == 0 && flag_cse_skip_blocks == 0))
7afe21cc
RK
8417 insn = temp;
8418
8419 cse_jumps_altered |= old_cse_jumps_altered;
8420 }
8421
8422#ifdef USE_C_ALLOCA
8423 alloca (0);
8424#endif
8425 }
8426
8427 /* Tell refers_to_mem_p that qty_const info is not available. */
8428 qty_const = 0;
8429
8430 if (max_elements_made < n_elements_made)
8431 max_elements_made = n_elements_made;
8432
a5dfb4ee 8433 return cse_jumps_altered || recorded_label_ref;
7afe21cc
RK
8434}
8435
8436/* Process a single basic block. FROM and TO and the limits of the basic
8437 block. NEXT_BRANCH points to the branch path when following jumps or
8438 a null path when not following jumps.
8439
8440 AROUND_LOOP is non-zero if we are to try to cse around to the start of a
8441 loop. This is true when we are being called for the last time on a
8442 block and this CSE pass is before loop.c. */
8443
8444static rtx
8445cse_basic_block (from, to, next_branch, around_loop)
8446 register rtx from, to;
8447 struct branch_path *next_branch;
8448 int around_loop;
8449{
8450 register rtx insn;
8451 int to_usage = 0;
8452 int in_libcall_block = 0;
e9a25f70 8453 int num_insns = 0;
7afe21cc
RK
8454
8455 /* Each of these arrays is undefined before max_reg, so only allocate
8456 the space actually needed and adjust the start below. */
8457
8458 qty_first_reg = (int *) alloca ((max_qty - max_reg) * sizeof (int));
8459 qty_last_reg = (int *) alloca ((max_qty - max_reg) * sizeof (int));
8460 qty_mode= (enum machine_mode *) alloca ((max_qty - max_reg) * sizeof (enum machine_mode));
8461 qty_const = (rtx *) alloca ((max_qty - max_reg) * sizeof (rtx));
8462 qty_const_insn = (rtx *) alloca ((max_qty - max_reg) * sizeof (rtx));
8463 qty_comparison_code
8464 = (enum rtx_code *) alloca ((max_qty - max_reg) * sizeof (enum rtx_code));
8465 qty_comparison_qty = (int *) alloca ((max_qty - max_reg) * sizeof (int));
8466 qty_comparison_const = (rtx *) alloca ((max_qty - max_reg) * sizeof (rtx));
8467
8468 qty_first_reg -= max_reg;
8469 qty_last_reg -= max_reg;
8470 qty_mode -= max_reg;
8471 qty_const -= max_reg;
8472 qty_const_insn -= max_reg;
8473 qty_comparison_code -= max_reg;
8474 qty_comparison_qty -= max_reg;
8475 qty_comparison_const -= max_reg;
8476
8477 new_basic_block ();
8478
8479 /* TO might be a label. If so, protect it from being deleted. */
8480 if (to != 0 && GET_CODE (to) == CODE_LABEL)
8481 ++LABEL_NUSES (to);
8482
8483 for (insn = from; insn != to; insn = NEXT_INSN (insn))
8484 {
8485 register enum rtx_code code;
e9a25f70
JL
8486 int i;
8487 struct table_elt *p, *next;
8488
8489 /* If we have processed 1,000 insns, flush the hash table to avoid
8490 extreme quadratic behavior.
8491
8492 ??? This is a real kludge and needs to be done some other way.
8493 Perhaps for 2.9. */
8494 if (num_insns++ > 1000)
8495 {
8496 for (i = 0; i < NBUCKETS; i++)
8497 for (p = table[i]; p; p = next)
8498 {
8499 next = p->next_same_hash;
8500
8501 if (GET_CODE (p->exp) == REG)
8502 invalidate (p->exp, p->mode);
8503 else
8504 remove_from_table (p, i);
8505 }
8506
8507 num_insns = 0;
8508 }
7afe21cc
RK
8509
8510 /* See if this is a branch that is part of the path. If so, and it is
8511 to be taken, do so. */
8512 if (next_branch->branch == insn)
8513 {
8b3686ed
RK
8514 enum taken status = next_branch++->status;
8515 if (status != NOT_TAKEN)
7afe21cc 8516 {
8b3686ed
RK
8517 if (status == TAKEN)
8518 record_jump_equiv (insn, 1);
8519 else
8520 invalidate_skipped_block (NEXT_INSN (insn));
8521
7afe21cc
RK
8522 /* Set the last insn as the jump insn; it doesn't affect cc0.
8523 Then follow this branch. */
8524#ifdef HAVE_cc0
8525 prev_insn_cc0 = 0;
8526#endif
8527 prev_insn = insn;
8528 insn = JUMP_LABEL (insn);
8529 continue;
8530 }
8531 }
8532
8533 code = GET_CODE (insn);
8534 if (GET_MODE (insn) == QImode)
8535 PUT_MODE (insn, VOIDmode);
8536
8537 if (GET_RTX_CLASS (code) == 'i')
8538 {
8539 /* Process notes first so we have all notes in canonical forms when
8540 looking for duplicate operations. */
8541
8542 if (REG_NOTES (insn))
906c4e36 8543 REG_NOTES (insn) = cse_process_notes (REG_NOTES (insn), NULL_RTX);
7afe21cc
RK
8544
8545 /* Track when we are inside in LIBCALL block. Inside such a block,
8546 we do not want to record destinations. The last insn of a
8547 LIBCALL block is not considered to be part of the block, since
830a38ee 8548 its destination is the result of the block and hence should be
7afe21cc
RK
8549 recorded. */
8550
906c4e36 8551 if (find_reg_note (insn, REG_LIBCALL, NULL_RTX))
7afe21cc 8552 in_libcall_block = 1;
906c4e36 8553 else if (find_reg_note (insn, REG_RETVAL, NULL_RTX))
7afe21cc
RK
8554 in_libcall_block = 0;
8555
8556 cse_insn (insn, in_libcall_block);
8557 }
8558
8559 /* If INSN is now an unconditional jump, skip to the end of our
8560 basic block by pretending that we just did the last insn in the
8561 basic block. If we are jumping to the end of our block, show
8562 that we can have one usage of TO. */
8563
8564 if (simplejump_p (insn))
8565 {
8566 if (to == 0)
8567 return 0;
8568
8569 if (JUMP_LABEL (insn) == to)
8570 to_usage = 1;
8571
6a5293dc
RS
8572 /* Maybe TO was deleted because the jump is unconditional.
8573 If so, there is nothing left in this basic block. */
8574 /* ??? Perhaps it would be smarter to set TO
8575 to whatever follows this insn,
8576 and pretend the basic block had always ended here. */
8577 if (INSN_DELETED_P (to))
8578 break;
8579
7afe21cc
RK
8580 insn = PREV_INSN (to);
8581 }
8582
8583 /* See if it is ok to keep on going past the label
8584 which used to end our basic block. Remember that we incremented
d45cf215 8585 the count of that label, so we decrement it here. If we made
7afe21cc
RK
8586 a jump unconditional, TO_USAGE will be one; in that case, we don't
8587 want to count the use in that jump. */
8588
8589 if (to != 0 && NEXT_INSN (insn) == to
8590 && GET_CODE (to) == CODE_LABEL && --LABEL_NUSES (to) == to_usage)
8591 {
8592 struct cse_basic_block_data val;
146135d6 8593 rtx prev;
7afe21cc
RK
8594
8595 insn = NEXT_INSN (to);
8596
8597 if (LABEL_NUSES (to) == 0)
146135d6 8598 insn = delete_insn (to);
7afe21cc 8599
146135d6
RK
8600 /* If TO was the last insn in the function, we are done. */
8601 if (insn == 0)
7afe21cc
RK
8602 return 0;
8603
146135d6
RK
8604 /* If TO was preceded by a BARRIER we are done with this block
8605 because it has no continuation. */
8606 prev = prev_nonnote_insn (to);
8607 if (prev && GET_CODE (prev) == BARRIER)
8608 return insn;
8609
8610 /* Find the end of the following block. Note that we won't be
8611 following branches in this case. */
7afe21cc
RK
8612 to_usage = 0;
8613 val.path_size = 0;
8b3686ed 8614 cse_end_of_basic_block (insn, &val, 0, 0, 0);
7afe21cc
RK
8615
8616 /* If the tables we allocated have enough space left
8617 to handle all the SETs in the next basic block,
8618 continue through it. Otherwise, return,
8619 and that block will be scanned individually. */
8620 if (val.nsets * 2 + next_qty > max_qty)
8621 break;
8622
8623 cse_basic_block_start = val.low_cuid;
8624 cse_basic_block_end = val.high_cuid;
8625 to = val.last;
8626
8627 /* Prevent TO from being deleted if it is a label. */
8628 if (to != 0 && GET_CODE (to) == CODE_LABEL)
8629 ++LABEL_NUSES (to);
8630
8631 /* Back up so we process the first insn in the extension. */
8632 insn = PREV_INSN (insn);
8633 }
8634 }
8635
8636 if (next_qty > max_qty)
8637 abort ();
8638
8639 /* If we are running before loop.c, we stopped on a NOTE_INSN_LOOP_END, and
8640 the previous insn is the only insn that branches to the head of a loop,
8641 we can cse into the loop. Don't do this if we changed the jump
8642 structure of a loop unless we aren't going to be following jumps. */
8643
8b3686ed
RK
8644 if ((cse_jumps_altered == 0
8645 || (flag_cse_follow_jumps == 0 && flag_cse_skip_blocks == 0))
7afe21cc
RK
8646 && around_loop && to != 0
8647 && GET_CODE (to) == NOTE && NOTE_LINE_NUMBER (to) == NOTE_INSN_LOOP_END
8648 && GET_CODE (PREV_INSN (to)) == JUMP_INSN
8649 && JUMP_LABEL (PREV_INSN (to)) != 0
8650 && LABEL_NUSES (JUMP_LABEL (PREV_INSN (to))) == 1)
8651 cse_around_loop (JUMP_LABEL (PREV_INSN (to)));
8652
8653 return to ? NEXT_INSN (to) : 0;
8654}
8655\f
8656/* Count the number of times registers are used (not set) in X.
8657 COUNTS is an array in which we accumulate the count, INCR is how much
79644f06
RK
8658 we count each register usage.
8659
8660 Don't count a usage of DEST, which is the SET_DEST of a SET which
8661 contains X in its SET_SRC. This is because such a SET does not
8662 modify the liveness of DEST. */
7afe21cc
RK
8663
8664static void
79644f06 8665count_reg_usage (x, counts, dest, incr)
7afe21cc
RK
8666 rtx x;
8667 int *counts;
79644f06 8668 rtx dest;
7afe21cc
RK
8669 int incr;
8670{
f1e7c95f 8671 enum rtx_code code;
7afe21cc
RK
8672 char *fmt;
8673 int i, j;
8674
f1e7c95f
RK
8675 if (x == 0)
8676 return;
8677
8678 switch (code = GET_CODE (x))
7afe21cc
RK
8679 {
8680 case REG:
79644f06
RK
8681 if (x != dest)
8682 counts[REGNO (x)] += incr;
7afe21cc
RK
8683 return;
8684
8685 case PC:
8686 case CC0:
8687 case CONST:
8688 case CONST_INT:
8689 case CONST_DOUBLE:
8690 case SYMBOL_REF:
8691 case LABEL_REF:
8692 case CLOBBER:
8693 return;
8694
8695 case SET:
8696 /* Unless we are setting a REG, count everything in SET_DEST. */
8697 if (GET_CODE (SET_DEST (x)) != REG)
79644f06 8698 count_reg_usage (SET_DEST (x), counts, NULL_RTX, incr);
9ff08f70
RK
8699
8700 /* If SRC has side-effects, then we can't delete this insn, so the
8701 usage of SET_DEST inside SRC counts.
8702
8703 ??? Strictly-speaking, we might be preserving this insn
8704 because some other SET has side-effects, but that's hard
8705 to do and can't happen now. */
8706 count_reg_usage (SET_SRC (x), counts,
8707 side_effects_p (SET_SRC (x)) ? NULL_RTX : SET_DEST (x),
8708 incr);
7afe21cc
RK
8709 return;
8710
f1e7c95f
RK
8711 case CALL_INSN:
8712 count_reg_usage (CALL_INSN_FUNCTION_USAGE (x), counts, NULL_RTX, incr);
8713
8714 /* ... falls through ... */
7afe21cc
RK
8715 case INSN:
8716 case JUMP_INSN:
79644f06 8717 count_reg_usage (PATTERN (x), counts, NULL_RTX, incr);
7afe21cc
RK
8718
8719 /* Things used in a REG_EQUAL note aren't dead since loop may try to
8720 use them. */
8721
f1e7c95f 8722 count_reg_usage (REG_NOTES (x), counts, NULL_RTX, incr);
7afe21cc
RK
8723 return;
8724
8725 case EXPR_LIST:
8726 case INSN_LIST:
f1e7c95f
RK
8727 if (REG_NOTE_KIND (x) == REG_EQUAL
8728 || GET_CODE (XEXP (x,0)) == USE)
79644f06 8729 count_reg_usage (XEXP (x, 0), counts, NULL_RTX, incr);
f1e7c95f 8730 count_reg_usage (XEXP (x, 1), counts, NULL_RTX, incr);
7afe21cc 8731 return;
e9a25f70
JL
8732
8733 default:
8734 break;
7afe21cc
RK
8735 }
8736
8737 fmt = GET_RTX_FORMAT (code);
8738 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
8739 {
8740 if (fmt[i] == 'e')
79644f06 8741 count_reg_usage (XEXP (x, i), counts, dest, incr);
7afe21cc
RK
8742 else if (fmt[i] == 'E')
8743 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
79644f06 8744 count_reg_usage (XVECEXP (x, i, j), counts, dest, incr);
7afe21cc
RK
8745 }
8746}
8747\f
8748/* Scan all the insns and delete any that are dead; i.e., they store a register
8749 that is never used or they copy a register to itself.
8750
8751 This is used to remove insns made obviously dead by cse. It improves the
8752 heuristics in loop since it won't try to move dead invariants out of loops
8753 or make givs for dead quantities. The remaining passes of the compilation
8754 are also sped up. */
8755
8756void
8757delete_dead_from_cse (insns, nreg)
8758 rtx insns;
8759 int nreg;
8760{
8761 int *counts = (int *) alloca (nreg * sizeof (int));
77fa0940 8762 rtx insn, prev;
51723711 8763#ifdef HAVE_cc0
d45cf215 8764 rtx tem;
51723711 8765#endif
7afe21cc 8766 int i;
614bb5d4 8767 int in_libcall = 0, dead_libcall = 0;
7afe21cc
RK
8768
8769 /* First count the number of times each register is used. */
4c9a05bc 8770 bzero ((char *) counts, sizeof (int) * nreg);
7afe21cc 8771 for (insn = next_real_insn (insns); insn; insn = next_real_insn (insn))
79644f06 8772 count_reg_usage (insn, counts, NULL_RTX, 1);
7afe21cc
RK
8773
8774 /* Go from the last insn to the first and delete insns that only set unused
8775 registers or copy a register to itself. As we delete an insn, remove
8776 usage counts for registers it uses. */
77fa0940 8777 for (insn = prev_real_insn (get_last_insn ()); insn; insn = prev)
7afe21cc
RK
8778 {
8779 int live_insn = 0;
614bb5d4 8780 rtx note;
7afe21cc 8781
77fa0940
RK
8782 prev = prev_real_insn (insn);
8783
614bb5d4
JL
8784 /* Don't delete any insns that are part of a libcall block unless
8785 we can delete the whole libcall block.
8786
77fa0940
RK
8787 Flow or loop might get confused if we did that. Remember
8788 that we are scanning backwards. */
906c4e36 8789 if (find_reg_note (insn, REG_RETVAL, NULL_RTX))
614bb5d4
JL
8790 {
8791 in_libcall = 1;
8792 live_insn = 1;
8793 dead_libcall = 0;
e4890d45 8794
614bb5d4
JL
8795 /* See if there's a REG_EQUAL note on this insn and try to
8796 replace the source with the REG_EQUAL expression.
8797
8798 We assume that insns with REG_RETVALs can only be reg->reg
8799 copies at this point. */
8800 note = find_reg_note (insn, REG_EQUAL, NULL_RTX);
8801 if (note)
8802 {
8803 rtx set = single_set (insn);
8804 if (set
8805 && validate_change (insn, &SET_SRC (set), XEXP (note, 0), 0))
8806 {
8807 remove_note (insn,
8808 find_reg_note (insn, REG_RETVAL, NULL_RTX));
8809 dead_libcall = 1;
8810 }
8811 }
8812 }
8813 else if (in_libcall)
8814 live_insn = ! dead_libcall;
e4890d45 8815 else if (GET_CODE (PATTERN (insn)) == SET)
7afe21cc
RK
8816 {
8817 if (GET_CODE (SET_DEST (PATTERN (insn))) == REG
8818 && SET_DEST (PATTERN (insn)) == SET_SRC (PATTERN (insn)))
8819 ;
8820
d45cf215
RS
8821#ifdef HAVE_cc0
8822 else if (GET_CODE (SET_DEST (PATTERN (insn))) == CC0
8823 && ! side_effects_p (SET_SRC (PATTERN (insn)))
8824 && ((tem = next_nonnote_insn (insn)) == 0
8825 || GET_RTX_CLASS (GET_CODE (tem)) != 'i'
8826 || ! reg_referenced_p (cc0_rtx, PATTERN (tem))))
8827 ;
8828#endif
7afe21cc
RK
8829 else if (GET_CODE (SET_DEST (PATTERN (insn))) != REG
8830 || REGNO (SET_DEST (PATTERN (insn))) < FIRST_PSEUDO_REGISTER
8831 || counts[REGNO (SET_DEST (PATTERN (insn)))] != 0
8832 || side_effects_p (SET_SRC (PATTERN (insn))))
8833 live_insn = 1;
8834 }
8835 else if (GET_CODE (PATTERN (insn)) == PARALLEL)
8836 for (i = XVECLEN (PATTERN (insn), 0) - 1; i >= 0; i--)
8837 {
8838 rtx elt = XVECEXP (PATTERN (insn), 0, i);
8839
8840 if (GET_CODE (elt) == SET)
8841 {
8842 if (GET_CODE (SET_DEST (elt)) == REG
8843 && SET_DEST (elt) == SET_SRC (elt))
8844 ;
8845
d45cf215
RS
8846#ifdef HAVE_cc0
8847 else if (GET_CODE (SET_DEST (elt)) == CC0
8848 && ! side_effects_p (SET_SRC (elt))
8849 && ((tem = next_nonnote_insn (insn)) == 0
8850 || GET_RTX_CLASS (GET_CODE (tem)) != 'i'
8851 || ! reg_referenced_p (cc0_rtx, PATTERN (tem))))
8852 ;
8853#endif
7afe21cc
RK
8854 else if (GET_CODE (SET_DEST (elt)) != REG
8855 || REGNO (SET_DEST (elt)) < FIRST_PSEUDO_REGISTER
8856 || counts[REGNO (SET_DEST (elt))] != 0
8857 || side_effects_p (SET_SRC (elt)))
8858 live_insn = 1;
8859 }
8860 else if (GET_CODE (elt) != CLOBBER && GET_CODE (elt) != USE)
8861 live_insn = 1;
8862 }
8863 else
8864 live_insn = 1;
8865
8866 /* If this is a dead insn, delete it and show registers in it aren't
e4890d45 8867 being used. */
7afe21cc 8868
e4890d45 8869 if (! live_insn)
7afe21cc 8870 {
79644f06 8871 count_reg_usage (insn, counts, NULL_RTX, -1);
77fa0940 8872 delete_insn (insn);
7afe21cc 8873 }
e4890d45 8874
906c4e36 8875 if (find_reg_note (insn, REG_LIBCALL, NULL_RTX))
614bb5d4
JL
8876 {
8877 in_libcall = 0;
8878 dead_libcall = 0;
8879 }
7afe21cc
RK
8880 }
8881}
This page took 1.633726 seconds and 5 git commands to generate.