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