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