|
|
1.1 root 1: /* Common subexpression elimination for GNU compiler.
2: Copyright (C) 1987, 1988, 1989, 1992, 1993 Free Software Foundation, Inc.
3:
4: This file is part of GNU CC.
5:
6: GNU CC is free software; you can redistribute it and/or modify
7: it under the terms of the GNU General Public License as published by
8: the Free Software Foundation; either version 2, or (at your option)
9: any later version.
10:
11: GNU CC is distributed in the hope that it will be useful,
12: but WITHOUT ANY WARRANTY; without even the implied warranty of
13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14: GNU General Public License for more details.
15:
16: You should have received a copy of the GNU General Public License
17: along with GNU CC; see the file COPYING. If not, write to
18: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
19:
20:
21: #include "config.h"
22: /* Must precede rtl.h for FFS. */
23: #include <stdio.h>
24:
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:
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:
61: Registers 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:
95: Constants 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:
101: Whether a reg or a constant is preferred is determined by the configuration
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:
115: Other 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:
181: Related 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:
192: static 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:
197: static int max_qty;
198:
199: /* Next quantity number to be allocated.
200: This is 1 + the largest number needed so far. */
201:
202: static 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:
207: static int *qty_first_reg;
208: static int *qty_last_reg;
209:
210: /* Index by quantity number, gives the mode of the quantity. */
211:
212: static 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:
219: static rtx *qty_const;
220:
221: /* Indexed by qty number, gives the insn that stored the constant value
222: recorded in `qty_const'. */
223:
224: static 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. */
233: static 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:
239: static 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:
245: static 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:
257: static rtx prev_insn_cc0;
258: static enum machine_mode prev_insn_cc0_mode;
259: #endif
260:
261: /* Previous actual insn. 0 if at first insn of basic block. */
262:
263: static rtx prev_insn;
264:
265: /* Insn being scanned. */
266:
267: static rtx this_insn;
268:
269: /* Index by (pseudo) register number, gives the quantity number
270: of the register's current contents. */
271:
272: static 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:
282: static int *reg_next_eqv;
283: static 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:
288: static 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:
297: static 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:
304: static 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:
309: static 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:
316: static int *all_minus_one;
317: static int *consec_ints;
318:
319: /* CUID of insn that starts the basic block currently being cse-processed. */
320:
321: static int cse_basic_block_start;
322:
323: /* CUID of insn that ends the basic block currently being cse-processed. */
324:
325: static int cse_basic_block_end;
326:
327: /* Vector mapping INSN_UIDs to cuids.
328: The cuids are like uids but increase monotonically always.
329: We use them to see whether a reg is used outside a given basic block. */
330:
331: static int *uid_cuid;
332:
333: /* Highest UID in UID_CUID. */
334: static int max_uid;
335:
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:
343: static 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:
349: static 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:
354: static 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:
359: static 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:
404: struct 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) \
443: (((N) == FRAME_POINTER_REGNUM || (N) == HARD_FRAME_POINTER_REGNUM \
444: || fixed_regs[N]) \
445: && ! OVERLAPPING_REGNO_P ((N)))
446: #else
447: #define FIXED_REGNO_P(N) \
448: ((N) == FRAME_POINTER_REGNUM || (N) == HARD_FRAME_POINTER_REGNUM \
449: || fixed_regs[N])
450: #endif
451:
452: /* Compute cost of X, as stored in the `cost' field of a table_elt. Fixed
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) \
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 \
462: && FIXED_REGNO_P (N) && REGNO_REG_CLASS (N) != NO_REGS))
463:
464: #define COST(X) \
465: (GET_CODE (X) == REG \
466: ? (CHEAP_REG (REGNO (X)) ? 0 \
467: : REGNO (X) >= FIRST_PSEUDO_REGISTER ? 1 \
468: : 2) \
469: : rtx_cost (X, SET) * 2)
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:
476: static 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:
481: static struct table_elt *free_element_chain;
482:
483: /* Number of `struct table_elt' structures made so far for this function. */
484:
485: static int n_elements_made;
486:
487: /* Maximum value `n_elements_made' has had so far in this compilation
488: for functions previously processed. */
489:
490: static 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:
496: static 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:
503: static 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:
518: struct 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:
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:
532: struct 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:
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) \
559: ((X) == frame_pointer_rtx || (X) == hard_frame_pointer_rtx \
560: || (X) == arg_pointer_rtx \
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 \
565: || XEXP (X, 0) == hard_frame_pointer_rtx \
566: || XEXP (X, 0) == arg_pointer_rtx \
567: || XEXP (X, 0) == virtual_stack_vars_rtx \
568: || XEXP (X, 0) == virtual_incoming_args_rtx)))
569:
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. */
575:
576: #define NONZERO_BASE_PLUS_P(X) \
577: ((X) == frame_pointer_rtx || (X) == hard_frame_pointer_rtx \
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 \
582: || XEXP (X, 0) == hard_frame_pointer_rtx \
583: || XEXP (X, 0) == arg_pointer_rtx \
584: || XEXP (X, 0) == virtual_stack_vars_rtx \
585: || XEXP (X, 0) == virtual_incoming_args_rtx)) \
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:
594: static void new_basic_block PROTO((void));
595: static void make_new_qty PROTO((int));
596: static void make_regs_eqv PROTO((int, int));
597: static void delete_reg_equiv PROTO((int));
598: static int mention_regs PROTO((rtx));
599: static int insert_regs PROTO((rtx, struct table_elt *, int));
600: static void free_element PROTO((struct table_elt *));
601: static void remove_from_table PROTO((struct table_elt *, int));
602: static struct table_elt *get_element PROTO((void));
603: static struct table_elt *lookup PROTO((rtx, int, enum machine_mode)),
604: *lookup_for_remove PROTO((rtx, int, enum machine_mode));
605: static rtx lookup_as_function PROTO((rtx, enum rtx_code));
606: static struct table_elt *insert PROTO((rtx, struct table_elt *, int,
607: enum machine_mode));
608: static void merge_equiv_classes PROTO((struct table_elt *,
609: struct table_elt *));
610: static void invalidate PROTO((rtx));
611: static void remove_invalid_refs PROTO((int));
612: static void rehash_using_reg PROTO((rtx));
613: static void invalidate_memory PROTO((struct write_data *));
614: static void invalidate_for_call PROTO((void));
615: static rtx use_related_value PROTO((rtx, struct table_elt *));
616: static int canon_hash PROTO((rtx, enum machine_mode));
617: static int safe_hash PROTO((rtx, enum machine_mode));
618: static int exp_equiv_p PROTO((rtx, rtx, int, int));
619: static void set_nonvarying_address_components PROTO((rtx, int, rtx *,
620: HOST_WIDE_INT *,
621: HOST_WIDE_INT *));
622: static int refers_to_p PROTO((rtx, rtx));
623: static int refers_to_mem_p PROTO((rtx, rtx, HOST_WIDE_INT,
624: HOST_WIDE_INT));
625: static int cse_rtx_addr_varies_p PROTO((rtx));
626: static rtx canon_reg PROTO((rtx, rtx));
627: static void find_best_addr PROTO((rtx, rtx *));
628: static enum rtx_code find_comparison_args PROTO((enum rtx_code, rtx *, rtx *,
629: enum machine_mode *,
630: enum machine_mode *));
631: static rtx cse_gen_binary PROTO((enum rtx_code, enum machine_mode,
632: rtx, rtx));
633: static rtx simplify_plus_minus PROTO((enum rtx_code, enum machine_mode,
634: rtx, rtx));
635: static rtx fold_rtx PROTO((rtx, rtx));
636: static rtx equiv_constant PROTO((rtx));
637: static void record_jump_equiv PROTO((rtx, int));
638: static void record_jump_cond PROTO((enum rtx_code, enum machine_mode,
639: rtx, rtx, int));
640: static void cse_insn PROTO((rtx, int));
641: static void note_mem_written PROTO((rtx, struct write_data *));
642: static void invalidate_from_clobbers PROTO((struct write_data *, rtx));
643: static rtx cse_process_notes PROTO((rtx, rtx));
644: static void cse_around_loop PROTO((rtx));
645: static void invalidate_skipped_set PROTO((rtx, rtx));
646: static void invalidate_skipped_block PROTO((rtx));
647: static void cse_check_loop_start PROTO((rtx, rtx));
648: static void cse_set_around_loop PROTO((rtx, rtx, rtx));
649: static rtx cse_basic_block PROTO((rtx, rtx, struct branch_path *, int));
650: static void count_reg_usage PROTO((rtx, int *, int));
651:
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:
663: int
664: rtx_cost (x, outer_code)
665: rtx x;
666: enum rtx_code outer_code;
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;
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;
707: default:
708: total = 2;
709: }
710:
711: switch (code)
712: {
713: case REG:
714: return ! CHEAP_REG (REGNO (x));
715:
716: case SUBREG:
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);
722: return 2;
723: #ifdef RTX_COSTS
724: RTX_COSTS (x, code, outer_code);
725: #endif
726: CONST_COSTS (x, code, outer_code);
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')
735: total += rtx_cost (XEXP (x, i), code);
736: else if (fmt[i] == 'E')
737: for (j = 0; j < XVECLEN (x, i); j++)
738: total += rtx_cost (XVECEXP (x, i, j), code);
739:
740: return total;
741: }
742:
743: /* Clear the hash table and initialize each register with its own quantity,
744: for a new basic block. */
745:
746: static void
747: new_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:
784: static void
785: make_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:
805: static void
806: make_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
827: they cannot be used in substitutions or canonicalizations
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:
866: static void
867: delete_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:
902: static int
903: mention_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)
912: return 0;
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))))
948: if (insert_regs (XEXP (x, 0), NULL_PTR, 0))
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))))
956: if (insert_regs (XEXP (x, 1), NULL_PTR, 0))
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:
984: static int
985: insert_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:
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))
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: }
1018:
1019: return 0;
1020: }
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: {
1031: insert_regs (SUBREG_REG (x), NULL_PTR, 0);
1032: mention_regs (SUBREG_REG (x));
1033: return 1;
1034: }
1035: else
1036: return mention_regs (x);
1037: }
1038:
1039: /* Look in or update the hash table. */
1040:
1041: /* Put the element ELT on the list of free elements. */
1042:
1043: static void
1044: free_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:
1053: static struct table_elt *
1054: get_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:
1071: static void
1072: remove_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:
1151: static struct table_elt *
1152: lookup (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:
1170: static struct table_elt *
1171: lookup_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:
1201: static rtx
1202: lookup_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
1235: find the cheapest when a register is retrieved from the table.
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:
1248: static struct table_elt *
1249: insert (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)
1389: subelt = insert (subexp, NULL_PTR, subhash, mode);
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:
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:
1416: static void
1417: merge_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:
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:
1472: static void
1473: invalidate (x)
1474: rtx x;
1475: {
1476: register int i;
1477: register struct table_elt *p;
1478: rtx base;
1479: HOST_WIDE_INT start, end;
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: {
1508: HOST_WIDE_INT in_table
1509: = TEST_HARD_REG_BIT (hard_regs_in_table, regno);
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 ();
1559:
1560: set_nonvarying_address_components (XEXP (x, 0), GET_MODE_SIZE (GET_MODE (x)),
1561: &base, &start, &end);
1562:
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:
1580: static void
1581: remove_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
1592: && refers_to_regno_p (regno, regno + 1, p->exp, NULL_PTR))
1593: remove_from_table (p, i);
1594: }
1595: }
1596:
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:
1602: static void
1603: rehash_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)
1630: && exp_equiv_p (p->exp, p->exp, 1, 0)
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:
1650: /* Remove from the hash table all expressions that reference memory,
1651: or some of them as specified by *WRITES. */
1652:
1653: static void
1654: invalidate_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:
1674: /* Remove from the hash table any expression that is a call-clobbered
1675: register. Also update their TICK values. */
1676:
1677: static void
1678: invalidate_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:
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:
1733: static rtx
1734: use_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;
1740: HOST_WIDE_INT offset;
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:
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:
1817: static int
1818: canon_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
1849: && regno != HARD_FRAME_POINTER_REGNUM
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. */
1883: return (hash + ((HOST_WIDE_INT) LABEL_REF << 7)
1884: + ((HOST_WIDE_INT) XEXP (x, 0) & ((1 << HASHBITS) - 1)));
1885:
1886: case SYMBOL_REF:
1887: return (hash + ((HOST_WIDE_INT) SYMBOL_REF << 7)
1888: + ((HOST_WIDE_INT) XEXP (x, 0) & ((1 << HASHBITS) - 1)));
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:
1982: static int
1983: safe_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:
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:
2012: static int
2013: exp_equiv_p (x, y, validate, equal_values)
2014: rtx x, y;
2015: int validate;
2016: int equal_values;
2017: {
2018: register int i, j;
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:
2064: return INTVAL (x) == INTVAL (y);
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: {
2118: switch (fmt[i])
2119: {
2120: case 'e':
2121: if (! exp_equiv_p (XEXP (x, i), XEXP (y, i), validate, equal_values))
2122: return 0;
2123: break;
2124:
2125: case 'E':
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;
2132: break;
2133:
2134: case 's':
2135: if (strcmp (XSTR (x, i), XSTR (y, i)))
2136: return 0;
2137: break;
2138:
2139: case 'i':
2140: if (XINT (x, i) != XINT (y, i))
2141: return 0;
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 ();
2154: }
2155: }
2156:
2157: return 1;
2158: }
2159:
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:
2164: static int
2165: refers_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:
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:
2221: static void
2222: set_nonvarying_address_components (addr, size, pbase, pstart, pend)
2223: rtx addr;
2224: int size;
2225: rtx *pbase;
2226: HOST_WIDE_INT *pstart, *pend;
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:
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:
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.
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:
2293: static int
2294: refers_to_mem_p (x, base, start, end)
2295: rtx x, base;
2296: HOST_WIDE_INT start, end;
2297: {
2298: register HOST_WIDE_INT i;
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. */
2317: rtx mybase;
2318: HOST_WIDE_INT mystart, myend;
2319:
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. */
2327: if (! rtx_equal_p (mybase, base))
2328: return 0;
2329:
2330: return myend > start && mystart < end;
2331: }
2332:
2333: #ifdef MACHO_PIC
2334: if (code == PLUS && XEXP (x, 0) == pic_offset_table_rtx)
2335: {
2336: x = XEXP (XEXP (XEXP (x, 1), 0), 0);
2337: goto repeat;
2338: }
2339: #endif
2340:
2341: /* X does not match, so try its subexpressions. */
2342:
2343: fmt = GET_RTX_FORMAT (code);
2344: for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
2345: if (fmt[i] == 'e')
2346: {
2347: if (i == 0)
2348: {
2349: x = XEXP (x, 0);
2350: goto repeat;
2351: }
2352: else
2353: if (refers_to_mem_p (XEXP (x, i), base, start, end))
2354: return 1;
2355: }
2356: else if (fmt[i] == 'E')
2357: {
2358: int j;
2359: for (j = 0; j < XVECLEN (x, i); j++)
2360: if (refers_to_mem_p (XVECEXP (x, i, j), base, start, end))
2361: return 1;
2362: }
2363:
2364: return 0;
2365: }
2366:
2367: /* Nonzero if X refers to memory at a varying address;
2368: except that a register which has at the moment a known constant value
2369: isn't considered variable. */
2370:
2371: static int
2372: cse_rtx_addr_varies_p (x)
2373: rtx x;
2374: {
2375: /* We need not check for X and the equivalence class being of the same
2376: mode because if X is equivalent to a constant in some mode, it
2377: doesn't vary in any mode. */
2378:
2379: if (GET_CODE (x) == MEM
2380: && GET_CODE (XEXP (x, 0)) == REG
2381: && REGNO_QTY_VALID_P (REGNO (XEXP (x, 0)))
2382: && GET_MODE (XEXP (x, 0)) == qty_mode[reg_qty[REGNO (XEXP (x, 0))]]
2383: && qty_const[reg_qty[REGNO (XEXP (x, 0))]] != 0)
2384: return 0;
2385:
2386: if (GET_CODE (x) == MEM
2387: && GET_CODE (XEXP (x, 0)) == PLUS
2388: && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
2389: && GET_CODE (XEXP (XEXP (x, 0), 0)) == REG
2390: && REGNO_QTY_VALID_P (REGNO (XEXP (XEXP (x, 0), 0)))
2391: && (GET_MODE (XEXP (XEXP (x, 0), 0))
2392: == qty_mode[reg_qty[REGNO (XEXP (XEXP (x, 0), 0))]])
2393: && qty_const[reg_qty[REGNO (XEXP (XEXP (x, 0), 0))]])
2394: return 0;
2395:
2396: return rtx_addr_varies_p (x);
2397: }
2398:
2399: /* Canonicalize an expression:
2400: replace each register reference inside it
2401: with the "oldest" equivalent register.
2402:
2403: If INSN is non-zero and we are replacing a pseudo with a hard register
2404: or vice versa, validate_change is used to ensure that INSN remains valid
2405: after we make our substitution. The calls are made with IN_GROUP non-zero
2406: so apply_change_group must be called upon the outermost return from this
2407: function (unless INSN is zero). The result of apply_change_group can
2408: generally be discarded since the changes we are making are optional. */
2409:
2410: static rtx
2411: canon_reg (x, insn)
2412: rtx x;
2413: rtx insn;
2414: {
2415: register int i;
2416: register enum rtx_code code;
2417: register char *fmt;
2418:
2419: if (x == 0)
2420: return x;
2421:
2422: code = GET_CODE (x);
2423: switch (code)
2424: {
2425: case PC:
2426: case CC0:
2427: case CONST:
2428: case CONST_INT:
2429: case CONST_DOUBLE:
2430: case SYMBOL_REF:
2431: case LABEL_REF:
2432: case ADDR_VEC:
2433: case ADDR_DIFF_VEC:
2434: return x;
2435:
2436: case REG:
2437: {
2438: register int first;
2439:
2440: /* Never replace a hard reg, because hard regs can appear
2441: in more than one machine mode, and we must preserve the mode
2442: of each occurrence. Also, some hard regs appear in
2443: MEMs that are shared and mustn't be altered. Don't try to
2444: replace any reg that maps to a reg of class NO_REGS. */
2445: if (REGNO (x) < FIRST_PSEUDO_REGISTER
2446: || ! REGNO_QTY_VALID_P (REGNO (x)))
2447: return x;
2448:
2449: first = qty_first_reg[reg_qty[REGNO (x)]];
2450: return (first >= FIRST_PSEUDO_REGISTER ? regno_reg_rtx[first]
2451: : REGNO_REG_CLASS (first) == NO_REGS ? x
2452: : gen_rtx (REG, qty_mode[reg_qty[REGNO (x)]], first));
2453: }
2454: }
2455:
2456: fmt = GET_RTX_FORMAT (code);
2457: for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
2458: {
2459: register int j;
2460:
2461: if (fmt[i] == 'e')
2462: {
2463: rtx new = canon_reg (XEXP (x, i), insn);
2464:
2465: /* If replacing pseudo with hard reg or vice versa, ensure the
2466: insn remains valid. Likewise if the insn has MATCH_DUPs. */
2467: if (insn != 0 && new != 0
2468: && GET_CODE (new) == REG && GET_CODE (XEXP (x, i)) == REG
2469: && (((REGNO (new) < FIRST_PSEUDO_REGISTER)
2470: != (REGNO (XEXP (x, i)) < FIRST_PSEUDO_REGISTER))
2471: || insn_n_dups[recog_memoized (insn)] > 0))
2472: validate_change (insn, &XEXP (x, i), new, 1);
2473: else
2474: XEXP (x, i) = new;
2475: }
2476: else if (fmt[i] == 'E')
2477: for (j = 0; j < XVECLEN (x, i); j++)
2478: XVECEXP (x, i, j) = canon_reg (XVECEXP (x, i, j), insn);
2479: }
2480:
2481: return x;
2482: }
2483:
2484: /* LOC is a location with INSN that is an operand address (the contents of
2485: a MEM). Find the best equivalent address to use that is valid for this
2486: insn.
2487:
2488: On most CISC machines, complicated address modes are costly, and rtx_cost
2489: is a good approximation for that cost. However, most RISC machines have
2490: only a few (usually only one) memory reference formats. If an address is
2491: valid at all, it is often just as cheap as any other address. Hence, for
2492: RISC machines, we use the configuration macro `ADDRESS_COST' to compare the
2493: costs of various addresses. For two addresses of equal cost, choose the one
2494: with the highest `rtx_cost' value as that has the potential of eliminating
2495: the most insns. For equal costs, we choose the first in the equivalence
2496: class. Note that we ignore the fact that pseudo registers are cheaper
2497: than hard registers here because we would also prefer the pseudo registers.
2498: */
2499:
2500: static void
2501: find_best_addr (insn, loc)
2502: rtx insn;
2503: rtx *loc;
2504: {
2505: struct table_elt *elt, *p;
2506: rtx addr = *loc;
2507: int our_cost;
2508: int found_better = 1;
2509: int save_do_not_record = do_not_record;
2510: int save_hash_arg_in_memory = hash_arg_in_memory;
2511: int save_hash_arg_in_struct = hash_arg_in_struct;
2512: int hash_code;
2513: int addr_volatile;
2514: int regno;
2515:
2516: /* Do not try to replace constant addresses or addresses of local and
2517: argument slots. These MEM expressions are made only once and inserted
2518: in many instructions, as well as being used to control symbol table
2519: output. It is not safe to clobber them.
2520:
2521: There are some uncommon cases where the address is already in a register
2522: for some reason, but we cannot take advantage of that because we have
2523: no easy way to unshare the MEM. In addition, looking up all stack
2524: addresses is costly. */
2525: if ((GET_CODE (addr) == PLUS
2526: && GET_CODE (XEXP (addr, 0)) == REG
2527: && GET_CODE (XEXP (addr, 1)) == CONST_INT
2528: && (regno = REGNO (XEXP (addr, 0)),
2529: regno == FRAME_POINTER_REGNUM || regno == HARD_FRAME_POINTER_REGNUM
2530: || regno == ARG_POINTER_REGNUM))
2531: || (GET_CODE (addr) == REG
2532: && (regno = REGNO (addr), regno == FRAME_POINTER_REGNUM
2533: || regno == HARD_FRAME_POINTER_REGNUM
2534: || regno == ARG_POINTER_REGNUM))
2535: || CONSTANT_ADDRESS_P (addr))
2536: return;
2537:
2538: /* If this address is not simply a register, try to fold it. This will
2539: sometimes simplify the expression. Many simplifications
2540: will not be valid, but some, usually applying the associative rule, will
2541: be valid and produce better code. */
2542: if (GET_CODE (addr) != REG
2543: && validate_change (insn, loc, fold_rtx (addr, insn), 0))
2544: addr = *loc;
2545:
2546: /* If this address is not in the hash table, we can't look for equivalences
2547: of the whole address. Also, ignore if volatile. */
2548:
2549: do_not_record = 0;
2550: hash_code = HASH (addr, Pmode);
2551: addr_volatile = do_not_record;
2552: do_not_record = save_do_not_record;
2553: hash_arg_in_memory = save_hash_arg_in_memory;
2554: hash_arg_in_struct = save_hash_arg_in_struct;
2555:
2556: if (addr_volatile)
2557: return;
2558:
2559: elt = lookup (addr, hash_code, Pmode);
2560:
2561: #ifndef ADDRESS_COST
2562: if (elt)
2563: {
2564: our_cost = elt->cost;
2565:
2566: /* Find the lowest cost below ours that works. */
2567: for (elt = elt->first_same_value; elt; elt = elt->next_same_value)
2568: if (elt->cost < our_cost
2569: && (GET_CODE (elt->exp) == REG
2570: || exp_equiv_p (elt->exp, elt->exp, 1, 0))
2571: && validate_change (insn, loc,
2572: canon_reg (copy_rtx (elt->exp), NULL_RTX), 0))
2573: return;
2574: }
2575: #else
2576:
2577: if (elt)
2578: {
2579: /* We need to find the best (under the criteria documented above) entry
2580: in the class that is valid. We use the `flag' field to indicate
2581: choices that were invalid and iterate until we can't find a better
2582: one that hasn't already been tried. */
2583:
2584: for (p = elt->first_same_value; p; p = p->next_same_value)
2585: p->flag = 0;
2586:
2587: while (found_better)
2588: {
2589: int best_addr_cost = ADDRESS_COST (*loc);
2590: int best_rtx_cost = (elt->cost + 1) >> 1;
2591: struct table_elt *best_elt = elt;
2592:
2593: found_better = 0;
2594: for (p = elt->first_same_value; p; p = p->next_same_value)
2595: if (! p->flag
2596: && (GET_CODE (p->exp) == REG
2597: || exp_equiv_p (p->exp, p->exp, 1, 0))
2598: && (ADDRESS_COST (p->exp) < best_addr_cost
2599: || (ADDRESS_COST (p->exp) == best_addr_cost
2600: && (p->cost + 1) >> 1 > best_rtx_cost)))
2601: {
2602: found_better = 1;
2603: best_addr_cost = ADDRESS_COST (p->exp);
2604: best_rtx_cost = (p->cost + 1) >> 1;
2605: best_elt = p;
2606: }
2607:
2608: if (found_better)
2609: {
2610: if (validate_change (insn, loc,
2611: canon_reg (copy_rtx (best_elt->exp),
2612: NULL_RTX), 0))
2613: return;
2614: else
2615: best_elt->flag = 1;
2616: }
2617: }
2618: }
2619:
2620: /* If the address is a binary operation with the first operand a register
2621: and the second a constant, do the same as above, but looking for
2622: equivalences of the register. Then try to simplify before checking for
2623: the best address to use. This catches a few cases: First is when we
2624: have REG+const and the register is another REG+const. We can often merge
2625: the constants and eliminate one insn and one register. It may also be
2626: that a machine has a cheap REG+REG+const. Finally, this improves the
2627: code on the Alpha for unaligned byte stores. */
2628:
2629: if (flag_expensive_optimizations
2630: && (GET_RTX_CLASS (GET_CODE (*loc)) == '2'
2631: || GET_RTX_CLASS (GET_CODE (*loc)) == 'c')
2632: && GET_CODE (XEXP (*loc, 0)) == REG
2633: && GET_CODE (XEXP (*loc, 1)) == CONST_INT)
2634: {
2635: rtx c = XEXP (*loc, 1);
2636:
2637: do_not_record = 0;
2638: hash_code = HASH (XEXP (*loc, 0), Pmode);
2639: do_not_record = save_do_not_record;
2640: hash_arg_in_memory = save_hash_arg_in_memory;
2641: hash_arg_in_struct = save_hash_arg_in_struct;
2642:
2643: elt = lookup (XEXP (*loc, 0), hash_code, Pmode);
2644: if (elt == 0)
2645: return;
2646:
2647: /* We need to find the best (under the criteria documented above) entry
2648: in the class that is valid. We use the `flag' field to indicate
2649: choices that were invalid and iterate until we can't find a better
2650: one that hasn't already been tried. */
2651:
2652: for (p = elt->first_same_value; p; p = p->next_same_value)
2653: p->flag = 0;
2654:
2655: while (found_better)
2656: {
2657: int best_addr_cost = ADDRESS_COST (*loc);
2658: int best_rtx_cost = (COST (*loc) + 1) >> 1;
2659: struct table_elt *best_elt = elt;
2660: rtx best_rtx = *loc;
2661:
2662: found_better = 0;
2663: for (p = elt->first_same_value; p; p = p->next_same_value)
2664: if (! p->flag
2665: && (GET_CODE (p->exp) == REG
2666: || exp_equiv_p (p->exp, p->exp, 1, 0)))
2667: {
2668: rtx new = cse_gen_binary (GET_CODE (*loc), Pmode, p->exp, c);
2669:
2670: if ((ADDRESS_COST (new) < best_addr_cost
2671: || (ADDRESS_COST (new) == best_addr_cost
2672: && (COST (new) + 1) >> 1 > best_rtx_cost)))
2673: {
2674: found_better = 1;
2675: best_addr_cost = ADDRESS_COST (new);
2676: best_rtx_cost = (COST (new) + 1) >> 1;
2677: best_elt = p;
2678: best_rtx = new;
2679: }
2680: }
2681:
2682: if (found_better)
2683: {
2684: if (validate_change (insn, loc,
2685: canon_reg (copy_rtx (best_rtx),
2686: NULL_RTX), 0))
2687: return;
2688: else
2689: best_elt->flag = 1;
2690: }
2691: }
2692: }
2693: #endif
2694: }
2695:
2696: /* Given an operation (CODE, *PARG1, *PARG2), where code is a comparison
2697: operation (EQ, NE, GT, etc.), follow it back through the hash table and
2698: what values are being compared.
2699:
2700: *PARG1 and *PARG2 are updated to contain the rtx representing the values
2701: actually being compared. For example, if *PARG1 was (cc0) and *PARG2
2702: was (const_int 0), *PARG1 and *PARG2 will be set to the objects that were
2703: compared to produce cc0.
2704:
2705: The return value is the comparison operator and is either the code of
2706: A or the code corresponding to the inverse of the comparison. */
2707:
2708: static enum rtx_code
2709: find_comparison_args (code, parg1, parg2, pmode1, pmode2)
2710: enum rtx_code code;
2711: rtx *parg1, *parg2;
2712: enum machine_mode *pmode1, *pmode2;
2713: {
2714: rtx arg1, arg2;
2715:
2716: arg1 = *parg1, arg2 = *parg2;
2717:
2718: /* If ARG2 is const0_rtx, see what ARG1 is equivalent to. */
2719:
2720: while (arg2 == CONST0_RTX (GET_MODE (arg1)))
2721: {
2722: /* Set non-zero when we find something of interest. */
2723: rtx x = 0;
2724: int reverse_code = 0;
2725: struct table_elt *p = 0;
2726:
2727: /* If arg1 is a COMPARE, extract the comparison arguments from it.
2728: On machines with CC0, this is the only case that can occur, since
2729: fold_rtx will return the COMPARE or item being compared with zero
2730: when given CC0. */
2731:
2732: if (GET_CODE (arg1) == COMPARE && arg2 == const0_rtx)
2733: x = arg1;
2734:
2735: /* If ARG1 is a comparison operator and CODE is testing for
2736: STORE_FLAG_VALUE, get the inner arguments. */
2737:
2738: else if (GET_RTX_CLASS (GET_CODE (arg1)) == '<')
2739: {
2740: if (code == NE
2741: || (GET_MODE_CLASS (GET_MODE (arg1)) == MODE_INT
2742: && code == LT && STORE_FLAG_VALUE == -1)
2743: #ifdef FLOAT_STORE_FLAG_VALUE
2744: || (GET_MODE_CLASS (GET_MODE (arg1)) == MODE_FLOAT
2745: && FLOAT_STORE_FLAG_VALUE < 0)
2746: #endif
2747: )
2748: x = arg1;
2749: else if (code == EQ
2750: || (GET_MODE_CLASS (GET_MODE (arg1)) == MODE_INT
2751: && code == GE && STORE_FLAG_VALUE == -1)
2752: #ifdef FLOAT_STORE_FLAG_VALUE
2753: || (GET_MODE_CLASS (GET_MODE (arg1)) == MODE_FLOAT
2754: && FLOAT_STORE_FLAG_VALUE < 0)
2755: #endif
2756: )
2757: x = arg1, reverse_code = 1;
2758: }
2759:
2760: /* ??? We could also check for
2761:
2762: (ne (and (eq (...) (const_int 1))) (const_int 0))
2763:
2764: and related forms, but let's wait until we see them occurring. */
2765:
2766: if (x == 0)
2767: /* Look up ARG1 in the hash table and see if it has an equivalence
2768: that lets us see what is being compared. */
2769: p = lookup (arg1, safe_hash (arg1, GET_MODE (arg1)) % NBUCKETS,
2770: GET_MODE (arg1));
2771: if (p) p = p->first_same_value;
2772:
2773: for (; p; p = p->next_same_value)
2774: {
2775: enum machine_mode inner_mode = GET_MODE (p->exp);
2776:
2777: /* If the entry isn't valid, skip it. */
2778: if (! exp_equiv_p (p->exp, p->exp, 1, 0))
2779: continue;
2780:
2781: if (GET_CODE (p->exp) == COMPARE
2782: /* Another possibility is that this machine has a compare insn
2783: that includes the comparison code. In that case, ARG1 would
2784: be equivalent to a comparison operation that would set ARG1 to
2785: either STORE_FLAG_VALUE or zero. If this is an NE operation,
2786: ORIG_CODE is the actual comparison being done; if it is an EQ,
2787: we must reverse ORIG_CODE. On machine with a negative value
2788: for STORE_FLAG_VALUE, also look at LT and GE operations. */
2789: || ((code == NE
2790: || (code == LT
2791: && GET_MODE_CLASS (inner_mode) == MODE_INT
2792: && (GET_MODE_BITSIZE (inner_mode)
2793: <= HOST_BITS_PER_WIDE_INT)
2794: && (STORE_FLAG_VALUE
2795: & ((HOST_WIDE_INT) 1
2796: << (GET_MODE_BITSIZE (inner_mode) - 1))))
2797: #ifdef FLOAT_STORE_FLAG_VALUE
2798: || (code == LT
2799: && GET_MODE_CLASS (inner_mode) == MODE_FLOAT
2800: && FLOAT_STORE_FLAG_VALUE < 0)
2801: #endif
2802: )
2803: && GET_RTX_CLASS (GET_CODE (p->exp)) == '<'))
2804: {
2805: x = p->exp;
2806: break;
2807: }
2808: else if ((code == EQ
2809: || (code == GE
2810: && GET_MODE_CLASS (inner_mode) == MODE_INT
2811: && (GET_MODE_BITSIZE (inner_mode)
2812: <= HOST_BITS_PER_WIDE_INT)
2813: && (STORE_FLAG_VALUE
2814: & ((HOST_WIDE_INT) 1
2815: << (GET_MODE_BITSIZE (inner_mode) - 1))))
2816: #ifdef FLOAT_STORE_FLAG_VALUE
2817: || (code == GE
2818: && GET_MODE_CLASS (inner_mode) == MODE_FLOAT
2819: && FLOAT_STORE_FLAG_VALUE < 0)
2820: #endif
2821: )
2822: && GET_RTX_CLASS (GET_CODE (p->exp)) == '<')
2823: {
2824: reverse_code = 1;
2825: x = p->exp;
2826: break;
2827: }
2828:
2829: /* If this is fp + constant, the equivalent is a better operand since
2830: it may let us predict the value of the comparison. */
2831: else if (NONZERO_BASE_PLUS_P (p->exp))
2832: {
2833: arg1 = p->exp;
2834: continue;
2835: }
2836: }
2837:
2838: /* If we didn't find a useful equivalence for ARG1, we are done.
2839: Otherwise, set up for the next iteration. */
2840: if (x == 0)
2841: break;
2842:
2843: arg1 = XEXP (x, 0), arg2 = XEXP (x, 1);
2844: if (GET_RTX_CLASS (GET_CODE (x)) == '<')
2845: code = GET_CODE (x);
2846:
2847: if (reverse_code)
2848: code = reverse_condition (code);
2849: }
2850:
2851: /* Return our results. Return the modes from before fold_rtx
2852: because fold_rtx might produce const_int, and then it's too late. */
2853: *pmode1 = GET_MODE (arg1), *pmode2 = GET_MODE (arg2);
2854: *parg1 = fold_rtx (arg1, 0), *parg2 = fold_rtx (arg2, 0);
2855:
2856: return code;
2857: }
2858:
2859: /* Try to simplify a unary operation CODE whose output mode is to be
2860: MODE with input operand OP whose mode was originally OP_MODE.
2861: Return zero if no simplification can be made. */
2862:
2863: rtx
2864: simplify_unary_operation (code, mode, op, op_mode)
2865: enum rtx_code code;
2866: enum machine_mode mode;
2867: rtx op;
2868: enum machine_mode op_mode;
2869: {
2870: register int width = GET_MODE_BITSIZE (mode);
2871:
2872: /* The order of these tests is critical so that, for example, we don't
2873: check the wrong mode (input vs. output) for a conversion operation,
2874: such as FIX. At some point, this should be simplified. */
2875:
2876: #if !defined (REAL_IS_NOT_DOUBLE) || defined (REAL_ARITHMETIC)
2877: if (code == FLOAT && GET_CODE (op) == CONST_INT)
2878: {
2879: REAL_VALUE_TYPE d;
2880:
2881: #ifdef REAL_ARITHMETIC
2882: REAL_VALUE_FROM_INT (d, INTVAL (op), INTVAL (op) < 0 ? ~0 : 0);
2883: #else
2884: d = (double) INTVAL (op);
2885: #endif
2886: return CONST_DOUBLE_FROM_REAL_VALUE (d, mode);
2887: }
2888: else if (code == UNSIGNED_FLOAT && GET_CODE (op) == CONST_INT)
2889: {
2890: REAL_VALUE_TYPE d;
2891:
2892: #ifdef REAL_ARITHMETIC
2893: REAL_VALUE_FROM_INT (d, INTVAL (op), 0);
2894: #else
2895: d = (double) (unsigned int) INTVAL (op);
2896: #endif
2897: return CONST_DOUBLE_FROM_REAL_VALUE (d, mode);
2898: }
2899:
2900: else if (code == FLOAT && GET_CODE (op) == CONST_DOUBLE
2901: && GET_MODE (op) == VOIDmode)
2902: {
2903: REAL_VALUE_TYPE d;
2904:
2905: #ifdef REAL_ARITHMETIC
2906: REAL_VALUE_FROM_INT (d, CONST_DOUBLE_LOW (op), CONST_DOUBLE_HIGH (op));
2907: #else
2908: if (CONST_DOUBLE_HIGH (op) < 0)
2909: {
2910: d = (double) (~ CONST_DOUBLE_HIGH (op));
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));
2914: d = (- d - 1.0);
2915: }
2916: else
2917: {
2918: d = (double) CONST_DOUBLE_HIGH (op);
2919: d *= ((double) ((HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT / 2))
2920: * (double) ((HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT / 2)));
2921: d += (double) (unsigned HOST_WIDE_INT) CONST_DOUBLE_LOW (op);
2922: }
2923: #endif /* REAL_ARITHMETIC */
2924: return CONST_DOUBLE_FROM_REAL_VALUE (d, mode);
2925: }
2926: else if (code == UNSIGNED_FLOAT && GET_CODE (op) == CONST_DOUBLE
2927: && GET_MODE (op) == VOIDmode)
2928: {
2929: REAL_VALUE_TYPE d;
2930:
2931: #ifdef REAL_ARITHMETIC
2932: REAL_VALUE_FROM_UNSIGNED_INT (d, CONST_DOUBLE_LOW (op),
2933: CONST_DOUBLE_HIGH (op));
2934: #else
2935: d = (double) CONST_DOUBLE_HIGH (op);
2936: d *= ((double) ((HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT / 2))
2937: * (double) ((HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT / 2)));
2938: d += (double) (unsigned HOST_WIDE_INT) CONST_DOUBLE_LOW (op);
2939: #endif /* REAL_ARITHMETIC */
2940: return CONST_DOUBLE_FROM_REAL_VALUE (d, mode);
2941: }
2942: #endif
2943:
2944: if (GET_CODE (op) == CONST_INT
2945: && width <= HOST_BITS_PER_WIDE_INT && width > 0)
2946: {
2947: register HOST_WIDE_INT arg0 = INTVAL (op);
2948: register HOST_WIDE_INT val;
2949:
2950: switch (code)
2951: {
2952: case NOT:
2953: val = ~ arg0;
2954: break;
2955:
2956: case NEG:
2957: val = - arg0;
2958: break;
2959:
2960: case ABS:
2961: val = (arg0 >= 0 ? arg0 : - arg0);
2962: break;
2963:
2964: case FFS:
2965: /* Don't use ffs here. Instead, get low order bit and then its
2966: number. If arg0 is zero, this will return 0, as desired. */
2967: arg0 &= GET_MODE_MASK (mode);
2968: val = exact_log2 (arg0 & (- arg0)) + 1;
2969: break;
2970:
2971: case TRUNCATE:
2972: val = arg0;
2973: break;
2974:
2975: case ZERO_EXTEND:
2976: if (op_mode == VOIDmode)
2977: op_mode = mode;
2978: if (GET_MODE_BITSIZE (op_mode) == HOST_BITS_PER_WIDE_INT)
2979: {
2980: /* If we were really extending the mode,
2981: we would have to distinguish between zero-extension
2982: and sign-extension. */
2983: if (width != GET_MODE_BITSIZE (op_mode))
2984: abort ();
2985: val = arg0;
2986: }
2987: else if (GET_MODE_BITSIZE (op_mode) < HOST_BITS_PER_WIDE_INT)
2988: val = arg0 & ~((HOST_WIDE_INT) (-1) << GET_MODE_BITSIZE (op_mode));
2989: else
2990: return 0;
2991: break;
2992:
2993: case SIGN_EXTEND:
2994: if (op_mode == VOIDmode)
2995: op_mode = mode;
2996: if (GET_MODE_BITSIZE (op_mode) == HOST_BITS_PER_WIDE_INT)
2997: {
2998: /* If we were really extending the mode,
2999: we would have to distinguish between zero-extension
3000: and sign-extension. */
3001: if (width != GET_MODE_BITSIZE (op_mode))
3002: abort ();
3003: val = arg0;
3004: }
3005: else if (GET_MODE_BITSIZE (op_mode) < HOST_BITS_PER_WIDE_INT)
3006: {
3007: val
3008: = arg0 & ~((HOST_WIDE_INT) (-1) << GET_MODE_BITSIZE (op_mode));
3009: if (val
3010: & ((HOST_WIDE_INT) 1 << (GET_MODE_BITSIZE (op_mode) - 1)))
3011: val -= (HOST_WIDE_INT) 1 << GET_MODE_BITSIZE (op_mode);
3012: }
3013: else
3014: return 0;
3015: break;
3016:
3017: case SQRT:
3018: return 0;
3019:
3020: default:
3021: abort ();
3022: }
3023:
3024: /* Clear the bits that don't belong in our mode,
3025: unless they and our sign bit are all one.
3026: So we get either a reasonable negative value or a reasonable
3027: unsigned value for this mode. */
3028: if (width < HOST_BITS_PER_WIDE_INT
3029: && ((val & ((HOST_WIDE_INT) (-1) << (width - 1)))
3030: != ((HOST_WIDE_INT) (-1) << (width - 1))))
3031: val &= (1 << width) - 1;
3032:
3033: return GEN_INT (val);
3034: }
3035:
3036: /* We can do some operations on integer CONST_DOUBLEs. Also allow
3037: for a DImode operation on a CONST_INT. */
3038: else if (GET_MODE (op) == VOIDmode
3039: && (GET_CODE (op) == CONST_DOUBLE || GET_CODE (op) == CONST_INT))
3040: {
3041: HOST_WIDE_INT l1, h1, lv, hv;
3042:
3043: if (GET_CODE (op) == CONST_DOUBLE)
3044: l1 = CONST_DOUBLE_LOW (op), h1 = CONST_DOUBLE_HIGH (op);
3045: else
3046: l1 = INTVAL (op), h1 = l1 < 0 ? -1 : 0;
3047:
3048: switch (code)
3049: {
3050: case NOT:
3051: lv = ~ l1;
3052: hv = ~ h1;
3053: break;
3054:
3055: case NEG:
3056: neg_double (l1, h1, &lv, &hv);
3057: break;
3058:
3059: case ABS:
3060: if (h1 < 0)
3061: neg_double (l1, h1, &lv, &hv);
3062: else
3063: lv = l1, hv = h1;
3064: break;
3065:
3066: case FFS:
3067: hv = 0;
3068: if (l1 == 0)
3069: lv = HOST_BITS_PER_WIDE_INT + exact_log2 (h1 & (-h1)) + 1;
3070: else
3071: lv = exact_log2 (l1 & (-l1)) + 1;
3072: break;
3073:
3074: case TRUNCATE:
3075: if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
3076: return GEN_INT (l1 & GET_MODE_MASK (mode));
3077: else
3078: return 0;
3079: break;
3080:
3081: case ZERO_EXTEND:
3082: if (op_mode == VOIDmode
3083: || GET_MODE_BITSIZE (op_mode) > HOST_BITS_PER_WIDE_INT)
3084: return 0;
3085:
3086: hv = 0;
3087: lv = l1 & GET_MODE_MASK (op_mode);
3088: break;
3089:
3090: case SIGN_EXTEND:
3091: if (op_mode == VOIDmode
3092: || GET_MODE_BITSIZE (op_mode) > HOST_BITS_PER_WIDE_INT)
3093: return 0;
3094: else
3095: {
3096: lv = l1 & GET_MODE_MASK (op_mode);
3097: if (GET_MODE_BITSIZE (op_mode) < HOST_BITS_PER_WIDE_INT
3098: && (lv & ((HOST_WIDE_INT) 1
3099: << (GET_MODE_BITSIZE (op_mode) - 1))) != 0)
3100: lv -= (HOST_WIDE_INT) 1 << GET_MODE_BITSIZE (op_mode);
3101:
3102: hv = (lv < 0) ? ~ (HOST_WIDE_INT) 0 : 0;
3103: }
3104: break;
3105:
3106: case SQRT:
3107: return 0;
3108:
3109: default:
3110: return 0;
3111: }
3112:
3113: return immed_double_const (lv, hv, mode);
3114: }
3115:
3116: #if ! defined (REAL_IS_NOT_DOUBLE) || defined (REAL_ARITHMETIC)
3117: else if (GET_CODE (op) == CONST_DOUBLE
3118: && GET_MODE_CLASS (mode) == MODE_FLOAT)
3119: {
3120: REAL_VALUE_TYPE d;
3121: jmp_buf handler;
3122: rtx x;
3123:
3124: if (setjmp (handler))
3125: /* There used to be a warning here, but that is inadvisable.
3126: People may want to cause traps, and the natural way
3127: to do it should not get a warning. */
3128: return 0;
3129:
3130: set_float_handler (handler);
3131:
3132: REAL_VALUE_FROM_CONST_DOUBLE (d, op);
3133:
3134: switch (code)
3135: {
3136: case NEG:
3137: d = REAL_VALUE_NEGATE (d);
3138: break;
3139:
3140: case ABS:
3141: if (REAL_VALUE_NEGATIVE (d))
3142: d = REAL_VALUE_NEGATE (d);
3143: break;
3144:
3145: case FLOAT_TRUNCATE:
3146: d = real_value_truncate (mode, d);
3147: break;
3148:
3149: case FLOAT_EXTEND:
3150: /* All this does is change the mode. */
3151: break;
3152:
3153: case FIX:
3154: d = REAL_VALUE_RNDZINT (d);
3155: break;
3156:
3157: case UNSIGNED_FIX:
3158: d = REAL_VALUE_UNSIGNED_RNDZINT (d);
3159: break;
3160:
3161: case SQRT:
3162: return 0;
3163:
3164: default:
3165: abort ();
3166: }
3167:
3168: x = immed_real_const_1 (d, mode);
3169: set_float_handler (NULL_PTR);
3170: return x;
3171: }
3172: else if (GET_CODE (op) == CONST_DOUBLE && GET_MODE_CLASS (mode) == MODE_INT
3173: && width <= HOST_BITS_PER_WIDE_INT && width > 0)
3174: {
3175: REAL_VALUE_TYPE d;
3176: jmp_buf handler;
3177: HOST_WIDE_INT val;
3178:
3179: if (setjmp (handler))
3180: return 0;
3181:
3182: set_float_handler (handler);
3183:
3184: REAL_VALUE_FROM_CONST_DOUBLE (d, op);
3185:
3186: switch (code)
3187: {
3188: case FIX:
3189: val = REAL_VALUE_FIX (d);
3190: break;
3191:
3192: case UNSIGNED_FIX:
3193: val = REAL_VALUE_UNSIGNED_FIX (d);
3194: break;
3195:
3196: default:
3197: abort ();
3198: }
3199:
3200: set_float_handler (NULL_PTR);
3201:
3202: /* Clear the bits that don't belong in our mode,
3203: unless they and our sign bit are all one.
3204: So we get either a reasonable negative value or a reasonable
3205: unsigned value for this mode. */
3206: if (width < HOST_BITS_PER_WIDE_INT
3207: && ((val & ((HOST_WIDE_INT) (-1) << (width - 1)))
3208: != ((HOST_WIDE_INT) (-1) << (width - 1))))
3209: val &= ((HOST_WIDE_INT) 1 << width) - 1;
3210:
3211: return GEN_INT (val);
3212: }
3213: #endif
3214: /* This was formerly used only for non-IEEE float.
3215: [email protected] says it is safe for IEEE also. */
3216: else
3217: {
3218: /* There are some simplifications we can do even if the operands
3219: aren't constant. */
3220: switch (code)
3221: {
3222: case NEG:
3223: case NOT:
3224: /* (not (not X)) == X, similarly for NEG. */
3225: if (GET_CODE (op) == code)
3226: return XEXP (op, 0);
3227: break;
3228:
3229: case SIGN_EXTEND:
3230: /* (sign_extend (truncate (minus (label_ref L1) (label_ref L2))))
3231: becomes just the MINUS if its mode is MODE. This allows
3232: folding switch statements on machines using casesi (such as
3233: the Vax). */
3234: if (GET_CODE (op) == TRUNCATE
3235: && GET_MODE (XEXP (op, 0)) == mode
3236: && GET_CODE (XEXP (op, 0)) == MINUS
3237: && GET_CODE (XEXP (XEXP (op, 0), 0)) == LABEL_REF
3238: && GET_CODE (XEXP (XEXP (op, 0), 1)) == LABEL_REF)
3239: return XEXP (op, 0);
3240: break;
3241: }
3242:
3243: return 0;
3244: }
3245: }
3246:
3247: /* Simplify a binary operation CODE with result mode MODE, operating on OP0
3248: and OP1. Return 0 if no simplification is possible.
3249:
3250: Don't use this for relational operations such as EQ or LT.
3251: Use simplify_relational_operation instead. */
3252:
3253: rtx
3254: simplify_binary_operation (code, mode, op0, op1)
3255: enum rtx_code code;
3256: enum machine_mode mode;
3257: rtx op0, op1;
3258: {
3259: register HOST_WIDE_INT arg0, arg1, arg0s, arg1s;
3260: HOST_WIDE_INT val;
3261: int width = GET_MODE_BITSIZE (mode);
3262: rtx tem;
3263:
3264: /* Relational operations don't work here. We must know the mode
3265: of the operands in order to do the comparison correctly.
3266: Assuming a full word can give incorrect results.
3267: Consider comparing 128 with -128 in QImode. */
3268:
3269: if (GET_RTX_CLASS (code) == '<')
3270: abort ();
3271:
3272: #if ! defined (REAL_IS_NOT_DOUBLE) || defined (REAL_ARITHMETIC)
3273: if (GET_MODE_CLASS (mode) == MODE_FLOAT
3274: && GET_CODE (op0) == CONST_DOUBLE && GET_CODE (op1) == CONST_DOUBLE
3275: && mode == GET_MODE (op0) && mode == GET_MODE (op1))
3276: {
3277: REAL_VALUE_TYPE f0, f1, value;
3278: jmp_buf handler;
3279:
3280: if (setjmp (handler))
3281: return 0;
3282:
3283: set_float_handler (handler);
3284:
3285: REAL_VALUE_FROM_CONST_DOUBLE (f0, op0);
3286: REAL_VALUE_FROM_CONST_DOUBLE (f1, op1);
3287: f0 = real_value_truncate (mode, f0);
3288: f1 = real_value_truncate (mode, f1);
3289:
3290: #ifdef REAL_ARITHMETIC
3291: REAL_ARITHMETIC (value, rtx_to_tree_code (code), f0, f1);
3292: #else
3293: switch (code)
3294: {
3295: case PLUS:
3296: value = f0 + f1;
3297: break;
3298: case MINUS:
3299: value = f0 - f1;
3300: break;
3301: case MULT:
3302: value = f0 * f1;
3303: break;
3304: case DIV:
3305: #ifndef REAL_INFINITY
3306: if (f1 == 0)
3307: return 0;
3308: #endif
3309: value = f0 / f1;
3310: break;
3311: case SMIN:
3312: value = MIN (f0, f1);
3313: break;
3314: case SMAX:
3315: value = MAX (f0, f1);
3316: break;
3317: default:
3318: abort ();
3319: }
3320: #endif
3321:
3322: set_float_handler (NULL_PTR);
3323: value = real_value_truncate (mode, value);
3324: return immed_real_const_1 (value, mode);
3325: }
3326: #endif /* not REAL_IS_NOT_DOUBLE, or REAL_ARITHMETIC */
3327:
3328: /* We can fold some multi-word operations. */
3329: if (GET_MODE_CLASS (mode) == MODE_INT
3330: && width == HOST_BITS_PER_WIDE_INT * 2
3331: && (GET_CODE (op0) == CONST_DOUBLE || GET_CODE (op0) == CONST_INT)
3332: && (GET_CODE (op1) == CONST_DOUBLE || GET_CODE (op1) == CONST_INT))
3333: {
3334: HOST_WIDE_INT l1, l2, h1, h2, lv, hv;
3335:
3336: if (GET_CODE (op0) == CONST_DOUBLE)
3337: l1 = CONST_DOUBLE_LOW (op0), h1 = CONST_DOUBLE_HIGH (op0);
3338: else
3339: l1 = INTVAL (op0), h1 = l1 < 0 ? -1 : 0;
3340:
3341: if (GET_CODE (op1) == CONST_DOUBLE)
3342: l2 = CONST_DOUBLE_LOW (op1), h2 = CONST_DOUBLE_HIGH (op1);
3343: else
3344: l2 = INTVAL (op1), h2 = l2 < 0 ? -1 : 0;
3345:
3346: switch (code)
3347: {
3348: case MINUS:
3349: /* A - B == A + (-B). */
3350: neg_double (l2, h2, &lv, &hv);
3351: l2 = lv, h2 = hv;
3352:
3353: /* .. fall through ... */
3354:
3355: case PLUS:
3356: add_double (l1, h1, l2, h2, &lv, &hv);
3357: break;
3358:
3359: case MULT:
3360: mul_double (l1, h1, l2, h2, &lv, &hv);
3361: break;
3362:
3363: case DIV: case MOD: case UDIV: case UMOD:
3364: /* We'd need to include tree.h to do this and it doesn't seem worth
3365: it. */
3366: return 0;
3367:
3368: case AND:
3369: lv = l1 & l2, hv = h1 & h2;
3370: break;
3371:
3372: case IOR:
3373: lv = l1 | l2, hv = h1 | h2;
3374: break;
3375:
3376: case XOR:
3377: lv = l1 ^ l2, hv = h1 ^ h2;
3378: break;
3379:
3380: case SMIN:
3381: if (h1 < h2
3382: || (h1 == h2
3383: && ((unsigned HOST_WIDE_INT) l1
3384: < (unsigned HOST_WIDE_INT) l2)))
3385: lv = l1, hv = h1;
3386: else
3387: lv = l2, hv = h2;
3388: break;
3389:
3390: case SMAX:
3391: if (h1 > h2
3392: || (h1 == h2
3393: && ((unsigned HOST_WIDE_INT) l1
3394: > (unsigned HOST_WIDE_INT) l2)))
3395: lv = l1, hv = h1;
3396: else
3397: lv = l2, hv = h2;
3398: break;
3399:
3400: case UMIN:
3401: if ((unsigned HOST_WIDE_INT) h1 < (unsigned HOST_WIDE_INT) h2
3402: || (h1 == h2
3403: && ((unsigned HOST_WIDE_INT) l1
3404: < (unsigned HOST_WIDE_INT) l2)))
3405: lv = l1, hv = h1;
3406: else
3407: lv = l2, hv = h2;
3408: break;
3409:
3410: case UMAX:
3411: if ((unsigned HOST_WIDE_INT) h1 > (unsigned HOST_WIDE_INT) h2
3412: || (h1 == h2
3413: && ((unsigned HOST_WIDE_INT) l1
3414: > (unsigned HOST_WIDE_INT) l2)))
3415: lv = l1, hv = h1;
3416: else
3417: lv = l2, hv = h2;
3418: break;
3419:
3420: case LSHIFTRT: case ASHIFTRT:
3421: case ASHIFT: case LSHIFT:
3422: case ROTATE: case ROTATERT:
3423: #ifdef SHIFT_COUNT_TRUNCATED
3424: if (SHIFT_COUNT_TRUNCATED)
3425: l2 &= (GET_MODE_BITSIZE (mode) - 1), h2 = 0;
3426: #endif
3427:
3428: if (h2 != 0 || l2 < 0 || l2 >= GET_MODE_BITSIZE (mode))
3429: return 0;
3430:
3431: if (code == LSHIFTRT || code == ASHIFTRT)
3432: rshift_double (l1, h1, l2, GET_MODE_BITSIZE (mode), &lv, &hv,
3433: code == ASHIFTRT);
3434: else if (code == ASHIFT || code == LSHIFT)
3435: lshift_double (l1, h1, l2, GET_MODE_BITSIZE (mode), &lv, &hv,
3436: code == ASHIFT);
3437: else if (code == ROTATE)
3438: lrotate_double (l1, h1, l2, GET_MODE_BITSIZE (mode), &lv, &hv);
3439: else /* code == ROTATERT */
3440: rrotate_double (l1, h1, l2, GET_MODE_BITSIZE (mode), &lv, &hv);
3441: break;
3442:
3443: default:
3444: return 0;
3445: }
3446:
3447: return immed_double_const (lv, hv, mode);
3448: }
3449:
3450: if (GET_CODE (op0) != CONST_INT || GET_CODE (op1) != CONST_INT
3451: || width > HOST_BITS_PER_WIDE_INT || width == 0)
3452: {
3453: /* Even if we can't compute a constant result,
3454: there are some cases worth simplifying. */
3455:
3456: switch (code)
3457: {
3458: case PLUS:
3459: /* In IEEE floating point, x+0 is not the same as x. Similarly
3460: for the other optimizations below. */
3461: if (TARGET_FLOAT_FORMAT == IEEE_FLOAT_FORMAT
3462: && FLOAT_MODE_P (mode))
3463: break;
3464:
3465: if (op1 == CONST0_RTX (mode))
3466: return op0;
3467:
3468: /* ((-a) + b) -> (b - a) and similarly for (a + (-b)) */
3469: if (GET_CODE (op0) == NEG)
3470: return cse_gen_binary (MINUS, mode, op1, XEXP (op0, 0));
3471: else if (GET_CODE (op1) == NEG)
3472: return cse_gen_binary (MINUS, mode, op0, XEXP (op1, 0));
3473:
3474: /* Handle both-operands-constant cases. We can only add
3475: CONST_INTs to constants since the sum of relocatable symbols
3476: can't be handled by most assemblers. Don't add CONST_INT
3477: to CONST_INT since overflow won't be computed properly if wider
3478: than HOST_BITS_PER_WIDE_INT. */
3479:
3480: if (CONSTANT_P (op0) && GET_MODE (op0) != VOIDmode
3481: && GET_CODE (op1) == CONST_INT)
3482: return plus_constant (op0, INTVAL (op1));
3483: else if (CONSTANT_P (op1) && GET_MODE (op1) != VOIDmode
3484: && GET_CODE (op0) == CONST_INT)
3485: return plus_constant (op1, INTVAL (op0));
3486:
3487: /* If one of the operands is a PLUS or a MINUS, see if we can
3488: simplify this by the associative law.
3489: Don't use the associative law for floating point.
3490: The inaccuracy makes it nonassociative,
3491: and subtle programs can break if operations are associated. */
3492:
3493: if (INTEGRAL_MODE_P (mode)
3494: && (GET_CODE (op0) == PLUS || GET_CODE (op0) == MINUS
3495: || GET_CODE (op1) == PLUS || GET_CODE (op1) == MINUS)
3496: && (tem = simplify_plus_minus (code, mode, op0, op1)) != 0)
3497: return tem;
3498: break;
3499:
3500: case COMPARE:
3501: #ifdef HAVE_cc0
3502: /* Convert (compare FOO (const_int 0)) to FOO unless we aren't
3503: using cc0, in which case we want to leave it as a COMPARE
3504: so we can distinguish it from a register-register-copy.
3505:
3506: In IEEE floating point, x-0 is not the same as x. */
3507:
3508: if ((TARGET_FLOAT_FORMAT != IEEE_FLOAT_FORMAT
3509: || ! FLOAT_MODE_P (mode))
3510: && op1 == CONST0_RTX (mode))
3511: return op0;
3512: #else
3513: /* Do nothing here. */
3514: #endif
3515: break;
3516:
3517: case MINUS:
3518: /* None of these optimizations can be done for IEEE
3519: floating point. */
3520: if (TARGET_FLOAT_FORMAT == IEEE_FLOAT_FORMAT
3521: && FLOAT_MODE_P (mode))
3522: break;
3523:
3524: /* We can't assume x-x is 0 even with non-IEEE floating point. */
3525: if (rtx_equal_p (op0, op1)
3526: && ! side_effects_p (op0)
3527: && ! FLOAT_MODE_P (mode))
3528: return const0_rtx;
3529:
3530: /* Change subtraction from zero into negation. */
3531: if (op0 == CONST0_RTX (mode))
3532: return gen_rtx (NEG, mode, op1);
3533:
3534: /* (-1 - a) is ~a. */
3535: if (op0 == constm1_rtx)
3536: return gen_rtx (NOT, mode, op1);
3537:
3538: /* Subtracting 0 has no effect. */
3539: if (op1 == CONST0_RTX (mode))
3540: return op0;
3541:
3542: /* (a - (-b)) -> (a + b). */
3543: if (GET_CODE (op1) == NEG)
3544: return cse_gen_binary (PLUS, mode, op0, XEXP (op1, 0));
3545:
3546: /* If one of the operands is a PLUS or a MINUS, see if we can
3547: simplify this by the associative law.
3548: Don't use the associative law for floating point.
3549: The inaccuracy makes it nonassociative,
3550: and subtle programs can break if operations are associated. */
3551:
3552: if (INTEGRAL_MODE_P (mode)
3553: && (GET_CODE (op0) == PLUS || GET_CODE (op0) == MINUS
3554: || GET_CODE (op1) == PLUS || GET_CODE (op1) == MINUS)
3555: && (tem = simplify_plus_minus (code, mode, op0, op1)) != 0)
3556: return tem;
3557:
3558: /* Don't let a relocatable value get a negative coeff. */
3559: if (GET_CODE (op1) == CONST_INT && GET_MODE (op1) != VOIDmode)
3560: return plus_constant (op0, - INTVAL (op1));
3561: break;
3562:
3563: case MULT:
3564: if (op1 == constm1_rtx)
3565: {
3566: tem = simplify_unary_operation (NEG, mode, op0, mode);
3567:
3568: return tem ? tem : gen_rtx (NEG, mode, op0);
3569: }
3570:
3571: /* In IEEE floating point, x*0 is not always 0. */
3572: if ((TARGET_FLOAT_FORMAT != IEEE_FLOAT_FORMAT
3573: && ! FLOAT_MODE_P (mode))
3574: && op1 == CONST0_RTX (mode)
3575: && ! side_effects_p (op0))
3576: return op1;
3577:
3578: /* In IEEE floating point, x*1 is not equivalent to x for nans.
3579: However, ANSI says we can drop signals,
3580: so we can do this anyway. */
3581: if (op1 == CONST1_RTX (mode))
3582: return op0;
3583:
3584: /* Convert multiply by constant power of two into shift. */
3585: if (GET_CODE (op1) == CONST_INT
3586: && (val = exact_log2 (INTVAL (op1))) >= 0)
3587: return gen_rtx (ASHIFT, mode, op0, GEN_INT (val));
3588:
3589: if (GET_CODE (op1) == CONST_DOUBLE
3590: && GET_MODE_CLASS (GET_MODE (op1)) == MODE_FLOAT)
3591: {
3592: REAL_VALUE_TYPE d;
3593: jmp_buf handler;
3594: int op1is2, op1ism1;
3595:
3596: if (setjmp (handler))
3597: return 0;
3598:
3599: set_float_handler (handler);
3600: REAL_VALUE_FROM_CONST_DOUBLE (d, op1);
3601: op1is2 = REAL_VALUES_EQUAL (d, dconst2);
3602: op1ism1 = REAL_VALUES_EQUAL (d, dconstm1);
3603: set_float_handler (NULL_PTR);
3604:
3605: /* x*2 is x+x and x*(-1) is -x */
3606: if (op1is2 && GET_MODE (op0) == mode)
3607: return gen_rtx (PLUS, mode, op0, copy_rtx (op0));
3608:
3609: else if (op1ism1 && GET_MODE (op0) == mode)
3610: return gen_rtx (NEG, mode, op0);
3611: }
3612: break;
3613:
3614: case IOR:
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 op1;
3620: if (rtx_equal_p (op0, op1) && ! side_effects_p (op0))
3621: return op0;
3622: /* A | (~A) -> -1 */
3623: if (((GET_CODE (op0) == NOT && rtx_equal_p (XEXP (op0, 0), op1))
3624: || (GET_CODE (op1) == NOT && rtx_equal_p (XEXP (op1, 0), op0)))
3625: && ! side_effects_p (op0)
3626: && GET_MODE_CLASS (mode) != MODE_CC)
3627: return constm1_rtx;
3628: break;
3629:
3630: case XOR:
3631: if (op1 == const0_rtx)
3632: return op0;
3633: if (GET_CODE (op1) == CONST_INT
3634: && (INTVAL (op1) & GET_MODE_MASK (mode)) == GET_MODE_MASK (mode))
3635: return gen_rtx (NOT, mode, op0);
3636: if (op0 == op1 && ! side_effects_p (op0)
3637: && GET_MODE_CLASS (mode) != MODE_CC)
3638: return const0_rtx;
3639: break;
3640:
3641: case AND:
3642: if (op1 == const0_rtx && ! side_effects_p (op0))
3643: return const0_rtx;
3644: if (GET_CODE (op1) == CONST_INT
3645: && (INTVAL (op1) & GET_MODE_MASK (mode)) == GET_MODE_MASK (mode))
3646: return op0;
3647: if (op0 == op1 && ! side_effects_p (op0)
3648: && GET_MODE_CLASS (mode) != MODE_CC)
3649: return op0;
3650: /* A & (~A) -> 0 */
3651: if (((GET_CODE (op0) == NOT && rtx_equal_p (XEXP (op0, 0), op1))
3652: || (GET_CODE (op1) == NOT && rtx_equal_p (XEXP (op1, 0), op0)))
3653: && ! side_effects_p (op0)
3654: && GET_MODE_CLASS (mode) != MODE_CC)
3655: return const0_rtx;
3656: break;
3657:
3658: case UDIV:
3659: /* Convert divide by power of two into shift (divide by 1 handled
3660: below). */
3661: if (GET_CODE (op1) == CONST_INT
3662: && (arg1 = exact_log2 (INTVAL (op1))) > 0)
3663: return gen_rtx (LSHIFTRT, mode, op0, GEN_INT (arg1));
3664:
3665: /* ... fall through ... */
3666:
3667: case DIV:
3668: if (op1 == CONST1_RTX (mode))
3669: return op0;
3670:
3671: /* In IEEE floating point, 0/x is not always 0. */
3672: if ((TARGET_FLOAT_FORMAT != IEEE_FLOAT_FORMAT
3673: || ! FLOAT_MODE_P (mode))
3674: && op0 == CONST0_RTX (mode)
3675: && ! side_effects_p (op1))
3676: return op0;
3677:
3678: #if 0 /* Turned off till an expert says this is a safe thing to do. */
3679: #if ! defined (REAL_IS_NOT_DOUBLE) || defined (REAL_ARITHMETIC)
3680: /* Change division by a constant into multiplication. */
3681: else if (GET_CODE (op1) == CONST_DOUBLE
3682: && GET_MODE_CLASS (GET_MODE (op1)) == MODE_FLOAT
3683: && op1 != CONST0_RTX (mode))
3684: {
3685: REAL_VALUE_TYPE d;
3686: REAL_VALUE_FROM_CONST_DOUBLE (d, op1);
3687: if (REAL_VALUES_EQUAL (d, dconst0))
3688: abort();
3689: #if defined (REAL_ARITHMETIC)
3690: REAL_ARITHMETIC (d, (int) RDIV_EXPR, dconst1, d);
3691: return gen_rtx (MULT, mode, op0,
3692: CONST_DOUBLE_FROM_REAL_VALUE (d, mode));
3693: #else
3694: return gen_rtx (MULT, mode, op0,
3695: CONST_DOUBLE_FROM_REAL_VALUE (1./d, mode));
3696: }
3697: #endif
3698: #endif
3699: #endif
3700: break;
3701:
3702: case UMOD:
3703: /* Handle modulus by power of two (mod with 1 handled below). */
3704: if (GET_CODE (op1) == CONST_INT
3705: && exact_log2 (INTVAL (op1)) > 0)
3706: return gen_rtx (AND, mode, op0, GEN_INT (INTVAL (op1) - 1));
3707:
3708: /* ... fall through ... */
3709:
3710: case MOD:
3711: if ((op0 == const0_rtx || op1 == const1_rtx)
3712: && ! side_effects_p (op0) && ! side_effects_p (op1))
3713: return const0_rtx;
3714: break;
3715:
3716: case ROTATERT:
3717: case ROTATE:
3718: /* Rotating ~0 always results in ~0. */
3719: if (GET_CODE (op0) == CONST_INT && width <= HOST_BITS_PER_WIDE_INT
3720: && INTVAL (op0) == GET_MODE_MASK (mode)
3721: && ! side_effects_p (op1))
3722: return op0;
3723:
3724: /* ... fall through ... */
3725:
3726: case LSHIFT:
3727: case ASHIFT:
3728: case ASHIFTRT:
3729: case LSHIFTRT:
3730: if (op1 == const0_rtx)
3731: return op0;
3732: if (op0 == const0_rtx && ! side_effects_p (op1))
3733: return op0;
3734: break;
3735:
3736: case SMIN:
3737: if (width <= HOST_BITS_PER_WIDE_INT && GET_CODE (op1) == CONST_INT
3738: && INTVAL (op1) == (HOST_WIDE_INT) 1 << (width -1)
3739: && ! side_effects_p (op0))
3740: return op1;
3741: else if (rtx_equal_p (op0, op1) && ! side_effects_p (op0))
3742: return op0;
3743: break;
3744:
3745: case SMAX:
3746: if (width <= HOST_BITS_PER_WIDE_INT && GET_CODE (op1) == CONST_INT
3747: && (INTVAL (op1)
3748: == (unsigned HOST_WIDE_INT) GET_MODE_MASK (mode) >> 1)
3749: && ! side_effects_p (op0))
3750: return op1;
3751: else if (rtx_equal_p (op0, op1) && ! side_effects_p (op0))
3752: return op0;
3753: break;
3754:
3755: case UMIN:
3756: if (op1 == const0_rtx && ! side_effects_p (op0))
3757: return op1;
3758: else if (rtx_equal_p (op0, op1) && ! side_effects_p (op0))
3759: return op0;
3760: break;
3761:
3762: case UMAX:
3763: if (op1 == constm1_rtx && ! side_effects_p (op0))
3764: return op1;
3765: else if (rtx_equal_p (op0, op1) && ! side_effects_p (op0))
3766: return op0;
3767: break;
3768:
3769: default:
3770: abort ();
3771: }
3772:
3773: return 0;
3774: }
3775:
3776: /* Get the integer argument values in two forms:
3777: zero-extended in ARG0, ARG1 and sign-extended in ARG0S, ARG1S. */
3778:
3779: arg0 = INTVAL (op0);
3780: arg1 = INTVAL (op1);
3781:
3782: if (width < HOST_BITS_PER_WIDE_INT)
3783: {
3784: arg0 &= ((HOST_WIDE_INT) 1 << width) - 1;
3785: arg1 &= ((HOST_WIDE_INT) 1 << width) - 1;
3786:
3787: arg0s = arg0;
3788: if (arg0s & ((HOST_WIDE_INT) 1 << (width - 1)))
3789: arg0s |= ((HOST_WIDE_INT) (-1) << width);
3790:
3791: arg1s = arg1;
3792: if (arg1s & ((HOST_WIDE_INT) 1 << (width - 1)))
3793: arg1s |= ((HOST_WIDE_INT) (-1) << width);
3794: }
3795: else
3796: {
3797: arg0s = arg0;
3798: arg1s = arg1;
3799: }
3800:
3801: /* Compute the value of the arithmetic. */
3802:
3803: switch (code)
3804: {
3805: case PLUS:
3806: val = arg0s + arg1s;
3807: break;
3808:
3809: case MINUS:
3810: val = arg0s - arg1s;
3811: break;
3812:
3813: case MULT:
3814: val = arg0s * arg1s;
3815: break;
3816:
3817: case DIV:
3818: if (arg1s == 0)
3819: return 0;
3820: val = arg0s / arg1s;
3821: break;
3822:
3823: case MOD:
3824: if (arg1s == 0)
3825: return 0;
3826: val = arg0s % arg1s;
3827: break;
3828:
3829: case UDIV:
3830: if (arg1 == 0)
3831: return 0;
3832: val = (unsigned HOST_WIDE_INT) arg0 / arg1;
3833: break;
3834:
3835: case UMOD:
3836: if (arg1 == 0)
3837: return 0;
3838: val = (unsigned HOST_WIDE_INT) arg0 % arg1;
3839: break;
3840:
3841: case AND:
3842: val = arg0 & arg1;
3843: break;
3844:
3845: case IOR:
3846: val = arg0 | arg1;
3847: break;
3848:
3849: case XOR:
3850: val = arg0 ^ arg1;
3851: break;
3852:
3853: case LSHIFTRT:
3854: /* If shift count is undefined, don't fold it; let the machine do
3855: what it wants. But truncate it if the machine will do that. */
3856: if (arg1 < 0)
3857: return 0;
3858:
3859: #ifdef SHIFT_COUNT_TRUNCATED
3860: if (SHIFT_COUNT_TRUNCATED)
3861: arg1 &= (BITS_PER_WORD - 1);
3862: #endif
3863:
3864: if (arg1 >= width)
3865: return 0;
3866:
3867: val = ((unsigned HOST_WIDE_INT) arg0) >> arg1;
3868: break;
3869:
3870: case ASHIFT:
3871: case LSHIFT:
3872: if (arg1 < 0)
3873: return 0;
3874:
3875: #ifdef SHIFT_COUNT_TRUNCATED
3876: if (SHIFT_COUNT_TRUNCATED)
3877: arg1 &= (BITS_PER_WORD - 1);
3878: #endif
3879:
3880: if (arg1 >= width)
3881: return 0;
3882:
3883: val = ((unsigned HOST_WIDE_INT) arg0) << arg1;
3884: break;
3885:
3886: case ASHIFTRT:
3887: if (arg1 < 0)
3888: return 0;
3889:
3890: #ifdef SHIFT_COUNT_TRUNCATED
3891: if (SHIFT_COUNT_TRUNCATED)
3892: arg1 &= (BITS_PER_WORD - 1);
3893: #endif
3894:
3895: if (arg1 >= width)
3896: return 0;
3897:
3898: val = arg0s >> arg1;
3899:
3900: /* Bootstrap compiler may not have sign extended the right shift.
3901: Manually extend the sign to insure bootstrap cc matches gcc. */
3902: if (arg0s < 0 && arg1 > 0)
3903: val |= ((HOST_WIDE_INT) -1) << (HOST_BITS_PER_WIDE_INT - arg1);
3904:
3905: break;
3906:
3907: case ROTATERT:
3908: if (arg1 < 0)
3909: return 0;
3910:
3911: arg1 %= width;
3912: val = ((((unsigned HOST_WIDE_INT) arg0) << (width - arg1))
3913: | (((unsigned HOST_WIDE_INT) arg0) >> arg1));
3914: break;
3915:
3916: case ROTATE:
3917: if (arg1 < 0)
3918: return 0;
3919:
3920: arg1 %= width;
3921: val = ((((unsigned HOST_WIDE_INT) arg0) << arg1)
3922: | (((unsigned HOST_WIDE_INT) arg0) >> (width - arg1)));
3923: break;
3924:
3925: case COMPARE:
3926: /* Do nothing here. */
3927: return 0;
3928:
3929: case SMIN:
3930: val = arg0s <= arg1s ? arg0s : arg1s;
3931: break;
3932:
3933: case UMIN:
3934: val = ((unsigned HOST_WIDE_INT) arg0
3935: <= (unsigned HOST_WIDE_INT) arg1 ? arg0 : arg1);
3936: break;
3937:
3938: case SMAX:
3939: val = arg0s > arg1s ? arg0s : arg1s;
3940: break;
3941:
3942: case UMAX:
3943: val = ((unsigned HOST_WIDE_INT) arg0
3944: > (unsigned HOST_WIDE_INT) arg1 ? arg0 : arg1);
3945: break;
3946:
3947: default:
3948: abort ();
3949: }
3950:
3951: /* Clear the bits that don't belong in our mode, unless they and our sign
3952: bit are all one. So we get either a reasonable negative value or a
3953: reasonable unsigned value for this mode. */
3954: if (width < HOST_BITS_PER_WIDE_INT
3955: && ((val & ((HOST_WIDE_INT) (-1) << (width - 1)))
3956: != ((HOST_WIDE_INT) (-1) << (width - 1))))
3957: val &= ((HOST_WIDE_INT) 1 << width) - 1;
3958:
3959: return GEN_INT (val);
3960: }
3961:
3962: /* Simplify a PLUS or MINUS, at least one of whose operands may be another
3963: PLUS or MINUS.
3964:
3965: Rather than test for specific case, we do this by a brute-force method
3966: and do all possible simplifications until no more changes occur. Then
3967: we rebuild the operation. */
3968:
3969: static rtx
3970: simplify_plus_minus (code, mode, op0, op1)
3971: enum rtx_code code;
3972: enum machine_mode mode;
3973: rtx op0, op1;
3974: {
3975: rtx ops[8];
3976: int negs[8];
3977: rtx result, tem;
3978: int n_ops = 2, input_ops = 2, input_consts = 0, n_consts = 0;
3979: int first = 1, negate = 0, changed;
3980: int i, j;
3981:
3982: bzero (ops, sizeof ops);
3983:
3984: /* Set up the two operands and then expand them until nothing has been
3985: changed. If we run out of room in our array, give up; this should
3986: almost never happen. */
3987:
3988: ops[0] = op0, ops[1] = op1, negs[0] = 0, negs[1] = (code == MINUS);
3989:
3990: changed = 1;
3991: while (changed)
3992: {
3993: changed = 0;
3994:
3995: for (i = 0; i < n_ops; i++)
3996: switch (GET_CODE (ops[i]))
3997: {
3998: case PLUS:
3999: case MINUS:
4000: if (n_ops == 7)
4001: return 0;
4002:
4003: ops[n_ops] = XEXP (ops[i], 1);
4004: negs[n_ops++] = GET_CODE (ops[i]) == MINUS ? !negs[i] : negs[i];
4005: ops[i] = XEXP (ops[i], 0);
4006: input_ops++;
4007: changed = 1;
4008: break;
4009:
4010: case NEG:
4011: ops[i] = XEXP (ops[i], 0);
4012: negs[i] = ! negs[i];
4013: changed = 1;
4014: break;
4015:
4016: case CONST:
4017: ops[i] = XEXP (ops[i], 0);
4018: input_consts++;
4019: changed = 1;
4020: break;
4021:
4022: case NOT:
4023: /* ~a -> (-a - 1) */
4024: if (n_ops != 7)
4025: {
4026: ops[n_ops] = constm1_rtx;
4027: negs[n_ops++] = negs[i];
4028: ops[i] = XEXP (ops[i], 0);
4029: negs[i] = ! negs[i];
4030: changed = 1;
4031: }
4032: break;
4033:
4034: case CONST_INT:
4035: if (negs[i])
4036: ops[i] = GEN_INT (- INTVAL (ops[i])), negs[i] = 0, changed = 1;
4037: break;
4038: }
4039: }
4040:
4041: /* If we only have two operands, we can't do anything. */
4042: if (n_ops <= 2)
4043: return 0;
4044:
4045: /* Now simplify each pair of operands until nothing changes. The first
4046: time through just simplify constants against each other. */
4047:
4048: changed = 1;
4049: while (changed)
4050: {
4051: changed = first;
4052:
4053: for (i = 0; i < n_ops - 1; i++)
4054: for (j = i + 1; j < n_ops; j++)
4055: if (ops[i] != 0 && ops[j] != 0
4056: && (! first || (CONSTANT_P (ops[i]) && CONSTANT_P (ops[j]))))
4057: {
4058: rtx lhs = ops[i], rhs = ops[j];
4059: enum rtx_code ncode = PLUS;
4060:
4061: if (negs[i] && ! negs[j])
4062: lhs = ops[j], rhs = ops[i], ncode = MINUS;
4063: else if (! negs[i] && negs[j])
4064: ncode = MINUS;
4065:
4066: tem = simplify_binary_operation (ncode, mode, lhs, rhs);
4067: if (tem)
4068: {
4069: ops[i] = tem, ops[j] = 0;
4070: negs[i] = negs[i] && negs[j];
4071: if (GET_CODE (tem) == NEG)
4072: ops[i] = XEXP (tem, 0), negs[i] = ! negs[i];
4073:
4074: if (GET_CODE (ops[i]) == CONST_INT && negs[i])
4075: ops[i] = GEN_INT (- INTVAL (ops[i])), negs[i] = 0;
4076: changed = 1;
4077: }
4078: }
4079:
4080: first = 0;
4081: }
4082:
4083: /* Pack all the operands to the lower-numbered entries and give up if
4084: we didn't reduce the number of operands we had. Make sure we
4085: count a CONST as two operands. If we have the same number of
4086: operands, but have made more CONSTs than we had, this is also
4087: an improvement, so accept it. */
4088:
4089: for (i = 0, j = 0; j < n_ops; j++)
4090: if (ops[j] != 0)
4091: {
4092: ops[i] = ops[j], negs[i++] = negs[j];
4093: if (GET_CODE (ops[j]) == CONST)
4094: n_consts++;
4095: }
4096:
4097: if (i + n_consts > input_ops
4098: || (i + n_consts == input_ops && n_consts <= input_consts))
4099: return 0;
4100:
4101: n_ops = i;
4102:
4103: /* If we have a CONST_INT, put it last. */
4104: for (i = 0; i < n_ops - 1; i++)
4105: if (GET_CODE (ops[i]) == CONST_INT)
4106: {
4107: tem = ops[n_ops - 1], ops[n_ops - 1] = ops[i] , ops[i] = tem;
4108: j = negs[n_ops - 1], negs[n_ops - 1] = negs[i], negs[i] = j;
4109: }
4110:
4111: /* Put a non-negated operand first. If there aren't any, make all
4112: operands positive and negate the whole thing later. */
4113: for (i = 0; i < n_ops && negs[i]; i++)
4114: ;
4115:
4116: if (i == n_ops)
4117: {
4118: for (i = 0; i < n_ops; i++)
4119: negs[i] = 0;
4120: negate = 1;
4121: }
4122: else if (i != 0)
4123: {
4124: tem = ops[0], ops[0] = ops[i], ops[i] = tem;
4125: j = negs[0], negs[0] = negs[i], negs[i] = j;
4126: }
4127:
4128: /* Now make the result by performing the requested operations. */
4129: result = ops[0];
4130: for (i = 1; i < n_ops; i++)
4131: result = cse_gen_binary (negs[i] ? MINUS : PLUS, mode, result, ops[i]);
4132:
4133: return negate ? gen_rtx (NEG, mode, result) : result;
4134: }
4135:
4136: /* Make a binary operation by properly ordering the operands and
4137: seeing if the expression folds. */
4138:
4139: static rtx
4140: cse_gen_binary (code, mode, op0, op1)
4141: enum rtx_code code;
4142: enum machine_mode mode;
4143: rtx op0, op1;
4144: {
4145: rtx tem;
4146:
4147: /* Put complex operands first and constants second if commutative. */
4148: if (GET_RTX_CLASS (code) == 'c'
4149: && ((CONSTANT_P (op0) && GET_CODE (op1) != CONST_INT)
4150: || (GET_RTX_CLASS (GET_CODE (op0)) == 'o'
4151: && GET_RTX_CLASS (GET_CODE (op1)) != 'o')
4152: || (GET_CODE (op0) == SUBREG
4153: && GET_RTX_CLASS (GET_CODE (SUBREG_REG (op0))) == 'o'
4154: && GET_RTX_CLASS (GET_CODE (op1)) != 'o')))
4155: tem = op0, op0 = op1, op1 = tem;
4156:
4157: /* If this simplifies, do it. */
4158: tem = simplify_binary_operation (code, mode, op0, op1);
4159:
4160: if (tem)
4161: return tem;
4162:
4163: /* Handle addition and subtraction of CONST_INT specially. Otherwise,
4164: just form the operation. */
4165:
4166: if (code == PLUS && GET_CODE (op1) == CONST_INT
4167: && GET_MODE (op0) != VOIDmode)
4168: return plus_constant (op0, INTVAL (op1));
4169: else if (code == MINUS && GET_CODE (op1) == CONST_INT
4170: && GET_MODE (op0) != VOIDmode)
4171: return plus_constant (op0, - INTVAL (op1));
4172: else
4173: return gen_rtx (code, mode, op0, op1);
4174: }
4175:
4176: /* Like simplify_binary_operation except used for relational operators.
4177: MODE is the mode of the operands, not that of the result. */
4178:
4179: rtx
4180: simplify_relational_operation (code, mode, op0, op1)
4181: enum rtx_code code;
4182: enum machine_mode mode;
4183: rtx op0, op1;
4184: {
4185: register HOST_WIDE_INT arg0, arg1, arg0s, arg1s;
4186: HOST_WIDE_INT val;
4187: int width = GET_MODE_BITSIZE (mode);
4188:
4189: /* If op0 is a compare, extract the comparison arguments from it. */
4190: if (GET_CODE (op0) == COMPARE && op1 == const0_rtx)
4191: op1 = XEXP (op0, 1), op0 = XEXP (op0, 0);
4192:
4193: /* What to do with MODE_CC isn't clear yet.
4194: Let's make sure nothing erroneous is done. */
4195: if (GET_MODE_CLASS (GET_MODE (op0)) == MODE_CC)
4196: return 0;
4197:
4198: /* Unlike the arithmetic operations, we can do the comparison whether
4199: or not WIDTH is larger than HOST_BITS_PER_WIDE_INT because the
4200: CONST_INTs are to be understood as being infinite precision as
4201: is the comparison. So there is no question of overflow. */
4202:
4203: if (GET_CODE (op0) != CONST_INT || GET_CODE (op1) != CONST_INT || width == 0)
4204: {
4205: /* Even if we can't compute a constant result,
4206: there are some cases worth simplifying. */
4207:
4208: /* For non-IEEE floating-point, if the two operands are equal, we know
4209: the result. */
4210: if (rtx_equal_p (op0, op1)
4211: && (TARGET_FLOAT_FORMAT != IEEE_FLOAT_FORMAT
4212: || ! FLOAT_MODE_P (GET_MODE (op0))))
4213: return (code == EQ || code == GE || code == LE || code == LEU
4214: || code == GEU) ? const_true_rtx : const0_rtx;
4215:
4216: #if ! defined (REAL_IS_NOT_DOUBLE) || defined (REAL_ARITHMETIC)
4217: else if (GET_CODE (op0) == CONST_DOUBLE
4218: && GET_CODE (op1) == CONST_DOUBLE
4219: && GET_MODE_CLASS (GET_MODE (op0)) == MODE_FLOAT)
4220: {
4221: REAL_VALUE_TYPE d0, d1;
4222: jmp_buf handler;
4223: int op0lt, op1lt, equal;
4224:
4225: if (setjmp (handler))
4226: return 0;
4227:
4228: set_float_handler (handler);
4229: REAL_VALUE_FROM_CONST_DOUBLE (d0, op0);
4230: REAL_VALUE_FROM_CONST_DOUBLE (d1, op1);
4231: equal = REAL_VALUES_EQUAL (d0, d1);
4232: op0lt = REAL_VALUES_LESS (d0, d1);
4233: op1lt = REAL_VALUES_LESS (d1, d0);
4234: set_float_handler (NULL_PTR);
4235:
4236: switch (code)
4237: {
4238: case EQ:
4239: return equal ? const_true_rtx : const0_rtx;
4240: case NE:
4241: return !equal ? const_true_rtx : const0_rtx;
4242: case LE:
4243: return equal || op0lt ? const_true_rtx : const0_rtx;
4244: case LT:
4245: return op0lt ? const_true_rtx : const0_rtx;
4246: case GE:
4247: return equal || op1lt ? const_true_rtx : const0_rtx;
4248: case GT:
4249: return op1lt ? const_true_rtx : const0_rtx;
4250: }
4251: }
4252: #endif /* not REAL_IS_NOT_DOUBLE, or REAL_ARITHMETIC */
4253:
4254: else if (GET_MODE_CLASS (mode) == MODE_INT
4255: && width > HOST_BITS_PER_WIDE_INT
4256: && (GET_CODE (op0) == CONST_DOUBLE
4257: || GET_CODE (op0) == CONST_INT)
4258: && (GET_CODE (op1) == CONST_DOUBLE
4259: || GET_CODE (op1) == CONST_INT))
4260: {
4261: HOST_WIDE_INT h0, l0, h1, l1;
4262: unsigned HOST_WIDE_INT uh0, ul0, uh1, ul1;
4263: int op0lt, op0ltu, equal;
4264:
4265: if (GET_CODE (op0) == CONST_DOUBLE)
4266: l0 = CONST_DOUBLE_LOW (op0), h0 = CONST_DOUBLE_HIGH (op0);
4267: else
4268: l0 = INTVAL (op0), h0 = l0 < 0 ? -1 : 0;
4269:
4270: if (GET_CODE (op1) == CONST_DOUBLE)
4271: l1 = CONST_DOUBLE_LOW (op1), h1 = CONST_DOUBLE_HIGH (op1);
4272: else
4273: l1 = INTVAL (op1), h1 = l1 < 0 ? -1 : 0;
4274:
4275: uh0 = h0, ul0 = l0, uh1 = h1, ul1 = l1;
4276:
4277: equal = (h0 == h1 && l0 == l1);
4278: op0lt = (h0 < h1 || (h0 == h1 && l0 < l1));
4279: op0ltu = (uh0 < uh1 || (uh0 == uh1 && ul0 < ul1));
4280:
4281: switch (code)
4282: {
4283: case EQ:
4284: return equal ? const_true_rtx : const0_rtx;
4285: case NE:
4286: return !equal ? const_true_rtx : const0_rtx;
4287: case LE:
4288: return equal || op0lt ? const_true_rtx : const0_rtx;
4289: case LT:
4290: return op0lt ? const_true_rtx : const0_rtx;
4291: case GE:
4292: return !op0lt ? const_true_rtx : const0_rtx;
4293: case GT:
4294: return !equal && !op0lt ? const_true_rtx : const0_rtx;
4295: case LEU:
4296: return equal || op0ltu ? const_true_rtx : const0_rtx;
4297: case LTU:
4298: return op0ltu ? const_true_rtx : const0_rtx;
4299: case GEU:
4300: return !op0ltu ? const_true_rtx : const0_rtx;
4301: case GTU:
4302: return !equal && !op0ltu ? const_true_rtx : const0_rtx;
4303: }
4304: }
4305:
4306: switch (code)
4307: {
4308: case EQ:
4309: {
4310: #if 0
4311: /* We can't make this assumption due to #pragma weak */
4312: if (CONSTANT_P (op0) && op1 == const0_rtx)
4313: return const0_rtx;
4314: #endif
4315: if (NONZERO_BASE_PLUS_P (op0) && op1 == const0_rtx
4316: /* On some machines, the ap reg can be 0 sometimes. */
4317: && op0 != arg_pointer_rtx)
4318: return const0_rtx;
4319: break;
4320: }
4321:
4322: case NE:
4323: #if 0
4324: /* We can't make this assumption due to #pragma weak */
4325: if (CONSTANT_P (op0) && op1 == const0_rtx)
4326: return const_true_rtx;
4327: #endif
4328: if (NONZERO_BASE_PLUS_P (op0) && op1 == const0_rtx
4329: /* On some machines, the ap reg can be 0 sometimes. */
4330: && op0 != arg_pointer_rtx)
4331: return const_true_rtx;
4332: break;
4333:
4334: case GEU:
4335: /* Unsigned values are never negative, but we must be sure we are
4336: actually comparing a value, not a CC operand. */
4337: if (op1 == const0_rtx && INTEGRAL_MODE_P (mode))
4338: return const_true_rtx;
4339: break;
4340:
4341: case LTU:
4342: if (op1 == const0_rtx && INTEGRAL_MODE_P (mode))
4343: return const0_rtx;
4344: break;
4345:
4346: case LEU:
4347: /* Unsigned values are never greater than the largest
4348: unsigned value. */
4349: if (GET_CODE (op1) == CONST_INT
4350: && INTVAL (op1) == GET_MODE_MASK (mode)
4351: && INTEGRAL_MODE_P (mode))
4352: return const_true_rtx;
4353: break;
4354:
4355: case GTU:
4356: if (GET_CODE (op1) == CONST_INT
4357: && INTVAL (op1) == GET_MODE_MASK (mode)
4358: && INTEGRAL_MODE_P (mode))
4359: return const0_rtx;
4360: break;
4361: }
4362:
4363: return 0;
4364: }
4365:
4366: /* Get the integer argument values in two forms:
4367: zero-extended in ARG0, ARG1 and sign-extended in ARG0S, ARG1S. */
4368:
4369: arg0 = INTVAL (op0);
4370: arg1 = INTVAL (op1);
4371:
4372: if (width < HOST_BITS_PER_WIDE_INT)
4373: {
4374: arg0 &= ((HOST_WIDE_INT) 1 << width) - 1;
4375: arg1 &= ((HOST_WIDE_INT) 1 << width) - 1;
4376:
4377: arg0s = arg0;
4378: if (arg0s & ((HOST_WIDE_INT) 1 << (width - 1)))
4379: arg0s |= ((HOST_WIDE_INT) (-1) << width);
4380:
4381: arg1s = arg1;
4382: if (arg1s & ((HOST_WIDE_INT) 1 << (width - 1)))
4383: arg1s |= ((HOST_WIDE_INT) (-1) << width);
4384: }
4385: else
4386: {
4387: arg0s = arg0;
4388: arg1s = arg1;
4389: }
4390:
4391: /* Compute the value of the arithmetic. */
4392:
4393: switch (code)
4394: {
4395: case NE:
4396: val = arg0 != arg1 ? STORE_FLAG_VALUE : 0;
4397: break;
4398:
4399: case EQ:
4400: val = arg0 == arg1 ? STORE_FLAG_VALUE : 0;
4401: break;
4402:
4403: case LE:
4404: val = arg0s <= arg1s ? STORE_FLAG_VALUE : 0;
4405: break;
4406:
4407: case LT:
4408: val = arg0s < arg1s ? STORE_FLAG_VALUE : 0;
4409: break;
4410:
4411: case GE:
4412: val = arg0s >= arg1s ? STORE_FLAG_VALUE : 0;
4413: break;
4414:
4415: case GT:
4416: val = arg0s > arg1s ? STORE_FLAG_VALUE : 0;
4417: break;
4418:
4419: case LEU:
4420: val = (((unsigned HOST_WIDE_INT) arg0)
4421: <= ((unsigned HOST_WIDE_INT) arg1) ? STORE_FLAG_VALUE : 0);
4422: break;
4423:
4424: case LTU:
4425: val = (((unsigned HOST_WIDE_INT) arg0)
4426: < ((unsigned HOST_WIDE_INT) arg1) ? STORE_FLAG_VALUE : 0);
4427: break;
4428:
4429: case GEU:
4430: val = (((unsigned HOST_WIDE_INT) arg0)
4431: >= ((unsigned HOST_WIDE_INT) arg1) ? STORE_FLAG_VALUE : 0);
4432: break;
4433:
4434: case GTU:
4435: val = (((unsigned HOST_WIDE_INT) arg0)
4436: > ((unsigned HOST_WIDE_INT) arg1) ? STORE_FLAG_VALUE : 0);
4437: break;
4438:
4439: default:
4440: abort ();
4441: }
4442:
4443: /* Clear the bits that don't belong in our mode, unless they and our sign
4444: bit are all one. So we get either a reasonable negative value or a
4445: reasonable unsigned value for this mode. */
4446: if (width < HOST_BITS_PER_WIDE_INT
4447: && ((val & ((HOST_WIDE_INT) (-1) << (width - 1)))
4448: != ((HOST_WIDE_INT) (-1) << (width - 1))))
4449: val &= ((HOST_WIDE_INT) 1 << width) - 1;
4450:
4451: return GEN_INT (val);
4452: }
4453:
4454: /* Simplify CODE, an operation with result mode MODE and three operands,
4455: OP0, OP1, and OP2. OP0_MODE was the mode of OP0 before it became
4456: a constant. Return 0 if no simplifications is possible. */
4457:
4458: rtx
4459: simplify_ternary_operation (code, mode, op0_mode, op0, op1, op2)
4460: enum rtx_code code;
4461: enum machine_mode mode, op0_mode;
4462: rtx op0, op1, op2;
4463: {
4464: int width = GET_MODE_BITSIZE (mode);
4465:
4466: /* VOIDmode means "infinite" precision. */
4467: if (width == 0)
4468: width = HOST_BITS_PER_WIDE_INT;
4469:
4470: switch (code)
4471: {
4472: case SIGN_EXTRACT:
4473: case ZERO_EXTRACT:
4474: if (GET_CODE (op0) == CONST_INT
4475: && GET_CODE (op1) == CONST_INT
4476: && GET_CODE (op2) == CONST_INT
4477: && INTVAL (op1) + INTVAL (op2) <= GET_MODE_BITSIZE (op0_mode)
4478: && width <= HOST_BITS_PER_WIDE_INT)
4479: {
4480: /* Extracting a bit-field from a constant */
4481: HOST_WIDE_INT val = INTVAL (op0);
4482:
4483: #if BITS_BIG_ENDIAN
4484: val >>= (GET_MODE_BITSIZE (op0_mode) - INTVAL (op2) - INTVAL (op1));
4485: #else
4486: val >>= INTVAL (op2);
4487: #endif
4488: if (HOST_BITS_PER_WIDE_INT != INTVAL (op1))
4489: {
4490: /* First zero-extend. */
4491: val &= ((HOST_WIDE_INT) 1 << INTVAL (op1)) - 1;
4492: /* If desired, propagate sign bit. */
4493: if (code == SIGN_EXTRACT
4494: && (val & ((HOST_WIDE_INT) 1 << (INTVAL (op1) - 1))))
4495: val |= ~ (((HOST_WIDE_INT) 1 << INTVAL (op1)) - 1);
4496: }
4497:
4498: /* Clear the bits that don't belong in our mode,
4499: unless they and our sign bit are all one.
4500: So we get either a reasonable negative value or a reasonable
4501: unsigned value for this mode. */
4502: if (width < HOST_BITS_PER_WIDE_INT
4503: && ((val & ((HOST_WIDE_INT) (-1) << (width - 1)))
4504: != ((HOST_WIDE_INT) (-1) << (width - 1))))
4505: val &= ((HOST_WIDE_INT) 1 << width) - 1;
4506:
4507: return GEN_INT (val);
4508: }
4509: break;
4510:
4511: case IF_THEN_ELSE:
4512: if (GET_CODE (op0) == CONST_INT)
4513: return op0 != const0_rtx ? op1 : op2;
4514: break;
4515:
4516: default:
4517: abort ();
4518: }
4519:
4520: return 0;
4521: }
4522:
4523: /* If X is a nontrivial arithmetic operation on an argument
4524: for which a constant value can be determined, return
4525: the result of operating on that value, as a constant.
4526: Otherwise, return X, possibly with one or more operands
4527: modified by recursive calls to this function.
4528:
4529: If X is a register whose contents are known, we do NOT
4530: return those contents here. equiv_constant is called to
4531: perform that task.
4532:
4533: INSN is the insn that we may be modifying. If it is 0, make a copy
4534: of X before modifying it. */
4535:
4536: static rtx
4537: fold_rtx (x, insn)
4538: rtx x;
4539: rtx insn;
4540: {
4541: register enum rtx_code code;
4542: register enum machine_mode mode;
4543: register char *fmt;
4544: register int i;
4545: rtx new = 0;
4546: int copied = 0;
4547: int must_swap = 0;
4548:
4549: /* Folded equivalents of first two operands of X. */
4550: rtx folded_arg0;
4551: rtx folded_arg1;
4552:
4553: /* Constant equivalents of first three operands of X;
4554: 0 when no such equivalent is known. */
4555: rtx const_arg0;
4556: rtx const_arg1;
4557: rtx const_arg2;
4558:
4559: /* The mode of the first operand of X. We need this for sign and zero
4560: extends. */
4561: enum machine_mode mode_arg0;
4562:
4563: if (x == 0)
4564: return x;
4565:
4566: mode = GET_MODE (x);
4567: code = GET_CODE (x);
4568: switch (code)
4569: {
4570: case CONST:
4571: case CONST_INT:
4572: case CONST_DOUBLE:
4573: case SYMBOL_REF:
4574: case LABEL_REF:
4575: case REG:
4576: /* No use simplifying an EXPR_LIST
4577: since they are used only for lists of args
4578: in a function call's REG_EQUAL note. */
4579: case EXPR_LIST:
4580: return x;
4581:
4582: #ifdef HAVE_cc0
4583: case CC0:
4584: return prev_insn_cc0;
4585: #endif
4586:
4587: case PC:
4588: /* If the next insn is a CODE_LABEL followed by a jump table,
4589: PC's value is a LABEL_REF pointing to that label. That
4590: lets us fold switch statements on the Vax. */
4591: if (insn && GET_CODE (insn) == JUMP_INSN)
4592: {
4593: rtx next = next_nonnote_insn (insn);
4594:
4595: if (next && GET_CODE (next) == CODE_LABEL
4596: && NEXT_INSN (next) != 0
4597: && GET_CODE (NEXT_INSN (next)) == JUMP_INSN
4598: && (GET_CODE (PATTERN (NEXT_INSN (next))) == ADDR_VEC
4599: || GET_CODE (PATTERN (NEXT_INSN (next))) == ADDR_DIFF_VEC))
4600: return gen_rtx (LABEL_REF, Pmode, next);
4601: }
4602: break;
4603:
4604: case SUBREG:
4605: /* See if we previously assigned a constant value to this SUBREG. */
4606: if ((new = lookup_as_function (x, CONST_INT)) != 0
4607: || (new = lookup_as_function (x, CONST_DOUBLE)) != 0)
4608: return new;
4609:
4610: /* If this is a paradoxical SUBREG, we have no idea what value the
4611: extra bits would have. However, if the operand is equivalent
4612: to a SUBREG whose operand is the same as our mode, and all the
4613: modes are within a word, we can just use the inner operand
4614: because these SUBREGs just say how to treat the register.
4615:
4616: Similarly if we find an integer constant. */
4617:
4618: if (GET_MODE_SIZE (mode) > GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))))
4619: {
4620: enum machine_mode imode = GET_MODE (SUBREG_REG (x));
4621: struct table_elt *elt;
4622:
4623: if (GET_MODE_SIZE (mode) <= UNITS_PER_WORD
4624: && GET_MODE_SIZE (imode) <= UNITS_PER_WORD
4625: && (elt = lookup (SUBREG_REG (x), HASH (SUBREG_REG (x), imode),
4626: imode)) != 0)
4627: for (elt = elt->first_same_value;
4628: elt; elt = elt->next_same_value)
4629: {
4630: if (CONSTANT_P (elt->exp)
4631: && GET_MODE (elt->exp) == VOIDmode)
4632: return elt->exp;
4633:
4634: if (GET_CODE (elt->exp) == SUBREG
4635: && GET_MODE (SUBREG_REG (elt->exp)) == mode
4636: && exp_equiv_p (elt->exp, elt->exp, 1, 0))
4637: return copy_rtx (SUBREG_REG (elt->exp));
4638: }
4639:
4640: return x;
4641: }
4642:
4643: /* Fold SUBREG_REG. If it changed, see if we can simplify the SUBREG.
4644: We might be able to if the SUBREG is extracting a single word in an
4645: integral mode or extracting the low part. */
4646:
4647: folded_arg0 = fold_rtx (SUBREG_REG (x), insn);
4648: const_arg0 = equiv_constant (folded_arg0);
4649: if (const_arg0)
4650: folded_arg0 = const_arg0;
4651:
4652: if (folded_arg0 != SUBREG_REG (x))
4653: {
4654: new = 0;
4655:
4656: if (GET_MODE_CLASS (mode) == MODE_INT
4657: && GET_MODE_SIZE (mode) == UNITS_PER_WORD
4658: && GET_MODE (SUBREG_REG (x)) != VOIDmode)
4659: new = operand_subword (folded_arg0, SUBREG_WORD (x), 0,
4660: GET_MODE (SUBREG_REG (x)));
4661: if (new == 0 && subreg_lowpart_p (x))
4662: new = gen_lowpart_if_possible (mode, folded_arg0);
4663: if (new)
4664: return new;
4665: }
4666:
4667: /* If this is a narrowing SUBREG and our operand is a REG, see if
4668: we can find an equivalence for REG that is an arithmetic operation
4669: in a wider mode where both operands are paradoxical SUBREGs
4670: from objects of our result mode. In that case, we couldn't report
4671: an equivalent value for that operation, since we don't know what the
4672: extra bits will be. But we can find an equivalence for this SUBREG
4673: by folding that operation is the narrow mode. This allows us to
4674: fold arithmetic in narrow modes when the machine only supports
4675: word-sized arithmetic.
4676:
4677: Also look for a case where we have a SUBREG whose operand is the
4678: same as our result. If both modes are smaller than a word, we
4679: are simply interpreting a register in different modes and we
4680: can use the inner value. */
4681:
4682: if (GET_CODE (folded_arg0) == REG
4683: && GET_MODE_SIZE (mode) < GET_MODE_SIZE (GET_MODE (folded_arg0))
4684: && subreg_lowpart_p (x))
4685: {
4686: struct table_elt *elt;
4687:
4688: /* We can use HASH here since we know that canon_hash won't be
4689: called. */
4690: elt = lookup (folded_arg0,
4691: HASH (folded_arg0, GET_MODE (folded_arg0)),
4692: GET_MODE (folded_arg0));
4693:
4694: if (elt)
4695: elt = elt->first_same_value;
4696:
4697: for (; elt; elt = elt->next_same_value)
4698: {
4699: enum rtx_code eltcode = GET_CODE (elt->exp);
4700:
4701: /* Just check for unary and binary operations. */
4702: if (GET_RTX_CLASS (GET_CODE (elt->exp)) == '1'
4703: && GET_CODE (elt->exp) != SIGN_EXTEND
4704: && GET_CODE (elt->exp) != ZERO_EXTEND
4705: && GET_CODE (XEXP (elt->exp, 0)) == SUBREG
4706: && GET_MODE (SUBREG_REG (XEXP (elt->exp, 0))) == mode)
4707: {
4708: rtx op0 = SUBREG_REG (XEXP (elt->exp, 0));
4709:
4710: if (GET_CODE (op0) != REG && ! CONSTANT_P (op0))
4711: op0 = fold_rtx (op0, NULL_RTX);
4712:
4713: op0 = equiv_constant (op0);
4714: if (op0)
4715: new = simplify_unary_operation (GET_CODE (elt->exp), mode,
4716: op0, mode);
4717: }
4718: else if ((GET_RTX_CLASS (GET_CODE (elt->exp)) == '2'
4719: || GET_RTX_CLASS (GET_CODE (elt->exp)) == 'c')
4720: && eltcode != DIV && eltcode != MOD
4721: && eltcode != UDIV && eltcode != UMOD
4722: && eltcode != ASHIFTRT && eltcode != LSHIFTRT
4723: && eltcode != ROTATE && eltcode != ROTATERT
4724: && ((GET_CODE (XEXP (elt->exp, 0)) == SUBREG
4725: && (GET_MODE (SUBREG_REG (XEXP (elt->exp, 0)))
4726: == mode))
4727: || CONSTANT_P (XEXP (elt->exp, 0)))
4728: && ((GET_CODE (XEXP (elt->exp, 1)) == SUBREG
4729: && (GET_MODE (SUBREG_REG (XEXP (elt->exp, 1)))
4730: == mode))
4731: || CONSTANT_P (XEXP (elt->exp, 1))))
4732: {
4733: rtx op0 = gen_lowpart_common (mode, XEXP (elt->exp, 0));
4734: rtx op1 = gen_lowpart_common (mode, XEXP (elt->exp, 1));
4735:
4736: if (op0 && GET_CODE (op0) != REG && ! CONSTANT_P (op0))
4737: op0 = fold_rtx (op0, NULL_RTX);
4738:
4739: if (op0)
4740: op0 = equiv_constant (op0);
4741:
4742: if (op1 && GET_CODE (op1) != REG && ! CONSTANT_P (op1))
4743: op1 = fold_rtx (op1, NULL_RTX);
4744:
4745: if (op1)
4746: op1 = equiv_constant (op1);
4747:
4748: /* If we are looking for the low SImode part of
4749: (ashift:DI c (const_int 32)), it doesn't work
4750: to compute that in SImode, because a 32-bit shift
4751: in SImode is unpredictable. We know the value is 0. */
4752: if (op0 && op1
4753: && (GET_CODE (elt->exp) == ASHIFT
4754: || GET_CODE (elt->exp) == LSHIFT)
4755: && GET_CODE (op1) == CONST_INT
4756: && INTVAL (op1) >= GET_MODE_BITSIZE (mode))
4757: {
4758: if (INTVAL (op1) < GET_MODE_BITSIZE (GET_MODE (elt->exp)))
4759:
4760: /* If the count fits in the inner mode's width,
4761: but exceeds the outer mode's width,
4762: the value will get truncated to 0
4763: by the subreg. */
4764: new = const0_rtx;
4765: else
4766: /* If the count exceeds even the inner mode's width,
4767: don't fold this expression. */
4768: new = 0;
4769: }
4770: else if (op0 && op1)
4771: new = simplify_binary_operation (GET_CODE (elt->exp), mode,
4772: op0, op1);
4773: }
4774:
4775: else if (GET_CODE (elt->exp) == SUBREG
4776: && GET_MODE (SUBREG_REG (elt->exp)) == mode
4777: && (GET_MODE_SIZE (GET_MODE (folded_arg0))
4778: <= UNITS_PER_WORD)
4779: && exp_equiv_p (elt->exp, elt->exp, 1, 0))
4780: new = copy_rtx (SUBREG_REG (elt->exp));
4781:
4782: if (new)
4783: return new;
4784: }
4785: }
4786:
4787: return x;
4788:
4789: case NOT:
4790: case NEG:
4791: /* If we have (NOT Y), see if Y is known to be (NOT Z).
4792: If so, (NOT Y) simplifies to Z. Similarly for NEG. */
4793: new = lookup_as_function (XEXP (x, 0), code);
4794: if (new)
4795: return fold_rtx (copy_rtx (XEXP (new, 0)), insn);
4796: break;
4797:
4798: case MEM:
4799: /* If we are not actually processing an insn, don't try to find the
4800: best address. Not only don't we care, but we could modify the
4801: MEM in an invalid way since we have no insn to validate against. */
4802: if (insn != 0)
4803: find_best_addr (insn, &XEXP (x, 0));
4804:
4805: {
4806: /* Even if we don't fold in the insn itself,
4807: we can safely do so here, in hopes of getting a constant. */
4808: rtx addr = fold_rtx (XEXP (x, 0), NULL_RTX);
4809: rtx base = 0;
4810: HOST_WIDE_INT offset = 0;
4811:
4812: if (GET_CODE (addr) == REG
4813: && REGNO_QTY_VALID_P (REGNO (addr))
4814: && GET_MODE (addr) == qty_mode[reg_qty[REGNO (addr)]]
4815: && qty_const[reg_qty[REGNO (addr)]] != 0)
4816: addr = qty_const[reg_qty[REGNO (addr)]];
4817:
4818: /* If address is constant, split it into a base and integer offset. */
4819: if (GET_CODE (addr) == SYMBOL_REF || GET_CODE (addr) == LABEL_REF)
4820: base = addr;
4821: else if (GET_CODE (addr) == CONST && GET_CODE (XEXP (addr, 0)) == PLUS
4822: && GET_CODE (XEXP (XEXP (addr, 0), 1)) == CONST_INT)
4823: {
4824: base = XEXP (XEXP (addr, 0), 0);
4825: offset = INTVAL (XEXP (XEXP (addr, 0), 1));
4826: }
4827: else if (GET_CODE (addr) == LO_SUM
4828: && GET_CODE (XEXP (addr, 1)) == SYMBOL_REF)
4829: base = XEXP (addr, 1);
4830:
4831: /* If this is a constant pool reference, we can fold it into its
4832: constant to allow better value tracking. */
4833: if (base && GET_CODE (base) == SYMBOL_REF
4834: && CONSTANT_POOL_ADDRESS_P (base))
4835: {
4836: rtx constant = get_pool_constant (base);
4837: enum machine_mode const_mode = get_pool_mode (base);
4838: rtx new;
4839:
4840: if (CONSTANT_P (constant) && GET_CODE (constant) != CONST_INT)
4841: constant_pool_entries_cost = COST (constant);
4842:
4843: /* If we are loading the full constant, we have an equivalence. */
4844: if (offset == 0 && mode == const_mode)
4845: return constant;
4846:
4847: /* If this actually isn't a constant (wierd!), we can't do
4848: anything. Otherwise, handle the two most common cases:
4849: extracting a word from a multi-word constant, and extracting
4850: the low-order bits. Other cases don't seem common enough to
4851: worry about. */
4852: if (! CONSTANT_P (constant))
4853: return x;
4854:
4855: if (GET_MODE_CLASS (mode) == MODE_INT
4856: && GET_MODE_SIZE (mode) == UNITS_PER_WORD
4857: && offset % UNITS_PER_WORD == 0
4858: && (new = operand_subword (constant,
4859: offset / UNITS_PER_WORD,
4860: 0, const_mode)) != 0)
4861: return new;
4862:
4863: if (((BYTES_BIG_ENDIAN
4864: && offset == GET_MODE_SIZE (GET_MODE (constant)) - 1)
4865: || (! BYTES_BIG_ENDIAN && offset == 0))
4866: && (new = gen_lowpart_if_possible (mode, constant)) != 0)
4867: return new;
4868: }
4869:
4870: /* If this is a reference to a label at a known position in a jump
4871: table, we also know its value. */
4872: if (base && GET_CODE (base) == LABEL_REF)
4873: {
4874: rtx label = XEXP (base, 0);
4875: rtx table_insn = NEXT_INSN (label);
4876:
4877: if (table_insn && GET_CODE (table_insn) == JUMP_INSN
4878: && GET_CODE (PATTERN (table_insn)) == ADDR_VEC)
4879: {
4880: rtx table = PATTERN (table_insn);
4881:
4882: if (offset >= 0
4883: && (offset / GET_MODE_SIZE (GET_MODE (table))
4884: < XVECLEN (table, 0)))
4885: return XVECEXP (table, 0,
4886: offset / GET_MODE_SIZE (GET_MODE (table)));
4887: }
4888: if (table_insn && GET_CODE (table_insn) == JUMP_INSN
4889: && GET_CODE (PATTERN (table_insn)) == ADDR_DIFF_VEC)
4890: {
4891: rtx table = PATTERN (table_insn);
4892:
4893: if (offset >= 0
4894: && (offset / GET_MODE_SIZE (GET_MODE (table))
4895: < XVECLEN (table, 1)))
4896: {
4897: offset /= GET_MODE_SIZE (GET_MODE (table));
4898: new = gen_rtx (MINUS, Pmode, XVECEXP (table, 1, offset),
4899: XEXP (table, 0));
4900:
4901: if (GET_MODE (table) != Pmode)
4902: new = gen_rtx (TRUNCATE, GET_MODE (table), new);
4903:
4904: return new;
4905: }
4906: }
4907: }
4908:
4909: return x;
4910: }
4911: }
4912:
4913: const_arg0 = 0;
4914: const_arg1 = 0;
4915: const_arg2 = 0;
4916: mode_arg0 = VOIDmode;
4917:
4918: /* Try folding our operands.
4919: Then see which ones have constant values known. */
4920:
4921: fmt = GET_RTX_FORMAT (code);
4922: for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
4923: if (fmt[i] == 'e')
4924: {
4925: rtx arg = XEXP (x, i);
4926: rtx folded_arg = arg, const_arg = 0;
4927: enum machine_mode mode_arg = GET_MODE (arg);
4928: rtx cheap_arg, expensive_arg;
4929: rtx replacements[2];
4930: int j;
4931:
4932: /* Most arguments are cheap, so handle them specially. */
4933: switch (GET_CODE (arg))
4934: {
4935: case REG:
4936: /* This is the same as calling equiv_constant; it is duplicated
4937: here for speed. */
4938: if (REGNO_QTY_VALID_P (REGNO (arg))
4939: && qty_const[reg_qty[REGNO (arg)]] != 0
4940: && GET_CODE (qty_const[reg_qty[REGNO (arg)]]) != REG
4941: && GET_CODE (qty_const[reg_qty[REGNO (arg)]]) != PLUS)
4942: const_arg
4943: = gen_lowpart_if_possible (GET_MODE (arg),
4944: qty_const[reg_qty[REGNO (arg)]]);
4945: break;
4946:
4947: case CONST:
4948: case CONST_INT:
4949: case SYMBOL_REF:
4950: case LABEL_REF:
4951: case CONST_DOUBLE:
4952: const_arg = arg;
4953: break;
4954:
4955: #ifdef HAVE_cc0
4956: case CC0:
4957: folded_arg = prev_insn_cc0;
4958: mode_arg = prev_insn_cc0_mode;
4959: const_arg = equiv_constant (folded_arg);
4960: break;
4961: #endif
4962:
4963: default:
4964: folded_arg = fold_rtx (arg, insn);
4965: const_arg = equiv_constant (folded_arg);
4966: }
4967:
4968: /* For the first three operands, see if the operand
4969: is constant or equivalent to a constant. */
4970: switch (i)
4971: {
4972: case 0:
4973: folded_arg0 = folded_arg;
4974: const_arg0 = const_arg;
4975: mode_arg0 = mode_arg;
4976: break;
4977: case 1:
4978: folded_arg1 = folded_arg;
4979: const_arg1 = const_arg;
4980: break;
4981: case 2:
4982: const_arg2 = const_arg;
4983: break;
4984: }
4985:
4986: /* Pick the least expensive of the folded argument and an
4987: equivalent constant argument. */
4988: if (const_arg == 0 || const_arg == folded_arg
4989: || COST (const_arg) > COST (folded_arg))
4990: cheap_arg = folded_arg, expensive_arg = const_arg;
4991: else
4992: cheap_arg = const_arg, expensive_arg = folded_arg;
4993:
4994: /* Try to replace the operand with the cheapest of the two
4995: possibilities. If it doesn't work and this is either of the first
4996: two operands of a commutative operation, try swapping them.
4997: If THAT fails, try the more expensive, provided it is cheaper
4998: than what is already there. */
4999:
5000: if (cheap_arg == XEXP (x, i))
5001: continue;
5002:
5003: if (insn == 0 && ! copied)
5004: {
5005: x = copy_rtx (x);
5006: copied = 1;
5007: }
5008:
5009: replacements[0] = cheap_arg, replacements[1] = expensive_arg;
5010: for (j = 0;
5011: j < 2 && replacements[j]
5012: && COST (replacements[j]) < COST (XEXP (x, i));
5013: j++)
5014: {
5015: if (validate_change (insn, &XEXP (x, i), replacements[j], 0))
5016: break;
5017:
5018: if (code == NE || code == EQ || GET_RTX_CLASS (code) == 'c')
5019: {
5020: validate_change (insn, &XEXP (x, i), XEXP (x, 1 - i), 1);
5021: validate_change (insn, &XEXP (x, 1 - i), replacements[j], 1);
5022:
5023: if (apply_change_group ())
5024: {
5025: /* Swap them back to be invalid so that this loop can
5026: continue and flag them to be swapped back later. */
5027: rtx tem;
5028:
5029: tem = XEXP (x, 0); XEXP (x, 0) = XEXP (x, 1);
5030: XEXP (x, 1) = tem;
5031: must_swap = 1;
5032: break;
5033: }
5034: }
5035: }
5036: }
5037:
5038: else if (fmt[i] == 'E')
5039: /* Don't try to fold inside of a vector of expressions.
5040: Doing nothing is harmless. */
5041: ;
5042:
5043: /* If a commutative operation, place a constant integer as the second
5044: operand unless the first operand is also a constant integer. Otherwise,
5045: place any constant second unless the first operand is also a constant. */
5046:
5047: if (code == EQ || code == NE || GET_RTX_CLASS (code) == 'c')
5048: {
5049: if (must_swap || (const_arg0
5050: && (const_arg1 == 0
5051: || (GET_CODE (const_arg0) == CONST_INT
5052: && GET_CODE (const_arg1) != CONST_INT))))
5053: {
5054: register rtx tem = XEXP (x, 0);
5055:
5056: if (insn == 0 && ! copied)
5057: {
5058: x = copy_rtx (x);
5059: copied = 1;
5060: }
5061:
5062: validate_change (insn, &XEXP (x, 0), XEXP (x, 1), 1);
5063: validate_change (insn, &XEXP (x, 1), tem, 1);
5064: if (apply_change_group ())
5065: {
5066: tem = const_arg0, const_arg0 = const_arg1, const_arg1 = tem;
5067: tem = folded_arg0, folded_arg0 = folded_arg1, folded_arg1 = tem;
5068: }
5069: }
5070: }
5071:
5072: /* If X is an arithmetic operation, see if we can simplify it. */
5073:
5074: switch (GET_RTX_CLASS (code))
5075: {
5076: case '1':
5077: /* We can't simplify extension ops unless we know the original mode. */
5078: if ((code == ZERO_EXTEND || code == SIGN_EXTEND)
5079: && mode_arg0 == VOIDmode)
5080: break;
5081: new = simplify_unary_operation (code, mode,
5082: const_arg0 ? const_arg0 : folded_arg0,
5083: mode_arg0);
5084: break;
5085:
5086: case '<':
5087: /* See what items are actually being compared and set FOLDED_ARG[01]
5088: to those values and CODE to the actual comparison code. If any are
5089: constant, set CONST_ARG0 and CONST_ARG1 appropriately. We needn't
5090: do anything if both operands are already known to be constant. */
5091:
5092: if (const_arg0 == 0 || const_arg1 == 0)
5093: {
5094: struct table_elt *p0, *p1;
5095: rtx true = const_true_rtx, false = const0_rtx;
5096: enum machine_mode mode_arg1;
5097:
5098: #ifdef FLOAT_STORE_FLAG_VALUE
5099: if (GET_MODE_CLASS (mode) == MODE_FLOAT)
5100: {
5101: true = immed_real_const_1 (FLOAT_STORE_FLAG_VALUE, mode);
5102: false = CONST0_RTX (mode);
5103: }
5104: #endif
5105:
5106: code = find_comparison_args (code, &folded_arg0, &folded_arg1,
5107: &mode_arg0, &mode_arg1);
5108: const_arg0 = equiv_constant (folded_arg0);
5109: const_arg1 = equiv_constant (folded_arg1);
5110:
5111: /* If the mode is VOIDmode or a MODE_CC mode, we don't know
5112: what kinds of things are being compared, so we can't do
5113: anything with this comparison. */
5114:
5115: if (mode_arg0 == VOIDmode || GET_MODE_CLASS (mode_arg0) == MODE_CC)
5116: break;
5117:
5118: /* If we do not now have two constants being compared, see if we
5119: can nevertheless deduce some things about the comparison. */
5120: if (const_arg0 == 0 || const_arg1 == 0)
5121: {
5122: /* Is FOLDED_ARG0 frame-pointer plus a constant? Or non-explicit
5123: constant? These aren't zero, but we don't know their sign. */
5124: if (const_arg1 == const0_rtx
5125: && (NONZERO_BASE_PLUS_P (folded_arg0)
5126: #if 0 /* Sad to say, on sysvr4, #pragma weak can make a symbol address
5127: come out as 0. */
5128: || GET_CODE (folded_arg0) == SYMBOL_REF
5129: #endif
5130: || GET_CODE (folded_arg0) == LABEL_REF
5131: || GET_CODE (folded_arg0) == CONST))
5132: {
5133: if (code == EQ)
5134: return false;
5135: else if (code == NE)
5136: return true;
5137: }
5138:
5139: /* See if the two operands are the same. We don't do this
5140: for IEEE floating-point since we can't assume x == x
5141: since x might be a NaN. */
5142:
5143: if ((TARGET_FLOAT_FORMAT != IEEE_FLOAT_FORMAT
5144: || ! FLOAT_MODE_P (mode_arg0))
5145: && (folded_arg0 == folded_arg1
5146: || (GET_CODE (folded_arg0) == REG
5147: && GET_CODE (folded_arg1) == REG
5148: && (reg_qty[REGNO (folded_arg0)]
5149: == reg_qty[REGNO (folded_arg1)]))
5150: || ((p0 = lookup (folded_arg0,
5151: (safe_hash (folded_arg0, mode_arg0)
5152: % NBUCKETS), mode_arg0))
5153: && (p1 = lookup (folded_arg1,
5154: (safe_hash (folded_arg1, mode_arg0)
5155: % NBUCKETS), mode_arg0))
5156: && p0->first_same_value == p1->first_same_value)))
5157: return ((code == EQ || code == LE || code == GE
5158: || code == LEU || code == GEU)
5159: ? true : false);
5160:
5161: /* If FOLDED_ARG0 is a register, see if the comparison we are
5162: doing now is either the same as we did before or the reverse
5163: (we only check the reverse if not floating-point). */
5164: else if (GET_CODE (folded_arg0) == REG)
5165: {
5166: int qty = reg_qty[REGNO (folded_arg0)];
5167:
5168: if (REGNO_QTY_VALID_P (REGNO (folded_arg0))
5169: && (comparison_dominates_p (qty_comparison_code[qty], code)
5170: || (comparison_dominates_p (qty_comparison_code[qty],
5171: reverse_condition (code))
5172: && ! FLOAT_MODE_P (mode_arg0)))
5173: && (rtx_equal_p (qty_comparison_const[qty], folded_arg1)
5174: || (const_arg1
5175: && rtx_equal_p (qty_comparison_const[qty],
5176: const_arg1))
5177: || (GET_CODE (folded_arg1) == REG
5178: && (reg_qty[REGNO (folded_arg1)]
5179: == qty_comparison_qty[qty]))))
5180: return (comparison_dominates_p (qty_comparison_code[qty],
5181: code)
5182: ? true : false);
5183: }
5184: }
5185: }
5186:
5187: /* If we are comparing against zero, see if the first operand is
5188: equivalent to an IOR with a constant. If so, we may be able to
5189: determine the result of this comparison. */
5190:
5191: if (const_arg1 == const0_rtx)
5192: {
5193: rtx y = lookup_as_function (folded_arg0, IOR);
5194: rtx inner_const;
5195:
5196: if (y != 0
5197: && (inner_const = equiv_constant (XEXP (y, 1))) != 0
5198: && GET_CODE (inner_const) == CONST_INT
5199: && INTVAL (inner_const) != 0)
5200: {
5201: int sign_bitnum = GET_MODE_BITSIZE (mode_arg0) - 1;
5202: int has_sign = (HOST_BITS_PER_WIDE_INT >= sign_bitnum
5203: && (INTVAL (inner_const)
5204: & ((HOST_WIDE_INT) 1 << sign_bitnum)));
5205: rtx true = const_true_rtx, false = const0_rtx;
5206:
5207: #ifdef FLOAT_STORE_FLAG_VALUE
5208: if (GET_MODE_CLASS (mode) == MODE_FLOAT)
5209: {
5210: true = immed_real_const_1 (FLOAT_STORE_FLAG_VALUE, mode);
5211: false = CONST0_RTX (mode);
5212: }
5213: #endif
5214:
5215: switch (code)
5216: {
5217: case EQ:
5218: return false;
5219: case NE:
5220: return true;
5221: case LT: case LE:
5222: if (has_sign)
5223: return true;
5224: break;
5225: case GT: case GE:
5226: if (has_sign)
5227: return false;
5228: break;
5229: }
5230: }
5231: }
5232:
5233: new = simplify_relational_operation (code, mode_arg0,
5234: const_arg0 ? const_arg0 : folded_arg0,
5235: const_arg1 ? const_arg1 : folded_arg1);
5236: #ifdef FLOAT_STORE_FLAG_VALUE
5237: if (new != 0 && GET_MODE_CLASS (mode) == MODE_FLOAT)
5238: new = ((new == const0_rtx) ? CONST0_RTX (mode)
5239: : immed_real_const_1 (FLOAT_STORE_FLAG_VALUE, mode));
5240: #endif
5241: break;
5242:
5243: case '2':
5244: case 'c':
5245: switch (code)
5246: {
5247: case PLUS:
5248: /* If the second operand is a LABEL_REF, see if the first is a MINUS
5249: with that LABEL_REF as its second operand. If so, the result is
5250: the first operand of that MINUS. This handles switches with an
5251: ADDR_DIFF_VEC table. */
5252: if (const_arg1 && GET_CODE (const_arg1) == LABEL_REF)
5253: {
5254: rtx y = lookup_as_function (folded_arg0, MINUS);
5255:
5256: if (y != 0 && GET_CODE (XEXP (y, 1)) == LABEL_REF
5257: && XEXP (XEXP (y, 1), 0) == XEXP (const_arg1, 0))
5258: return XEXP (y, 0);
5259: }
5260: goto from_plus;
5261:
5262: case MINUS:
5263: /* If we have (MINUS Y C), see if Y is known to be (PLUS Z C2).
5264: If so, produce (PLUS Z C2-C). */
5265: if (const_arg1 != 0 && GET_CODE (const_arg1) == CONST_INT)
5266: {
5267: rtx y = lookup_as_function (XEXP (x, 0), PLUS);
5268: if (y && GET_CODE (XEXP (y, 1)) == CONST_INT)
5269: return fold_rtx (plus_constant (copy_rtx (y),
5270: -INTVAL (const_arg1)),
5271: NULL_RTX);
5272: }
5273:
5274: /* ... fall through ... */
5275:
5276: from_plus:
5277: case SMIN: case SMAX: case UMIN: case UMAX:
5278: case IOR: case AND: case XOR:
5279: case MULT: case DIV: case UDIV:
5280: case ASHIFT: case LSHIFTRT: case ASHIFTRT:
5281: /* If we have (<op> <reg> <const_int>) for an associative OP and REG
5282: is known to be of similar form, we may be able to replace the
5283: operation with a combined operation. This may eliminate the
5284: intermediate operation if every use is simplified in this way.
5285: Note that the similar optimization done by combine.c only works
5286: if the intermediate operation's result has only one reference. */
5287:
5288: if (GET_CODE (folded_arg0) == REG
5289: && const_arg1 && GET_CODE (const_arg1) == CONST_INT)
5290: {
5291: int is_shift
5292: = (code == ASHIFT || code == ASHIFTRT || code == LSHIFTRT);
5293: rtx y = lookup_as_function (folded_arg0, code);
5294: rtx inner_const;
5295: enum rtx_code associate_code;
5296: rtx new_const;
5297:
5298: if (y == 0
5299: || 0 == (inner_const
5300: = equiv_constant (fold_rtx (XEXP (y, 1), 0)))
5301: || GET_CODE (inner_const) != CONST_INT
5302: /* If we have compiled a statement like
5303: "if (x == (x & mask1))", and now are looking at
5304: "x & mask2", we will have a case where the first operand
5305: of Y is the same as our first operand. Unless we detect
5306: this case, an infinite loop will result. */
5307: || XEXP (y, 0) == folded_arg0)
5308: break;
5309:
5310: /* Don't associate these operations if they are a PLUS with the
5311: same constant and it is a power of two. These might be doable
5312: with a pre- or post-increment. Similarly for two subtracts of
5313: identical powers of two with post decrement. */
5314:
5315: if (code == PLUS && INTVAL (const_arg1) == INTVAL (inner_const)
5316: && (0
5317: #if defined(HAVE_PRE_INCREMENT) || defined(HAVE_POST_INCREMENT)
5318: || exact_log2 (INTVAL (const_arg1)) >= 0
5319: #endif
5320: #if defined(HAVE_PRE_DECREMENT) || defined(HAVE_POST_DECREMENT)
5321: || exact_log2 (- INTVAL (const_arg1)) >= 0
5322: #endif
5323: ))
5324: break;
5325:
5326: /* Compute the code used to compose the constants. For example,
5327: A/C1/C2 is A/(C1 * C2), so if CODE == DIV, we want MULT. */
5328:
5329: associate_code
5330: = (code == MULT || code == DIV || code == UDIV ? MULT
5331: : is_shift || code == PLUS || code == MINUS ? PLUS : code);
5332:
5333: new_const = simplify_binary_operation (associate_code, mode,
5334: const_arg1, inner_const);
5335:
5336: if (new_const == 0)
5337: break;
5338:
5339: /* If we are associating shift operations, don't let this
5340: produce a shift of the size of the object or larger.
5341: This could occur when we follow a sign-extend by a right
5342: shift on a machine that does a sign-extend as a pair
5343: of shifts. */
5344:
5345: if (is_shift && GET_CODE (new_const) == CONST_INT
5346: && INTVAL (new_const) >= GET_MODE_BITSIZE (mode))
5347: {
5348: /* As an exception, we can turn an ASHIFTRT of this
5349: form into a shift of the number of bits - 1. */
5350: if (code == ASHIFTRT)
5351: new_const = GEN_INT (GET_MODE_BITSIZE (mode) - 1);
5352: else
5353: break;
5354: }
5355:
5356: y = copy_rtx (XEXP (y, 0));
5357:
5358: /* If Y contains our first operand (the most common way this
5359: can happen is if Y is a MEM), we would do into an infinite
5360: loop if we tried to fold it. So don't in that case. */
5361:
5362: if (! reg_mentioned_p (folded_arg0, y))
5363: y = fold_rtx (y, insn);
5364:
5365: return cse_gen_binary (code, mode, y, new_const);
5366: }
5367: }
5368:
5369: new = simplify_binary_operation (code, mode,
5370: const_arg0 ? const_arg0 : folded_arg0,
5371: const_arg1 ? const_arg1 : folded_arg1);
5372: break;
5373:
5374: case 'o':
5375: /* (lo_sum (high X) X) is simply X. */
5376: if (code == LO_SUM && const_arg0 != 0
5377: && GET_CODE (const_arg0) == HIGH
5378: && rtx_equal_p (XEXP (const_arg0, 0), const_arg1))
5379: return const_arg1;
5380: break;
5381:
5382: case '3':
5383: case 'b':
5384: new = simplify_ternary_operation (code, mode, mode_arg0,
5385: const_arg0 ? const_arg0 : folded_arg0,
5386: const_arg1 ? const_arg1 : folded_arg1,
5387: const_arg2 ? const_arg2 : XEXP (x, 2));
5388: break;
5389: }
5390:
5391: return new ? new : x;
5392: }
5393:
5394: /* Return a constant value currently equivalent to X.
5395: Return 0 if we don't know one. */
5396:
5397: static rtx
5398: equiv_constant (x)
5399: rtx x;
5400: {
5401: if (GET_CODE (x) == REG
5402: && REGNO_QTY_VALID_P (REGNO (x))
5403: && qty_const[reg_qty[REGNO (x)]])
5404: x = gen_lowpart_if_possible (GET_MODE (x), qty_const[reg_qty[REGNO (x)]]);
5405:
5406: if (x != 0 && CONSTANT_P (x))
5407: return x;
5408:
5409: /* If X is a MEM, try to fold it outside the context of any insn to see if
5410: it might be equivalent to a constant. That handles the case where it
5411: is a constant-pool reference. Then try to look it up in the hash table
5412: in case it is something whose value we have seen before. */
5413:
5414: if (GET_CODE (x) == MEM)
5415: {
5416: struct table_elt *elt;
5417:
5418: x = fold_rtx (x, NULL_RTX);
5419: if (CONSTANT_P (x))
5420: return x;
5421:
5422: elt = lookup (x, safe_hash (x, GET_MODE (x)) % NBUCKETS, GET_MODE (x));
5423: if (elt == 0)
5424: return 0;
5425:
5426: for (elt = elt->first_same_value; elt; elt = elt->next_same_value)
5427: if (elt->is_const && CONSTANT_P (elt->exp))
5428: return elt->exp;
5429: }
5430:
5431: return 0;
5432: }
5433:
5434: /* Assuming that X is an rtx (e.g., MEM, REG or SUBREG) for a fixed-point
5435: number, return an rtx (MEM, SUBREG, or CONST_INT) that refers to the
5436: least-significant part of X.
5437: MODE specifies how big a part of X to return.
5438:
5439: If the requested operation cannot be done, 0 is returned.
5440:
5441: This is similar to gen_lowpart in emit-rtl.c. */
5442:
5443: rtx
5444: gen_lowpart_if_possible (mode, x)
5445: enum machine_mode mode;
5446: register rtx x;
5447: {
5448: rtx result = gen_lowpart_common (mode, x);
5449:
5450: if (result)
5451: return result;
5452: else if (GET_CODE (x) == MEM)
5453: {
5454: /* This is the only other case we handle. */
5455: register int offset = 0;
5456: rtx new;
5457:
5458: #if WORDS_BIG_ENDIAN
5459: offset = (MAX (GET_MODE_SIZE (GET_MODE (x)), UNITS_PER_WORD)
5460: - MAX (GET_MODE_SIZE (mode), UNITS_PER_WORD));
5461: #endif
5462: #if BYTES_BIG_ENDIAN
5463: /* Adjust the address so that the address-after-the-data
5464: is unchanged. */
5465: offset -= (MIN (UNITS_PER_WORD, GET_MODE_SIZE (mode))
5466: - MIN (UNITS_PER_WORD, GET_MODE_SIZE (GET_MODE (x))));
5467: #endif
5468: new = gen_rtx (MEM, mode, plus_constant (XEXP (x, 0), offset));
5469: if (! memory_address_p (mode, XEXP (new, 0)))
5470: return 0;
5471: MEM_VOLATILE_P (new) = MEM_VOLATILE_P (x);
5472: RTX_UNCHANGING_P (new) = RTX_UNCHANGING_P (x);
5473: MEM_IN_STRUCT_P (new) = MEM_IN_STRUCT_P (x);
5474: return new;
5475: }
5476: else
5477: return 0;
5478: }
5479:
5480: /* Given INSN, a jump insn, TAKEN indicates if we are following the "taken"
5481: branch. It will be zero if not.
5482:
5483: In certain cases, this can cause us to add an equivalence. For example,
5484: if we are following the taken case of
5485: if (i == 2)
5486: we can add the fact that `i' and '2' are now equivalent.
5487:
5488: In any case, we can record that this comparison was passed. If the same
5489: comparison is seen later, we will know its value. */
5490:
5491: static void
5492: record_jump_equiv (insn, taken)
5493: rtx insn;
5494: int taken;
5495: {
5496: int cond_known_true;
5497: rtx op0, op1;
5498: enum machine_mode mode, mode0, mode1;
5499: int reversed_nonequality = 0;
5500: enum rtx_code code;
5501:
5502: /* Ensure this is the right kind of insn. */
5503: if (! condjump_p (insn) || simplejump_p (insn))
5504: return;
5505:
5506: /* See if this jump condition is known true or false. */
5507: if (taken)
5508: cond_known_true = (XEXP (SET_SRC (PATTERN (insn)), 2) == pc_rtx);
5509: else
5510: cond_known_true = (XEXP (SET_SRC (PATTERN (insn)), 1) == pc_rtx);
5511:
5512: /* Get the type of comparison being done and the operands being compared.
5513: If we had to reverse a non-equality condition, record that fact so we
5514: know that it isn't valid for floating-point. */
5515: code = GET_CODE (XEXP (SET_SRC (PATTERN (insn)), 0));
5516: op0 = fold_rtx (XEXP (XEXP (SET_SRC (PATTERN (insn)), 0), 0), insn);
5517: op1 = fold_rtx (XEXP (XEXP (SET_SRC (PATTERN (insn)), 0), 1), insn);
5518:
5519: code = find_comparison_args (code, &op0, &op1, &mode0, &mode1);
5520: if (! cond_known_true)
5521: {
5522: reversed_nonequality = (code != EQ && code != NE);
5523: code = reverse_condition (code);
5524: }
5525:
5526: /* The mode is the mode of the non-constant. */
5527: mode = mode0;
5528: if (mode1 != VOIDmode)
5529: mode = mode1;
5530:
5531: record_jump_cond (code, mode, op0, op1, reversed_nonequality);
5532: }
5533:
5534: /* We know that comparison CODE applied to OP0 and OP1 in MODE is true.
5535: REVERSED_NONEQUALITY is nonzero if CODE had to be swapped.
5536: Make any useful entries we can with that information. Called from
5537: above function and called recursively. */
5538:
5539: static void
5540: record_jump_cond (code, mode, op0, op1, reversed_nonequality)
5541: enum rtx_code code;
5542: enum machine_mode mode;
5543: rtx op0, op1;
5544: int reversed_nonequality;
5545: {
5546: int op0_hash_code, op1_hash_code;
5547: int op0_in_memory, op0_in_struct, op1_in_memory, op1_in_struct;
5548: struct table_elt *op0_elt, *op1_elt;
5549:
5550: /* If OP0 and OP1 are known equal, and either is a paradoxical SUBREG,
5551: we know that they are also equal in the smaller mode (this is also
5552: true for all smaller modes whether or not there is a SUBREG, but
5553: is not worth testing for with no SUBREG. */
5554:
5555: /* Note that GET_MODE (op0) may not equal MODE. */
5556: if (code == EQ && GET_CODE (op0) == SUBREG
5557: && (GET_MODE_SIZE (GET_MODE (op0))
5558: > GET_MODE_SIZE (GET_MODE (SUBREG_REG (op0)))))
5559: {
5560: enum machine_mode inner_mode = GET_MODE (SUBREG_REG (op0));
5561: rtx tem = gen_lowpart_if_possible (inner_mode, op1);
5562:
5563: record_jump_cond (code, mode, SUBREG_REG (op0),
5564: tem ? tem : gen_rtx (SUBREG, inner_mode, op1, 0),
5565: reversed_nonequality);
5566: }
5567:
5568: if (code == EQ && GET_CODE (op1) == SUBREG
5569: && (GET_MODE_SIZE (GET_MODE (op1))
5570: > GET_MODE_SIZE (GET_MODE (SUBREG_REG (op1)))))
5571: {
5572: enum machine_mode inner_mode = GET_MODE (SUBREG_REG (op1));
5573: rtx tem = gen_lowpart_if_possible (inner_mode, op0);
5574:
5575: record_jump_cond (code, mode, SUBREG_REG (op1),
5576: tem ? tem : gen_rtx (SUBREG, inner_mode, op0, 0),
5577: reversed_nonequality);
5578: }
5579:
5580: /* Similarly, if this is an NE comparison, and either is a SUBREG
5581: making a smaller mode, we know the whole thing is also NE. */
5582:
5583: /* Note that GET_MODE (op0) may not equal MODE;
5584: if we test MODE instead, we can get an infinite recursion
5585: alternating between two modes each wider than MODE. */
5586:
5587: if (code == NE && GET_CODE (op0) == SUBREG
5588: && subreg_lowpart_p (op0)
5589: && (GET_MODE_SIZE (GET_MODE (op0))
5590: < GET_MODE_SIZE (GET_MODE (SUBREG_REG (op0)))))
5591: {
5592: enum machine_mode inner_mode = GET_MODE (SUBREG_REG (op0));
5593: rtx tem = gen_lowpart_if_possible (inner_mode, op1);
5594:
5595: record_jump_cond (code, mode, SUBREG_REG (op0),
5596: tem ? tem : gen_rtx (SUBREG, inner_mode, op1, 0),
5597: reversed_nonequality);
5598: }
5599:
5600: if (code == NE && GET_CODE (op1) == SUBREG
5601: && subreg_lowpart_p (op1)
5602: && (GET_MODE_SIZE (GET_MODE (op1))
5603: < GET_MODE_SIZE (GET_MODE (SUBREG_REG (op1)))))
5604: {
5605: enum machine_mode inner_mode = GET_MODE (SUBREG_REG (op1));
5606: rtx tem = gen_lowpart_if_possible (inner_mode, op0);
5607:
5608: record_jump_cond (code, mode, SUBREG_REG (op1),
5609: tem ? tem : gen_rtx (SUBREG, inner_mode, op0, 0),
5610: reversed_nonequality);
5611: }
5612:
5613: /* Hash both operands. */
5614:
5615: do_not_record = 0;
5616: hash_arg_in_memory = 0;
5617: hash_arg_in_struct = 0;
5618: op0_hash_code = HASH (op0, mode);
5619: op0_in_memory = hash_arg_in_memory;
5620: op0_in_struct = hash_arg_in_struct;
5621:
5622: if (do_not_record)
5623: return;
5624:
5625: do_not_record = 0;
5626: hash_arg_in_memory = 0;
5627: hash_arg_in_struct = 0;
5628: op1_hash_code = HASH (op1, mode);
5629: op1_in_memory = hash_arg_in_memory;
5630: op1_in_struct = hash_arg_in_struct;
5631:
5632: if (do_not_record)
5633: return;
5634:
5635: /* Look up both operands. */
5636: op0_elt = lookup (op0, op0_hash_code, mode);
5637: op1_elt = lookup (op1, op1_hash_code, mode);
5638:
5639: /* If we aren't setting two things equal all we can do is save this
5640: comparison. Similarly if this is floating-point. In the latter
5641: case, OP1 might be zero and both -0.0 and 0.0 are equal to it.
5642: If we record the equality, we might inadvertently delete code
5643: whose intent was to change -0 to +0. */
5644:
5645: if (code != EQ || FLOAT_MODE_P (GET_MODE (op0)))
5646: {
5647: /* If we reversed a floating-point comparison, if OP0 is not a
5648: register, or if OP1 is neither a register or constant, we can't
5649: do anything. */
5650:
5651: if (GET_CODE (op1) != REG)
5652: op1 = equiv_constant (op1);
5653:
5654: if ((reversed_nonequality && FLOAT_MODE_P (mode))
5655: || GET_CODE (op0) != REG || op1 == 0)
5656: return;
5657:
5658: /* Put OP0 in the hash table if it isn't already. This gives it a
5659: new quantity number. */
5660: if (op0_elt == 0)
5661: {
5662: if (insert_regs (op0, NULL_PTR, 0))
5663: {
5664: rehash_using_reg (op0);
5665: op0_hash_code = HASH (op0, mode);
5666:
5667: /* If OP0 is contained in OP1, this changes its hash code
5668: as well. Faster to rehash than to check, except
5669: for the simple case of a constant. */
5670: if (! CONSTANT_P (op1))
5671: op1_hash_code = HASH (op1,mode);
5672: }
5673:
5674: op0_elt = insert (op0, NULL_PTR, op0_hash_code, mode);
5675: op0_elt->in_memory = op0_in_memory;
5676: op0_elt->in_struct = op0_in_struct;
5677: }
5678:
5679: qty_comparison_code[reg_qty[REGNO (op0)]] = code;
5680: if (GET_CODE (op1) == REG)
5681: {
5682: /* Look it up again--in case op0 and op1 are the same. */
5683: op1_elt = lookup (op1, op1_hash_code, mode);
5684:
5685: /* Put OP1 in the hash table so it gets a new quantity number. */
5686: if (op1_elt == 0)
5687: {
5688: if (insert_regs (op1, NULL_PTR, 0))
5689: {
5690: rehash_using_reg (op1);
5691: op1_hash_code = HASH (op1, mode);
5692: }
5693:
5694: op1_elt = insert (op1, NULL_PTR, op1_hash_code, mode);
5695: op1_elt->in_memory = op1_in_memory;
5696: op1_elt->in_struct = op1_in_struct;
5697: }
5698:
5699: qty_comparison_qty[reg_qty[REGNO (op0)]] = reg_qty[REGNO (op1)];
5700: qty_comparison_const[reg_qty[REGNO (op0)]] = 0;
5701: }
5702: else
5703: {
5704: qty_comparison_qty[reg_qty[REGNO (op0)]] = -1;
5705: qty_comparison_const[reg_qty[REGNO (op0)]] = op1;
5706: }
5707:
5708: return;
5709: }
5710:
5711: /* If either side is still missing an equivalence, make it now,
5712: then merge the equivalences. */
5713:
5714: if (op0_elt == 0)
5715: {
5716: if (insert_regs (op0, NULL_PTR, 0))
5717: {
5718: rehash_using_reg (op0);
5719: op0_hash_code = HASH (op0, mode);
5720: }
5721:
5722: op0_elt = insert (op0, NULL_PTR, op0_hash_code, mode);
5723: op0_elt->in_memory = op0_in_memory;
5724: op0_elt->in_struct = op0_in_struct;
5725: }
5726:
5727: if (op1_elt == 0)
5728: {
5729: if (insert_regs (op1, NULL_PTR, 0))
5730: {
5731: rehash_using_reg (op1);
5732: op1_hash_code = HASH (op1, mode);
5733: }
5734:
5735: op1_elt = insert (op1, NULL_PTR, op1_hash_code, mode);
5736: op1_elt->in_memory = op1_in_memory;
5737: op1_elt->in_struct = op1_in_struct;
5738: }
5739:
5740: merge_equiv_classes (op0_elt, op1_elt);
5741: last_jump_equiv_class = op0_elt;
5742: }
5743:
5744: /* CSE processing for one instruction.
5745: First simplify sources and addresses of all assignments
5746: in the instruction, using previously-computed equivalents values.
5747: Then install the new sources and destinations in the table
5748: of available values.
5749:
5750: If IN_LIBCALL_BLOCK is nonzero, don't record any equivalence made in
5751: the insn. */
5752:
5753: /* Data on one SET contained in the instruction. */
5754:
5755: struct set
5756: {
5757: /* The SET rtx itself. */
5758: rtx rtl;
5759: /* The SET_SRC of the rtx (the original value, if it is changing). */
5760: rtx src;
5761: /* The hash-table element for the SET_SRC of the SET. */
5762: struct table_elt *src_elt;
5763: /* Hash code for the SET_SRC. */
5764: int src_hash_code;
5765: /* Hash code for the SET_DEST. */
5766: int dest_hash_code;
5767: /* The SET_DEST, with SUBREG, etc., stripped. */
5768: rtx inner_dest;
5769: /* Place where the pointer to the INNER_DEST was found. */
5770: rtx *inner_dest_loc;
5771: /* Nonzero if the SET_SRC is in memory. */
5772: char src_in_memory;
5773: /* Nonzero if the SET_SRC is in a structure. */
5774: char src_in_struct;
5775: /* Nonzero if the SET_SRC contains something
5776: whose value cannot be predicted and understood. */
5777: char src_volatile;
5778: /* Original machine mode, in case it becomes a CONST_INT. */
5779: enum machine_mode mode;
5780: /* A constant equivalent for SET_SRC, if any. */
5781: rtx src_const;
5782: /* Hash code of constant equivalent for SET_SRC. */
5783: int src_const_hash_code;
5784: /* Table entry for constant equivalent for SET_SRC, if any. */
5785: struct table_elt *src_const_elt;
5786: };
5787:
5788: static void
5789: cse_insn (insn, in_libcall_block)
5790: rtx insn;
5791: int in_libcall_block;
5792: {
5793: register rtx x = PATTERN (insn);
5794: rtx tem;
5795: register int i;
5796: register int n_sets = 0;
5797:
5798: /* Records what this insn does to set CC0. */
5799: rtx this_insn_cc0 = 0;
5800: enum machine_mode this_insn_cc0_mode;
5801: struct write_data writes_memory;
5802: static struct write_data init = {0, 0, 0, 0};
5803:
5804: rtx src_eqv = 0;
5805: struct table_elt *src_eqv_elt = 0;
5806: int src_eqv_volatile;
5807: int src_eqv_in_memory;
5808: int src_eqv_in_struct;
5809: int src_eqv_hash_code;
5810:
5811: struct set *sets;
5812:
5813: this_insn = insn;
5814: writes_memory = init;
5815:
5816: /* Find all the SETs and CLOBBERs in this instruction.
5817: Record all the SETs in the array `set' and count them.
5818: Also determine whether there is a CLOBBER that invalidates
5819: all memory references, or all references at varying addresses. */
5820:
5821: if (GET_CODE (x) == SET)
5822: {
5823: sets = (struct set *) alloca (sizeof (struct set));
5824: sets[0].rtl = x;
5825:
5826: /* Ignore SETs that are unconditional jumps.
5827: They never need cse processing, so this does not hurt.
5828: The reason is not efficiency but rather
5829: so that we can test at the end for instructions
5830: that have been simplified to unconditional jumps
5831: and not be misled by unchanged instructions
5832: that were unconditional jumps to begin with. */
5833: if (SET_DEST (x) == pc_rtx
5834: && GET_CODE (SET_SRC (x)) == LABEL_REF)
5835: ;
5836:
5837: /* Don't count call-insns, (set (reg 0) (call ...)), as a set.
5838: The hard function value register is used only once, to copy to
5839: someplace else, so it isn't worth cse'ing (and on 80386 is unsafe)!
5840: Ensure we invalidate the destination register. On the 80386 no
5841: other code would invalidate it since it is a fixed_reg.
5842: We need not check the return of apply_change_group; see canon_reg. */
5843:
5844: else if (GET_CODE (SET_SRC (x)) == CALL)
5845: {
5846: canon_reg (SET_SRC (x), insn);
5847: apply_change_group ();
5848: fold_rtx (SET_SRC (x), insn);
5849: invalidate (SET_DEST (x));
5850: }
5851: else
5852: n_sets = 1;
5853: }
5854: else if (GET_CODE (x) == PARALLEL)
5855: {
5856: register int lim = XVECLEN (x, 0);
5857:
5858: sets = (struct set *) alloca (lim * sizeof (struct set));
5859:
5860: /* Find all regs explicitly clobbered in this insn,
5861: and ensure they are not replaced with any other regs
5862: elsewhere in this insn.
5863: When a reg that is clobbered is also used for input,
5864: we should presume that that is for a reason,
5865: and we should not substitute some other register
5866: which is not supposed to be clobbered.
5867: Therefore, this loop cannot be merged into the one below
5868: because a CALL may precede a CLOBBER and refer to the
5869: value clobbered. We must not let a canonicalization do
5870: anything in that case. */
5871: for (i = 0; i < lim; i++)
5872: {
5873: register rtx y = XVECEXP (x, 0, i);
5874: if (GET_CODE (y) == CLOBBER)
5875: {
5876: rtx clobbered = XEXP (y, 0);
5877:
5878: if (GET_CODE (clobbered) == REG
5879: || GET_CODE (clobbered) == SUBREG)
5880: invalidate (clobbered);
5881: else if (GET_CODE (clobbered) == STRICT_LOW_PART
5882: || GET_CODE (clobbered) == ZERO_EXTRACT)
5883: invalidate (XEXP (clobbered, 0));
5884: }
5885: }
5886:
5887: for (i = 0; i < lim; i++)
5888: {
5889: register rtx y = XVECEXP (x, 0, i);
5890: if (GET_CODE (y) == SET)
5891: {
5892: /* As above, we ignore unconditional jumps and call-insns and
5893: ignore the result of apply_change_group. */
5894: if (GET_CODE (SET_SRC (y)) == CALL)
5895: {
5896: canon_reg (SET_SRC (y), insn);
5897: apply_change_group ();
5898: fold_rtx (SET_SRC (y), insn);
5899: invalidate (SET_DEST (y));
5900: }
5901: else if (SET_DEST (y) == pc_rtx
5902: && GET_CODE (SET_SRC (y)) == LABEL_REF)
5903: ;
5904: else
5905: sets[n_sets++].rtl = y;
5906: }
5907: else if (GET_CODE (y) == CLOBBER)
5908: {
5909: /* If we clobber memory, take note of that,
5910: and canon the address.
5911: This does nothing when a register is clobbered
5912: because we have already invalidated the reg. */
5913: if (GET_CODE (XEXP (y, 0)) == MEM)
5914: {
5915: canon_reg (XEXP (y, 0), NULL_RTX);
5916: note_mem_written (XEXP (y, 0), &writes_memory);
5917: }
5918: }
5919: else if (GET_CODE (y) == USE
5920: && ! (GET_CODE (XEXP (y, 0)) == REG
5921: && REGNO (XEXP (y, 0)) < FIRST_PSEUDO_REGISTER))
5922: canon_reg (y, NULL_RTX);
5923: else if (GET_CODE (y) == CALL)
5924: {
5925: /* The result of apply_change_group can be ignored; see
5926: canon_reg. */
5927: canon_reg (y, insn);
5928: apply_change_group ();
5929: fold_rtx (y, insn);
5930: }
5931: }
5932: }
5933: else if (GET_CODE (x) == CLOBBER)
5934: {
5935: if (GET_CODE (XEXP (x, 0)) == MEM)
5936: {
5937: canon_reg (XEXP (x, 0), NULL_RTX);
5938: note_mem_written (XEXP (x, 0), &writes_memory);
5939: }
5940: }
5941:
5942: /* Canonicalize a USE of a pseudo register or memory location. */
5943: else if (GET_CODE (x) == USE
5944: && ! (GET_CODE (XEXP (x, 0)) == REG
5945: && REGNO (XEXP (x, 0)) < FIRST_PSEUDO_REGISTER))
5946: canon_reg (XEXP (x, 0), NULL_RTX);
5947: else if (GET_CODE (x) == CALL)
5948: {
5949: /* The result of apply_change_group can be ignored; see canon_reg. */
5950: canon_reg (x, insn);
5951: apply_change_group ();
5952: fold_rtx (x, insn);
5953: }
5954:
5955: if (n_sets == 1 && REG_NOTES (insn) != 0)
5956: {
5957: /* Store the equivalent value in SRC_EQV, if different. */
5958: rtx tem = find_reg_note (insn, REG_EQUAL, NULL_RTX);
5959:
5960: if (tem && ! rtx_equal_p (XEXP (tem, 0), SET_SRC (sets[0].rtl)))
5961: src_eqv = canon_reg (XEXP (tem, 0), NULL_RTX);
5962: }
5963:
5964: /* Canonicalize sources and addresses of destinations.
5965: We do this in a separate pass to avoid problems when a MATCH_DUP is
5966: present in the insn pattern. In that case, we want to ensure that
5967: we don't break the duplicate nature of the pattern. So we will replace
5968: both operands at the same time. Otherwise, we would fail to find an
5969: equivalent substitution in the loop calling validate_change below.
5970:
5971: We used to suppress canonicalization of DEST if it appears in SRC,
5972: but we don't do this any more. */
5973:
5974: for (i = 0; i < n_sets; i++)
5975: {
5976: rtx dest = SET_DEST (sets[i].rtl);
5977: rtx src = SET_SRC (sets[i].rtl);
5978: rtx new = canon_reg (src, insn);
5979:
5980: if ((GET_CODE (new) == REG && GET_CODE (src) == REG
5981: && ((REGNO (new) < FIRST_PSEUDO_REGISTER)
5982: != (REGNO (src) < FIRST_PSEUDO_REGISTER)))
5983: || insn_n_dups[recog_memoized (insn)] > 0)
5984: validate_change (insn, &SET_SRC (sets[i].rtl), new, 1);
5985: else
5986: SET_SRC (sets[i].rtl) = new;
5987:
5988: if (GET_CODE (dest) == ZERO_EXTRACT || GET_CODE (dest) == SIGN_EXTRACT)
5989: {
5990: validate_change (insn, &XEXP (dest, 1),
5991: canon_reg (XEXP (dest, 1), insn), 1);
5992: validate_change (insn, &XEXP (dest, 2),
5993: canon_reg (XEXP (dest, 2), insn), 1);
5994: }
5995:
5996: while (GET_CODE (dest) == SUBREG || GET_CODE (dest) == STRICT_LOW_PART
5997: || GET_CODE (dest) == ZERO_EXTRACT
5998: || GET_CODE (dest) == SIGN_EXTRACT)
5999: dest = XEXP (dest, 0);
6000:
6001: if (GET_CODE (dest) == MEM)
6002: canon_reg (dest, insn);
6003: }
6004:
6005: /* Now that we have done all the replacements, we can apply the change
6006: group and see if they all work. Note that this will cause some
6007: canonicalizations that would have worked individually not to be applied
6008: because some other canonicalization didn't work, but this should not
6009: occur often.
6010:
6011: The result of apply_change_group can be ignored; see canon_reg. */
6012:
6013: apply_change_group ();
6014:
6015: /* Set sets[i].src_elt to the class each source belongs to.
6016: Detect assignments from or to volatile things
6017: and set set[i] to zero so they will be ignored
6018: in the rest of this function.
6019:
6020: Nothing in this loop changes the hash table or the register chains. */
6021:
6022: for (i = 0; i < n_sets; i++)
6023: {
6024: register rtx src, dest;
6025: register rtx src_folded;
6026: register struct table_elt *elt = 0, *p;
6027: enum machine_mode mode;
6028: rtx src_eqv_here;
6029: rtx src_const = 0;
6030: rtx src_related = 0;
6031: struct table_elt *src_const_elt = 0;
6032: int src_cost = 10000, src_eqv_cost = 10000, src_folded_cost = 10000;
6033: int src_related_cost = 10000, src_elt_cost = 10000;
6034: /* Set non-zero if we need to call force_const_mem on with the
6035: contents of src_folded before using it. */
6036: int src_folded_force_flag = 0;
6037:
6038: dest = SET_DEST (sets[i].rtl);
6039: src = SET_SRC (sets[i].rtl);
6040:
6041: /* If SRC is a constant that has no machine mode,
6042: hash it with the destination's machine mode.
6043: This way we can keep different modes separate. */
6044:
6045: mode = GET_MODE (src) == VOIDmode ? GET_MODE (dest) : GET_MODE (src);
6046: sets[i].mode = mode;
6047:
6048: if (src_eqv)
6049: {
6050: enum machine_mode eqvmode = mode;
6051: if (GET_CODE (dest) == STRICT_LOW_PART)
6052: eqvmode = GET_MODE (SUBREG_REG (XEXP (dest, 0)));
6053: do_not_record = 0;
6054: hash_arg_in_memory = 0;
6055: hash_arg_in_struct = 0;
6056: src_eqv = fold_rtx (src_eqv, insn);
6057: src_eqv_hash_code = HASH (src_eqv, eqvmode);
6058:
6059: /* Find the equivalence class for the equivalent expression. */
6060:
6061: if (!do_not_record)
6062: src_eqv_elt = lookup (src_eqv, src_eqv_hash_code, eqvmode);
6063:
6064: src_eqv_volatile = do_not_record;
6065: src_eqv_in_memory = hash_arg_in_memory;
6066: src_eqv_in_struct = hash_arg_in_struct;
6067: }
6068:
6069: /* If this is a STRICT_LOW_PART assignment, src_eqv corresponds to the
6070: value of the INNER register, not the destination. So it is not
6071: a legal substitution for the source. But save it for later. */
6072: if (GET_CODE (dest) == STRICT_LOW_PART)
6073: src_eqv_here = 0;
6074: else
6075: src_eqv_here = src_eqv;
6076:
6077: /* Simplify and foldable subexpressions in SRC. Then get the fully-
6078: simplified result, which may not necessarily be valid. */
6079: src_folded = fold_rtx (src, insn);
6080:
6081: /* If storing a constant in a bitfield, pre-truncate the constant
6082: so we will be able to record it later. */
6083: if (GET_CODE (SET_DEST (sets[i].rtl)) == ZERO_EXTRACT
6084: || GET_CODE (SET_DEST (sets[i].rtl)) == SIGN_EXTRACT)
6085: {
6086: rtx width = XEXP (SET_DEST (sets[i].rtl), 1);
6087:
6088: if (GET_CODE (src) == CONST_INT
6089: && GET_CODE (width) == CONST_INT
6090: && INTVAL (width) < HOST_BITS_PER_WIDE_INT
6091: && (INTVAL (src) & ((HOST_WIDE_INT) (-1) << INTVAL (width))))
6092: src_folded
6093: = GEN_INT (INTVAL (src) & (((HOST_WIDE_INT) 1
6094: << INTVAL (width)) - 1));
6095: }
6096:
6097: /* Compute SRC's hash code, and also notice if it
6098: should not be recorded at all. In that case,
6099: prevent any further processing of this assignment. */
6100: do_not_record = 0;
6101: hash_arg_in_memory = 0;
6102: hash_arg_in_struct = 0;
6103:
6104: sets[i].src = src;
6105: sets[i].src_hash_code = HASH (src, mode);
6106: sets[i].src_volatile = do_not_record;
6107: sets[i].src_in_memory = hash_arg_in_memory;
6108: sets[i].src_in_struct = hash_arg_in_struct;
6109:
6110: #if 0
6111: /* It is no longer clear why we used to do this, but it doesn't
6112: appear to still be needed. So let's try without it since this
6113: code hurts cse'ing widened ops. */
6114: /* If source is a perverse subreg (such as QI treated as an SI),
6115: treat it as volatile. It may do the work of an SI in one context
6116: where the extra bits are not being used, but cannot replace an SI
6117: in general. */
6118: if (GET_CODE (src) == SUBREG
6119: && (GET_MODE_SIZE (GET_MODE (src))
6120: > GET_MODE_SIZE (GET_MODE (SUBREG_REG (src)))))
6121: sets[i].src_volatile = 1;
6122: #endif
6123:
6124: /* Locate all possible equivalent forms for SRC. Try to replace
6125: SRC in the insn with each cheaper equivalent.
6126:
6127: We have the following types of equivalents: SRC itself, a folded
6128: version, a value given in a REG_EQUAL note, or a value related
6129: to a constant.
6130:
6131: Each of these equivalents may be part of an additional class
6132: of equivalents (if more than one is in the table, they must be in
6133: the same class; we check for this).
6134:
6135: If the source is volatile, we don't do any table lookups.
6136:
6137: We note any constant equivalent for possible later use in a
6138: REG_NOTE. */
6139:
6140: if (!sets[i].src_volatile)
6141: elt = lookup (src, sets[i].src_hash_code, mode);
6142:
6143: sets[i].src_elt = elt;
6144:
6145: if (elt && src_eqv_here && src_eqv_elt)
6146: {
6147: if (elt->first_same_value != src_eqv_elt->first_same_value)
6148: {
6149: /* The REG_EQUAL is indicating that two formerly distinct
6150: classes are now equivalent. So merge them. */
6151: merge_equiv_classes (elt, src_eqv_elt);
6152: src_eqv_hash_code = HASH (src_eqv, elt->mode);
6153: src_eqv_elt = lookup (src_eqv, src_eqv_hash_code, elt->mode);
6154: }
6155:
6156: src_eqv_here = 0;
6157: }
6158:
6159: else if (src_eqv_elt)
6160: elt = src_eqv_elt;
6161:
6162: /* Try to find a constant somewhere and record it in `src_const'.
6163: Record its table element, if any, in `src_const_elt'. Look in
6164: any known equivalences first. (If the constant is not in the
6165: table, also set `sets[i].src_const_hash_code'). */
6166: if (elt)
6167: for (p = elt->first_same_value; p; p = p->next_same_value)
6168: if (p->is_const)
6169: {
6170: src_const = p->exp;
6171: src_const_elt = elt;
6172: break;
6173: }
6174:
6175: if (src_const == 0
6176: && (CONSTANT_P (src_folded)
6177: /* Consider (minus (label_ref L1) (label_ref L2)) as
6178: "constant" here so we will record it. This allows us
6179: to fold switch statements when an ADDR_DIFF_VEC is used. */
6180: || (GET_CODE (src_folded) == MINUS
6181: && GET_CODE (XEXP (src_folded, 0)) == LABEL_REF
6182: && GET_CODE (XEXP (src_folded, 1)) == LABEL_REF)))
6183: src_const = src_folded, src_const_elt = elt;
6184: else if (src_const == 0 && src_eqv_here && CONSTANT_P (src_eqv_here))
6185: src_const = src_eqv_here, src_const_elt = src_eqv_elt;
6186:
6187: /* If we don't know if the constant is in the table, get its
6188: hash code and look it up. */
6189: if (src_const && src_const_elt == 0)
6190: {
6191: sets[i].src_const_hash_code = HASH (src_const, mode);
6192: src_const_elt = lookup (src_const, sets[i].src_const_hash_code,
6193: mode);
6194: }
6195:
6196: sets[i].src_const = src_const;
6197: sets[i].src_const_elt = src_const_elt;
6198:
6199: /* If the constant and our source are both in the table, mark them as
6200: equivalent. Otherwise, if a constant is in the table but the source
6201: isn't, set ELT to it. */
6202: if (src_const_elt && elt
6203: && src_const_elt->first_same_value != elt->first_same_value)
6204: merge_equiv_classes (elt, src_const_elt);
6205: else if (src_const_elt && elt == 0)
6206: elt = src_const_elt;
6207:
6208: /* See if there is a register linearly related to a constant
6209: equivalent of SRC. */
6210: if (src_const
6211: && (GET_CODE (src_const) == CONST
6212: || (src_const_elt && src_const_elt->related_value != 0)))
6213: {
6214: src_related = use_related_value (src_const, src_const_elt);
6215: if (src_related)
6216: {
6217: struct table_elt *src_related_elt
6218: = lookup (src_related, HASH (src_related, mode), mode);
6219: if (src_related_elt && elt)
6220: {
6221: if (elt->first_same_value
6222: != src_related_elt->first_same_value)
6223: /* This can occur when we previously saw a CONST
6224: involving a SYMBOL_REF and then see the SYMBOL_REF
6225: twice. Merge the involved classes. */
6226: merge_equiv_classes (elt, src_related_elt);
6227:
6228: src_related = 0;
6229: src_related_elt = 0;
6230: }
6231: else if (src_related_elt && elt == 0)
6232: elt = src_related_elt;
6233: }
6234: }
6235:
6236: /* See if we have a CONST_INT that is already in a register in a
6237: wider mode. */
6238:
6239: if (src_const && src_related == 0 && GET_CODE (src_const) == CONST_INT
6240: && GET_MODE_CLASS (mode) == MODE_INT
6241: && GET_MODE_BITSIZE (mode) < BITS_PER_WORD)
6242: {
6243: enum machine_mode wider_mode;
6244:
6245: for (wider_mode = GET_MODE_WIDER_MODE (mode);
6246: GET_MODE_BITSIZE (wider_mode) <= BITS_PER_WORD
6247: && src_related == 0;
6248: wider_mode = GET_MODE_WIDER_MODE (wider_mode))
6249: {
6250: struct table_elt *const_elt
6251: = lookup (src_const, HASH (src_const, wider_mode), wider_mode);
6252:
6253: if (const_elt == 0)
6254: continue;
6255:
6256: for (const_elt = const_elt->first_same_value;
6257: const_elt; const_elt = const_elt->next_same_value)
6258: if (GET_CODE (const_elt->exp) == REG)
6259: {
6260: src_related = gen_lowpart_if_possible (mode,
6261: const_elt->exp);
6262: break;
6263: }
6264: }
6265: }
6266:
6267: /* Another possibility is that we have an AND with a constant in
6268: a mode narrower than a word. If so, it might have been generated
6269: as part of an "if" which would narrow the AND. If we already
6270: have done the AND in a wider mode, we can use a SUBREG of that
6271: value. */
6272:
6273: if (flag_expensive_optimizations && ! src_related
6274: && GET_CODE (src) == AND && GET_CODE (XEXP (src, 1)) == CONST_INT
6275: && GET_MODE_SIZE (mode) < UNITS_PER_WORD)
6276: {
6277: enum machine_mode tmode;
6278: rtx new_and = gen_rtx (AND, VOIDmode, NULL_RTX, XEXP (src, 1));
6279:
6280: for (tmode = GET_MODE_WIDER_MODE (mode);
6281: GET_MODE_SIZE (tmode) <= UNITS_PER_WORD;
6282: tmode = GET_MODE_WIDER_MODE (tmode))
6283: {
6284: rtx inner = gen_lowpart_if_possible (tmode, XEXP (src, 0));
6285: struct table_elt *larger_elt;
6286:
6287: if (inner)
6288: {
6289: PUT_MODE (new_and, tmode);
6290: XEXP (new_and, 0) = inner;
6291: larger_elt = lookup (new_and, HASH (new_and, tmode), tmode);
6292: if (larger_elt == 0)
6293: continue;
6294:
6295: for (larger_elt = larger_elt->first_same_value;
6296: larger_elt; larger_elt = larger_elt->next_same_value)
6297: if (GET_CODE (larger_elt->exp) == REG)
6298: {
6299: src_related
6300: = gen_lowpart_if_possible (mode, larger_elt->exp);
6301: break;
6302: }
6303:
6304: if (src_related)
6305: break;
6306: }
6307: }
6308: }
6309:
6310: if (src == src_folded)
6311: src_folded = 0;
6312:
6313: /* At this point, ELT, if non-zero, points to a class of expressions
6314: equivalent to the source of this SET and SRC, SRC_EQV, SRC_FOLDED,
6315: and SRC_RELATED, if non-zero, each contain additional equivalent
6316: expressions. Prune these latter expressions by deleting expressions
6317: already in the equivalence class.
6318:
6319: Check for an equivalent identical to the destination. If found,
6320: this is the preferred equivalent since it will likely lead to
6321: elimination of the insn. Indicate this by placing it in
6322: `src_related'. */
6323:
6324: if (elt) elt = elt->first_same_value;
6325: for (p = elt; p; p = p->next_same_value)
6326: {
6327: enum rtx_code code = GET_CODE (p->exp);
6328:
6329: /* If the expression is not valid, ignore it. Then we do not
6330: have to check for validity below. In most cases, we can use
6331: `rtx_equal_p', since canonicalization has already been done. */
6332: if (code != REG && ! exp_equiv_p (p->exp, p->exp, 1, 0))
6333: continue;
6334:
6335: if (src && GET_CODE (src) == code && rtx_equal_p (src, p->exp))
6336: src = 0;
6337: else if (src_folded && GET_CODE (src_folded) == code
6338: && rtx_equal_p (src_folded, p->exp))
6339: src_folded = 0;
6340: else if (src_eqv_here && GET_CODE (src_eqv_here) == code
6341: && rtx_equal_p (src_eqv_here, p->exp))
6342: src_eqv_here = 0;
6343: else if (src_related && GET_CODE (src_related) == code
6344: && rtx_equal_p (src_related, p->exp))
6345: src_related = 0;
6346:
6347: /* This is the same as the destination of the insns, we want
6348: to prefer it. Copy it to src_related. The code below will
6349: then give it a negative cost. */
6350: if (GET_CODE (dest) == code && rtx_equal_p (p->exp, dest))
6351: src_related = dest;
6352:
6353: }
6354:
6355: /* Find the cheapest valid equivalent, trying all the available
6356: possibilities. Prefer items not in the hash table to ones
6357: that are when they are equal cost. Note that we can never
6358: worsen an insn as the current contents will also succeed.
6359: If we find an equivalent identical to the destination, use it as best,
6360: since this insn will probably be eliminated in that case. */
6361: if (src)
6362: {
6363: if (rtx_equal_p (src, dest))
6364: src_cost = -1;
6365: else
6366: src_cost = COST (src);
6367: }
6368:
6369: if (src_eqv_here)
6370: {
6371: if (rtx_equal_p (src_eqv_here, dest))
6372: src_eqv_cost = -1;
6373: else
6374: src_eqv_cost = COST (src_eqv_here);
6375: }
6376:
6377: if (src_folded)
6378: {
6379: if (rtx_equal_p (src_folded, dest))
6380: src_folded_cost = -1;
6381: else
6382: src_folded_cost = COST (src_folded);
6383: }
6384:
6385: if (src_related)
6386: {
6387: if (rtx_equal_p (src_related, dest))
6388: src_related_cost = -1;
6389: else
6390: src_related_cost = COST (src_related);
6391: }
6392:
6393: /* If this was an indirect jump insn, a known label will really be
6394: cheaper even though it looks more expensive. */
6395: if (dest == pc_rtx && src_const && GET_CODE (src_const) == LABEL_REF)
6396: src_folded = src_const, src_folded_cost = -1;
6397:
6398: /* Terminate loop when replacement made. This must terminate since
6399: the current contents will be tested and will always be valid. */
6400: while (1)
6401: {
6402: rtx trial;
6403:
6404: /* Skip invalid entries. */
6405: while (elt && GET_CODE (elt->exp) != REG
6406: && ! exp_equiv_p (elt->exp, elt->exp, 1, 0))
6407: elt = elt->next_same_value;
6408:
6409: if (elt) src_elt_cost = elt->cost;
6410:
6411: /* Find cheapest and skip it for the next time. For items
6412: of equal cost, use this order:
6413: src_folded, src, src_eqv, src_related and hash table entry. */
6414: if (src_folded_cost <= src_cost
6415: && src_folded_cost <= src_eqv_cost
6416: && src_folded_cost <= src_related_cost
6417: && src_folded_cost <= src_elt_cost)
6418: {
6419: trial = src_folded, src_folded_cost = 10000;
6420: if (src_folded_force_flag)
6421: trial = force_const_mem (mode, trial);
6422: }
6423: else if (src_cost <= src_eqv_cost
6424: && src_cost <= src_related_cost
6425: && src_cost <= src_elt_cost)
6426: trial = src, src_cost = 10000;
6427: else if (src_eqv_cost <= src_related_cost
6428: && src_eqv_cost <= src_elt_cost)
6429: trial = copy_rtx (src_eqv_here), src_eqv_cost = 10000;
6430: else if (src_related_cost <= src_elt_cost)
6431: trial = copy_rtx (src_related), src_related_cost = 10000;
6432: else
6433: {
6434: trial = copy_rtx (elt->exp);
6435: elt = elt->next_same_value;
6436: src_elt_cost = 10000;
6437: }
6438:
6439: /* We don't normally have an insn matching (set (pc) (pc)), so
6440: check for this separately here. We will delete such an
6441: insn below.
6442:
6443: Tablejump insns contain a USE of the table, so simply replacing
6444: the operand with the constant won't match. This is simply an
6445: unconditional branch, however, and is therefore valid. Just
6446: insert the substitution here and we will delete and re-emit
6447: the insn later. */
6448:
6449: if (n_sets == 1 && dest == pc_rtx
6450: && (trial == pc_rtx
6451: || (GET_CODE (trial) == LABEL_REF
6452: && ! condjump_p (insn))))
6453: {
6454: /* If TRIAL is a label in front of a jump table, we are
6455: really falling through the switch (this is how casesi
6456: insns work), so we must branch around the table. */
6457: if (GET_CODE (trial) == CODE_LABEL
6458: && NEXT_INSN (trial) != 0
6459: && GET_CODE (NEXT_INSN (trial)) == JUMP_INSN
6460: && (GET_CODE (PATTERN (NEXT_INSN (trial))) == ADDR_DIFF_VEC
6461: || GET_CODE (PATTERN (NEXT_INSN (trial))) == ADDR_VEC))
6462:
6463: trial = gen_rtx (LABEL_REF, Pmode, get_label_after (trial));
6464:
6465: SET_SRC (sets[i].rtl) = trial;
6466: break;
6467: }
6468:
6469: /* Look for a substitution that makes a valid insn. */
6470: else if (validate_change (insn, &SET_SRC (sets[i].rtl), trial, 0))
6471: {
6472: /* The result of apply_change_group can be ignored; see
6473: canon_reg. */
6474:
6475: validate_change (insn, &SET_SRC (sets[i].rtl),
6476: canon_reg (SET_SRC (sets[i].rtl), insn),
6477: 1);
6478: apply_change_group ();
6479: break;
6480: }
6481:
6482: /* If we previously found constant pool entries for
6483: constants and this is a constant, try making a
6484: pool entry. Put it in src_folded unless we already have done
6485: this since that is where it likely came from. */
6486:
6487: else if (constant_pool_entries_cost
6488: && CONSTANT_P (trial)
6489: && (src_folded == 0 || GET_CODE (src_folded) != MEM)
6490: && GET_MODE_CLASS (mode) != MODE_CC)
6491: {
6492: src_folded_force_flag = 1;
6493: src_folded = trial;
6494: src_folded_cost = constant_pool_entries_cost;
6495: }
6496: }
6497:
6498: src = SET_SRC (sets[i].rtl);
6499:
6500: /* In general, it is good to have a SET with SET_SRC == SET_DEST.
6501: However, there is an important exception: If both are registers
6502: that are not the head of their equivalence class, replace SET_SRC
6503: with the head of the class. If we do not do this, we will have
6504: both registers live over a portion of the basic block. This way,
6505: their lifetimes will likely abut instead of overlapping. */
6506: if (GET_CODE (dest) == REG
6507: && REGNO_QTY_VALID_P (REGNO (dest))
6508: && qty_mode[reg_qty[REGNO (dest)]] == GET_MODE (dest)
6509: && qty_first_reg[reg_qty[REGNO (dest)]] != REGNO (dest)
6510: && GET_CODE (src) == REG && REGNO (src) == REGNO (dest)
6511: /* Don't do this if the original insn had a hard reg as
6512: SET_SRC. */
6513: && (GET_CODE (sets[i].src) != REG
6514: || REGNO (sets[i].src) >= FIRST_PSEUDO_REGISTER))
6515: /* We can't call canon_reg here because it won't do anything if
6516: SRC is a hard register. */
6517: {
6518: int first = qty_first_reg[reg_qty[REGNO (src)]];
6519:
6520: src = SET_SRC (sets[i].rtl)
6521: = first >= FIRST_PSEUDO_REGISTER ? regno_reg_rtx[first]
6522: : gen_rtx (REG, GET_MODE (src), first);
6523:
6524: /* If we had a constant that is cheaper than what we are now
6525: setting SRC to, use that constant. We ignored it when we
6526: thought we could make this into a no-op. */
6527: if (src_const && COST (src_const) < COST (src)
6528: && validate_change (insn, &SET_SRC (sets[i].rtl), src_const, 0))
6529: src = src_const;
6530: }
6531:
6532: /* If we made a change, recompute SRC values. */
6533: if (src != sets[i].src)
6534: {
6535: do_not_record = 0;
6536: hash_arg_in_memory = 0;
6537: hash_arg_in_struct = 0;
6538: sets[i].src = src;
6539: sets[i].src_hash_code = HASH (src, mode);
6540: sets[i].src_volatile = do_not_record;
6541: sets[i].src_in_memory = hash_arg_in_memory;
6542: sets[i].src_in_struct = hash_arg_in_struct;
6543: sets[i].src_elt = lookup (src, sets[i].src_hash_code, mode);
6544: }
6545:
6546: /* If this is a single SET, we are setting a register, and we have an
6547: equivalent constant, we want to add a REG_NOTE. We don't want
6548: to write a REG_EQUAL note for a constant pseudo since verifying that
6549: that pseudo hasn't been eliminated is a pain. Such a note also
6550: won't help anything. */
6551: if (n_sets == 1 && src_const && GET_CODE (dest) == REG
6552: && GET_CODE (src_const) != REG)
6553: {
6554: rtx tem = find_reg_note (insn, REG_EQUAL, NULL_RTX);
6555:
6556: /* Record the actual constant value in a REG_EQUAL note, making
6557: a new one if one does not already exist. */
6558: if (tem)
6559: XEXP (tem, 0) = src_const;
6560: else
6561: REG_NOTES (insn) = gen_rtx (EXPR_LIST, REG_EQUAL,
6562: src_const, REG_NOTES (insn));
6563:
6564: /* If storing a constant value in a register that
6565: previously held the constant value 0,
6566: record this fact with a REG_WAS_0 note on this insn.
6567:
6568: Note that the *register* is required to have previously held 0,
6569: not just any register in the quantity and we must point to the
6570: insn that set that register to zero.
6571:
6572: Rather than track each register individually, we just see if
6573: the last set for this quantity was for this register. */
6574:
6575: if (REGNO_QTY_VALID_P (REGNO (dest))
6576: && qty_const[reg_qty[REGNO (dest)]] == const0_rtx)
6577: {
6578: /* See if we previously had a REG_WAS_0 note. */
6579: rtx note = find_reg_note (insn, REG_WAS_0, NULL_RTX);
6580: rtx const_insn = qty_const_insn[reg_qty[REGNO (dest)]];
6581:
6582: if ((tem = single_set (const_insn)) != 0
6583: && rtx_equal_p (SET_DEST (tem), dest))
6584: {
6585: if (note)
6586: XEXP (note, 0) = const_insn;
6587: else
6588: REG_NOTES (insn) = gen_rtx (INSN_LIST, REG_WAS_0,
6589: const_insn, REG_NOTES (insn));
6590: }
6591: }
6592: }
6593:
6594: /* Now deal with the destination. */
6595: do_not_record = 0;
6596: sets[i].inner_dest_loc = &SET_DEST (sets[0].rtl);
6597:
6598: /* Look within any SIGN_EXTRACT or ZERO_EXTRACT
6599: to the MEM or REG within it. */
6600: while (GET_CODE (dest) == SIGN_EXTRACT
6601: || GET_CODE (dest) == ZERO_EXTRACT
6602: || GET_CODE (dest) == SUBREG
6603: || GET_CODE (dest) == STRICT_LOW_PART)
6604: {
6605: sets[i].inner_dest_loc = &XEXP (dest, 0);
6606: dest = XEXP (dest, 0);
6607: }
6608:
6609: sets[i].inner_dest = dest;
6610:
6611: if (GET_CODE (dest) == MEM)
6612: {
6613: dest = fold_rtx (dest, insn);
6614:
6615: /* Decide whether we invalidate everything in memory,
6616: or just things at non-fixed places.
6617: Writing a large aggregate must invalidate everything
6618: because we don't know how long it is. */
6619: note_mem_written (dest, &writes_memory);
6620: }
6621:
6622: /* Compute the hash code of the destination now,
6623: before the effects of this instruction are recorded,
6624: since the register values used in the address computation
6625: are those before this instruction. */
6626: sets[i].dest_hash_code = HASH (dest, mode);
6627:
6628: /* Don't enter a bit-field in the hash table
6629: because the value in it after the store
6630: may not equal what was stored, due to truncation. */
6631:
6632: if (GET_CODE (SET_DEST (sets[i].rtl)) == ZERO_EXTRACT
6633: || GET_CODE (SET_DEST (sets[i].rtl)) == SIGN_EXTRACT)
6634: {
6635: rtx width = XEXP (SET_DEST (sets[i].rtl), 1);
6636:
6637: if (src_const != 0 && GET_CODE (src_const) == CONST_INT
6638: && GET_CODE (width) == CONST_INT
6639: && INTVAL (width) < HOST_BITS_PER_WIDE_INT
6640: && ! (INTVAL (src_const)
6641: & ((HOST_WIDE_INT) (-1) << INTVAL (width))))
6642: /* Exception: if the value is constant,
6643: and it won't be truncated, record it. */
6644: ;
6645: else
6646: {
6647: /* This is chosen so that the destination will be invalidated
6648: but no new value will be recorded.
6649: We must invalidate because sometimes constant
6650: values can be recorded for bitfields. */
6651: sets[i].src_elt = 0;
6652: sets[i].src_volatile = 1;
6653: src_eqv = 0;
6654: src_eqv_elt = 0;
6655: }
6656: }
6657:
6658: /* If only one set in a JUMP_INSN and it is now a no-op, we can delete
6659: the insn. */
6660: else if (n_sets == 1 && dest == pc_rtx && src == pc_rtx)
6661: {
6662: PUT_CODE (insn, NOTE);
6663: NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED;
6664: NOTE_SOURCE_FILE (insn) = 0;
6665: cse_jumps_altered = 1;
6666: /* One less use of the label this insn used to jump to. */
6667: --LABEL_NUSES (JUMP_LABEL (insn));
6668: /* No more processing for this set. */
6669: sets[i].rtl = 0;
6670: }
6671:
6672: /* If this SET is now setting PC to a label, we know it used to
6673: be a conditional or computed branch. So we see if we can follow
6674: it. If it was a computed branch, delete it and re-emit. */
6675: else if (dest == pc_rtx && GET_CODE (src) == LABEL_REF)
6676: {
6677: rtx p;
6678:
6679: /* If this is not in the format for a simple branch and
6680: we are the only SET in it, re-emit it. */
6681: if (! simplejump_p (insn) && n_sets == 1)
6682: {
6683: rtx new = emit_jump_insn_before (gen_jump (XEXP (src, 0)), insn);
6684: JUMP_LABEL (new) = XEXP (src, 0);
6685: LABEL_NUSES (XEXP (src, 0))++;
6686: delete_insn (insn);
6687: insn = new;
6688: }
6689: else
6690: /* Otherwise, force rerecognition, since it probably had
6691: a different pattern before.
6692: This shouldn't really be necessary, since whatever
6693: changed the source value above should have done this.
6694: Until the right place is found, might as well do this here. */
6695: INSN_CODE (insn) = -1;
6696:
6697: /* Now that we've converted this jump to an unconditional jump,
6698: there is dead code after it. Delete the dead code until we
6699: reach a BARRIER, the end of the function, or a label. Do
6700: not delete NOTEs except for NOTE_INSN_DELETED since later
6701: phases assume these notes are retained. */
6702:
6703: p = insn;
6704:
6705: while (NEXT_INSN (p) != 0
6706: && GET_CODE (NEXT_INSN (p)) != BARRIER
6707: && GET_CODE (NEXT_INSN (p)) != CODE_LABEL)
6708: {
6709: if (GET_CODE (NEXT_INSN (p)) != NOTE
6710: || NOTE_LINE_NUMBER (NEXT_INSN (p)) == NOTE_INSN_DELETED)
6711: delete_insn (NEXT_INSN (p));
6712: else
6713: p = NEXT_INSN (p);
6714: }
6715:
6716: /* If we don't have a BARRIER immediately after INSN, put one there.
6717: Much code assumes that there are no NOTEs between a JUMP_INSN and
6718: BARRIER. */
6719:
6720: if (NEXT_INSN (insn) == 0
6721: || GET_CODE (NEXT_INSN (insn)) != BARRIER)
6722: emit_barrier_after (insn);
6723:
6724: /* We might have two BARRIERs separated by notes. Delete the second
6725: one if so. */
6726:
6727: if (p != insn && NEXT_INSN (p) != 0
6728: && GET_CODE (NEXT_INSN (p)) == BARRIER)
6729: delete_insn (NEXT_INSN (p));
6730:
6731: cse_jumps_altered = 1;
6732: sets[i].rtl = 0;
6733: }
6734:
6735: /* If destination is volatile, invalidate it and then do no further
6736: processing for this assignment. */
6737:
6738: else if (do_not_record)
6739: {
6740: if (GET_CODE (dest) == REG || GET_CODE (dest) == SUBREG
6741: || GET_CODE (dest) == MEM)
6742: invalidate (dest);
6743: else if (GET_CODE (dest) == STRICT_LOW_PART
6744: || GET_CODE (dest) == ZERO_EXTRACT)
6745: invalidate (XEXP (dest, 0));
6746: sets[i].rtl = 0;
6747: }
6748:
6749: if (sets[i].rtl != 0 && dest != SET_DEST (sets[i].rtl))
6750: sets[i].dest_hash_code = HASH (SET_DEST (sets[i].rtl), mode);
6751:
6752: #ifdef HAVE_cc0
6753: /* If setting CC0, record what it was set to, or a constant, if it
6754: is equivalent to a constant. If it is being set to a floating-point
6755: value, make a COMPARE with the appropriate constant of 0. If we
6756: don't do this, later code can interpret this as a test against
6757: const0_rtx, which can cause problems if we try to put it into an
6758: insn as a floating-point operand. */
6759: if (dest == cc0_rtx)
6760: {
6761: this_insn_cc0 = src_const && mode != VOIDmode ? src_const : src;
6762: this_insn_cc0_mode = mode;
6763: if (FLOAT_MODE_P (mode))
6764: this_insn_cc0 = gen_rtx (COMPARE, VOIDmode, this_insn_cc0,
6765: CONST0_RTX (mode));
6766: }
6767: #endif
6768: }
6769:
6770: /* Now enter all non-volatile source expressions in the hash table
6771: if they are not already present.
6772: Record their equivalence classes in src_elt.
6773: This way we can insert the corresponding destinations into
6774: the same classes even if the actual sources are no longer in them
6775: (having been invalidated). */
6776:
6777: if (src_eqv && src_eqv_elt == 0 && sets[0].rtl != 0 && ! src_eqv_volatile
6778: && ! rtx_equal_p (src_eqv, SET_DEST (sets[0].rtl)))
6779: {
6780: register struct table_elt *elt;
6781: register struct table_elt *classp = sets[0].src_elt;
6782: rtx dest = SET_DEST (sets[0].rtl);
6783: enum machine_mode eqvmode = GET_MODE (dest);
6784:
6785: if (GET_CODE (dest) == STRICT_LOW_PART)
6786: {
6787: eqvmode = GET_MODE (SUBREG_REG (XEXP (dest, 0)));
6788: classp = 0;
6789: }
6790: if (insert_regs (src_eqv, classp, 0))
6791: src_eqv_hash_code = HASH (src_eqv, eqvmode);
6792: elt = insert (src_eqv, classp, src_eqv_hash_code, eqvmode);
6793: elt->in_memory = src_eqv_in_memory;
6794: elt->in_struct = src_eqv_in_struct;
6795: src_eqv_elt = elt;
6796:
6797: /* Check to see if src_eqv_elt is the same as a set source which
6798: does not yet have an elt, and if so set the elt of the set source
6799: to src_eqv_elt. */
6800: for (i = 0; i < n_sets; i++)
6801: if (sets[i].rtl && sets[i].src_elt == 0
6802: && rtx_equal_p (SET_SRC (sets[i].rtl), src_eqv))
6803: sets[i].src_elt = src_eqv_elt;
6804: }
6805:
6806: for (i = 0; i < n_sets; i++)
6807: if (sets[i].rtl && ! sets[i].src_volatile
6808: && ! rtx_equal_p (SET_SRC (sets[i].rtl), SET_DEST (sets[i].rtl)))
6809: {
6810: if (GET_CODE (SET_DEST (sets[i].rtl)) == STRICT_LOW_PART)
6811: {
6812: /* REG_EQUAL in setting a STRICT_LOW_PART
6813: gives an equivalent for the entire destination register,
6814: not just for the subreg being stored in now.
6815: This is a more interesting equivalence, so we arrange later
6816: to treat the entire reg as the destination. */
6817: sets[i].src_elt = src_eqv_elt;
6818: sets[i].src_hash_code = src_eqv_hash_code;
6819: }
6820: else
6821: {
6822: /* Insert source and constant equivalent into hash table, if not
6823: already present. */
6824: register struct table_elt *classp = src_eqv_elt;
6825: register rtx src = sets[i].src;
6826: register rtx dest = SET_DEST (sets[i].rtl);
6827: enum machine_mode mode
6828: = GET_MODE (src) == VOIDmode ? GET_MODE (dest) : GET_MODE (src);
6829:
6830: if (sets[i].src_elt == 0)
6831: {
6832: register struct table_elt *elt;
6833:
6834: /* Note that these insert_regs calls cannot remove
6835: any of the src_elt's, because they would have failed to
6836: match if not still valid. */
6837: if (insert_regs (src, classp, 0))
6838: sets[i].src_hash_code = HASH (src, mode);
6839: elt = insert (src, classp, sets[i].src_hash_code, mode);
6840: elt->in_memory = sets[i].src_in_memory;
6841: elt->in_struct = sets[i].src_in_struct;
6842: sets[i].src_elt = classp = elt;
6843: }
6844:
6845: if (sets[i].src_const && sets[i].src_const_elt == 0
6846: && src != sets[i].src_const
6847: && ! rtx_equal_p (sets[i].src_const, src))
6848: sets[i].src_elt = insert (sets[i].src_const, classp,
6849: sets[i].src_const_hash_code, mode);
6850: }
6851: }
6852: else if (sets[i].src_elt == 0)
6853: /* If we did not insert the source into the hash table (e.g., it was
6854: volatile), note the equivalence class for the REG_EQUAL value, if any,
6855: so that the destination goes into that class. */
6856: sets[i].src_elt = src_eqv_elt;
6857:
6858: invalidate_from_clobbers (&writes_memory, x);
6859:
6860: /* Some registers are invalidated by subroutine calls. Memory is
6861: invalidated by non-constant calls. */
6862:
6863: if (GET_CODE (insn) == CALL_INSN)
6864: {
6865: static struct write_data everything = {0, 1, 1, 1};
6866:
6867: if (! CONST_CALL_P (insn))
6868: invalidate_memory (&everything);
6869: invalidate_for_call ();
6870: }
6871:
6872: /* Now invalidate everything set by this instruction.
6873: If a SUBREG or other funny destination is being set,
6874: sets[i].rtl is still nonzero, so here we invalidate the reg
6875: a part of which is being set. */
6876:
6877: for (i = 0; i < n_sets; i++)
6878: if (sets[i].rtl)
6879: {
6880: register rtx dest = sets[i].inner_dest;
6881:
6882: /* Needed for registers to remove the register from its
6883: previous quantity's chain.
6884: Needed for memory if this is a nonvarying address, unless
6885: we have just done an invalidate_memory that covers even those. */
6886: if (GET_CODE (dest) == REG || GET_CODE (dest) == SUBREG
6887: || (! writes_memory.all && ! cse_rtx_addr_varies_p (dest)))
6888: invalidate (dest);
6889: else if (GET_CODE (dest) == STRICT_LOW_PART
6890: || GET_CODE (dest) == ZERO_EXTRACT)
6891: invalidate (XEXP (dest, 0));
6892: }
6893:
6894: /* Make sure registers mentioned in destinations
6895: are safe for use in an expression to be inserted.
6896: This removes from the hash table
6897: any invalid entry that refers to one of these registers.
6898:
6899: We don't care about the return value from mention_regs because
6900: we are going to hash the SET_DEST values unconditionally. */
6901:
6902: for (i = 0; i < n_sets; i++)
6903: if (sets[i].rtl && GET_CODE (SET_DEST (sets[i].rtl)) != REG)
6904: mention_regs (SET_DEST (sets[i].rtl));
6905:
6906: /* We may have just removed some of the src_elt's from the hash table.
6907: So replace each one with the current head of the same class. */
6908:
6909: for (i = 0; i < n_sets; i++)
6910: if (sets[i].rtl)
6911: {
6912: if (sets[i].src_elt && sets[i].src_elt->first_same_value == 0)
6913: /* If elt was removed, find current head of same class,
6914: or 0 if nothing remains of that class. */
6915: {
6916: register struct table_elt *elt = sets[i].src_elt;
6917:
6918: while (elt && elt->prev_same_value)
6919: elt = elt->prev_same_value;
6920:
6921: while (elt && elt->first_same_value == 0)
6922: elt = elt->next_same_value;
6923: sets[i].src_elt = elt ? elt->first_same_value : 0;
6924: }
6925: }
6926:
6927: /* Now insert the destinations into their equivalence classes. */
6928:
6929: for (i = 0; i < n_sets; i++)
6930: if (sets[i].rtl)
6931: {
6932: register rtx dest = SET_DEST (sets[i].rtl);
6933: register struct table_elt *elt;
6934:
6935: /* Don't record value if we are not supposed to risk allocating
6936: floating-point values in registers that might be wider than
6937: memory. */
6938: if ((flag_float_store
6939: && GET_CODE (dest) == MEM
6940: && FLOAT_MODE_P (GET_MODE (dest)))
6941: /* Don't record values of destinations set inside a libcall block
6942: since we might delete the libcall. Things should have been set
6943: up so we won't want to reuse such a value, but we play it safe
6944: here. */
6945: || in_libcall_block
6946: /* If we didn't put a REG_EQUAL value or a source into the hash
6947: table, there is no point is recording DEST. */
6948: || sets[i].src_elt == 0)
6949: continue;
6950:
6951: /* STRICT_LOW_PART isn't part of the value BEING set,
6952: and neither is the SUBREG inside it.
6953: Note that in this case SETS[I].SRC_ELT is really SRC_EQV_ELT. */
6954: if (GET_CODE (dest) == STRICT_LOW_PART)
6955: dest = SUBREG_REG (XEXP (dest, 0));
6956:
6957: if (GET_CODE (dest) == REG || GET_CODE (dest) == SUBREG)
6958: /* Registers must also be inserted into chains for quantities. */
6959: if (insert_regs (dest, sets[i].src_elt, 1))
6960: /* If `insert_regs' changes something, the hash code must be
6961: recalculated. */
6962: sets[i].dest_hash_code = HASH (dest, GET_MODE (dest));
6963:
6964: elt = insert (dest, sets[i].src_elt,
6965: sets[i].dest_hash_code, GET_MODE (dest));
6966: elt->in_memory = GET_CODE (sets[i].inner_dest) == MEM;
6967: if (elt->in_memory)
6968: {
6969: /* This implicitly assumes a whole struct
6970: need not have MEM_IN_STRUCT_P.
6971: But a whole struct is *supposed* to have MEM_IN_STRUCT_P. */
6972: elt->in_struct = (MEM_IN_STRUCT_P (sets[i].inner_dest)
6973: || sets[i].inner_dest != SET_DEST (sets[i].rtl));
6974: }
6975:
6976: /* If we have (set (subreg:m1 (reg:m2 foo) 0) (bar:m1)), M1 is no
6977: narrower than M2, and both M1 and M2 are the same number of words,
6978: we are also doing (set (reg:m2 foo) (subreg:m2 (bar:m1) 0)) so
6979: make that equivalence as well.
6980:
6981: However, BAR may have equivalences for which gen_lowpart_if_possible
6982: will produce a simpler value than gen_lowpart_if_possible applied to
6983: BAR (e.g., if BAR was ZERO_EXTENDed from M2), so we will scan all
6984: BAR's equivalences. If we don't get a simplified form, make
6985: the SUBREG. It will not be used in an equivalence, but will
6986: cause two similar assignments to be detected.
6987:
6988: Note the loop below will find SUBREG_REG (DEST) since we have
6989: already entered SRC and DEST of the SET in the table. */
6990:
6991: if (GET_CODE (dest) == SUBREG
6992: && (GET_MODE_SIZE (GET_MODE (SUBREG_REG (dest))) / UNITS_PER_WORD
6993: == GET_MODE_SIZE (GET_MODE (dest)) / UNITS_PER_WORD)
6994: && (GET_MODE_SIZE (GET_MODE (dest))
6995: >= GET_MODE_SIZE (GET_MODE (SUBREG_REG (dest))))
6996: && sets[i].src_elt != 0)
6997: {
6998: enum machine_mode new_mode = GET_MODE (SUBREG_REG (dest));
6999: struct table_elt *elt, *classp = 0;
7000:
7001: for (elt = sets[i].src_elt->first_same_value; elt;
7002: elt = elt->next_same_value)
7003: {
7004: rtx new_src = 0;
7005: int src_hash;
7006: struct table_elt *src_elt;
7007:
7008: /* Ignore invalid entries. */
7009: if (GET_CODE (elt->exp) != REG
7010: && ! exp_equiv_p (elt->exp, elt->exp, 1, 0))
7011: continue;
7012:
7013: new_src = gen_lowpart_if_possible (new_mode, elt->exp);
7014: if (new_src == 0)
7015: new_src = gen_rtx (SUBREG, new_mode, elt->exp, 0);
7016:
7017: src_hash = HASH (new_src, new_mode);
7018: src_elt = lookup (new_src, src_hash, new_mode);
7019:
7020: /* Put the new source in the hash table is if isn't
7021: already. */
7022: if (src_elt == 0)
7023: {
7024: if (insert_regs (new_src, classp, 0))
7025: src_hash = HASH (new_src, new_mode);
7026: src_elt = insert (new_src, classp, src_hash, new_mode);
7027: src_elt->in_memory = elt->in_memory;
7028: src_elt->in_struct = elt->in_struct;
7029: }
7030: else if (classp && classp != src_elt->first_same_value)
7031: /* Show that two things that we've seen before are
7032: actually the same. */
7033: merge_equiv_classes (src_elt, classp);
7034:
7035: classp = src_elt->first_same_value;
7036: }
7037: }
7038: }
7039:
7040: /* Special handling for (set REG0 REG1)
7041: where REG0 is the "cheapest", cheaper than REG1.
7042: After cse, REG1 will probably not be used in the sequel,
7043: so (if easily done) change this insn to (set REG1 REG0) and
7044: replace REG1 with REG0 in the previous insn that computed their value.
7045: Then REG1 will become a dead store and won't cloud the situation
7046: for later optimizations.
7047:
7048: Do not make this change if REG1 is a hard register, because it will
7049: then be used in the sequel and we may be changing a two-operand insn
7050: into a three-operand insn.
7051:
7052: Also do not do this if we are operating on a copy of INSN. */
7053:
7054: if (n_sets == 1 && sets[0].rtl && GET_CODE (SET_DEST (sets[0].rtl)) == REG
7055: && PREV_INSN(insn)
7056: && NEXT_INSN (PREV_INSN (insn)) == insn
7057: && GET_CODE (SET_SRC (sets[0].rtl)) == REG
7058: && REGNO (SET_SRC (sets[0].rtl)) >= FIRST_PSEUDO_REGISTER
7059: && REGNO_QTY_VALID_P (REGNO (SET_SRC (sets[0].rtl)))
7060: && (qty_first_reg[reg_qty[REGNO (SET_SRC (sets[0].rtl))]]
7061: == REGNO (SET_DEST (sets[0].rtl))))
7062: {
7063: rtx prev = PREV_INSN (insn);
7064: while (prev && GET_CODE (prev) == NOTE)
7065: prev = PREV_INSN (prev);
7066:
7067: if (prev && GET_CODE (prev) == INSN && GET_CODE (PATTERN (prev)) == SET
7068: && SET_DEST (PATTERN (prev)) == SET_SRC (sets[0].rtl))
7069: {
7070: rtx dest = SET_DEST (sets[0].rtl);
7071: rtx note = find_reg_note (prev, REG_EQUIV, NULL_RTX);
7072:
7073: validate_change (prev, & SET_DEST (PATTERN (prev)), dest, 1);
7074: validate_change (insn, & SET_DEST (sets[0].rtl),
7075: SET_SRC (sets[0].rtl), 1);
7076: validate_change (insn, & SET_SRC (sets[0].rtl), dest, 1);
7077: apply_change_group ();
7078:
7079: /* If REG1 was equivalent to a constant, REG0 is not. */
7080: if (note)
7081: PUT_REG_NOTE_KIND (note, REG_EQUAL);
7082:
7083: /* If there was a REG_WAS_0 note on PREV, remove it. Move
7084: any REG_WAS_0 note on INSN to PREV. */
7085: note = find_reg_note (prev, REG_WAS_0, NULL_RTX);
7086: if (note)
7087: remove_note (prev, note);
7088:
7089: note = find_reg_note (insn, REG_WAS_0, NULL_RTX);
7090: if (note)
7091: {
7092: remove_note (insn, note);
7093: XEXP (note, 1) = REG_NOTES (prev);
7094: REG_NOTES (prev) = note;
7095: }
7096: }
7097: }
7098:
7099: /* If this is a conditional jump insn, record any known equivalences due to
7100: the condition being tested. */
7101:
7102: last_jump_equiv_class = 0;
7103: if (GET_CODE (insn) == JUMP_INSN
7104: && n_sets == 1 && GET_CODE (x) == SET
7105: && GET_CODE (SET_SRC (x)) == IF_THEN_ELSE)
7106: record_jump_equiv (insn, 0);
7107:
7108: #ifdef HAVE_cc0
7109: /* If the previous insn set CC0 and this insn no longer references CC0,
7110: delete the previous insn. Here we use the fact that nothing expects CC0
7111: to be valid over an insn, which is true until the final pass. */
7112: if (prev_insn && GET_CODE (prev_insn) == INSN
7113: && (tem = single_set (prev_insn)) != 0
7114: && SET_DEST (tem) == cc0_rtx
7115: && ! reg_mentioned_p (cc0_rtx, x))
7116: {
7117: PUT_CODE (prev_insn, NOTE);
7118: NOTE_LINE_NUMBER (prev_insn) = NOTE_INSN_DELETED;
7119: NOTE_SOURCE_FILE (prev_insn) = 0;
7120: }
7121:
7122: prev_insn_cc0 = this_insn_cc0;
7123: prev_insn_cc0_mode = this_insn_cc0_mode;
7124: #endif
7125:
7126: prev_insn = insn;
7127: }
7128:
7129: /* Store 1 in *WRITES_PTR for those categories of memory ref
7130: that must be invalidated when the expression WRITTEN is stored in.
7131: If WRITTEN is null, say everything must be invalidated. */
7132:
7133: static void
7134: note_mem_written (written, writes_ptr)
7135: rtx written;
7136: struct write_data *writes_ptr;
7137: {
7138: static struct write_data everything = {0, 1, 1, 1};
7139:
7140: if (written == 0)
7141: *writes_ptr = everything;
7142: else if (GET_CODE (written) == MEM)
7143: {
7144: /* Pushing or popping the stack invalidates just the stack pointer. */
7145: rtx addr = XEXP (written, 0);
7146: if ((GET_CODE (addr) == PRE_DEC || GET_CODE (addr) == PRE_INC
7147: || GET_CODE (addr) == POST_DEC || GET_CODE (addr) == POST_INC)
7148: && GET_CODE (XEXP (addr, 0)) == REG
7149: && REGNO (XEXP (addr, 0)) == STACK_POINTER_REGNUM)
7150: {
7151: writes_ptr->sp = 1;
7152: return;
7153: }
7154: else if (GET_MODE (written) == BLKmode)
7155: *writes_ptr = everything;
7156: /* (mem (scratch)) means clobber everything. */
7157: else if (GET_CODE (addr) == SCRATCH)
7158: *writes_ptr = everything;
7159: else if (cse_rtx_addr_varies_p (written))
7160: {
7161: /* A varying address that is a sum indicates an array element,
7162: and that's just as good as a structure element
7163: in implying that we need not invalidate scalar variables.
7164: However, we must allow QImode aliasing of scalars, because the
7165: ANSI C standard allows character pointers to alias anything. */
7166: if (! ((MEM_IN_STRUCT_P (written)
7167: || GET_CODE (XEXP (written, 0)) == PLUS)
7168: && GET_MODE (written) != QImode))
7169: writes_ptr->all = 1;
7170: writes_ptr->nonscalar = 1;
7171: }
7172: writes_ptr->var = 1;
7173: }
7174: }
7175:
7176: /* Perform invalidation on the basis of everything about an insn
7177: except for invalidating the actual places that are SET in it.
7178: This includes the places CLOBBERed, and anything that might
7179: alias with something that is SET or CLOBBERed.
7180:
7181: W points to the writes_memory for this insn, a struct write_data
7182: saying which kinds of memory references must be invalidated.
7183: X is the pattern of the insn. */
7184:
7185: static void
7186: invalidate_from_clobbers (w, x)
7187: struct write_data *w;
7188: rtx x;
7189: {
7190: /* If W->var is not set, W specifies no action.
7191: If W->all is set, this step gets all memory refs
7192: so they can be ignored in the rest of this function. */
7193: if (w->var)
7194: invalidate_memory (w);
7195:
7196: if (w->sp)
7197: {
7198: if (reg_tick[STACK_POINTER_REGNUM] >= 0)
7199: reg_tick[STACK_POINTER_REGNUM]++;
7200:
7201: /* This should be *very* rare. */
7202: if (TEST_HARD_REG_BIT (hard_regs_in_table, STACK_POINTER_REGNUM))
7203: invalidate (stack_pointer_rtx);
7204: }
7205:
7206: if (GET_CODE (x) == CLOBBER)
7207: {
7208: rtx ref = XEXP (x, 0);
7209: if (ref)
7210: {
7211: if (GET_CODE (ref) == REG || GET_CODE (ref) == SUBREG
7212: || (GET_CODE (ref) == MEM && ! w->all))
7213: invalidate (ref);
7214: else if (GET_CODE (ref) == STRICT_LOW_PART
7215: || GET_CODE (ref) == ZERO_EXTRACT)
7216: invalidate (XEXP (ref, 0));
7217: }
7218: }
7219: else if (GET_CODE (x) == PARALLEL)
7220: {
7221: register int i;
7222: for (i = XVECLEN (x, 0) - 1; i >= 0; i--)
7223: {
7224: register rtx y = XVECEXP (x, 0, i);
7225: if (GET_CODE (y) == CLOBBER)
7226: {
7227: rtx ref = XEXP (y, 0);
7228: if (ref)
7229: {
7230: if (GET_CODE (ref) == REG || GET_CODE (ref) == SUBREG
7231: || (GET_CODE (ref) == MEM && !w->all))
7232: invalidate (ref);
7233: else if (GET_CODE (ref) == STRICT_LOW_PART
7234: || GET_CODE (ref) == ZERO_EXTRACT)
7235: invalidate (XEXP (ref, 0));
7236: }
7237: }
7238: }
7239: }
7240: }
7241:
7242: /* Process X, part of the REG_NOTES of an insn. Look at any REG_EQUAL notes
7243: and replace any registers in them with either an equivalent constant
7244: or the canonical form of the register. If we are inside an address,
7245: only do this if the address remains valid.
7246:
7247: OBJECT is 0 except when within a MEM in which case it is the MEM.
7248:
7249: Return the replacement for X. */
7250:
7251: static rtx
7252: cse_process_notes (x, object)
7253: rtx x;
7254: rtx object;
7255: {
7256: enum rtx_code code = GET_CODE (x);
7257: char *fmt = GET_RTX_FORMAT (code);
7258: int i;
7259:
7260: switch (code)
7261: {
7262: case CONST_INT:
7263: case CONST:
7264: case SYMBOL_REF:
7265: case LABEL_REF:
7266: case CONST_DOUBLE:
7267: case PC:
7268: case CC0:
7269: case LO_SUM:
7270: return x;
7271:
7272: case MEM:
7273: XEXP (x, 0) = cse_process_notes (XEXP (x, 0), x);
7274: return x;
7275:
7276: case EXPR_LIST:
7277: case INSN_LIST:
7278: if (REG_NOTE_KIND (x) == REG_EQUAL)
7279: XEXP (x, 0) = cse_process_notes (XEXP (x, 0), NULL_RTX);
7280: if (XEXP (x, 1))
7281: XEXP (x, 1) = cse_process_notes (XEXP (x, 1), NULL_RTX);
7282: return x;
7283:
7284: case SIGN_EXTEND:
7285: case ZERO_EXTEND:
7286: {
7287: rtx new = cse_process_notes (XEXP (x, 0), object);
7288: /* We don't substitute VOIDmode constants into these rtx,
7289: since they would impede folding. */
7290: if (GET_MODE (new) != VOIDmode)
7291: validate_change (object, &XEXP (x, 0), new, 0);
7292: return x;
7293: }
7294:
7295: case REG:
7296: i = reg_qty[REGNO (x)];
7297:
7298: /* Return a constant or a constant register. */
7299: if (REGNO_QTY_VALID_P (REGNO (x))
7300: && qty_const[i] != 0
7301: && (CONSTANT_P (qty_const[i])
7302: || GET_CODE (qty_const[i]) == REG))
7303: {
7304: rtx new = gen_lowpart_if_possible (GET_MODE (x), qty_const[i]);
7305: if (new)
7306: return new;
7307: }
7308:
7309: /* Otherwise, canonicalize this register. */
7310: return canon_reg (x, NULL_RTX);
7311: }
7312:
7313: for (i = 0; i < GET_RTX_LENGTH (code); i++)
7314: if (fmt[i] == 'e')
7315: validate_change (object, &XEXP (x, i),
7316: cse_process_notes (XEXP (x, i), object), 0);
7317:
7318: return x;
7319: }
7320:
7321: /* Find common subexpressions between the end test of a loop and the beginning
7322: of the loop. LOOP_START is the CODE_LABEL at the start of a loop.
7323:
7324: Often we have a loop where an expression in the exit test is used
7325: in the body of the loop. For example "while (*p) *q++ = *p++;".
7326: Because of the way we duplicate the loop exit test in front of the loop,
7327: however, we don't detect that common subexpression. This will be caught
7328: when global cse is implemented, but this is a quite common case.
7329:
7330: This function handles the most common cases of these common expressions.
7331: It is called after we have processed the basic block ending with the
7332: NOTE_INSN_LOOP_END note that ends a loop and the previous JUMP_INSN
7333: jumps to a label used only once. */
7334:
7335: static void
7336: cse_around_loop (loop_start)
7337: rtx loop_start;
7338: {
7339: rtx insn;
7340: int i;
7341: struct table_elt *p;
7342:
7343: /* If the jump at the end of the loop doesn't go to the start, we don't
7344: do anything. */
7345: for (insn = PREV_INSN (loop_start);
7346: insn && (GET_CODE (insn) == NOTE && NOTE_LINE_NUMBER (insn) >= 0);
7347: insn = PREV_INSN (insn))
7348: ;
7349:
7350: if (insn == 0
7351: || GET_CODE (insn) != NOTE
7352: || NOTE_LINE_NUMBER (insn) != NOTE_INSN_LOOP_BEG)
7353: return;
7354:
7355: /* If the last insn of the loop (the end test) was an NE comparison,
7356: we will interpret it as an EQ comparison, since we fell through
7357: the loop. Any equivalences resulting from that comparison are
7358: therefore not valid and must be invalidated. */
7359: if (last_jump_equiv_class)
7360: for (p = last_jump_equiv_class->first_same_value; p;
7361: p = p->next_same_value)
7362: if (GET_CODE (p->exp) == MEM || GET_CODE (p->exp) == REG
7363: || GET_CODE (p->exp) == SUBREG)
7364: invalidate (p->exp);
7365: else if (GET_CODE (p->exp) == STRICT_LOW_PART
7366: || GET_CODE (p->exp) == ZERO_EXTRACT)
7367: invalidate (XEXP (p->exp, 0));
7368:
7369: /* Process insns starting after LOOP_START until we hit a CALL_INSN or
7370: a CODE_LABEL (we could handle a CALL_INSN, but it isn't worth it).
7371:
7372: The only thing we do with SET_DEST is invalidate entries, so we
7373: can safely process each SET in order. It is slightly less efficient
7374: to do so, but we only want to handle the most common cases. */
7375:
7376: for (insn = NEXT_INSN (loop_start);
7377: GET_CODE (insn) != CALL_INSN && GET_CODE (insn) != CODE_LABEL
7378: && ! (GET_CODE (insn) == NOTE
7379: && NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_END);
7380: insn = NEXT_INSN (insn))
7381: {
7382: if (GET_RTX_CLASS (GET_CODE (insn)) == 'i'
7383: && (GET_CODE (PATTERN (insn)) == SET
7384: || GET_CODE (PATTERN (insn)) == CLOBBER))
7385: cse_set_around_loop (PATTERN (insn), insn, loop_start);
7386: else if (GET_RTX_CLASS (GET_CODE (insn)) == 'i'
7387: && GET_CODE (PATTERN (insn)) == PARALLEL)
7388: for (i = XVECLEN (PATTERN (insn), 0) - 1; i >= 0; i--)
7389: if (GET_CODE (XVECEXP (PATTERN (insn), 0, i)) == SET
7390: || GET_CODE (XVECEXP (PATTERN (insn), 0, i)) == CLOBBER)
7391: cse_set_around_loop (XVECEXP (PATTERN (insn), 0, i), insn,
7392: loop_start);
7393: }
7394: }
7395:
7396: /* Variable used for communications between the next two routines. */
7397:
7398: static struct write_data skipped_writes_memory;
7399:
7400: /* Process one SET of an insn that was skipped. We ignore CLOBBERs
7401: since they are done elsewhere. This function is called via note_stores. */
7402:
7403: static void
7404: invalidate_skipped_set (dest, set)
7405: rtx set;
7406: rtx dest;
7407: {
7408: if (GET_CODE (set) == CLOBBER
7409: #ifdef HAVE_cc0
7410: || dest == cc0_rtx
7411: #endif
7412: || dest == pc_rtx)
7413: return;
7414:
7415: if (GET_CODE (dest) == MEM)
7416: note_mem_written (dest, &skipped_writes_memory);
7417:
7418: /* There are times when an address can appear varying and be a PLUS
7419: during this scan when it would be a fixed address were we to know
7420: the proper equivalences. So promote "nonscalar" to be "all". */
7421: if (skipped_writes_memory.nonscalar)
7422: skipped_writes_memory.all = 1;
7423:
7424: if (GET_CODE (dest) == REG || GET_CODE (dest) == SUBREG
7425: || (! skipped_writes_memory.all && ! cse_rtx_addr_varies_p (dest)))
7426: invalidate (dest);
7427: else if (GET_CODE (dest) == STRICT_LOW_PART
7428: || GET_CODE (dest) == ZERO_EXTRACT)
7429: invalidate (XEXP (dest, 0));
7430: }
7431:
7432: /* Invalidate all insns from START up to the end of the function or the
7433: next label. This called when we wish to CSE around a block that is
7434: conditionally executed. */
7435:
7436: static void
7437: invalidate_skipped_block (start)
7438: rtx start;
7439: {
7440: rtx insn;
7441: static struct write_data init = {0, 0, 0, 0};
7442: static struct write_data everything = {0, 1, 1, 1};
7443:
7444: for (insn = start; insn && GET_CODE (insn) != CODE_LABEL;
7445: insn = NEXT_INSN (insn))
7446: {
7447: if (GET_RTX_CLASS (GET_CODE (insn)) != 'i')
7448: continue;
7449:
7450: skipped_writes_memory = init;
7451:
7452: if (GET_CODE (insn) == CALL_INSN)
7453: {
7454: invalidate_for_call ();
7455: skipped_writes_memory = everything;
7456: }
7457:
7458: note_stores (PATTERN (insn), invalidate_skipped_set);
7459: invalidate_from_clobbers (&skipped_writes_memory, PATTERN (insn));
7460: }
7461: }
7462:
7463: /* Used for communication between the following two routines; contains a
7464: value to be checked for modification. */
7465:
7466: static rtx cse_check_loop_start_value;
7467:
7468: /* If modifying X will modify the value in CSE_CHECK_LOOP_START_VALUE,
7469: indicate that fact by setting CSE_CHECK_LOOP_START_VALUE to 0. */
7470:
7471: static void
7472: cse_check_loop_start (x, set)
7473: rtx x;
7474: rtx set;
7475: {
7476: if (cse_check_loop_start_value == 0
7477: || GET_CODE (x) == CC0 || GET_CODE (x) == PC)
7478: return;
7479:
7480: if ((GET_CODE (x) == MEM && GET_CODE (cse_check_loop_start_value) == MEM)
7481: || reg_overlap_mentioned_p (x, cse_check_loop_start_value))
7482: cse_check_loop_start_value = 0;
7483: }
7484:
7485: /* X is a SET or CLOBBER contained in INSN that was found near the start of
7486: a loop that starts with the label at LOOP_START.
7487:
7488: If X is a SET, we see if its SET_SRC is currently in our hash table.
7489: If so, we see if it has a value equal to some register used only in the
7490: loop exit code (as marked by jump.c).
7491:
7492: If those two conditions are true, we search backwards from the start of
7493: the loop to see if that same value was loaded into a register that still
7494: retains its value at the start of the loop.
7495:
7496: If so, we insert an insn after the load to copy the destination of that
7497: load into the equivalent register and (try to) replace our SET_SRC with that
7498: register.
7499:
7500: In any event, we invalidate whatever this SET or CLOBBER modifies. */
7501:
7502: static void
7503: cse_set_around_loop (x, insn, loop_start)
7504: rtx x;
7505: rtx insn;
7506: rtx loop_start;
7507: {
7508: struct table_elt *src_elt;
7509: static struct write_data init = {0, 0, 0, 0};
7510: struct write_data writes_memory;
7511:
7512: writes_memory = init;
7513:
7514: /* If this is a SET, see if we can replace SET_SRC, but ignore SETs that
7515: are setting PC or CC0 or whose SET_SRC is already a register. */
7516: if (GET_CODE (x) == SET
7517: && GET_CODE (SET_DEST (x)) != PC && GET_CODE (SET_DEST (x)) != CC0
7518: && GET_CODE (SET_SRC (x)) != REG)
7519: {
7520: src_elt = lookup (SET_SRC (x),
7521: HASH (SET_SRC (x), GET_MODE (SET_DEST (x))),
7522: GET_MODE (SET_DEST (x)));
7523:
7524: if (src_elt)
7525: for (src_elt = src_elt->first_same_value; src_elt;
7526: src_elt = src_elt->next_same_value)
7527: if (GET_CODE (src_elt->exp) == REG && REG_LOOP_TEST_P (src_elt->exp)
7528: && COST (src_elt->exp) < COST (SET_SRC (x)))
7529: {
7530: rtx p, set;
7531:
7532: /* Look for an insn in front of LOOP_START that sets
7533: something in the desired mode to SET_SRC (x) before we hit
7534: a label or CALL_INSN. */
7535:
7536: for (p = prev_nonnote_insn (loop_start);
7537: p && GET_CODE (p) != CALL_INSN
7538: && GET_CODE (p) != CODE_LABEL;
7539: p = prev_nonnote_insn (p))
7540: if ((set = single_set (p)) != 0
7541: && GET_CODE (SET_DEST (set)) == REG
7542: && GET_MODE (SET_DEST (set)) == src_elt->mode
7543: && rtx_equal_p (SET_SRC (set), SET_SRC (x)))
7544: {
7545: /* We now have to ensure that nothing between P
7546: and LOOP_START modified anything referenced in
7547: SET_SRC (x). We know that nothing within the loop
7548: can modify it, or we would have invalidated it in
7549: the hash table. */
7550: rtx q;
7551:
7552: cse_check_loop_start_value = SET_SRC (x);
7553: for (q = p; q != loop_start; q = NEXT_INSN (q))
7554: if (GET_RTX_CLASS (GET_CODE (q)) == 'i')
7555: note_stores (PATTERN (q), cse_check_loop_start);
7556:
7557: /* If nothing was changed and we can replace our
7558: SET_SRC, add an insn after P to copy its destination
7559: to what we will be replacing SET_SRC with. */
7560: if (cse_check_loop_start_value
7561: && validate_change (insn, &SET_SRC (x),
7562: src_elt->exp, 0))
7563: emit_insn_after (gen_move_insn (src_elt->exp,
7564: SET_DEST (set)),
7565: p);
7566: break;
7567: }
7568: }
7569: }
7570:
7571: /* Now invalidate anything modified by X. */
7572: note_mem_written (SET_DEST (x), &writes_memory);
7573:
7574: if (writes_memory.var)
7575: invalidate_memory (&writes_memory);
7576:
7577: /* See comment on similar code in cse_insn for explanation of these tests. */
7578: if (GET_CODE (SET_DEST (x)) == REG || GET_CODE (SET_DEST (x)) == SUBREG
7579: || (GET_CODE (SET_DEST (x)) == MEM && ! writes_memory.all
7580: && ! cse_rtx_addr_varies_p (SET_DEST (x))))
7581: invalidate (SET_DEST (x));
7582: else if (GET_CODE (SET_DEST (x)) == STRICT_LOW_PART
7583: || GET_CODE (SET_DEST (x)) == ZERO_EXTRACT)
7584: invalidate (XEXP (SET_DEST (x), 0));
7585: }
7586:
7587: /* Find the end of INSN's basic block and return its range,
7588: the total number of SETs in all the insns of the block, the last insn of the
7589: block, and the branch path.
7590:
7591: The branch path indicates which branches should be followed. If a non-zero
7592: path size is specified, the block should be rescanned and a different set
7593: of branches will be taken. The branch path is only used if
7594: FLAG_CSE_FOLLOW_JUMPS or FLAG_CSE_SKIP_BLOCKS is non-zero.
7595:
7596: DATA is a pointer to a struct cse_basic_block_data, defined below, that is
7597: used to describe the block. It is filled in with the information about
7598: the current block. The incoming structure's branch path, if any, is used
7599: to construct the output branch path. */
7600:
7601: void
7602: cse_end_of_basic_block (insn, data, follow_jumps, after_loop, skip_blocks)
7603: rtx insn;
7604: struct cse_basic_block_data *data;
7605: int follow_jumps;
7606: int after_loop;
7607: int skip_blocks;
7608: {
7609: rtx p = insn, q;
7610: int nsets = 0;
7611: int low_cuid = INSN_CUID (insn), high_cuid = INSN_CUID (insn);
7612: rtx next = GET_RTX_CLASS (GET_CODE (insn)) == 'i' ? insn : next_real_insn (insn);
7613: int path_size = data->path_size;
7614: int path_entry = 0;
7615: int i;
7616:
7617: /* Update the previous branch path, if any. If the last branch was
7618: previously TAKEN, mark it NOT_TAKEN. If it was previously NOT_TAKEN,
7619: shorten the path by one and look at the previous branch. We know that
7620: at least one branch must have been taken if PATH_SIZE is non-zero. */
7621: while (path_size > 0)
7622: {
7623: if (data->path[path_size - 1].status != NOT_TAKEN)
7624: {
7625: data->path[path_size - 1].status = NOT_TAKEN;
7626: break;
7627: }
7628: else
7629: path_size--;
7630: }
7631:
7632: /* Scan to end of this basic block. */
7633: while (p && GET_CODE (p) != CODE_LABEL)
7634: {
7635: /* Don't cse out the end of a loop. This makes a difference
7636: only for the unusual loops that always execute at least once;
7637: all other loops have labels there so we will stop in any case.
7638: Cse'ing out the end of the loop is dangerous because it
7639: might cause an invariant expression inside the loop
7640: to be reused after the end of the loop. This would make it
7641: hard to move the expression out of the loop in loop.c,
7642: especially if it is one of several equivalent expressions
7643: and loop.c would like to eliminate it.
7644:
7645: If we are running after loop.c has finished, we can ignore
7646: the NOTE_INSN_LOOP_END. */
7647:
7648: if (! after_loop && GET_CODE (p) == NOTE
7649: && NOTE_LINE_NUMBER (p) == NOTE_INSN_LOOP_END)
7650: break;
7651:
7652: /* Don't cse over a call to setjmp; on some machines (eg vax)
7653: the regs restored by the longjmp come from
7654: a later time than the setjmp. */
7655: if (GET_CODE (p) == NOTE
7656: && NOTE_LINE_NUMBER (p) == NOTE_INSN_SETJMP)
7657: break;
7658:
7659: /* A PARALLEL can have lots of SETs in it,
7660: especially if it is really an ASM_OPERANDS. */
7661: if (GET_RTX_CLASS (GET_CODE (p)) == 'i'
7662: && GET_CODE (PATTERN (p)) == PARALLEL)
7663: nsets += XVECLEN (PATTERN (p), 0);
7664: else if (GET_CODE (p) != NOTE)
7665: nsets += 1;
7666:
7667: /* Ignore insns made by CSE; they cannot affect the boundaries of
7668: the basic block. */
7669:
7670: if (INSN_UID (p) <= max_uid && INSN_CUID (p) > high_cuid)
7671: high_cuid = INSN_CUID (p);
7672: if (INSN_UID (p) <= max_uid && INSN_CUID (p) < low_cuid)
7673: low_cuid = INSN_CUID (p);
7674:
7675: /* See if this insn is in our branch path. If it is and we are to
7676: take it, do so. */
7677: if (path_entry < path_size && data->path[path_entry].branch == p)
7678: {
7679: if (data->path[path_entry].status != NOT_TAKEN)
7680: p = JUMP_LABEL (p);
7681:
7682: /* Point to next entry in path, if any. */
7683: path_entry++;
7684: }
7685:
7686: /* If this is a conditional jump, we can follow it if -fcse-follow-jumps
7687: was specified, we haven't reached our maximum path length, there are
7688: insns following the target of the jump, this is the only use of the
7689: jump label, and the target label is preceded by a BARRIER.
7690:
7691: Alternatively, we can follow the jump if it branches around a
7692: block of code and there are no other branches into the block.
7693: In this case invalidate_skipped_block will be called to invalidate any
7694: registers set in the block when following the jump. */
7695:
7696: else if ((follow_jumps || skip_blocks) && path_size < PATHLENGTH - 1
7697: && GET_CODE (p) == JUMP_INSN
7698: && GET_CODE (PATTERN (p)) == SET
7699: && GET_CODE (SET_SRC (PATTERN (p))) == IF_THEN_ELSE
7700: && LABEL_NUSES (JUMP_LABEL (p)) == 1
7701: && NEXT_INSN (JUMP_LABEL (p)) != 0)
7702: {
7703: for (q = PREV_INSN (JUMP_LABEL (p)); q; q = PREV_INSN (q))
7704: if ((GET_CODE (q) != NOTE
7705: || NOTE_LINE_NUMBER (q) == NOTE_INSN_LOOP_END
7706: || NOTE_LINE_NUMBER (q) == NOTE_INSN_SETJMP)
7707: && (GET_CODE (q) != CODE_LABEL || LABEL_NUSES (q) != 0))
7708: break;
7709:
7710: /* If we ran into a BARRIER, this code is an extension of the
7711: basic block when the branch is taken. */
7712: if (follow_jumps && q != 0 && GET_CODE (q) == BARRIER)
7713: {
7714: /* Don't allow ourself to keep walking around an
7715: always-executed loop. */
7716: if (next_real_insn (q) == next)
7717: {
7718: p = NEXT_INSN (p);
7719: continue;
7720: }
7721:
7722: /* Similarly, don't put a branch in our path more than once. */
7723: for (i = 0; i < path_entry; i++)
7724: if (data->path[i].branch == p)
7725: break;
7726:
7727: if (i != path_entry)
7728: break;
7729:
7730: data->path[path_entry].branch = p;
7731: data->path[path_entry++].status = TAKEN;
7732:
7733: /* This branch now ends our path. It was possible that we
7734: didn't see this branch the last time around (when the
7735: insn in front of the target was a JUMP_INSN that was
7736: turned into a no-op). */
7737: path_size = path_entry;
7738:
7739: p = JUMP_LABEL (p);
7740: /* Mark block so we won't scan it again later. */
7741: PUT_MODE (NEXT_INSN (p), QImode);
7742: }
7743: /* Detect a branch around a block of code. */
7744: else if (skip_blocks && q != 0 && GET_CODE (q) != CODE_LABEL)
7745: {
7746: register rtx tmp;
7747:
7748: if (next_real_insn (q) == next)
7749: {
7750: p = NEXT_INSN (p);
7751: continue;
7752: }
7753:
7754: for (i = 0; i < path_entry; i++)
7755: if (data->path[i].branch == p)
7756: break;
7757:
7758: if (i != path_entry)
7759: break;
7760:
7761: /* This is no_labels_between_p (p, q) with an added check for
7762: reaching the end of a function (in case Q precedes P). */
7763: for (tmp = NEXT_INSN (p); tmp && tmp != q; tmp = NEXT_INSN (tmp))
7764: if (GET_CODE (tmp) == CODE_LABEL)
7765: break;
7766:
7767: if (tmp == q)
7768: {
7769: data->path[path_entry].branch = p;
7770: data->path[path_entry++].status = AROUND;
7771:
7772: path_size = path_entry;
7773:
7774: p = JUMP_LABEL (p);
7775: /* Mark block so we won't scan it again later. */
7776: PUT_MODE (NEXT_INSN (p), QImode);
7777: }
7778: }
7779: }
7780: p = NEXT_INSN (p);
7781: }
7782:
7783: data->low_cuid = low_cuid;
7784: data->high_cuid = high_cuid;
7785: data->nsets = nsets;
7786: data->last = p;
7787:
7788: /* If all jumps in the path are not taken, set our path length to zero
7789: so a rescan won't be done. */
7790: for (i = path_size - 1; i >= 0; i--)
7791: if (data->path[i].status != NOT_TAKEN)
7792: break;
7793:
7794: if (i == -1)
7795: data->path_size = 0;
7796: else
7797: data->path_size = path_size;
7798:
7799: /* End the current branch path. */
7800: data->path[path_size].branch = 0;
7801: }
7802:
7803: /* Perform cse on the instructions of a function.
7804: F is the first instruction.
7805: NREGS is one plus the highest pseudo-reg number used in the instruction.
7806:
7807: AFTER_LOOP is 1 if this is the cse call done after loop optimization
7808: (only if -frerun-cse-after-loop).
7809:
7810: Returns 1 if jump_optimize should be redone due to simplifications
7811: in conditional jump instructions. */
7812:
7813: int
7814: cse_main (f, nregs, after_loop, file)
7815: rtx f;
7816: int nregs;
7817: int after_loop;
7818: FILE *file;
7819: {
7820: struct cse_basic_block_data val;
7821: register rtx insn = f;
7822: register int i;
7823:
7824: cse_jumps_altered = 0;
7825: constant_pool_entries_cost = 0;
7826: val.path_size = 0;
7827:
7828: init_recog ();
7829:
7830: max_reg = nregs;
7831:
7832: all_minus_one = (int *) alloca (nregs * sizeof (int));
7833: consec_ints = (int *) alloca (nregs * sizeof (int));
7834:
7835: for (i = 0; i < nregs; i++)
7836: {
7837: all_minus_one[i] = -1;
7838: consec_ints[i] = i;
7839: }
7840:
7841: reg_next_eqv = (int *) alloca (nregs * sizeof (int));
7842: reg_prev_eqv = (int *) alloca (nregs * sizeof (int));
7843: reg_qty = (int *) alloca (nregs * sizeof (int));
7844: reg_in_table = (int *) alloca (nregs * sizeof (int));
7845: reg_tick = (int *) alloca (nregs * sizeof (int));
7846:
7847: /* Discard all the free elements of the previous function
7848: since they are allocated in the temporarily obstack. */
7849: bzero (table, sizeof table);
7850: free_element_chain = 0;
7851: n_elements_made = 0;
7852:
7853: /* Find the largest uid. */
7854:
7855: max_uid = get_max_uid ();
7856: uid_cuid = (int *) alloca ((max_uid + 1) * sizeof (int));
7857: bzero (uid_cuid, (max_uid + 1) * sizeof (int));
7858:
7859: /* Compute the mapping from uids to cuids.
7860: CUIDs are numbers assigned to insns, like uids,
7861: except that cuids increase monotonically through the code.
7862: Don't assign cuids to line-number NOTEs, so that the distance in cuids
7863: between two insns is not affected by -g. */
7864:
7865: for (insn = f, i = 0; insn; insn = NEXT_INSN (insn))
7866: {
7867: if (GET_CODE (insn) != NOTE
7868: || NOTE_LINE_NUMBER (insn) < 0)
7869: INSN_CUID (insn) = ++i;
7870: else
7871: /* Give a line number note the same cuid as preceding insn. */
7872: INSN_CUID (insn) = i;
7873: }
7874:
7875: /* Initialize which registers are clobbered by calls. */
7876:
7877: CLEAR_HARD_REG_SET (regs_invalidated_by_call);
7878:
7879: for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
7880: if ((call_used_regs[i]
7881: /* Used to check !fixed_regs[i] here, but that isn't safe;
7882: fixed regs are still call-clobbered, and sched can get
7883: confused if they can "live across calls".
7884:
7885: The frame pointer is always preserved across calls. The arg
7886: pointer is if it is fixed. The stack pointer usually is, unless
7887: RETURN_POPS_ARGS, in which case an explicit CLOBBER
7888: will be present. If we are generating PIC code, the PIC offset
7889: table register is preserved across calls. */
7890:
7891: && i != STACK_POINTER_REGNUM
7892: && i != FRAME_POINTER_REGNUM
7893: #if HARD_FRAME_POINTER_REGNUM != FRAME_POINTER_REGNUM
7894: && i != HARD_FRAME_POINTER_REGNUM
7895: #endif
7896: #if ARG_POINTER_REGNUM != FRAME_POINTER_REGNUM
7897: && ! (i == ARG_POINTER_REGNUM && fixed_regs[i])
7898: #endif
7899: #ifdef PIC_OFFSET_TABLE_REGNUM
7900: && ! (i == PIC_OFFSET_TABLE_REGNUM && flag_pic)
7901: #endif
7902: )
7903: || global_regs[i])
7904: SET_HARD_REG_BIT (regs_invalidated_by_call, i);
7905:
7906: /* Loop over basic blocks.
7907: Compute the maximum number of qty's needed for each basic block
7908: (which is 2 for each SET). */
7909: insn = f;
7910: while (insn)
7911: {
7912: cse_end_of_basic_block (insn, &val, flag_cse_follow_jumps, after_loop,
7913: flag_cse_skip_blocks);
7914:
7915: /* If this basic block was already processed or has no sets, skip it. */
7916: if (val.nsets == 0 || GET_MODE (insn) == QImode)
7917: {
7918: PUT_MODE (insn, VOIDmode);
7919: insn = (val.last ? NEXT_INSN (val.last) : 0);
7920: val.path_size = 0;
7921: continue;
7922: }
7923:
7924: cse_basic_block_start = val.low_cuid;
7925: cse_basic_block_end = val.high_cuid;
7926: max_qty = val.nsets * 2;
7927:
7928: if (file)
7929: fprintf (file, ";; Processing block from %d to %d, %d sets.\n",
7930: INSN_UID (insn), val.last ? INSN_UID (val.last) : 0,
7931: val.nsets);
7932:
7933: /* Make MAX_QTY bigger to give us room to optimize
7934: past the end of this basic block, if that should prove useful. */
7935: if (max_qty < 500)
7936: max_qty = 500;
7937:
7938: max_qty += max_reg;
7939:
7940: /* If this basic block is being extended by following certain jumps,
7941: (see `cse_end_of_basic_block'), we reprocess the code from the start.
7942: Otherwise, we start after this basic block. */
7943: if (val.path_size > 0)
7944: cse_basic_block (insn, val.last, val.path, 0);
7945: else
7946: {
7947: int old_cse_jumps_altered = cse_jumps_altered;
7948: rtx temp;
7949:
7950: /* When cse changes a conditional jump to an unconditional
7951: jump, we want to reprocess the block, since it will give
7952: us a new branch path to investigate. */
7953: cse_jumps_altered = 0;
7954: temp = cse_basic_block (insn, val.last, val.path, ! after_loop);
7955: if (cse_jumps_altered == 0
7956: || (flag_cse_follow_jumps == 0 && flag_cse_skip_blocks == 0))
7957: insn = temp;
7958:
7959: cse_jumps_altered |= old_cse_jumps_altered;
7960: }
7961:
7962: #ifdef USE_C_ALLOCA
7963: alloca (0);
7964: #endif
7965: }
7966:
7967: /* Tell refers_to_mem_p that qty_const info is not available. */
7968: qty_const = 0;
7969:
7970: if (max_elements_made < n_elements_made)
7971: max_elements_made = n_elements_made;
7972:
7973: return cse_jumps_altered;
7974: }
7975:
7976: /* Process a single basic block. FROM and TO and the limits of the basic
7977: block. NEXT_BRANCH points to the branch path when following jumps or
7978: a null path when not following jumps.
7979:
7980: AROUND_LOOP is non-zero if we are to try to cse around to the start of a
7981: loop. This is true when we are being called for the last time on a
7982: block and this CSE pass is before loop.c. */
7983:
7984: static rtx
7985: cse_basic_block (from, to, next_branch, around_loop)
7986: register rtx from, to;
7987: struct branch_path *next_branch;
7988: int around_loop;
7989: {
7990: register rtx insn;
7991: int to_usage = 0;
7992: int in_libcall_block = 0;
7993:
7994: /* Each of these arrays is undefined before max_reg, so only allocate
7995: the space actually needed and adjust the start below. */
7996:
7997: qty_first_reg = (int *) alloca ((max_qty - max_reg) * sizeof (int));
7998: qty_last_reg = (int *) alloca ((max_qty - max_reg) * sizeof (int));
7999: qty_mode= (enum machine_mode *) alloca ((max_qty - max_reg) * sizeof (enum machine_mode));
8000: qty_const = (rtx *) alloca ((max_qty - max_reg) * sizeof (rtx));
8001: qty_const_insn = (rtx *) alloca ((max_qty - max_reg) * sizeof (rtx));
8002: qty_comparison_code
8003: = (enum rtx_code *) alloca ((max_qty - max_reg) * sizeof (enum rtx_code));
8004: qty_comparison_qty = (int *) alloca ((max_qty - max_reg) * sizeof (int));
8005: qty_comparison_const = (rtx *) alloca ((max_qty - max_reg) * sizeof (rtx));
8006:
8007: qty_first_reg -= max_reg;
8008: qty_last_reg -= max_reg;
8009: qty_mode -= max_reg;
8010: qty_const -= max_reg;
8011: qty_const_insn -= max_reg;
8012: qty_comparison_code -= max_reg;
8013: qty_comparison_qty -= max_reg;
8014: qty_comparison_const -= max_reg;
8015:
8016: new_basic_block ();
8017:
8018: /* TO might be a label. If so, protect it from being deleted. */
8019: if (to != 0 && GET_CODE (to) == CODE_LABEL)
8020: ++LABEL_NUSES (to);
8021:
8022: for (insn = from; insn != to; insn = NEXT_INSN (insn))
8023: {
8024: register enum rtx_code code;
8025:
8026: /* See if this is a branch that is part of the path. If so, and it is
8027: to be taken, do so. */
8028: if (next_branch->branch == insn)
8029: {
8030: enum taken status = next_branch++->status;
8031: if (status != NOT_TAKEN)
8032: {
8033: if (status == TAKEN)
8034: record_jump_equiv (insn, 1);
8035: else
8036: invalidate_skipped_block (NEXT_INSN (insn));
8037:
8038: /* Set the last insn as the jump insn; it doesn't affect cc0.
8039: Then follow this branch. */
8040: #ifdef HAVE_cc0
8041: prev_insn_cc0 = 0;
8042: #endif
8043: prev_insn = insn;
8044: insn = JUMP_LABEL (insn);
8045: continue;
8046: }
8047: }
8048:
8049: code = GET_CODE (insn);
8050: if (GET_MODE (insn) == QImode)
8051: PUT_MODE (insn, VOIDmode);
8052:
8053: if (GET_RTX_CLASS (code) == 'i')
8054: {
8055: /* Process notes first so we have all notes in canonical forms when
8056: looking for duplicate operations. */
8057:
8058: if (REG_NOTES (insn))
8059: REG_NOTES (insn) = cse_process_notes (REG_NOTES (insn), NULL_RTX);
8060:
8061: /* Track when we are inside in LIBCALL block. Inside such a block,
8062: we do not want to record destinations. The last insn of a
8063: LIBCALL block is not considered to be part of the block, since
8064: its destination is the result of the block and hence should be
8065: recorded. */
8066:
8067: if (find_reg_note (insn, REG_LIBCALL, NULL_RTX))
8068: in_libcall_block = 1;
8069: else if (find_reg_note (insn, REG_RETVAL, NULL_RTX))
8070: in_libcall_block = 0;
8071:
8072: cse_insn (insn, in_libcall_block);
8073: }
8074:
8075: /* If INSN is now an unconditional jump, skip to the end of our
8076: basic block by pretending that we just did the last insn in the
8077: basic block. If we are jumping to the end of our block, show
8078: that we can have one usage of TO. */
8079:
8080: if (simplejump_p (insn))
8081: {
8082: if (to == 0)
8083: return 0;
8084:
8085: if (JUMP_LABEL (insn) == to)
8086: to_usage = 1;
8087:
8088: /* Maybe TO was deleted because the jump is unconditional.
8089: If so, there is nothing left in this basic block. */
8090: /* ??? Perhaps it would be smarter to set TO
8091: to whatever follows this insn,
8092: and pretend the basic block had always ended here. */
8093: if (INSN_DELETED_P (to))
8094: break;
8095:
8096: insn = PREV_INSN (to);
8097: }
8098:
8099: /* See if it is ok to keep on going past the label
8100: which used to end our basic block. Remember that we incremented
8101: the count of that label, so we decrement it here. If we made
8102: a jump unconditional, TO_USAGE will be one; in that case, we don't
8103: want to count the use in that jump. */
8104:
8105: if (to != 0 && NEXT_INSN (insn) == to
8106: && GET_CODE (to) == CODE_LABEL && --LABEL_NUSES (to) == to_usage)
8107: {
8108: struct cse_basic_block_data val;
8109:
8110: insn = NEXT_INSN (to);
8111:
8112: if (LABEL_NUSES (to) == 0)
8113: delete_insn (to);
8114:
8115: /* Find the end of the following block. Note that we won't be
8116: following branches in this case. If TO was the last insn
8117: in the function, we are done. Similarly, if we deleted the
8118: insn after TO, it must have been because it was preceded by
8119: a BARRIER. In that case, we are done with this block because it
8120: has no continuation. */
8121:
8122: if (insn == 0 || INSN_DELETED_P (insn))
8123: return 0;
8124:
8125: to_usage = 0;
8126: val.path_size = 0;
8127: cse_end_of_basic_block (insn, &val, 0, 0, 0);
8128:
8129: /* If the tables we allocated have enough space left
8130: to handle all the SETs in the next basic block,
8131: continue through it. Otherwise, return,
8132: and that block will be scanned individually. */
8133: if (val.nsets * 2 + next_qty > max_qty)
8134: break;
8135:
8136: cse_basic_block_start = val.low_cuid;
8137: cse_basic_block_end = val.high_cuid;
8138: to = val.last;
8139:
8140: /* Prevent TO from being deleted if it is a label. */
8141: if (to != 0 && GET_CODE (to) == CODE_LABEL)
8142: ++LABEL_NUSES (to);
8143:
8144: /* Back up so we process the first insn in the extension. */
8145: insn = PREV_INSN (insn);
8146: }
8147: }
8148:
8149: if (next_qty > max_qty)
8150: abort ();
8151:
8152: /* If we are running before loop.c, we stopped on a NOTE_INSN_LOOP_END, and
8153: the previous insn is the only insn that branches to the head of a loop,
8154: we can cse into the loop. Don't do this if we changed the jump
8155: structure of a loop unless we aren't going to be following jumps. */
8156:
8157: if ((cse_jumps_altered == 0
8158: || (flag_cse_follow_jumps == 0 && flag_cse_skip_blocks == 0))
8159: && around_loop && to != 0
8160: && GET_CODE (to) == NOTE && NOTE_LINE_NUMBER (to) == NOTE_INSN_LOOP_END
8161: && GET_CODE (PREV_INSN (to)) == JUMP_INSN
8162: && JUMP_LABEL (PREV_INSN (to)) != 0
8163: && LABEL_NUSES (JUMP_LABEL (PREV_INSN (to))) == 1)
8164: cse_around_loop (JUMP_LABEL (PREV_INSN (to)));
8165:
8166: return to ? NEXT_INSN (to) : 0;
8167: }
8168:
8169: /* Count the number of times registers are used (not set) in X.
8170: COUNTS is an array in which we accumulate the count, INCR is how much
8171: we count each register usage. */
8172:
8173: static void
8174: count_reg_usage (x, counts, incr)
8175: rtx x;
8176: int *counts;
8177: int incr;
8178: {
8179: enum rtx_code code = GET_CODE (x);
8180: char *fmt;
8181: int i, j;
8182:
8183: switch (code)
8184: {
8185: case REG:
8186: counts[REGNO (x)] += incr;
8187: return;
8188:
8189: case PC:
8190: case CC0:
8191: case CONST:
8192: case CONST_INT:
8193: case CONST_DOUBLE:
8194: case SYMBOL_REF:
8195: case LABEL_REF:
8196: case CLOBBER:
8197: return;
8198:
8199: case SET:
8200: /* Unless we are setting a REG, count everything in SET_DEST. */
8201: if (GET_CODE (SET_DEST (x)) != REG)
8202: count_reg_usage (SET_DEST (x), counts, incr);
8203: count_reg_usage (SET_SRC (x), counts, incr);
8204: return;
8205:
8206: case INSN:
8207: case JUMP_INSN:
8208: case CALL_INSN:
8209: count_reg_usage (PATTERN (x), counts, incr);
8210:
8211: /* Things used in a REG_EQUAL note aren't dead since loop may try to
8212: use them. */
8213:
8214: if (REG_NOTES (x))
8215: count_reg_usage (REG_NOTES (x), counts, incr);
8216: return;
8217:
8218: case EXPR_LIST:
8219: case INSN_LIST:
8220: if (REG_NOTE_KIND (x) == REG_EQUAL)
8221: count_reg_usage (XEXP (x, 0), counts, incr);
8222: if (XEXP (x, 1))
8223: count_reg_usage (XEXP (x, 1), counts, incr);
8224: return;
8225: }
8226:
8227: fmt = GET_RTX_FORMAT (code);
8228: for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
8229: {
8230: if (fmt[i] == 'e')
8231: count_reg_usage (XEXP (x, i), counts, incr);
8232: else if (fmt[i] == 'E')
8233: for (j = XVECLEN (x, i) - 1; j >= 0; j--)
8234: count_reg_usage (XVECEXP (x, i, j), counts, incr);
8235: }
8236: }
8237:
8238: /* Scan all the insns and delete any that are dead; i.e., they store a register
8239: that is never used or they copy a register to itself.
8240:
8241: This is used to remove insns made obviously dead by cse. It improves the
8242: heuristics in loop since it won't try to move dead invariants out of loops
8243: or make givs for dead quantities. The remaining passes of the compilation
8244: are also sped up. */
8245:
8246: void
8247: delete_dead_from_cse (insns, nreg)
8248: rtx insns;
8249: int nreg;
8250: {
8251: int *counts = (int *) alloca (nreg * sizeof (int));
8252: rtx insn, prev;
8253: rtx tem;
8254: int i;
8255: int in_libcall = 0;
8256:
8257: /* First count the number of times each register is used. */
8258: bzero (counts, sizeof (int) * nreg);
8259: for (insn = next_real_insn (insns); insn; insn = next_real_insn (insn))
8260: count_reg_usage (insn, counts, 1);
8261:
8262: /* Go from the last insn to the first and delete insns that only set unused
8263: registers or copy a register to itself. As we delete an insn, remove
8264: usage counts for registers it uses. */
8265: for (insn = prev_real_insn (get_last_insn ()); insn; insn = prev)
8266: {
8267: int live_insn = 0;
8268:
8269: prev = prev_real_insn (insn);
8270:
8271: /* Don't delete any insns that are part of a libcall block.
8272: Flow or loop might get confused if we did that. Remember
8273: that we are scanning backwards. */
8274: if (find_reg_note (insn, REG_RETVAL, NULL_RTX))
8275: in_libcall = 1;
8276:
8277: if (in_libcall)
8278: live_insn = 1;
8279: else if (GET_CODE (PATTERN (insn)) == SET)
8280: {
8281: if (GET_CODE (SET_DEST (PATTERN (insn))) == REG
8282: && SET_DEST (PATTERN (insn)) == SET_SRC (PATTERN (insn)))
8283: ;
8284:
8285: #ifdef HAVE_cc0
8286: else if (GET_CODE (SET_DEST (PATTERN (insn))) == CC0
8287: && ! side_effects_p (SET_SRC (PATTERN (insn)))
8288: && ((tem = next_nonnote_insn (insn)) == 0
8289: || GET_RTX_CLASS (GET_CODE (tem)) != 'i'
8290: || ! reg_referenced_p (cc0_rtx, PATTERN (tem))))
8291: ;
8292: #endif
8293: else if (GET_CODE (SET_DEST (PATTERN (insn))) != REG
8294: || REGNO (SET_DEST (PATTERN (insn))) < FIRST_PSEUDO_REGISTER
8295: || counts[REGNO (SET_DEST (PATTERN (insn)))] != 0
8296: || side_effects_p (SET_SRC (PATTERN (insn))))
8297: live_insn = 1;
8298: }
8299: else if (GET_CODE (PATTERN (insn)) == PARALLEL)
8300: for (i = XVECLEN (PATTERN (insn), 0) - 1; i >= 0; i--)
8301: {
8302: rtx elt = XVECEXP (PATTERN (insn), 0, i);
8303:
8304: if (GET_CODE (elt) == SET)
8305: {
8306: if (GET_CODE (SET_DEST (elt)) == REG
8307: && SET_DEST (elt) == SET_SRC (elt))
8308: ;
8309:
8310: #ifdef HAVE_cc0
8311: else if (GET_CODE (SET_DEST (elt)) == CC0
8312: && ! side_effects_p (SET_SRC (elt))
8313: && ((tem = next_nonnote_insn (insn)) == 0
8314: || GET_RTX_CLASS (GET_CODE (tem)) != 'i'
8315: || ! reg_referenced_p (cc0_rtx, PATTERN (tem))))
8316: ;
8317: #endif
8318: else if (GET_CODE (SET_DEST (elt)) != REG
8319: || REGNO (SET_DEST (elt)) < FIRST_PSEUDO_REGISTER
8320: || counts[REGNO (SET_DEST (elt))] != 0
8321: || side_effects_p (SET_SRC (elt)))
8322: live_insn = 1;
8323: }
8324: else if (GET_CODE (elt) != CLOBBER && GET_CODE (elt) != USE)
8325: live_insn = 1;
8326: }
8327: else
8328: live_insn = 1;
8329:
8330: /* If this is a dead insn, delete it and show registers in it aren't
8331: being used. */
8332:
8333: if (! live_insn)
8334: {
8335: count_reg_usage (insn, counts, -1);
8336: delete_insn (insn);
8337: }
8338:
8339: if (find_reg_note (insn, REG_LIBCALL, NULL_RTX))
8340: in_libcall = 0;
8341: }
8342: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.