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