|
|
1.1 ! root 1: /* Common subexpression elimination for GNU compiler. ! 2: Copyright (C) 1987, 1988 Free Software Foundation, Inc. ! 3: ! 4: This file is part of GNU CC. ! 5: ! 6: GNU CC is distributed in the hope that it will be useful, ! 7: but WITHOUT ANY WARRANTY. No author or distributor ! 8: accepts responsibility to anyone for the consequences of using it ! 9: or for whether it serves any particular purpose or works at all, ! 10: unless he says so in writing. Refer to the GNU CC General Public ! 11: License for full details. ! 12: ! 13: Everyone is granted permission to copy, modify and redistribute ! 14: GNU CC, but only under the conditions described in the ! 15: GNU CC General Public License. A copy of this license is ! 16: supposed to have been given to you along with GNU CC so you ! 17: can know your rights and responsibilities. It should be in a ! 18: file named COPYING. Among other things, the copyright notice ! 19: and this notice must be preserved on all copies. */ ! 20: ! 21: ! 22: #include "config.h" ! 23: #include "rtl.h" ! 24: #include "insn-config.h" ! 25: #include "regs.h" ! 26: #include "hard-reg-set.h" ! 27: ! 28: /* The basic idea of common subexpression elimination is to go ! 29: through the code, keeping a record of expressions that would ! 30: have the same value at the current scan point, and replacing ! 31: expressions encountered with the cheapest equivalent expression. ! 32: ! 33: It is too complicated to keep track of the different possibilities ! 34: when control paths merge; so, at each label, we forget all that is ! 35: known and start fresh. This can be described as processing each ! 36: basic block separately. Note, however, that these are not quite ! 37: the same as the basic blocks found by a later pass and used for ! 38: data flow analysis and register packing. We do not need to start fresh ! 39: after a conditional jump instruction if there is no label there. ! 40: ! 41: We use two data structures to record the equivalent expressions: ! 42: a hash table for most expressions, and several vectors together ! 43: with "quantity numbers" to record equivalent (pseudo) registers. ! 44: ! 45: The use of the special data structure for registers is desirable ! 46: because it is faster. It is possible because registers references ! 47: contain a fairly small number, the register number, taken from ! 48: a contiguously allocated series, and two register references are ! 49: identical if they have the same number. General expressions ! 50: do not have any such thing, so the only way to retrieve the ! 51: information recorded on an expression other than a register ! 52: is to keep it in a hash table. ! 53: ! 54: Registers and "quantity numbers": ! 55: ! 56: At the start of each basic block, all of the (hardware and pseudo) ! 57: registers used in the function are given distinct quantity ! 58: numbers to indicate their contents. During scan, when the code ! 59: copies one register into another, we copy the quantity number. ! 60: When a register is loaded in any other way, we allocate a new ! 61: quantity number to describe the value generated by this operation. ! 62: `reg_qty' records what quantity a register is currently thought ! 63: of as containing. ! 64: ! 65: We also maintain a bidirectional chain of registers for each ! 66: quantity number. `qty_first_reg', `qty_last_reg', ! 67: `reg_next_eqv' and `reg_prev_eqv' hold these chains. ! 68: ! 69: The first register in a chain is the one whose lifespan is least local. ! 70: Among equals, it is the one that was seen first. ! 71: We replace any equivalent register with that one. ! 72: ! 73: Constants and quantity numbers ! 74: ! 75: When a quantity has a known constant value, that value is stored ! 76: in the appropriate element of qty_const. This is in addition to ! 77: putting the constant in the hash table as is usual for non-regs. ! 78: ! 79: Regs are preferred to constants as they are to everything else, ! 80: but expressions containing constants can be simplified, by fold_rtx. ! 81: ! 82: When a quantity has a known nearly constant value (such as an address ! 83: of a stack slot), that value is stored in the appropriate element ! 84: of qty_const. ! 85: ! 86: Integer constants don't have a machine mode. However, cse ! 87: determines the intended machine mode from the destination ! 88: of the instruction that moves the constant. The machine mode ! 89: is recorded in the hash table along with the actual RTL ! 90: constant expression so that different modes are kept separate. ! 91: ! 92: Other expressions: ! 93: ! 94: To record known equivalences among expressions in general ! 95: we use a hash table called `table'. It has a fixed number of buckets ! 96: that contain chains of `struct table_elt' elements for expressions. ! 97: These chains connect the elements whose expressions have the same ! 98: hash codes. ! 99: ! 100: Other chains through the same elements connect the elements which ! 101: currently have equivalent values. ! 102: ! 103: Register references in an expression are canonicalized before hashing ! 104: the expression. This is done using `reg_qty' and `qty_first_reg'. ! 105: The hash code of a register reference is computed using the quantity ! 106: number, not the register number. ! 107: ! 108: When the value of an expression changes, it is necessary to remove from the ! 109: hash table not just that expression but all expressions whose values ! 110: could be different as a result. ! 111: ! 112: 1. If the value changing is in memory, except in special cases ! 113: ANYTHING referring to memory could be changed. That is because ! 114: nobody knows where a pointer does not point. ! 115: The function `invalidate_memory' removes what is necessary. ! 116: ! 117: The special cases are when the address is constant or is ! 118: a constant plus a fixed register such as the frame pointer ! 119: or a static chain pointer. When such addresses are stored in, ! 120: we can tell exactly which other such addresses must be invalidated ! 121: due to overlap. `invalidate' does this. ! 122: All expressions that refer to non-constant ! 123: memory addresses are also invalidated. `invalidate_memory' does this. ! 124: ! 125: 2. If the value changing is a register, all expressions ! 126: containing references to that register, and only those, ! 127: must be removed. ! 128: ! 129: Because searching the entire hash table for expressions that contain ! 130: a register is very slow, we try to figure out when it isn't necessary. ! 131: Precisely, this is necessary only when expressions have been ! 132: entered in the hash table using this register, and then the value has ! 133: changed, and then another expression wants to be added to refer to ! 134: teh register's new value. This sequence of circumstances is rare ! 135: within any one basic block. ! 136: ! 137: The vectors `reg_tick' and `reg_in_table' are used to detect this case. ! 138: reg_tick[i] is incremented whenever a value is stored in register i. ! 139: reg_in_table[i] holds -1 if no references to register i have been ! 140: entered in the table; otherwise, it contains the value reg_tick[i] had ! 141: when the references were entered. If we want to enter a reference ! 142: and reg_in_table[i] != reg_tick[i], we must scan and remove old references. ! 143: Until we want to enter a new entry, the mere fact that the twovectors ! 144: don't match makes the entries be ignored if anyone tries to match them. ! 145: ! 146: Registers themselves are entered in the hash table as well as in ! 147: the equivalent-register chains. However, the vectors `reg_tick' ! 148: and `reg_in_table' do not apply to expressions which are simple ! 149: register references. These expressions are removed from the table ! 150: immediately when they become invalid, and this can be done even if ! 151: we do not immediately search for all the expressions that refer to ! 152: the register. ! 153: ! 154: A CLOBBER rtx in an instruction invalidates its operand for further ! 155: reuse. A CLOBBER or SET rtx whose operand is a MEM:BLK ! 156: invalidates everything that resides in memory. ! 157: ! 158: Related expressions: ! 159: ! 160: Constant expressions that differ only by an additive integer ! 161: are called related. When a constant expression is put in ! 162: the table, the related expression with no constant term ! 163: is also entered. These are made to point at each other ! 164: so that it is possible to find out if there exists any ! 165: register equivalent to an expression related to a given expression. */ ! 166: ! 167: /* One plus largest register number used in this function. */ ! 168: ! 169: static int max_reg; ! 170: ! 171: /* Length of vectors indexed by quantity number. ! 172: We know in advance we will not need a quantity number this big. */ ! 173: ! 174: static int max_qty; ! 175: ! 176: /* Next quantity number to be allocated. ! 177: This is 1 + the largest number needed so far. */ ! 178: ! 179: static int next_qty; ! 180: ! 181: /* Indexed by quantity number, gives the first (or last) (pseudo) register ! 182: in the chain of registers that currently contain this quantity. */ ! 183: ! 184: static int *qty_first_reg; ! 185: static int *qty_last_reg; ! 186: ! 187: /* Indexed by quantity number, gives the rtx of the constant value of the ! 188: quantity, or zero if it does not have a known value. ! 189: A sum of the frame pointer (or arg pointer) plus a constant ! 190: can also be entered here. */ ! 191: ! 192: static rtx *qty_const; ! 193: ! 194: /* Indexed by qty number, gives the insn that stored the constant value ! 195: recorded in `qty_const'. */ ! 196: ! 197: static rtx *qty_const_insn; ! 198: ! 199: /* Value stored in CC0 by previous insn: ! 200: 0 if previous insn didn't store in CC0. ! 201: else 0100 + (M&7)<<3 + (N&7) ! 202: where M is 1, 0 or -1 if result was >, == or < as signed number ! 203: and N is 1, 0 or -1 if result was >, == or < as unsigned number. ! 204: 0200 bit may also be set, meaning that only == and != comparisons ! 205: have known results. */ ! 206: ! 207: static int prev_insn_cc0; ! 208: ! 209: /* Previous actual insn. 0 if at first insn of basic block. */ ! 210: ! 211: static rtx prev_insn; ! 212: ! 213: /* Insn being scanned. */ ! 214: ! 215: static rtx this_insn; ! 216: ! 217: /* Index by (pseudo) register number, gives the quantity number ! 218: of the register's current contents. */ ! 219: ! 220: static int *reg_qty; ! 221: ! 222: /* Index by (pseudo) register number, gives the number of the next ! 223: (pseudo) register in the chain of registers sharing the same value. ! 224: Or -1 if this register is at the end of the chain. */ ! 225: ! 226: static int *reg_next_eqv; ! 227: ! 228: /* Index by (pseudo) register number, gives the number of the previous ! 229: (pseudo) register in the chain of registers sharing the same value. ! 230: Or -1 if this register is at the beginning of the chain. */ ! 231: ! 232: static int *reg_prev_eqv; ! 233: ! 234: /* Index by (pseudo) register number, gives the latest rtx ! 235: to use to insert a ref to that register. */ ! 236: ! 237: static rtx *reg_rtx; ! 238: ! 239: /* Index by (pseudo) register number, gives the number of times ! 240: that register has been altered in the current basic block. */ ! 241: ! 242: static int *reg_tick; ! 243: ! 244: /* Index by (pseudo) register number, gives the reg_tick value at which ! 245: rtx's containing this register are valid in the hash table. ! 246: If this does not equal the current reg_tick value, such expressions ! 247: existing in the hash table are invalid. ! 248: If this is -1, no expressions containing this register have been ! 249: entered in the table. */ ! 250: ! 251: static int *reg_in_table; ! 252: ! 253: /* Two vectors of max_reg ints: ! 254: one containing all -1's; in the other, element i contains i. ! 255: These are used to initialize various other vectors fast. */ ! 256: ! 257: static int *all_minus_one; ! 258: static int *consec_ints; ! 259: ! 260: /* UID of insn that starts the basic block currently being cse-processed. */ ! 261: ! 262: static int cse_basic_block_start; ! 263: ! 264: /* UID of insn that ends the basic block currently being cse-processed. */ ! 265: ! 266: static int cse_basic_block_end; ! 267: ! 268: /* Nonzero if cse has altered conditional jump insns ! 269: in such a way that jump optimization should be redone. */ ! 270: ! 271: static int cse_jumps_altered; ! 272: ! 273: /* canon_hash stores 1 in do_not_record ! 274: if it notices a reference to CC0, CC1 or PC. */ ! 275: ! 276: static int do_not_record; ! 277: ! 278: /* canon_hash stores 1 in hash_arg_in_memory ! 279: if it notices a reference to memory within the expression being hashed. */ ! 280: ! 281: static int hash_arg_in_memory; ! 282: ! 283: /* canon_hash stores 1 in hash_arg_in_struct ! 284: if it notices a reference to memory that's part of a structure. */ ! 285: ! 286: static int hash_arg_in_struct; ! 287: ! 288: /* The hash table contains buckets which are chains of `struct table_elt's, ! 289: each recording one expression's information. ! 290: That expression is in the `exp' field. ! 291: ! 292: Those elements with the same hash code are chained in both directions ! 293: through the `next_same_hash' and `prev_same_hash' fields. ! 294: ! 295: Each set of expressions with equivalent values ! 296: are on a two-way chain through the `next_same_value' ! 297: and `prev_same_value' fields, and all point with ! 298: the `first_same_value' field at the first element in ! 299: that chain. The chain is in order of increasing cost. ! 300: Each element's cost value is in its `cost' field. ! 301: ! 302: The `in_memory' field is nonzero for elements that ! 303: involve any reference to memory. These elements are removed ! 304: whenever a write is done to an unidentified location in memory. ! 305: To be safe, we assume that a memory address is unidentified unless ! 306: the address is either a symbol constant or a constant plus ! 307: the frame pointer or argument pointer. ! 308: ! 309: The `in_struct' field is nonzero for elements that ! 310: involve any reference to memory inside a structure or array. ! 311: ! 312: The `equivalence_only' field means that this expression came from a ! 313: REG_EQUIV or REG_EQUAL note; it is not valid for substitution into an insn. ! 314: ! 315: The `related_value' field is used to connect related expressions ! 316: (that differ by adding an integer). ! 317: The related expressions are chained in a circular fashion. ! 318: `related_value' is zero for expressions for which this ! 319: chain is not useful. ! 320: ! 321: The `mode' field is usually the same as GET_MODE (`exp'), but ! 322: if `exp' is a CONST_INT and has no machine mode then the `mode' ! 323: field is the mode it was being used as. Each constant is ! 324: recorded separately for each mode it is used with. */ ! 325: ! 326: ! 327: struct table_elt ! 328: { ! 329: rtx exp; ! 330: struct table_elt *next_same_hash; ! 331: struct table_elt *prev_same_hash; ! 332: struct table_elt *next_same_value; ! 333: struct table_elt *prev_same_value; ! 334: struct table_elt *first_same_value; ! 335: struct table_elt *related_value; ! 336: int cost; ! 337: enum machine_mode mode; ! 338: char in_memory; ! 339: char in_struct; ! 340: char equivalence_only; ! 341: }; ! 342: ! 343: #define HASH(x, m) (canon_hash (x, m) % NBUCKETS) ! 344: /* We don't want a lot of buckets, because we rarely have very many ! 345: things stored in the hash table, and a lot of buckets slows ! 346: down a lot of loops that happen frequently. */ ! 347: #define NBUCKETS 31 ! 348: ! 349: static struct table_elt *table[NBUCKETS]; ! 350: ! 351: /* Chain of `struct table_elt's made so far for this function ! 352: but currently removed from the table. */ ! 353: ! 354: static struct table_elt *free_element_chain; ! 355: ! 356: /* Number of `struct table_elt' structures made so far for this function. */ ! 357: ! 358: static int n_elements_made; ! 359: ! 360: /* Maximum value `n_elements_made' has had so far in this compilation ! 361: for functions previously processed. */ ! 362: ! 363: static int max_elements_made; ! 364: ! 365: /* Bits describing what kind of values in memory must be invalidated ! 366: for a particular instruction. If all three bits are zero, ! 367: no memory refs need to be invalidated. Each bit is more powerful ! 368: than the preceding ones, and if a bit is set then the preceding ! 369: bits are also set. ! 370: ! 371: Here is how the bits are set. ! 372: Writing at a fixed address invalidates only variable addresses, ! 373: writing in a structure element at variable address ! 374: invalidates all but scalar variables, ! 375: and writing in anything else at variable address invalidates everything. */ ! 376: ! 377: struct write_data ! 378: { ! 379: int var : 1; /* Invalidate variable addresses. */ ! 380: int nonscalar : 1; /* Invalidate all but scalar variables. */ ! 381: int all : 1; /* Invalidate all memory refs. */ ! 382: }; ! 383: ! 384: /* Nonzero if X has the form (PLUS frame-pointer integer). */ ! 385: ! 386: #define FIXED_BASE_PLUS_P(X) \ ! 387: (GET_CODE (X) == PLUS && GET_CODE (XEXP (X, 1)) == CONST_INT \ ! 388: && (XEXP (X, 0) == frame_pointer_rtx || XEXP (X, 0) == arg_pointer_rtx)) ! 389: ! 390: static struct table_elt *lookup (); ! 391: static void free_element (); ! 392: ! 393: static void remove_invalid_refs (); ! 394: static int exp_equiv_p (); ! 395: int refers_to_p (); ! 396: int refers_to_mem_p (); ! 397: static void invalidate_from_clobbers (); ! 398: static int safe_hash (); ! 399: static int get_integer_term (); ! 400: static rtx get_related_value (); ! 401: static void note_mem_written (); ! 402: static int cse_rtx_addr_varies_p (); ! 403: ! 404: /* Return an estimate of the cost of computing rtx X. ! 405: The only use of this is to compare the costs of two expressions ! 406: to decide whether to replace one with the other. */ ! 407: ! 408: static int ! 409: rtx_cost (x) ! 410: rtx x; ! 411: { ! 412: register int i, j; ! 413: register RTX_CODE code = GET_CODE (x); ! 414: register char *fmt; ! 415: register int total; ! 416: ! 417: switch (code) ! 418: { ! 419: case REG: ! 420: return 1; ! 421: case SUBREG: ! 422: return 2; ! 423: CONST_COSTS (x, code); ! 424: } ! 425: ! 426: total = 2; ! 427: ! 428: /* Sum the costs of the sub-rtx's, plus 2 just put in. */ ! 429: ! 430: fmt = GET_RTX_FORMAT (code); ! 431: for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) ! 432: if (fmt[i] == 'e') ! 433: total += rtx_cost (XEXP (x, i)); ! 434: else if (fmt[i] == 'E') ! 435: for (j = 0; j < XVECLEN (x, i); j++) ! 436: total += rtx_cost (XVECEXP (x, i, j)); ! 437: ! 438: return total; ! 439: } ! 440: ! 441: /* Clear the hash table and initialize each register with its own quantity, ! 442: for a new basic block. */ ! 443: ! 444: static void ! 445: new_basic_block () ! 446: { ! 447: register int i; ! 448: register int vecsize = max_reg * sizeof (rtx); ! 449: next_qty = max_reg; ! 450: ! 451: bzero (reg_rtx, vecsize); ! 452: bzero (reg_tick, vecsize); ! 453: ! 454: bcopy (all_minus_one, reg_in_table, vecsize); ! 455: bcopy (all_minus_one, reg_next_eqv, vecsize); ! 456: bcopy (all_minus_one, reg_prev_eqv, vecsize); ! 457: bcopy (consec_ints, reg_qty, vecsize); ! 458: ! 459: for (i = 0; i < max_qty; i++) ! 460: { ! 461: qty_first_reg[i] = i; ! 462: qty_last_reg[i] = i; ! 463: qty_const[i] = 0; ! 464: qty_const_insn[i] = 0; ! 465: } ! 466: ! 467: for (i = 0; i < NBUCKETS; i++) ! 468: { ! 469: register struct table_elt *this, *next; ! 470: for (this = table[i]; this; this = next) ! 471: { ! 472: next = this->next_same_hash; ! 473: free_element (this); ! 474: } ! 475: } ! 476: ! 477: bzero (table, sizeof table); ! 478: ! 479: prev_insn_cc0 = 0; ! 480: prev_insn = 0; ! 481: } ! 482: ! 483: /* Say that register REG contains a quantity not in any register before. */ ! 484: ! 485: static void ! 486: make_new_qty (reg) ! 487: register int reg; ! 488: { ! 489: register int q; ! 490: ! 491: q = reg_qty[reg] = next_qty++; ! 492: qty_first_reg[q] = reg; ! 493: qty_last_reg[q] = reg; ! 494: } ! 495: ! 496: /* Make reg NEW equivalent to reg OLD. ! 497: OLD is not changing; NEW is. */ ! 498: ! 499: static void ! 500: make_regs_eqv (new, old) ! 501: register int new, old; ! 502: { ! 503: register int lastr, firstr; ! 504: register int q = reg_qty[old]; ! 505: ! 506: /* Nothing should become eqv until it has a "non-invalid" qty number. */ ! 507: if (q == old) ! 508: abort (); ! 509: ! 510: reg_qty[new] = q; ! 511: firstr = qty_first_reg[q]; ! 512: lastr = qty_last_reg[q]; ! 513: ! 514: /* Prefer pseudo regs to hard regs with the same value. ! 515: Among pseudos, if NEW will live longer than any other reg of the same qty, ! 516: and that is beyond the current basic block, ! 517: make it the new canonical replacement for this qty. */ ! 518: if (new >= FIRST_PSEUDO_REGISTER ! 519: && (firstr < FIRST_PSEUDO_REGISTER ! 520: || ((regno_last_uid[new] > cse_basic_block_end ! 521: || regno_first_uid[new] < cse_basic_block_start) ! 522: && regno_last_uid[new] > regno_last_uid[firstr]))) ! 523: { ! 524: reg_prev_eqv[firstr] = new; ! 525: reg_next_eqv[new] = firstr; ! 526: reg_prev_eqv[new] = -1; ! 527: qty_first_reg[q] = new; ! 528: } ! 529: else ! 530: { ! 531: /* If NEW is a hard reg, insert at end. ! 532: Otherwise, insert before any hard regs that are at the end. */ ! 533: while (lastr < FIRST_PSEUDO_REGISTER && new >= FIRST_PSEUDO_REGISTER) ! 534: lastr = reg_prev_eqv[lastr]; ! 535: reg_next_eqv[new] = reg_next_eqv[lastr]; ! 536: if (reg_next_eqv[lastr] >= 0) ! 537: reg_prev_eqv[reg_next_eqv[lastr]] = new; ! 538: else ! 539: qty_last_reg[q] = new; ! 540: reg_next_eqv[lastr] = new; ! 541: reg_prev_eqv[new] = lastr; ! 542: } ! 543: } ! 544: ! 545: /* Discard the records of what is in register REG. */ ! 546: ! 547: static void ! 548: reg_invalidate (reg) ! 549: register int reg; ! 550: { ! 551: register int n = reg_next_eqv[reg]; ! 552: register int p = reg_prev_eqv[reg]; ! 553: register int q = reg_qty[reg]; ! 554: ! 555: reg_tick[reg]++; ! 556: ! 557: if (q == reg) ! 558: { ! 559: /* Save time if already invalid */ ! 560: /* It shouldn't be linked to anything if it's invalid. */ ! 561: if (reg_prev_eqv[q] != -1) ! 562: abort (); ! 563: if (reg_next_eqv[q] != -1) ! 564: abort (); ! 565: return; ! 566: } ! 567: ! 568: if (n != -1) ! 569: reg_prev_eqv[n] = p; ! 570: else ! 571: qty_last_reg[q] = p; ! 572: if (p != -1) ! 573: reg_next_eqv[p] = n; ! 574: else ! 575: qty_first_reg[q] = n; ! 576: ! 577: reg_qty[reg] = reg; ! 578: qty_first_reg[reg] = reg; ! 579: qty_last_reg[reg] = reg; ! 580: reg_next_eqv[reg] = -1; ! 581: reg_prev_eqv[reg] = -1; ! 582: } ! 583: ! 584: /* Remove any invalid expressions from the hash table ! 585: that refer to any of the registers contained in expression X. ! 586: ! 587: Make sure that newly inserted references to those registers ! 588: as subexpressions will be considered valid. ! 589: ! 590: mention_regs is not called when a register itself ! 591: is being stored in the table. */ ! 592: ! 593: static void ! 594: mention_regs (x) ! 595: rtx x; ! 596: { ! 597: register RTX_CODE code = GET_CODE (x); ! 598: register int i, j; ! 599: register char *fmt; ! 600: ! 601: if (code == REG) ! 602: { ! 603: register int regno = REGNO (x); ! 604: reg_rtx[regno] = x; ! 605: ! 606: if (reg_in_table[regno] >= 0 && reg_in_table[regno] != reg_tick[regno]) ! 607: remove_invalid_refs (regno); ! 608: ! 609: reg_in_table[regno] = reg_tick[regno]; ! 610: ! 611: return; ! 612: } ! 613: ! 614: fmt = GET_RTX_FORMAT (code); ! 615: for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) ! 616: if (fmt[i] == 'e') ! 617: mention_regs (XEXP (x, i)); ! 618: else if (fmt[i] == 'E') ! 619: for (j = 0; j < XVECLEN (x, i); j++) ! 620: mention_regs (XVECEXP (x, i, j)); ! 621: } ! 622: ! 623: /* Update the register quantities for inserting X into the hash table ! 624: with a value equivalent to CLASSP. ! 625: (If CLASSP is not a REG or a SUBREG, it is irrelevant.) ! 626: If MODIFIED is nonzero, X is a destination; it is being modified. ! 627: Note that reg_invalidate should be called on a register ! 628: before insert_regs is done on that register with MODIFIED != 0. ! 629: ! 630: Nonzero value means that elements of reg_qty have changed ! 631: so X's hash code may be different. */ ! 632: ! 633: static int ! 634: insert_regs (x, classp, modified) ! 635: rtx x; ! 636: struct table_elt *classp; ! 637: int modified; ! 638: { ! 639: if (GET_CODE (x) == REG) ! 640: { ! 641: register int regno = REGNO (x); ! 642: reg_rtx[regno] = x; ! 643: if (modified || reg_qty[regno] == regno) ! 644: { ! 645: if (classp && GET_CODE (classp->exp) == REG) ! 646: { ! 647: make_regs_eqv (regno, REGNO (classp->exp)); ! 648: /* Make sure reg_rtx is set up even for regs ! 649: not explicitly set (such as function value). */ ! 650: reg_rtx[REGNO (classp->exp)] = classp->exp; ! 651: } ! 652: else ! 653: make_new_qty (regno); ! 654: return 1; ! 655: } ! 656: } ! 657: /* Copying a subreg into a subreg makes the regs equivalent, ! 658: but only if the entire regs' mode is within one word. ! 659: Copying one reg of a DImode into one reg of another DImode ! 660: does not make them equivalent. */ ! 661: else if (GET_CODE (x) == SUBREG ! 662: && GET_CODE (SUBREG_REG (x)) == REG ! 663: && GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))) <= BITS_PER_WORD ! 664: && (modified ! 665: || reg_qty[REGNO (SUBREG_REG (x))] == REGNO (SUBREG_REG (x)))) ! 666: { ! 667: if (classp && GET_CODE (classp->exp) == SUBREG ! 668: && GET_CODE (SUBREG_REG (classp->exp)) == REG ! 669: && GET_MODE (SUBREG_REG (classp->exp)) == GET_MODE (SUBREG_REG (x))) ! 670: { ! 671: int oregno = REGNO (SUBREG_REG (classp->exp)); ! 672: make_regs_eqv (REGNO (SUBREG_REG (x)), oregno); ! 673: /* Make sure reg_rtx is set up even for regs ! 674: not explicitly set (such as function value). */ ! 675: reg_rtx[oregno] = SUBREG_REG (classp->exp); ! 676: } ! 677: else ! 678: make_new_qty (REGNO (SUBREG_REG (x))); ! 679: return 1; ! 680: } ! 681: else ! 682: mention_regs (x); ! 683: return 0; ! 684: } ! 685: ! 686: /* Look in or update the hash table. */ ! 687: ! 688: /* Put the element ELT on the list of free elements. */ ! 689: ! 690: static void ! 691: free_element (elt) ! 692: struct table_elt *elt; ! 693: { ! 694: elt->next_same_hash = free_element_chain; ! 695: free_element_chain = elt; ! 696: } ! 697: ! 698: /* Return an element that is free for use. */ ! 699: ! 700: static struct table_elt * ! 701: get_element () ! 702: { ! 703: struct table_elt *elt = free_element_chain; ! 704: if (elt) ! 705: { ! 706: free_element_chain = elt->next_same_hash; ! 707: return elt; ! 708: } ! 709: n_elements_made++; ! 710: return (struct table_elt *) oballoc (sizeof (struct table_elt)); ! 711: } ! 712: ! 713: /* Remove table element ELT from use in the table. ! 714: HASH is its hash code, made using the HASH macro. ! 715: It's an argument because often that is known in advance ! 716: and we save much time not recomputing it. */ ! 717: ! 718: static void ! 719: remove (elt, hash) ! 720: register struct table_elt *elt; ! 721: int hash; ! 722: { ! 723: if (elt == 0) ! 724: return; ! 725: ! 726: /* Mark this element as removed. See cse_insn. */ ! 727: elt->first_same_value = 0; ! 728: ! 729: /* Remove the table element from its equivalence class. */ ! 730: ! 731: { ! 732: register struct table_elt *prev = elt->prev_same_value; ! 733: register struct table_elt *next = elt->next_same_value; ! 734: ! 735: if (next) next->prev_same_value = prev; ! 736: ! 737: if (prev) ! 738: prev->next_same_value = next; ! 739: else ! 740: { ! 741: register struct table_elt *newfirst = next; ! 742: while (next) ! 743: { ! 744: next->first_same_value = newfirst; ! 745: next = next->next_same_value; ! 746: } ! 747: } ! 748: } ! 749: ! 750: /* Remove the table element from its hash bucket. */ ! 751: ! 752: { ! 753: register struct table_elt *prev = elt->prev_same_hash; ! 754: register struct table_elt *next = elt->next_same_hash; ! 755: ! 756: if (next) next->prev_same_hash = prev; ! 757: ! 758: if (prev) ! 759: prev->next_same_hash = next; ! 760: else ! 761: table[hash] = next; ! 762: } ! 763: ! 764: /* Remove the table element from its related-value circular chain. */ ! 765: ! 766: if (elt->related_value != 0 && elt->related_value != elt) ! 767: { ! 768: register struct table_elt *p = elt->related_value; ! 769: while (p->related_value != elt) ! 770: p = p->related_value; ! 771: p->related_value = elt->related_value; ! 772: if (p->related_value == p) ! 773: p->related_value = 0; ! 774: } ! 775: ! 776: free_element (elt); ! 777: } ! 778: ! 779: /* Look up X in the hash table and return its table element, ! 780: or 0 if X is not in the table. ! 781: ! 782: MODE is the machine-mode of X, or if X is an integer constant ! 783: with VOIDmode then MODE is the mode with which X will be used. ! 784: ! 785: Here we are satisfied to find an expression whose tree structure ! 786: looks like X. */ ! 787: ! 788: static struct table_elt * ! 789: lookup (x, hash, mode) ! 790: rtx x; ! 791: int hash; ! 792: enum machine_mode mode; ! 793: { ! 794: register struct table_elt *p; ! 795: ! 796: for (p = table[hash]; p; p = p->next_same_hash) ! 797: if (mode == p->mode && (x == p->exp || exp_equiv_p (x, p->exp, 1))) ! 798: return p; ! 799: ! 800: return 0; ! 801: } ! 802: ! 803: /* Like `lookup' but don't care whether the table element uses invalid regs. ! 804: Also ignore discrepancies in the machine mode of a register. */ ! 805: ! 806: static struct table_elt * ! 807: lookup_for_remove (x, hash, mode) ! 808: rtx x; ! 809: int hash; ! 810: enum machine_mode mode; ! 811: { ! 812: register struct table_elt *p; ! 813: ! 814: if (GET_CODE (x) == REG) ! 815: { ! 816: int regno = REGNO (x); ! 817: /* Don't check the machine mode when comparing registers; ! 818: invalidating (REG:SI 0) also invalidates (REG:DF 0). */ ! 819: for (p = table[hash]; p; p = p->next_same_hash) ! 820: if (GET_CODE (p->exp) == REG ! 821: && REGNO (p->exp) == regno) ! 822: return p; ! 823: } ! 824: else ! 825: { ! 826: for (p = table[hash]; p; p = p->next_same_hash) ! 827: if (mode == p->mode && (x == p->exp || exp_equiv_p (x, p->exp, 0))) ! 828: return p; ! 829: } ! 830: ! 831: return 0; ! 832: } ! 833: ! 834: /* Look for an expression equivalent to X and of the form (CODE Y). ! 835: If one is found, return Y. */ ! 836: ! 837: static rtx ! 838: lookup_as_function (x, code) ! 839: rtx x; ! 840: enum rtx_code code; ! 841: { ! 842: register struct table_elt *p = lookup (x, safe_hash (x, 0) % NBUCKETS, ! 843: GET_MODE (x)); ! 844: if (p == 0) ! 845: return 0; ! 846: ! 847: for (p = p->first_same_value; p; p = p->next_same_value) ! 848: { ! 849: if (GET_CODE (p->exp) == code ! 850: /* Make sure this is a valid entry in the table. */ ! 851: && (exp_equiv_p (XEXP (p->exp, 0), XEXP (p->exp, 0)))) ! 852: return XEXP (p->exp, 0); ! 853: } ! 854: ! 855: return 0; ! 856: } ! 857: ! 858: /* Insert X in the hash table, assuming HASH is its hash code ! 859: and CLASSP is the current first element of the class it should go in ! 860: (or 0 if a new class should be made). ! 861: It is inserted at the proper position to keep the class in ! 862: the order cheapest first. ! 863: ! 864: MODE is the machine-mode of X, or if X is an integer constant ! 865: with VOIDmode then MODE is the mode with which X will be used. ! 866: ! 867: For elements of equal cheapness, the most recent one ! 868: goes in front, except that the first element in the list ! 869: remains first unless a cheaper element is added. ! 870: ! 871: The in_memory field in the hash table element is set to 0. ! 872: The caller must set it nonzero if appropriate. ! 873: ! 874: You should call insert_regs (X, CLASSP, MODIFY) before calling here, ! 875: and if insert_regs returns a nonzero value ! 876: you must then recompute its hash code before calling here. ! 877: ! 878: If necessary, update table showing constant values of quantities. */ ! 879: ! 880: #define CHEAPER(X,Y) \ ! 881: (((X)->cost < (Y)->cost) || \ ! 882: (GET_CODE ((X)->exp) == REG && GET_CODE ((Y)->exp) == REG \ ! 883: && (regno_last_uid[REGNO ((X)->exp)] > cse_basic_block_end \ ! 884: || regno_first_uid[REGNO ((X)->exp)] < cse_basic_block_start) \ ! 885: && (regno_last_uid[REGNO ((X)->exp)] \ ! 886: > regno_last_uid[REGNO ((Y)->exp)]))) ! 887: ! 888: static struct table_elt * ! 889: insert (x, classp, hash, mode) ! 890: register rtx x; ! 891: register struct table_elt *classp; ! 892: int hash; ! 893: enum machine_mode mode; ! 894: { ! 895: register struct table_elt *elt; ! 896: ! 897: /* Put an element for X into the right hash bucket. */ ! 898: ! 899: elt = get_element (); ! 900: elt->exp = x; ! 901: elt->cost = rtx_cost (x) * 2; ! 902: /* Make pseudo regs a little cheaper than hard regs. */ ! 903: if (GET_CODE (x) == REG && REGNO (x) >= FIRST_PSEUDO_REGISTER) ! 904: elt->cost -= 1; ! 905: elt->next_same_value = 0; ! 906: elt->prev_same_value = 0; ! 907: elt->next_same_hash = table[hash]; ! 908: elt->prev_same_hash = 0; ! 909: elt->related_value = 0; ! 910: elt->in_memory = 0; ! 911: elt->equivalence_only = 0; ! 912: elt->mode = mode; ! 913: if (table[hash]) ! 914: table[hash]->prev_same_hash = elt; ! 915: table[hash] = elt; ! 916: ! 917: /* Put it into the proper value-class. */ ! 918: if (classp) ! 919: { ! 920: if (CHEAPER (elt, classp)) ! 921: /** Insert at the head of the class */ ! 922: { ! 923: register struct table_elt *p; ! 924: elt->next_same_value = classp; ! 925: classp->prev_same_value = elt; ! 926: elt->first_same_value = elt; ! 927: ! 928: for (p = classp; p; p = p->next_same_value) ! 929: p->first_same_value = elt; ! 930: } ! 931: else ! 932: { ! 933: /* Insert not at head of the class. */ ! 934: /* Put it after the last element cheaper than X. */ ! 935: register struct table_elt *p, *next; ! 936: for (p = classp; (next = p->next_same_value) && CHEAPER (p, elt); ! 937: p = next); ! 938: elt->next_same_value = next; ! 939: if (next) ! 940: next->prev_same_value = elt; ! 941: elt->prev_same_value = p; ! 942: p->next_same_value = elt; ! 943: elt->first_same_value = classp; ! 944: } ! 945: } ! 946: else ! 947: elt->first_same_value = elt; ! 948: ! 949: if ((CONSTANT_P (x) || FIXED_BASE_PLUS_P (x)) ! 950: && GET_CODE (elt->first_same_value->exp) == REG) ! 951: { ! 952: qty_const[reg_qty[REGNO (elt->first_same_value->exp)]] = x; ! 953: qty_const_insn[reg_qty[REGNO (elt->first_same_value->exp)]] = this_insn; ! 954: } ! 955: ! 956: if (GET_CODE (x) == REG) ! 957: { ! 958: if (elt->next_same_value != 0 ! 959: && (CONSTANT_P (elt->next_same_value->exp) ! 960: || FIXED_BASE_PLUS_P (elt->next_same_value->exp))) ! 961: { ! 962: qty_const[reg_qty[REGNO (x)]] = elt->next_same_value->exp; ! 963: qty_const_insn[reg_qty[REGNO (x)]] = this_insn; ! 964: } ! 965: if (CONSTANT_P (elt->first_same_value->exp) ! 966: || FIXED_BASE_PLUS_P (elt->first_same_value->exp)) ! 967: { ! 968: qty_const[reg_qty[REGNO (x)]] = elt->first_same_value->exp; ! 969: qty_const_insn[reg_qty[REGNO (x)]] = this_insn; ! 970: } ! 971: } ! 972: ! 973: /* If this is a constant with symbolic value, ! 974: and it has a term with an explicit integer value, ! 975: link it up with related expressions. */ ! 976: if (GET_CODE (x) == CONST) ! 977: { ! 978: rtx subexp = get_related_value (x); ! 979: int subhash; ! 980: struct table_elt *subelt, *subelt_prev; ! 981: ! 982: if (subexp != 0) ! 983: { ! 984: /* Get the integer-free subexpression in the hash table. */ ! 985: subhash = safe_hash (subexp, mode) % NBUCKETS; ! 986: subelt = lookup (subexp, subhash, mode); ! 987: if (subelt == 0) ! 988: subelt = insert (subexp, 0, subhash, mode); ! 989: /* Initialize SUBELT's circular chain if it has none. */ ! 990: if (subelt->related_value == 0) ! 991: subelt->related_value = subelt; ! 992: /* Find the element in the circular chain that precedes SUBELT. */ ! 993: subelt_prev = subelt; ! 994: while (subelt_prev->related_value != subelt) ! 995: subelt_prev = subelt_prev->related_value; ! 996: /* Put new ELT into SUBELT's circular chain just before SUBELT. ! 997: This way the element that follows SUBELT is the oldest one. */ ! 998: elt->related_value = subelt_prev->related_value; ! 999: subelt_prev->related_value = elt; ! 1000: } ! 1001: } ! 1002: ! 1003: return elt; ! 1004: } ! 1005: ! 1006: /* Remove from the hash table, or mark as invalid, ! 1007: all expressions whose values could be altered by storing in X. ! 1008: X is a register, a subreg, or a memory reference with nonvarying address ! 1009: (because, when a memory reference with a varying address is stored in, ! 1010: all memory references are removed by invalidate_memory ! 1011: so specific invalidation is superfluous). ! 1012: ! 1013: A nonvarying address may be just a register or just ! 1014: a symbol reference, or it may be either of those plus ! 1015: a numeric offset. */ ! 1016: ! 1017: static void ! 1018: invalidate (x) ! 1019: rtx x; ! 1020: { ! 1021: register int i; ! 1022: register struct table_elt *p; ! 1023: register rtx base; ! 1024: register int start, end; ! 1025: ! 1026: /* If X is a register, dependencies on its contents ! 1027: are recorded through the qty number mechanism. ! 1028: Just change the qty number of the register, ! 1029: mark it as invalid for expressions that refer to it, ! 1030: and remove it itself. */ ! 1031: ! 1032: if (GET_CODE (x) == REG) ! 1033: { ! 1034: register int hash = HASH (x, 0); ! 1035: reg_invalidate (REGNO (x)); ! 1036: remove (lookup_for_remove (x, hash, GET_MODE (x)), hash); ! 1037: return; ! 1038: } ! 1039: ! 1040: if (GET_CODE (x) == SUBREG) ! 1041: { ! 1042: if (GET_CODE (SUBREG_REG (x)) != REG) ! 1043: abort (); ! 1044: invalidate (SUBREG_REG (x)); ! 1045: return; ! 1046: } ! 1047: ! 1048: /* X is not a register; it must be a memory reference with ! 1049: a nonvarying address. Remove all hash table elements ! 1050: that refer to overlapping pieces of memory. */ ! 1051: ! 1052: if (GET_CODE (x) != MEM) ! 1053: abort (); ! 1054: base = XEXP (x, 0); ! 1055: start = 0; ! 1056: ! 1057: /* Registers with nonvarying addresses usually have constant equivalents; ! 1058: but the frame pointer register is also possible. */ ! 1059: if (GET_CODE (base) == REG ! 1060: && qty_const[reg_qty[REGNO (base)]] != 0) ! 1061: base = qty_const[reg_qty[REGNO (base)]]; ! 1062: ! 1063: if (GET_CODE (base) == CONST) ! 1064: base = XEXP (base, 0); ! 1065: if (GET_CODE (base) == PLUS ! 1066: && GET_CODE (XEXP (base, 1)) == CONST_INT) ! 1067: { ! 1068: start = INTVAL (XEXP (base, 1)); ! 1069: base = XEXP (base, 0); ! 1070: } ! 1071: ! 1072: end = start + GET_MODE_SIZE (GET_MODE (x)); ! 1073: for (i = 0; i < NBUCKETS; i++) ! 1074: { ! 1075: register struct table_elt *next; ! 1076: for (p = table[i]; p; p = next) ! 1077: { ! 1078: next = p->next_same_hash; ! 1079: if (refers_to_mem_p (p->exp, base, start, end)) ! 1080: remove (p, i); ! 1081: } ! 1082: } ! 1083: } ! 1084: ! 1085: /* Remove all expressions that refer to register REGNO, ! 1086: since they are already invalid, and we are about to ! 1087: mark that register valid again and don't want the old ! 1088: expressions to reappear as valid. */ ! 1089: ! 1090: static void ! 1091: remove_invalid_refs (regno) ! 1092: int regno; ! 1093: { ! 1094: register int i; ! 1095: register struct table_elt *p, *next; ! 1096: register rtx x = reg_rtx[regno]; ! 1097: ! 1098: for (i = 0; i < NBUCKETS; i++) ! 1099: for (p = table[i]; p; p = next) ! 1100: { ! 1101: next = p->next_same_hash; ! 1102: if (GET_CODE (p->exp) != REG && refers_to_p (p->exp, x)) ! 1103: remove (p, i); ! 1104: } ! 1105: } ! 1106: ! 1107: /* Remove from the hash table all expressions that reference memory, ! 1108: or some of them as specified by *WRITES. */ ! 1109: ! 1110: static void ! 1111: invalidate_memory (writes) ! 1112: struct write_data *writes; ! 1113: { ! 1114: register int i; ! 1115: register struct table_elt *p, *next; ! 1116: int all = writes->all; ! 1117: int nonscalar = writes->nonscalar; ! 1118: ! 1119: for (i = 0; i < NBUCKETS; i++) ! 1120: for (p = table[i]; p; p = next) ! 1121: { ! 1122: next = p->next_same_hash; ! 1123: if (p->in_memory ! 1124: && (all ! 1125: || (nonscalar && p->in_struct) ! 1126: || cse_rtx_addr_varies_p (p->exp))) ! 1127: remove (p, i); ! 1128: } ! 1129: } ! 1130: ! 1131: /* Return the value of the integer term in X, if one is apparent; ! 1132: otherwise return 0. ! 1133: We do not check extremely carefully for the presence of integer terms ! 1134: but rather consider only the cases that `insert' notices ! 1135: for the `related_value' field. */ ! 1136: ! 1137: static int ! 1138: get_integer_term (x) ! 1139: rtx x; ! 1140: { ! 1141: if (GET_CODE (x) == CONST) ! 1142: x = XEXP (x, 0); ! 1143: ! 1144: if (GET_CODE (x) == MINUS ! 1145: && GET_CODE (XEXP (x, 1)) == CONST_INT) ! 1146: return - INTVAL (XEXP (x, 1)); ! 1147: if (GET_CODE (x) != PLUS) ! 1148: return 0; ! 1149: if (GET_CODE (XEXP (x, 0)) == CONST_INT) ! 1150: return INTVAL (XEXP (x, 0)); ! 1151: if (GET_CODE (XEXP (x, 1)) == CONST_INT) ! 1152: return INTVAL (XEXP (x, 1)); ! 1153: return 0; ! 1154: } ! 1155: ! 1156: static rtx ! 1157: get_related_value (x) ! 1158: rtx x; ! 1159: { ! 1160: if (GET_CODE (x) != CONST) ! 1161: return 0; ! 1162: x = XEXP (x, 0); ! 1163: if (GET_CODE (x) == PLUS) ! 1164: { ! 1165: if (GET_CODE (XEXP (x, 0)) == CONST_INT) ! 1166: return XEXP (x, 1); ! 1167: if (GET_CODE (XEXP (x, 1)) == CONST_INT) ! 1168: return XEXP (x, 0); ! 1169: } ! 1170: else if (GET_CODE (x) == MINUS ! 1171: && GET_CODE (XEXP (x, 1)) == CONST_INT) ! 1172: return XEXP (x, 0); ! 1173: return 0; ! 1174: } ! 1175: ! 1176: /* Given an expression X of type CONST, ! 1177: and ELT which is its table entry (or 0 if it ! 1178: is not in the hash table), ! 1179: return an alternate expression for X as a register plus integer. ! 1180: If none can be found or it would not be a valid address, return 0. */ ! 1181: ! 1182: static rtx ! 1183: use_related_value (x, elt) ! 1184: rtx x; ! 1185: struct table_elt *elt; ! 1186: { ! 1187: register struct table_elt *relt = 0; ! 1188: register struct table_elt *p; ! 1189: int offset; ! 1190: rtx addr; ! 1191: ! 1192: /* First, is there anything related known? ! 1193: If we have a table element, we can tell from that. ! 1194: Otherwise, must look it up. */ ! 1195: ! 1196: if (elt != 0 && elt->related_value != 0) ! 1197: relt = elt; ! 1198: else if (elt == 0 && GET_CODE (x) == CONST) ! 1199: { ! 1200: rtx subexp = get_related_value (x); ! 1201: if (subexp != 0) ! 1202: relt = lookup (subexp, ! 1203: safe_hash (subexp, GET_MODE (subexp)) % NBUCKETS, ! 1204: GET_MODE (subexp)); ! 1205: } ! 1206: ! 1207: if (relt == 0) ! 1208: return 0; ! 1209: ! 1210: /* Search all related table entries for one that has an ! 1211: equivalent register. */ ! 1212: ! 1213: p = relt; ! 1214: while (1) ! 1215: { ! 1216: if (p->first_same_value != 0 ! 1217: && GET_CODE (p->first_same_value->exp) == REG) ! 1218: break; ! 1219: p = p->related_value; ! 1220: ! 1221: /* We went all the way around, so there is nothing to be found. ! 1222: Return failure. */ ! 1223: if (p == relt) ! 1224: return 0; ! 1225: /* Perhaps RELT was in the table for some other reason and ! 1226: it has no related values recorded. */ ! 1227: if (p == 0) ! 1228: return 0; ! 1229: } ! 1230: ! 1231: offset = (get_integer_term (x) - get_integer_term (p->exp)); ! 1232: if (offset == 0) ! 1233: abort (); ! 1234: ! 1235: addr = plus_constant (p->first_same_value->exp, offset); ! 1236: if (memory_address_p (QImode, addr)) ! 1237: return addr; ! 1238: return 0; ! 1239: } ! 1240: ! 1241: /* Hash an rtx. We are careful to make sure the value is never negative. ! 1242: Equivalent registers hash identically. ! 1243: ! 1244: Store 1 in do_not_record if any subexpression is volatile. ! 1245: ! 1246: Store 1 in hash_arg_in_memory if X contains a MEM rtx ! 1247: which does not have the ->unchanging bit set. ! 1248: In this case, also store 1 in hash_arg_in_struct ! 1249: if there is a MEM rtx which has the ->in_struct bit set. ! 1250: ! 1251: Note that cse_insn knows that the hash code of a MEM expression ! 1252: is just (int) MEM plus the hash code of the address. ! 1253: It also knows it can use HASHREG to get the hash code of (REG n). */ ! 1254: ! 1255: #define HASHBITS 16 ! 1256: ! 1257: #define HASHREG(RTX) \ ! 1258: ((((int) REG << 7) + reg_qty[REGNO (RTX)]) % NBUCKETS) ! 1259: ! 1260: static int ! 1261: canon_hash (x, mode) ! 1262: rtx x; ! 1263: enum machine_mode mode; ! 1264: { ! 1265: register int i, j; ! 1266: register int hash = 0; ! 1267: register RTX_CODE code; ! 1268: register char *fmt; ! 1269: ! 1270: /* repeat is used to turn tail-recursion into iteration. */ ! 1271: repeat: ! 1272: code = GET_CODE (x); ! 1273: switch (code) ! 1274: { ! 1275: case REG: ! 1276: { ! 1277: /* We do not invalidate anything on pushing or popping ! 1278: because they cannot change anything but the stack pointer; ! 1279: but that means we must consider the stack pointer volatile ! 1280: since it can be changed "mysteriously". */ ! 1281: ! 1282: register int regno = REGNO (x); ! 1283: if (regno == STACK_POINTER_REGNUM) ! 1284: { ! 1285: do_not_record = 1; ! 1286: return 0; ! 1287: } ! 1288: return hash + ((int) REG << 7) + reg_qty[regno]; ! 1289: } ! 1290: ! 1291: case CONST_INT: ! 1292: hash = INTVAL (x); ! 1293: hash = (int) mode + ((int) CONST_INT << 7) + hash + hash >> HASHBITS; ! 1294: return ((1 << HASHBITS) - 1) & hash; ! 1295: ! 1296: /* Assume there is only one rtx object for any given label. */ ! 1297: case LABEL_REF: ! 1298: return hash + ((int) LABEL_REF << 7) + (int) XEXP (x, 0); ! 1299: ! 1300: case SYMBOL_REF: ! 1301: return hash + ((int) SYMBOL_REF << 7) + (int) XEXP (x, 0); ! 1302: ! 1303: case MEM: ! 1304: if (x->volatil) ! 1305: { ! 1306: do_not_record = 1; ! 1307: return 0; ! 1308: } ! 1309: if (! x->unchanging) ! 1310: { ! 1311: hash_arg_in_memory = 1; ! 1312: if (x->in_struct) hash_arg_in_struct = 1; ! 1313: } ! 1314: /* Now that we have already found this special case, ! 1315: might as well speed it up as much as possible. */ ! 1316: hash += (int) MEM; ! 1317: x = XEXP (x, 0); ! 1318: goto repeat; ! 1319: ! 1320: case PRE_DEC: ! 1321: case PRE_INC: ! 1322: case POST_DEC: ! 1323: case POST_INC: ! 1324: case PC: ! 1325: case CC0: ! 1326: case CALL: ! 1327: do_not_record = 1; ! 1328: return 0; ! 1329: ! 1330: case ASM_OPERANDS: ! 1331: if (x->volatil) ! 1332: { ! 1333: do_not_record = 1; ! 1334: return 0; ! 1335: } ! 1336: } ! 1337: ! 1338: i = GET_RTX_LENGTH (code) - 1; ! 1339: hash += (int) code + (int) GET_MODE (x); ! 1340: fmt = GET_RTX_FORMAT (code); ! 1341: for (; i >= 0; i--) ! 1342: { ! 1343: if (fmt[i] == 'e') ! 1344: { ! 1345: /* If we are about to do the last recursive call ! 1346: needed at this level, change it into iteration. ! 1347: This function is called enough to be worth it. */ ! 1348: if (i == 0) ! 1349: { ! 1350: x = XEXP (x, 0); ! 1351: goto repeat; ! 1352: } ! 1353: hash += canon_hash (XEXP (x, i), 0); ! 1354: } ! 1355: else if (fmt[i] == 'E') ! 1356: for (j = 0; j < XVECLEN (x, i); j++) ! 1357: hash += canon_hash (XVECEXP (x, i, j), 0); ! 1358: else if (fmt[i] == 's') ! 1359: { ! 1360: register char *p = XSTR (x, i); ! 1361: while (*p) ! 1362: { ! 1363: register int tem = *p++; ! 1364: hash += ((1 << HASHBITS) - 1) & (tem + tem >> HASHBITS); ! 1365: } ! 1366: } ! 1367: else ! 1368: { ! 1369: register int tem = XINT (x, i); ! 1370: hash += ((1 << HASHBITS) - 1) & (tem + tem >> HASHBITS); ! 1371: } ! 1372: } ! 1373: return hash; ! 1374: } ! 1375: ! 1376: /* Like canon_hash but with no side effects. */ ! 1377: ! 1378: static int ! 1379: safe_hash (x, mode) ! 1380: rtx x; ! 1381: enum machine_mode mode; ! 1382: { ! 1383: int save_do_not_record = do_not_record; ! 1384: int save_hash_arg_in_memory = hash_arg_in_memory; ! 1385: int save_hash_arg_in_struct = hash_arg_in_struct; ! 1386: int hash = canon_hash (x, mode); ! 1387: hash_arg_in_memory = save_hash_arg_in_memory; ! 1388: hash_arg_in_struct = save_hash_arg_in_struct; ! 1389: do_not_record = save_do_not_record; ! 1390: return hash; ! 1391: } ! 1392: ! 1393: /* Return 1 iff X and Y would canonicalize into the same thing, ! 1394: without actually constructing the canonicalization of either one. ! 1395: If VALIDATE is nonzero, ! 1396: we assume X is an expression being processed from the rtl ! 1397: and Y was found in the hash table. We check register refs ! 1398: in Y for being marked as valid. */ ! 1399: ! 1400: static int ! 1401: exp_equiv_p (x, y, validate) ! 1402: rtx x, y; ! 1403: int validate; ! 1404: { ! 1405: register int i; ! 1406: register RTX_CODE code = GET_CODE (x); ! 1407: register char *fmt; ! 1408: ! 1409: /* An expression is usually equivalent to itself, ! 1410: but not if it's a register that's invalid. */ ! 1411: if (x == y) ! 1412: return (code != REG ! 1413: || !validate ! 1414: || reg_in_table[REGNO (y)] == reg_tick[REGNO (y)]); ! 1415: ! 1416: if (code != GET_CODE (y)) ! 1417: return 0; ! 1418: if (code == REG) ! 1419: return (reg_qty[REGNO (x)] == reg_qty[REGNO (y)] ! 1420: && (!validate ! 1421: || reg_in_table[REGNO (y)] == reg_tick[REGNO (y)])); ! 1422: ! 1423: /* Assume there is only one rtx object to refer ! 1424: to any given label. ! 1425: We already know that X and Y are not the same object ! 1426: so they must differ. */ ! 1427: ! 1428: if (code == LABEL_REF || code == SYMBOL_REF) ! 1429: return XEXP (x, 0) == XEXP (y, 0); ! 1430: ! 1431: /* (MULT:SI x y) and (MULT:HI x y) are NOT equivalent. */ ! 1432: ! 1433: if (GET_MODE (x) != GET_MODE (y)) ! 1434: return 0; ! 1435: ! 1436: /* Compare the elements. If any pair of corresponding elements ! 1437: fail to match, return 0 for the whole things. */ ! 1438: ! 1439: fmt = GET_RTX_FORMAT (code); ! 1440: for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) ! 1441: { ! 1442: if (fmt[i] == 'e') ! 1443: { ! 1444: if (! exp_equiv_p (XEXP (x, i), XEXP (y, i), validate)) ! 1445: return 0; ! 1446: } ! 1447: else if (fmt[i] == 'E') ! 1448: { ! 1449: int j; ! 1450: for (j = 0; j < XVECLEN (x, i); j++) ! 1451: if (! exp_equiv_p (XVECEXP (x, i, j), XVECEXP (y, i, j), validate)) ! 1452: return 0; ! 1453: } ! 1454: else if (fmt[i] == 's') ! 1455: { ! 1456: if (strcmp (XSTR (x, i), XSTR (y, i))) ! 1457: return 0; ! 1458: } ! 1459: else ! 1460: { ! 1461: if (XINT (x, i) != XINT (y, i)) ! 1462: return 0; ! 1463: } ! 1464: } ! 1465: return 1; ! 1466: } ! 1467: ! 1468: /* Return 1 iff any subexpression of X matches Y. ! 1469: Here we do not require that X or Y be valid (for registers referred to) ! 1470: for being in the hash table. */ ! 1471: ! 1472: int ! 1473: refers_to_p (x, y) ! 1474: rtx x, y; ! 1475: { ! 1476: register int i; ! 1477: register RTX_CODE code; ! 1478: register char *fmt; ! 1479: ! 1480: repeat: ! 1481: if (x == y) ! 1482: return 1; ! 1483: ! 1484: code = GET_CODE (x); ! 1485: /* If X as a whole has the same code as Y, they may match. ! 1486: If so, return 1. */ ! 1487: if (code == GET_CODE (y)) ! 1488: { ! 1489: if (exp_equiv_p (x, y, 0)) ! 1490: return 1; ! 1491: } ! 1492: ! 1493: /* X does not match, so try its subexpressions. */ ! 1494: ! 1495: fmt = GET_RTX_FORMAT (code); ! 1496: for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) ! 1497: if (fmt[i] == 'e') ! 1498: { ! 1499: if (i == 0) ! 1500: { ! 1501: x = XEXP (x, 0); ! 1502: goto repeat; ! 1503: } ! 1504: else ! 1505: if (refers_to_p (XEXP (x, i), y)) ! 1506: return 1; ! 1507: } ! 1508: else if (fmt[i] == 'E') ! 1509: { ! 1510: int j; ! 1511: for (j = 0; j < XVECLEN (x, i); j++) ! 1512: if (refers_to_p (XVECEXP (x, i, j), y)) ! 1513: return 1; ! 1514: } ! 1515: ! 1516: return 0; ! 1517: } ! 1518: ! 1519: /* Return 1 iff any subexpression of X refers to memory ! 1520: at an address of REG plus some offset ! 1521: such that any of the bytes' offsets fall between START (inclusive) ! 1522: and END (exclusive). ! 1523: ! 1524: The value is undefined if X is a varying address. ! 1525: This function is not used in such cases. ! 1526: ! 1527: When used in the cse pass, `qty_const' is nonzero, and it is used ! 1528: to treat an address that is a register with a known constant value ! 1529: as if it were that constant value. ! 1530: In the loop pass, `qty_const' is zero, so this is not done. */ ! 1531: ! 1532: int ! 1533: refers_to_mem_p (x, reg, start, end) ! 1534: rtx x, reg; ! 1535: int start, end; ! 1536: { ! 1537: register int i; ! 1538: register RTX_CODE code; ! 1539: register char *fmt; ! 1540: ! 1541: repeat: ! 1542: code = GET_CODE (x); ! 1543: if (code == MEM) ! 1544: { ! 1545: register rtx addr = XEXP (x, 0); /* Get the address. */ ! 1546: int myend; ! 1547: if (GET_CODE (addr) == REG ! 1548: /* qty_const is 0 when outside the cse pass; ! 1549: at such times, this info is not available. */ ! 1550: && qty_const != 0 ! 1551: && qty_const[reg_qty[REGNO (addr)]] != 0) ! 1552: addr = qty_const[reg_qty[REGNO (addr)]]; ! 1553: if (GET_CODE (addr) == CONST) ! 1554: addr = XEXP (addr, 0); ! 1555: ! 1556: /* If ADDR is BASE, or BASE plus an integer, put ! 1557: the integer in I. */ ! 1558: if (addr == reg) ! 1559: i = 0; ! 1560: else if (GET_CODE (addr) == PLUS ! 1561: && XEXP (addr, 0) == reg ! 1562: && GET_CODE (XEXP (addr, 1)) == CONST_INT) ! 1563: i = INTVAL (XEXP (addr, 1)); ! 1564: else ! 1565: return 0; ! 1566: ! 1567: myend = i + GET_MODE_SIZE (GET_MODE (x)); ! 1568: return myend > start && i < end; ! 1569: } ! 1570: ! 1571: /* X does not match, so try its subexpressions. */ ! 1572: ! 1573: fmt = GET_RTX_FORMAT (code); ! 1574: for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) ! 1575: if (fmt[i] == 'e') ! 1576: { ! 1577: if (i == 0) ! 1578: { ! 1579: x = XEXP (x, 0); ! 1580: goto repeat; ! 1581: } ! 1582: else ! 1583: if (refers_to_mem_p (XEXP (x, i), reg, start, end)) ! 1584: return 1; ! 1585: } ! 1586: else if (fmt[i] == 'E') ! 1587: { ! 1588: int j; ! 1589: for (j = 0; j < XVECLEN (x, i); j++) ! 1590: if (refers_to_mem_p (XVECEXP (x, i, j), reg, start, end)) ! 1591: return 1; ! 1592: } ! 1593: ! 1594: return 0; ! 1595: } ! 1596: ! 1597: /* Nonzero if X refers to memory at a varying address; ! 1598: except that a register which has at the moment a known constant value ! 1599: isn't considered variable. */ ! 1600: ! 1601: static int ! 1602: cse_rtx_addr_varies_p (x) ! 1603: rtx x; ! 1604: { ! 1605: if (GET_CODE (x) == MEM ! 1606: && GET_CODE (XEXP (x, 0)) == REG ! 1607: && qty_const[reg_qty[REGNO (XEXP (x, 0))]] != 0) ! 1608: return 0; ! 1609: return rtx_addr_varies_p (x); ! 1610: } ! 1611: ! 1612: /* Canonicalize an expression: ! 1613: replace each register reference inside it ! 1614: with the "oldest" equivalent register. */ ! 1615: ! 1616: static rtx ! 1617: canon_reg (x) ! 1618: rtx x; ! 1619: { ! 1620: register int i; ! 1621: register RTX_CODE code = GET_CODE (x); ! 1622: register char *fmt; ! 1623: ! 1624: if (code == REG) ! 1625: { ! 1626: register int qty = reg_qty[REGNO (x)]; ! 1627: register rtx new = reg_rtx[qty_first_reg[qty]]; ! 1628: /* Never replace a hard reg, because hard regs can appear ! 1629: in more than one machine mode, and we must preserve the mode ! 1630: of each occurrence. Also, some hard regs appear in ! 1631: MEMs that are shared and mustn't be altered. */ ! 1632: if (REGNO (x) < FIRST_PSEUDO_REGISTER) ! 1633: return x; ! 1634: return new ? new : x; ! 1635: } ! 1636: ! 1637: fmt = GET_RTX_FORMAT (code); ! 1638: for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) ! 1639: { ! 1640: register int j; ! 1641: ! 1642: if (fmt[i] == 'e') ! 1643: XEXP (x, i) = canon_reg (XEXP (x, i)); ! 1644: else if (fmt[i] == 'E') ! 1645: for (j = 0; j < XVECLEN (x, i); j++) ! 1646: XVECEXP (x, i, j) = canon_reg (XVECEXP (x, i, j)); ! 1647: } ! 1648: ! 1649: return x; ! 1650: } ! 1651: ! 1652: /* If X is a nontrivial arithmetic operation on an argument ! 1653: for which a constant value can be determined, return ! 1654: the result of operating on that value, as a constant. ! 1655: Otherwise, return X, possibly with one or more operands ! 1656: modified by recursive calls to this function. ! 1657: ! 1658: If X is a register whose contents are known, we do NOT ! 1659: return those contents. This is because an instruction that ! 1660: uses a register is usually faster than one that uses a constant. ! 1661: ! 1662: COPYFLAG is nonzero for memory addresses and subexpressions thereof. ! 1663: If COPYFLAG is nonzero, we avoid altering X itself ! 1664: by creating new structure when necessary. In this case we ! 1665: can risk creating invalid structure because it will be tested. ! 1666: If COPYFLAG is zero, be careful not to substitute constants ! 1667: into expressions that cannot be simplified. */ ! 1668: ! 1669: static rtx ! 1670: fold_rtx (x, copyflag) ! 1671: rtx x; ! 1672: int copyflag; ! 1673: { ! 1674: register RTX_CODE code = GET_CODE (x); ! 1675: register char *fmt; ! 1676: register int i, val; ! 1677: rtx new = 0; ! 1678: int copied = ! copyflag; ! 1679: int width = GET_MODE_BITSIZE (GET_MODE (x)); ! 1680: ! 1681: /* Constant equivalents of first three operands of X; ! 1682: 0 when no such equivalent is known. */ ! 1683: rtx const_arg0; ! 1684: rtx const_arg1; ! 1685: rtx const_arg2; ! 1686: ! 1687: switch (code) ! 1688: { ! 1689: case CONST: ! 1690: case CONST_INT: ! 1691: case CONST_DOUBLE: ! 1692: case SYMBOL_REF: ! 1693: case LABEL_REF: ! 1694: case PC: ! 1695: case CC0: ! 1696: case REG: ! 1697: return x; ! 1698: ! 1699: /* We must be careful when folding a memory address ! 1700: to avoid making it invalid. So fold nondestrictively ! 1701: and use the result only if it's valid. */ ! 1702: case MEM: ! 1703: { ! 1704: rtx newaddr = fold_rtx (XEXP (x, 0), 1); ! 1705: if (! memory_address_p (GET_MODE (x), newaddr) ! 1706: && memory_address_p (GET_MODE (x), XEXP (x, 0))) ! 1707: return x; ! 1708: ! 1709: if (copyflag) ! 1710: return gen_rtx (MEM, GET_MODE (x), newaddr); ! 1711: XEXP (x, 0) = newaddr; ! 1712: return x; ! 1713: } ! 1714: } ! 1715: ! 1716: const_arg0 = 0; ! 1717: const_arg1 = 0; ! 1718: const_arg2 = 0; ! 1719: ! 1720: /* Try folding our operands. ! 1721: Then see which ones have constant values known. */ ! 1722: ! 1723: fmt = GET_RTX_FORMAT (code); ! 1724: for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) ! 1725: if (fmt[i] == 'e') ! 1726: { ! 1727: register rtx tem = fold_rtx (XEXP (x, i), copyflag); ! 1728: ! 1729: /* If an operand has changed under folding, and we are not supposed to ! 1730: alter the original structure, copy X if we haven't yet done so. */ ! 1731: if (! copied && tem != XEXP (x, i)) ! 1732: { ! 1733: int j; ! 1734: rtx new = rtx_alloc (code); ! 1735: PUT_MODE (new, GET_MODE (x)); ! 1736: for (j = 0; j < GET_RTX_LENGTH (code); j++) ! 1737: XINT (new, j) = XINT (x, j); ! 1738: x = new; ! 1739: copied = 1; ! 1740: } ! 1741: ! 1742: /* Install the possibly altered folded operand. */ ! 1743: XEXP (x, i) = tem; ! 1744: ! 1745: /* For the first three operands, see if the operand ! 1746: is constant or equivalent to a constant. */ ! 1747: if (i < 3) ! 1748: { ! 1749: rtx tem1; ! 1750: rtx const_arg = 0; ! 1751: ! 1752: if (CONSTANT_P (tem)) ! 1753: const_arg = tem; ! 1754: else if (GET_CODE (tem) == REG ! 1755: && qty_const[reg_qty[REGNO (tem)]] != 0 ! 1756: /* Make sure it is really a constant */ ! 1757: && ((tem1 = qty_const[reg_qty[REGNO (tem)]]), ! 1758: GET_CODE (tem1) != REG && GET_CODE (tem1) != PLUS)) ! 1759: const_arg = qty_const[reg_qty[REGNO (tem)]]; ! 1760: ! 1761: switch (i) ! 1762: { ! 1763: case 0: ! 1764: const_arg0 = const_arg; ! 1765: break; ! 1766: case 1: ! 1767: const_arg1 = const_arg; ! 1768: break; ! 1769: case 2: ! 1770: const_arg2 = const_arg; ! 1771: break; ! 1772: } ! 1773: } ! 1774: } ! 1775: else if (fmt[i] == 'E') ! 1776: /* Don't try to fold inside of a vector of expressions. ! 1777: Doing nothing is is harmless. */ ! 1778: ; ! 1779: ! 1780: /* Now decode the kind of rtx X is ! 1781: and either return X (if nothing can be done) ! 1782: or store a value in VAL and drop through ! 1783: (to return a CONST_INT for the integer VAL). */ ! 1784: ! 1785: if (GET_RTX_LENGTH (code) == 1) ! 1786: { ! 1787: register int arg0; ! 1788: ! 1789: if (const_arg0 == 0 || GET_CODE (const_arg0) != CONST_INT) ! 1790: return x; ! 1791: ! 1792: arg0 = INTVAL (const_arg0); ! 1793: ! 1794: switch (GET_CODE (x)) ! 1795: { ! 1796: case NOT: ! 1797: val = ~ arg0; ! 1798: break; ! 1799: ! 1800: case NEG: ! 1801: val = - arg0; ! 1802: break; ! 1803: ! 1804: case TRUNCATE: ! 1805: val = arg0; ! 1806: break; ! 1807: ! 1808: case ZERO_EXTEND: ! 1809: { ! 1810: enum machine_mode mode = GET_MODE (XEXP (x, 0)); ! 1811: if (mode == VOIDmode) ! 1812: return x; ! 1813: val = arg0 & ~((-1) << GET_MODE_BITSIZE (mode)); ! 1814: break; ! 1815: } ! 1816: ! 1817: case SIGN_EXTEND: ! 1818: { ! 1819: enum machine_mode mode = GET_MODE (XEXP (x, 0)); ! 1820: if (mode == VOIDmode) ! 1821: return x; ! 1822: val = arg0 & ~((-1) << GET_MODE_BITSIZE (mode)); ! 1823: if (val & (1 << (GET_MODE_BITSIZE (mode) - 1))) ! 1824: val -= 1 << GET_MODE_BITSIZE (mode); ! 1825: break; ! 1826: } ! 1827: ! 1828: default: ! 1829: return x; ! 1830: } ! 1831: } ! 1832: else if (GET_RTX_LENGTH (code) == 2) ! 1833: { ! 1834: register int arg0, arg1, arg0s, arg1s; ! 1835: ! 1836: /* If 1st arg is the condition codes, 2nd must be zero ! 1837: and this must be a comparison. ! 1838: Decode the info on how the previous insn set the cc0 ! 1839: and use that to deduce result of comparison. */ ! 1840: if (XEXP (x, 0) == cc0_rtx) ! 1841: { ! 1842: if (prev_insn_cc0 == 0 ! 1843: || const_arg1 != const0_rtx ! 1844: /* 0200 bit in prev_insn_cc0 means only zeroness is known, ! 1845: and sign is not known. */ ! 1846: || ((prev_insn_cc0 & 0200) ! 1847: && code != EQ && code != NE)) ! 1848: return x; ! 1849: if (code == LEU || code == LTU || code == GEU || code == GTU) ! 1850: arg0 = prev_insn_cc0 & 7; ! 1851: else ! 1852: arg0 = (prev_insn_cc0 >> 3) & 7; ! 1853: if (arg0 == 7) arg0 = -1; ! 1854: ! 1855: switch (code) ! 1856: { ! 1857: case LE: ! 1858: case LEU: ! 1859: return (arg0 <= 0) ? const1_rtx : const0_rtx; ! 1860: case LT: ! 1861: case LTU: ! 1862: return (arg0 < 0) ? const1_rtx : const0_rtx; ! 1863: case GE: ! 1864: case GEU: ! 1865: return (arg0 >= 0) ? const1_rtx : const0_rtx; ! 1866: case GT: ! 1867: case GTU: ! 1868: return (arg0 > 0) ? const1_rtx : const0_rtx; ! 1869: case NE: ! 1870: return (arg0 != 0) ? const1_rtx : const0_rtx; ! 1871: case EQ: ! 1872: return (arg0 == 0) ? const1_rtx : const0_rtx; ! 1873: default: ! 1874: abort (); ! 1875: } ! 1876: } ! 1877: ! 1878: if (const_arg0 == 0 || const_arg1 == 0 ! 1879: || GET_CODE (const_arg0) != CONST_INT ! 1880: || GET_CODE (const_arg1) != CONST_INT) ! 1881: { ! 1882: /* Even if we can't compute a constant result, ! 1883: there are some cases worth simplifying. */ ! 1884: if (code == PLUS) ! 1885: { ! 1886: if (const_arg0 == const0_rtx) ! 1887: return XEXP (x, 1); ! 1888: if (const_arg1 == const0_rtx) ! 1889: return XEXP (x, 0); ! 1890: ! 1891: /* Handle both-operands-constant cases. */ ! 1892: if (const_arg0 != 0 && const_arg1 != 0) ! 1893: { ! 1894: if (GET_CODE (const_arg0) == CONST_INT) ! 1895: new = plus_constant (const_arg1, INTVAL (const_arg0)); ! 1896: else if (GET_CODE (const_arg1) == CONST_INT) ! 1897: new = plus_constant (const_arg0, INTVAL (const_arg1)); ! 1898: else ! 1899: { ! 1900: new = gen_rtx (PLUS, GET_MODE (x), const0_rtx, const0_rtx); ! 1901: XEXP (new, 0) = const_arg0; ! 1902: if (GET_CODE (const_arg0) == CONST) ! 1903: XEXP (new, 0) = XEXP (const_arg0, 0); ! 1904: XEXP (new, 1) = const_arg1; ! 1905: if (GET_CODE (const_arg1) == CONST) ! 1906: XEXP (new, 1) = XEXP (const_arg1, 0); ! 1907: new = gen_rtx (CONST, GET_MODE (new), new); ! 1908: } ! 1909: } ! 1910: ! 1911: else if (const_arg0 != 0 ! 1912: && GET_CODE (const_arg0) == CONST_INT ! 1913: && GET_CODE (XEXP (x, 1)) == PLUS ! 1914: && (CONSTANT_P (XEXP (XEXP (x, 1), 0)) ! 1915: || CONSTANT_P (XEXP (XEXP (x, 1), 1)))) ! 1916: /* constant + (variable + constant) ! 1917: can result if an index register is made constant. ! 1918: We simplify this by adding the constants. ! 1919: If we did not, it would become an invalid address. */ ! 1920: new = plus_constant (XEXP (x, 1), ! 1921: INTVAL (const_arg0)); ! 1922: else if (const_arg1 != 0 ! 1923: && GET_CODE (const_arg1) == CONST_INT ! 1924: && GET_CODE (XEXP (x, 0)) == PLUS ! 1925: && (CONSTANT_P (XEXP (XEXP (x, 0), 0)) ! 1926: || CONSTANT_P (XEXP (XEXP (x, 0), 1)))) ! 1927: new = plus_constant (XEXP (x, 0), ! 1928: INTVAL (const_arg1)); ! 1929: } ! 1930: else if (code == MINUS) ! 1931: { ! 1932: if (const_arg1 == const0_rtx) ! 1933: return XEXP (x, 0); ! 1934: ! 1935: if (XEXP (x, 0) == XEXP (x, 1) ! 1936: || (const_arg0 != 0 && const_arg0 == const_arg1)) ! 1937: { ! 1938: /* We can't assume x-x is 0 with IEEE floating point. */ ! 1939: if (GET_MODE_CLASS (GET_MODE (x)) == MODE_INT) ! 1940: return const0_rtx; ! 1941: } ! 1942: ! 1943: if (const_arg0 != 0 && const_arg1 != 0 ! 1944: /* Don't let a relocatable value get a negative coeff. */ ! 1945: && GET_CODE (const_arg1) == CONST_INT) ! 1946: new = plus_constant (const_arg0, - INTVAL (const_arg1)); ! 1947: } ! 1948: ! 1949: /* PLUS and MULT can appear inside of a MEM. ! 1950: In such situations, a constant term must come second. */ ! 1951: else if (code == MULT || code == PLUS) ! 1952: if (copyflag && const_arg0 != 0) ! 1953: { ! 1954: if (! copied) ! 1955: x = gen_rtx (code, GET_MODE (x), XEXP (x, 0), XEXP (x, 1)); ! 1956: XEXP (x, 0) = XEXP (x, 1); ! 1957: XEXP (x, 1) = const_arg0; ! 1958: } ! 1959: ! 1960: /* If integer truncation is being done with SUBREG, ! 1961: we can compute the result. */ ! 1962: ! 1963: else if (code == SUBREG) ! 1964: if (SUBREG_WORD (x) == 0 ! 1965: && const_arg0 != 0 ! 1966: && GET_CODE (const_arg0) == CONST_INT ! 1967: && GET_MODE_SIZE (GET_MODE (x)) < GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))) ! 1968: && (GET_MODE (x) == QImode || GET_MODE (x) == HImode ! 1969: || GET_MODE (x) == SImode)) ! 1970: { ! 1971: arg0 = INTVAL (const_arg0); ! 1972: arg0 &= (1 << GET_MODE_BITSIZE (GET_MODE (x))) - 1; ! 1973: if (arg0 == INTVAL (const_arg0)) ! 1974: new = const_arg0; ! 1975: else ! 1976: new = gen_rtx (CONST_INT, VOIDmode, arg0); ! 1977: } ! 1978: ! 1979: if (new != 0 && LEGITIMATE_CONSTANT_P (new)) ! 1980: return new; ! 1981: return x; ! 1982: } ! 1983: ! 1984: /* Get the integer argument values in two forms: ! 1985: zero-extended in ARG0, ARG1 and sign-extended in ARG0S, ARG1S. */ ! 1986: ! 1987: arg0 = INTVAL (const_arg0); ! 1988: arg1 = INTVAL (const_arg1); ! 1989: ! 1990: if (width < HOST_BITS_PER_INT) ! 1991: { ! 1992: arg0 &= (1 << width) - 1; ! 1993: arg1 &= (1 << width) - 1; ! 1994: ! 1995: arg0s = arg0; ! 1996: if (arg0s & (1 << (width - 1))) ! 1997: arg0s |= ((-1) << width); ! 1998: ! 1999: arg1s = arg1; ! 2000: if (arg1s & (1 << (width - 1))) ! 2001: arg1s |= ((-1) << width); ! 2002: } ! 2003: else ! 2004: { ! 2005: arg0s = arg0; ! 2006: arg1s = arg1; ! 2007: } ! 2008: ! 2009: /* Compute the value of the arithmetic. */ ! 2010: ! 2011: switch (code) ! 2012: { ! 2013: case PLUS: ! 2014: val = arg0 + arg1; ! 2015: break; ! 2016: ! 2017: case MINUS: ! 2018: if (GET_MODE (x) == VOIDmode) ! 2019: /* Overflowless comparison: ! 2020: cannot represent an exact answer, so don't fold. ! 2021: This is used only to set the CC0, ! 2022: and fold_cc0 will take care of it. */ ! 2023: return x; ! 2024: val = arg0 - arg1; ! 2025: break; ! 2026: ! 2027: case MULT: ! 2028: val = arg0s * arg1s; ! 2029: break; ! 2030: ! 2031: case DIV: ! 2032: if (arg1s == 0) ! 2033: return x; ! 2034: val = arg0s / arg1s; ! 2035: break; ! 2036: ! 2037: case MOD: ! 2038: if (arg1s == 0) ! 2039: return x; ! 2040: val = arg0s % arg1s; ! 2041: break; ! 2042: ! 2043: case UMULT: ! 2044: val = (unsigned) arg0 * arg1; ! 2045: break; ! 2046: ! 2047: case UDIV: ! 2048: if (arg1 == 0) ! 2049: return x; ! 2050: val = (unsigned) arg0 / arg1; ! 2051: break; ! 2052: ! 2053: case UMOD: ! 2054: if (arg1 == 0) ! 2055: return x; ! 2056: val = (unsigned) arg0 % arg1; ! 2057: break; ! 2058: ! 2059: case AND: ! 2060: val = arg0 & arg1; ! 2061: break; ! 2062: ! 2063: case IOR: ! 2064: val = arg0 | arg1; ! 2065: break; ! 2066: ! 2067: case XOR: ! 2068: val = arg0 ^ arg1; ! 2069: break; ! 2070: ! 2071: case NE: ! 2072: val = arg0 != arg1; ! 2073: break; ! 2074: ! 2075: case EQ: ! 2076: val = arg0 == arg1; ! 2077: break; ! 2078: ! 2079: case LE: ! 2080: val = arg0s <= arg1s; ! 2081: break; ! 2082: ! 2083: case LT: ! 2084: val = arg0s < arg1s; ! 2085: break; ! 2086: ! 2087: case GE: ! 2088: val = arg0s >= arg1s; ! 2089: break; ! 2090: ! 2091: case GT: ! 2092: val = arg0s > arg1s; ! 2093: break; ! 2094: ! 2095: case LEU: ! 2096: val = ((unsigned) arg0) <= ((unsigned) arg1); ! 2097: break; ! 2098: ! 2099: case LTU: ! 2100: val = ((unsigned) arg0) < ((unsigned) arg1); ! 2101: break; ! 2102: ! 2103: case GEU: ! 2104: val = ((unsigned) arg0) >= ((unsigned) arg1); ! 2105: break; ! 2106: ! 2107: case GTU: ! 2108: val = ((unsigned) arg0) > ((unsigned) arg1); ! 2109: break; ! 2110: ! 2111: case LSHIFT: ! 2112: val = ((unsigned) arg0) << arg1; ! 2113: break; ! 2114: ! 2115: case ASHIFT: ! 2116: val = arg0s << arg1; ! 2117: break; ! 2118: ! 2119: case ROTATERT: ! 2120: arg1 = - arg1; ! 2121: case ROTATE: ! 2122: { ! 2123: int size = GET_MODE_SIZE (GET_MODE (x)) * BITS_PER_UNIT; ! 2124: if (arg1 > 0) ! 2125: { ! 2126: arg1 %= size; ! 2127: val = ((((unsigned) arg0) << arg1) ! 2128: | (((unsigned) arg0) >> (size - arg1))); ! 2129: } ! 2130: else if (arg1 < 0) ! 2131: { ! 2132: arg1 = (- arg1) % size; ! 2133: val = ((((unsigned) arg0) >> arg1) ! 2134: | (((unsigned) arg0) << (size - arg1))); ! 2135: } ! 2136: else ! 2137: val = arg0; ! 2138: } ! 2139: break; ! 2140: ! 2141: case LSHIFTRT: ! 2142: val = ((unsigned) arg0) >> arg1; ! 2143: break; ! 2144: ! 2145: case ASHIFTRT: ! 2146: val = arg0s >> arg1; ! 2147: break; ! 2148: ! 2149: default: ! 2150: return x; ! 2151: } ! 2152: } ! 2153: else if (code == IF_THEN_ELSE && const_arg0 != 0 ! 2154: && GET_CODE (const_arg0) == CONST_INT) ! 2155: return XEXP (x, ((INTVAL (const_arg0) != 0) ? 1 : 2)); ! 2156: else if (code == SIGN_EXTRACT || code == ZERO_EXTRACT) ! 2157: { ! 2158: if (const_arg0 != 0 && const_arg1 != 0 && const_arg2 != 0 ! 2159: && GET_CODE (const_arg0) == CONST_INT ! 2160: && GET_CODE (const_arg1) == CONST_INT ! 2161: && GET_CODE (const_arg2) == CONST_INT) ! 2162: { ! 2163: /* Extracting a bit-field from a constant */ ! 2164: val = INTVAL (const_arg0); ! 2165: #ifdef BITS_BIG_ENDIAN ! 2166: val >>= (GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0))) ! 2167: - INTVAL (const_arg2) - INTVAL (const_arg1)); ! 2168: #else ! 2169: val >>= INTVAL (const_arg2); ! 2170: #endif ! 2171: if (HOST_BITS_PER_INT != INTVAL (const_arg1)) ! 2172: { ! 2173: /* First zero-extend. */ ! 2174: val &= (1 << INTVAL (const_arg1)) - 1; ! 2175: /* If desired, propagate sign bit. */ ! 2176: if (code == SIGN_EXTRACT ! 2177: && (val & (1 << (INTVAL (const_arg1) - 1)))) ! 2178: val |= ~ (1 << INTVAL (const_arg1)); ! 2179: } ! 2180: } ! 2181: else ! 2182: return x; ! 2183: } ! 2184: else ! 2185: return x; ! 2186: ! 2187: /* Clear the bits that don't belong in our mode, ! 2188: unless they and our sign bit are all one. ! 2189: So we get either a reasonable negative value or a reasonable ! 2190: unsigned value for this mode. */ ! 2191: if (width < HOST_BITS_PER_INT) ! 2192: { ! 2193: if ((val & ((-1) << (width - 1))) ! 2194: != ((-1) << (width - 1))) ! 2195: val &= (1 << width) - 1; ! 2196: } ! 2197: ! 2198: /* Now make the new constant. */ ! 2199: { ! 2200: rtx new = gen_rtx (CONST_INT, VOIDmode, val); ! 2201: return LEGITIMATE_CONSTANT_P (new) ? new : x; ! 2202: } ! 2203: } ! 2204: ! 2205: /* Given an expression X which is used to set CC0, ! 2206: return an integer recording (in the encoding used for prev_insn_cc0) ! 2207: how the condition codes would be set by that expression. ! 2208: Return 0 if the value is not constant ! 2209: or if there is any doubt what condition codes result from it. */ ! 2210: ! 2211: static int ! 2212: fold_cc0 (x) ! 2213: rtx x; ! 2214: { ! 2215: if (GET_CODE (x) == MINUS && GET_MODE (x) == VOIDmode) ! 2216: { ! 2217: rtx y0 = fold_rtx (XEXP (x, 0), 0); ! 2218: rtx y1 = fold_rtx (XEXP (x, 1), 0); ! 2219: int u0, u1, s0, s1; ! 2220: enum machine_mode m; ! 2221: ! 2222: m = GET_MODE (y0); ! 2223: if (m == VOIDmode) ! 2224: m = GET_MODE (y1); ! 2225: if (m == VOIDmode) ! 2226: return 0; ! 2227: ! 2228: if (GET_CODE (y0) == REG) ! 2229: y0 = qty_const[reg_qty[REGNO (y0)]]; ! 2230: ! 2231: if (y0 == 0 || GET_CODE (y0) != CONST_INT) ! 2232: return 0; ! 2233: ! 2234: if (GET_CODE (y1) == REG) ! 2235: y1 = qty_const[reg_qty[REGNO (y1)]]; ! 2236: ! 2237: if (y1 == 0 || GET_CODE (y1) != CONST_INT) ! 2238: return 0; ! 2239: ! 2240: s0 = u0 = INTVAL (y0); ! 2241: s1 = u1 = INTVAL (y1); ! 2242: ! 2243: { ! 2244: int width = GET_MODE_BITSIZE (m); ! 2245: if (width < HOST_BITS_PER_INT) ! 2246: { ! 2247: s0 = u0 &= ~ ((-1) << width); ! 2248: s1 = u1 &= ~ ((-1) << width); ! 2249: if (u0 & (1 << (width - 1))) ! 2250: s0 |= ((-1) << width); ! 2251: if (u1 & (1 << (width - 1))) ! 2252: s1 |= ((-1) << width); ! 2253: } ! 2254: } ! 2255: ! 2256: return 0100 + ((s0 < s1 ? 7 : s0 > s1) << 3) ! 2257: + (((unsigned) u0 < (unsigned) u1) ? 7 ! 2258: : ((unsigned) u0 > (unsigned) u1)); ! 2259: } ! 2260: { ! 2261: rtx y0; ! 2262: int u0, s0; ! 2263: enum machine_mode m; ! 2264: ! 2265: y0 = fold_rtx (x, 0); ! 2266: ! 2267: m = GET_MODE (y0); ! 2268: ! 2269: if (GET_CODE (y0) == REG) ! 2270: y0 = qty_const[reg_qty[REGNO (y0)]]; ! 2271: ! 2272: /* Register had no constant equivalent? We can't do anything. */ ! 2273: if (y0 == 0) ! 2274: return 0; ! 2275: ! 2276: /* Value is frame-pointer plus a constant? ! 2277: That isn't zero, but we don't know its sign. */ ! 2278: if (FIXED_BASE_PLUS_P (y0)) ! 2279: return 0300 + (1<<3) + 1; ! 2280: ! 2281: /* Otherwise, only integers enable us to optimize. */ ! 2282: if (GET_CODE (y0) != CONST_INT) ! 2283: return 0; ! 2284: ! 2285: s0 = u0 = INTVAL (y0); ! 2286: if (m != VOIDmode) ! 2287: { ! 2288: int width = GET_MODE_BITSIZE (m); ! 2289: if (width < HOST_BITS_PER_INT) ! 2290: { ! 2291: s0 = u0 &= ~ ((-1) << GET_MODE_BITSIZE (m)); ! 2292: if (u0 & (1 << (GET_MODE_BITSIZE (m) - 1))) ! 2293: s0 |= ((-1) << GET_MODE_BITSIZE (m)); ! 2294: } ! 2295: } ! 2296: return 0100 + ((s0 < 0 ? 7 : s0 > 0) << 3) + (u0 != 0); ! 2297: } ! 2298: } ! 2299: ! 2300: /* Attempt to prove that a loop will be executed >= 1 times, ! 2301: or prove it will be executed 0 times. ! 2302: If either can be proved, delete some of the code. */ ! 2303: ! 2304: static void ! 2305: predecide_loop_entry (insn) ! 2306: register rtx insn; ! 2307: { ! 2308: register rtx jump = NEXT_INSN (insn); ! 2309: register rtx p = JUMP_LABEL (jump); ! 2310: register rtx loop_top_label = NEXT_INSN (NEXT_INSN (jump)); ! 2311: enum { UNK, DELETE_LOOP, DELETE_JUMP } disposition = UNK; ! 2312: int count = 0; ! 2313: ! 2314: /* Trace the flow of control through the end test, ! 2315: propagating constants, to see if result is determined. */ ! 2316: prev_insn_cc0 = 0; ! 2317: /* Avoid infinite loop if we find a cycle of jumps. */ ! 2318: while (count < 10) ! 2319: { ! 2320: /* At end of function? Means rtl is inconsistent, ! 2321: but this can happen when stmt.c gets confused ! 2322: by a syntax error. */ ! 2323: if (p == 0) ! 2324: break; ! 2325: /* Arriving at end of loop means endtest will drop out. */ ! 2326: if (GET_CODE (p) == NOTE ! 2327: && NOTE_LINE_NUMBER (p) == NOTE_INSN_LOOP_END) ! 2328: { ! 2329: disposition = DELETE_LOOP; ! 2330: break; ! 2331: } ! 2332: else if (GET_CODE (p) == CODE_LABEL || GET_CODE (p) == NOTE) ! 2333: ; ! 2334: /* We only know how to handle two kinds of insns: ! 2335: conditional jumps, and those that set the condition codes. */ ! 2336: else if (GET_CODE (p) == INSN && GET_CODE (PATTERN (p)) == SET ! 2337: && SET_DEST (PATTERN (p)) == cc0_rtx) ! 2338: { ! 2339: prev_insn_cc0 = fold_cc0 (copy_rtx (SET_SRC (PATTERN (p)))); ! 2340: } ! 2341: else if (GET_CODE (p) == JUMP_INSN ! 2342: && GET_CODE (PATTERN (p)) == SET ! 2343: && SET_DEST (PATTERN (p)) == pc_rtx) ! 2344: { ! 2345: register rtx target ! 2346: = fold_rtx (SET_SRC (PATTERN (p)), 1); ! 2347: if (GET_CODE (target) == LABEL_REF) ! 2348: p = XEXP (target, 0); ! 2349: else if (target != pc_rtx) ! 2350: /* If destination of jump is not fixed, give up. */ ! 2351: break; ! 2352: count++; ! 2353: } ! 2354: /* Any other kind of insn means we don't know ! 2355: what result the test will have. */ ! 2356: else ! 2357: break; ! 2358: ! 2359: /* Arriving at top of loop means we can drop straight in. ! 2360: Check here because we can arrive only via a jump insn ! 2361: which would have changed P above. */ ! 2362: if (p == loop_top_label) ! 2363: { ! 2364: disposition = DELETE_JUMP; ! 2365: break; ! 2366: } ! 2367: /* We went past one insn; consider the next. */ ! 2368: p = NEXT_INSN (p); ! 2369: } ! 2370: if (disposition == DELETE_JUMP) ! 2371: { ! 2372: /* We know the loop test will succeed the first time, ! 2373: so delete the jump to the test; drop right into loop. ! 2374: Note that one call to delete_insn gets the BARRIER as well. */ ! 2375: delete_insn (jump); ! 2376: } ! 2377: if (disposition == DELETE_LOOP) ! 2378: { ! 2379: /* We know the endtest will fail and drop right out of the loop, ! 2380: but it isn't safe to delete the loop here. ! 2381: There could be jumps into it from outside. ! 2382: So make the entry-jump jump around the loop. ! 2383: This will cause find_basic_blocks to delete it if appropriate. */ ! 2384: register rtx label = gen_label_rtx (); ! 2385: emit_label_after (label, p); ! 2386: redirect_jump (jump, label); ! 2387: } ! 2388: } ! 2389: ! 2390: /* CSE processing for one instruction. ! 2391: First simplify sources and addresses of all assignments ! 2392: in the instruction, using previously-computed equivalents values. ! 2393: Then install the new sources and destinations in the table ! 2394: of available values. */ ! 2395: ! 2396: static rtx set[MAX_SETS_PER_INSN]; ! 2397: static struct table_elt *src_elt[MAX_SETS_PER_INSN]; ! 2398: static int src_hash_code[MAX_SETS_PER_INSN]; ! 2399: static int dest_hash_code[MAX_SETS_PER_INSN]; ! 2400: static char src_in_memory[MAX_SETS_PER_INSN]; ! 2401: static char src_in_struct[MAX_SETS_PER_INSN]; ! 2402: static rtx inner_dest[MAX_SETS_PER_INSN]; ! 2403: static char src_volatile[MAX_SETS_PER_INSN]; ! 2404: ! 2405: static void ! 2406: cse_insn (insn) ! 2407: rtx insn; ! 2408: { ! 2409: register rtx x = PATTERN (insn); ! 2410: register int i; ! 2411: register int n_sets = 0; ! 2412: ! 2413: /* Records what this insn does to set CC0, ! 2414: using same encoding used for prev_insn_cc0. */ ! 2415: int this_insn_cc0 = 0; ! 2416: struct write_data writes_memory; ! 2417: static struct write_data init = {0, 0, 0}; ! 2418: ! 2419: rtx src_eqv = 0; ! 2420: struct table_elt *src_eqv_elt = 0; ! 2421: int src_eqv_in_memory; ! 2422: int src_eqv_in_struct; ! 2423: int src_eqv_volatile = 0; ! 2424: int src_eqv_hash_code; ! 2425: ! 2426: this_insn = insn; ! 2427: writes_memory = init; ! 2428: ! 2429: /* Find all the SETs and CLOBBERs in this instruction. ! 2430: Record all the SETs in the array `set' and count them. ! 2431: Also determine whether there is a CLOBBER that invalidates ! 2432: all memory references, or all references at varying addresses. */ ! 2433: ! 2434: if (GET_CODE (x) == SET) ! 2435: { ! 2436: rtx tem; ! 2437: n_sets = 1; ! 2438: set[0] = x; ! 2439: tem = find_reg_note (insn, REG_EQUIV, 0); ! 2440: if (tem == 0) ! 2441: tem = find_reg_note (insn, REG_EQUAL, 0); ! 2442: if (tem) src_eqv = XEXP (tem, 0); ! 2443: ! 2444: /* Return now for unconditional jumps. ! 2445: They never need cse processing, so this does not hurt. ! 2446: The reason is not efficiency but rather ! 2447: so that we can test at the end for instructions ! 2448: that have been simplified to unconditional jumps ! 2449: and not be misled by unchanged instructions ! 2450: that were unconditional jumps to begin with. */ ! 2451: if (SET_DEST (x) == pc_rtx ! 2452: && GET_CODE (SET_SRC (x)) == LABEL_REF) ! 2453: return; ! 2454: } ! 2455: else if (GET_CODE (x) == PARALLEL) ! 2456: { ! 2457: register int lim = XVECLEN (x, 0); ! 2458: for (i = 0; i < lim; i++) ! 2459: { ! 2460: register rtx y = XVECEXP (x, 0, i); ! 2461: if (GET_CODE (y) == SET) ! 2462: set[n_sets++] = y; ! 2463: else if (GET_CODE (y) == CLOBBER) ! 2464: note_mem_written (XEXP (y, 0), &writes_memory); ! 2465: else if (GET_CODE (y) == CALL) ! 2466: canon_reg (y); ! 2467: } ! 2468: } ! 2469: else if (GET_CODE (x) == CLOBBER) ! 2470: note_mem_written (XEXP (x, 0), &writes_memory); ! 2471: else if (GET_CODE (x) == CALL) ! 2472: canon_reg (x); ! 2473: ! 2474: if (n_sets == 0) ! 2475: { ! 2476: invalidate_from_clobbers (&writes_memory, x); ! 2477: return; ! 2478: } ! 2479: ! 2480: /* Canonicalize sources and addresses of destinations. ! 2481: set src_elt[i] to the class each source belongs to. ! 2482: Detect assignments from or to volatile things ! 2483: and set set[i] to zero so they will be ignored ! 2484: in the rest of this function. ! 2485: ! 2486: Nothing in this loop changes the hash table or the register chains. */ ! 2487: ! 2488: for (i = 0; i < n_sets; i++) ! 2489: { ! 2490: register rtx src, dest; ! 2491: register struct table_elt *elt; ! 2492: enum machine_mode mode; ! 2493: ! 2494: dest = SET_DEST (set[i]); ! 2495: src = SET_SRC (set[i]); ! 2496: ! 2497: /* If SRC is a constant that has no machine mode, ! 2498: hash it with the destination's machine mode. ! 2499: This way we can keep different modes separate. */ ! 2500: ! 2501: mode = GET_MODE (src) == VOIDmode ? GET_MODE (dest) : GET_MODE (src); ! 2502: ! 2503: /* Replace each registers in SRC with oldest equivalent register, ! 2504: but if DEST is a register do not replace it if it appears in SRC. */ ! 2505: ! 2506: if (GET_CODE (dest) == REG) ! 2507: { ! 2508: int tem = reg_qty[REGNO (dest)]; ! 2509: reg_qty[REGNO (dest)] = REGNO (dest); ! 2510: src = canon_reg (src); ! 2511: if (src_eqv) ! 2512: src_eqv = canon_reg (src_eqv); ! 2513: reg_qty[REGNO (dest)] = tem; ! 2514: } ! 2515: else ! 2516: { ! 2517: src = canon_reg (src); ! 2518: if (src_eqv) ! 2519: src_eqv = canon_reg (src_eqv); ! 2520: } ! 2521: ! 2522: if (src_eqv) ! 2523: { ! 2524: enum machine_mode eqvmode = mode; ! 2525: if (GET_CODE (dest) == STRICT_LOW_PART) ! 2526: eqvmode = GET_MODE (SUBREG_REG (XEXP (dest, 0))); ! 2527: do_not_record = 0; ! 2528: hash_arg_in_memory = 0; ! 2529: hash_arg_in_struct = 0; ! 2530: src_eqv = fold_rtx (src_eqv, 0); ! 2531: src_eqv_hash_code = HASH (src_eqv, eqvmode); ! 2532: ! 2533: /* Replace the src_eqv with its cheapest equivalent. */ ! 2534: ! 2535: if (!do_not_record) ! 2536: { ! 2537: elt = lookup (src_eqv, src_eqv_hash_code, eqvmode); ! 2538: if (elt && elt != elt->first_same_value) ! 2539: { ! 2540: elt = elt->first_same_value; ! 2541: /* Find the cheapest one that is still valid. */ ! 2542: while ((GET_CODE (elt->exp) != REG ! 2543: && !exp_equiv_p (elt->exp, elt->exp, 1)) ! 2544: || elt->equivalence_only) ! 2545: elt = elt->next_same_value; ! 2546: src_eqv = copy_rtx (elt->exp); ! 2547: hash_arg_in_memory = 0; ! 2548: hash_arg_in_struct = 0; ! 2549: src_eqv_hash_code = HASH (src_eqv, elt->mode); ! 2550: } ! 2551: src_eqv_elt = elt; ! 2552: } ! 2553: else ! 2554: src_eqv = 0; ! 2555: ! 2556: src_eqv_in_memory = hash_arg_in_memory; ! 2557: src_eqv_in_struct = hash_arg_in_struct; ! 2558: } ! 2559: ! 2560: /* Compute SRC's hash code, and also notice if it ! 2561: should not be recorded at all. In that case, ! 2562: prevent any further processing of this assignment. */ ! 2563: do_not_record = 0; ! 2564: hash_arg_in_memory = 0; ! 2565: hash_arg_in_struct = 0; ! 2566: src = fold_rtx (src, 0); ! 2567: /* If we have (NOT Y), see if Y is known to be (NOT Z). ! 2568: If so, (NOT Y) simplifies to Z. */ ! 2569: if (GET_CODE (src) == NOT || GET_CODE (src) == NEG) ! 2570: { ! 2571: rtx y = lookup_as_function (XEXP (src, 0), GET_CODE (src)); ! 2572: if (y != 0) ! 2573: src = y; ! 2574: } ! 2575: ! 2576: /* If storing a constant value in a register that ! 2577: previously held the constant value 0, ! 2578: record this fact with a REG_WAS_0 note on this insn. */ ! 2579: if (GET_CODE (src) == CONST_INT ! 2580: && GET_CODE (dest) == REG ! 2581: && n_sets == 0 ! 2582: && qty_const[reg_qty[REGNO (dest)]] == const0_rtx) ! 2583: REG_NOTES (insn) = gen_rtx (INSN_LIST, REG_WAS_0, ! 2584: qty_const_insn[reg_qty[REGNO (dest)]], ! 2585: REG_NOTES (insn)); ! 2586: ! 2587: src_hash_code[i] = HASH (src, mode); ! 2588: ! 2589: src_volatile[i] = do_not_record; ! 2590: ! 2591: #if 0 ! 2592: /* This code caused multiple hash-table entries ! 2593: to be created for registers. Invalidation ! 2594: would only get one, leaving others that didn't belong. ! 2595: I don't know what good this ever did. */ ! 2596: if (GET_CODE (src) == REG) ! 2597: { ! 2598: src_in_memory[i] = 0; ! 2599: src_elt[i] = 0; ! 2600: } ! 2601: else ...; ! 2602: #endif ! 2603: /* If source is a perverse subreg (such as QI treated as an SI), ! 2604: treat it as volatile. It may do the work of an SI in one context ! 2605: where the extra bits are not being used, but cannot replace an SI ! 2606: in general. */ ! 2607: if (GET_CODE (src) == SUBREG ! 2608: && (GET_MODE_SIZE (GET_MODE (src)) ! 2609: > GET_MODE_SIZE (GET_MODE (SUBREG_REG (src))))) ! 2610: src_volatile[i] = 1; ! 2611: else if (!src_volatile[i]) ! 2612: { ! 2613: /* Replace the source with its cheapest equivalent. */ ! 2614: ! 2615: elt = lookup (src, src_hash_code[i], mode); ! 2616: if (elt && elt != elt->first_same_value) ! 2617: { ! 2618: elt = elt->first_same_value; ! 2619: /* Find the cheapest one that is still valid. */ ! 2620: while ((GET_CODE (elt->exp) != REG ! 2621: && !exp_equiv_p (elt->exp, elt->exp, 1)) ! 2622: || elt->equivalence_only) ! 2623: elt = elt->next_same_value; ! 2624: src = copy_rtx (elt->exp); ! 2625: hash_arg_in_memory = 0; ! 2626: hash_arg_in_struct = 0; ! 2627: src_hash_code[i] = HASH (src, elt->mode); ! 2628: } ! 2629: ! 2630: /* If ELT is a constant, is there a register ! 2631: linearly related to it? If so, replace it ! 2632: with the sum of that register plus an offset. */ ! 2633: ! 2634: if (GET_CODE (src) == CONST && n_sets == 1 ! 2635: && SET_DEST (set[i]) != cc0_rtx) ! 2636: { ! 2637: rtx newsrc = use_related_value (src, elt); ! 2638: if (newsrc == 0 && src_eqv != 0) ! 2639: newsrc = use_related_value (src_eqv, src_eqv_elt); ! 2640: if (newsrc) ! 2641: { ! 2642: rtx oldsrc = src; ! 2643: src = newsrc; ! 2644: hash_arg_in_memory = 0; ! 2645: hash_arg_in_struct = 0; ! 2646: src_hash_code[i] = HASH (src, GET_MODE (src)); ! 2647: /* The new expression for the SRC has the same value ! 2648: as the previous one; so if the previous one is in ! 2649: the hash table, put the new one in as equivalent. */ ! 2650: if (elt != 0) ! 2651: elt = insert (src, elt->first_same_value, src_hash_code[i], ! 2652: elt->mode); ! 2653: else ! 2654: { ! 2655: /* Maybe the new expression is in the table already. */ ! 2656: elt = lookup (src, src_hash_code[i], mode); ! 2657: /* And maybe a register contains the same value. */ ! 2658: if (elt && elt != elt->first_same_value) ! 2659: { ! 2660: elt = elt->first_same_value; ! 2661: /* Find the cheapest one that is still valid. */ ! 2662: while ((GET_CODE (elt->exp) != REG ! 2663: && !exp_equiv_p (elt->exp, elt->exp, 1)) ! 2664: || elt->equivalence_only) ! 2665: elt = elt->next_same_value; ! 2666: src = copy_rtx (elt->exp); ! 2667: hash_arg_in_memory = 0; ! 2668: hash_arg_in_struct = 0; ! 2669: src_hash_code[i] = HASH (src, elt->mode); ! 2670: } ! 2671: } ! 2672: ! 2673: /* This would normally be inhibited by the REG_EQUIV ! 2674: note we are about to make. */ ! 2675: SET_SRC (set[i]) = src; ! 2676: ! 2677: /* Record the actual constant value in a REG_EQUIV note. */ ! 2678: if (GET_CODE (SET_DEST (set[i])) == REG) ! 2679: REG_NOTES (insn) = gen_rtx (EXPR_LIST, REG_EQUIV, ! 2680: oldsrc, 0); ! 2681: } ! 2682: } ! 2683: ! 2684: src_elt[i] = elt; ! 2685: src_in_memory[i] = hash_arg_in_memory; ! 2686: src_in_struct[i] = hash_arg_in_struct; ! 2687: } ! 2688: ! 2689: /* Either canon_reg or the copy_rtx may have changed this. */ ! 2690: /* Note it is not safe to replace the sources if there ! 2691: is more than one set. We could get an insn ! 2692: [(set (reg) (reg)) (set (reg) (reg))], which is probably ! 2693: not in the machine description. ! 2694: This case we could handle by breaking into several insns. ! 2695: Cases of partial substitution cannot win at all. */ ! 2696: /* Also, if this insn is setting a "constant" register, ! 2697: we may not replace the value that is given to it. */ ! 2698: if (n_sets == 1) ! 2699: if (REG_NOTES (insn) == 0 ! 2700: || REG_NOTE_KIND (REG_NOTES (insn)) != REG_EQUIV) ! 2701: SET_SRC (set[i]) = src; ! 2702: ! 2703: do_not_record = 0; ! 2704: ! 2705: /* Look within any SIGN_EXTRACT or ZERO_EXTRACT ! 2706: to the MEM or REG within it. */ ! 2707: while (1) ! 2708: { ! 2709: if (GET_CODE (dest) == SIGN_EXTRACT ! 2710: || GET_CODE (dest) == ZERO_EXTRACT) ! 2711: { ! 2712: XEXP (dest, 1) = canon_reg (XEXP (dest, 1)); ! 2713: XEXP (dest, 2) = canon_reg (XEXP (dest, 2)); ! 2714: dest = XEXP (dest, 0); ! 2715: } ! 2716: else if (GET_CODE (dest) == SUBREG ! 2717: || GET_CODE (dest) == STRICT_LOW_PART) ! 2718: dest = XEXP (dest, 0); ! 2719: else ! 2720: break; ! 2721: } ! 2722: ! 2723: inner_dest[i] = dest; ! 2724: ! 2725: /* If storing into memory, do cse on the memory address. ! 2726: Also compute the hash code of the destination now, ! 2727: before the effects of this instruction are recorded, ! 2728: since the register values used in the address computation ! 2729: are those before this instruction. */ ! 2730: if (GET_CODE (dest) == MEM) ! 2731: { ! 2732: register rtx addr; ! 2733: register int hash; ! 2734: ! 2735: canon_reg (dest); ! 2736: dest = fold_rtx (dest, 0); ! 2737: addr = XEXP (dest, 0); ! 2738: ! 2739: /* Pushing or popping does not invalidate anything. */ ! 2740: if ((GET_CODE (addr) == PRE_DEC || GET_CODE (addr) == PRE_INC ! 2741: || GET_CODE (addr) == POST_DEC || GET_CODE (addr) == POST_INC) ! 2742: && GET_CODE (XEXP (addr, 0)) == REG ! 2743: && REGNO (XEXP (addr, 0)) == STACK_POINTER_REGNUM) ! 2744: ; ! 2745: else ! 2746: /* Otherwise, decide whether we invalidate ! 2747: everything in memory, or just things at non-fixed places. ! 2748: Writing a large aggregate must invalidate everything ! 2749: because we don't know how long it is. */ ! 2750: note_mem_written (dest, &writes_memory); ! 2751: ! 2752: /* Do not consider addresses of local and argument slots. ! 2753: The MEM expressions for args and non-register local variables ! 2754: are made only once and inserted in many instructions, ! 2755: as well as being used to control symbol table output. ! 2756: It is not safe to clobber them. */ ! 2757: if ((GET_CODE (addr) == PLUS ! 2758: && GET_CODE (XEXP (addr, 0)) == REG ! 2759: && GET_CODE (XEXP (addr, 1)) == CONST_INT ! 2760: && (hash = REGNO (XEXP (addr, 0)), ! 2761: hash == FRAME_POINTER_REGNUM || hash == ARG_POINTER_REGNUM)) ! 2762: || (GET_CODE (addr) == REG ! 2763: && (hash = REGNO (addr), ! 2764: hash == FRAME_POINTER_REGNUM || hash == ARG_POINTER_REGNUM))) ! 2765: dest_hash_code[i] = safe_hash (dest) % NBUCKETS; ! 2766: else ! 2767: { ! 2768: /* Look for a simpler equivalent for the destination address. */ ! 2769: hash = HASH (addr, Pmode); ! 2770: if (! do_not_record) ! 2771: { ! 2772: elt = lookup (addr, hash, Pmode); ! 2773: dest_hash_code[i] = ((int) MEM + hash) % NBUCKETS; ! 2774: ! 2775: if (elt && elt != elt->first_same_value) ! 2776: { ! 2777: elt = elt->first_same_value; ! 2778: /* Find the cheapest one that is still valid. */ ! 2779: while ((GET_CODE (elt->exp) != REG ! 2780: && !exp_equiv_p (elt->exp, elt->exp, 1)) ! 2781: || elt->equivalence_only) ! 2782: elt = elt->next_same_value; ! 2783: ! 2784: addr = copy_rtx (elt->exp); ! 2785: /* Create a new MEM rtx, in case the old one ! 2786: is shared somewhere else. */ ! 2787: dest = gen_rtx (MEM, GET_MODE (dest), addr); ! 2788: dest->volatil = inner_dest[i]->volatil; ! 2789: SET_DEST (set[i]) = dest; ! 2790: inner_dest[i] = dest; ! 2791: } ! 2792: } ! 2793: } ! 2794: } ! 2795: ! 2796: /* Don't enter a bit-field in the hash table ! 2797: because the value in it after the store ! 2798: may not equal what was stored, due to truncation. */ ! 2799: ! 2800: if (GET_CODE (SET_DEST (set[i])) == ZERO_EXTRACT ! 2801: || GET_CODE (SET_DEST (set[i])) == SIGN_EXTRACT) ! 2802: src_volatile[i] = 1, src_eqv = 0; ! 2803: ! 2804: /* No further processing for this assignment ! 2805: if destination is volatile. */ ! 2806: ! 2807: else if (do_not_record ! 2808: || (GET_CODE (dest) == REG ! 2809: ? REGNO (dest) == STACK_POINTER_REGNUM ! 2810: : GET_CODE (dest) != MEM)) ! 2811: set[i] = 0; ! 2812: ! 2813: if (set[i] != 0 && dest != SET_DEST (set[i])) ! 2814: dest_hash_code[i] = HASH (SET_DEST (set[i]), mode); ! 2815: ! 2816: if (dest == cc0_rtx ! 2817: && (GET_CODE (src) == MINUS ! 2818: || CONSTANT_P (src) ! 2819: || GET_CODE (src) == REG)) ! 2820: this_insn_cc0 = fold_cc0 (src); ! 2821: } ! 2822: ! 2823: /* Now enter all non-volatile source expressions in the hash table ! 2824: if they are not already present. ! 2825: Record in src_elt the heads of their equivalence classes. ! 2826: This way we can insert the corresponding destinations into ! 2827: the same classes even if the actual sources are no longer in them ! 2828: (having been invalidated). */ ! 2829: ! 2830: if (src_eqv && src_eqv_elt == 0 && set[0] != 0) ! 2831: { ! 2832: register struct table_elt *elt; ! 2833: rtx dest = SET_DEST (set[0]); ! 2834: enum machine_mode eqvmode = GET_MODE (dest); ! 2835: ! 2836: if (GET_CODE (dest) == STRICT_LOW_PART) ! 2837: eqvmode = GET_MODE (SUBREG_REG (XEXP (dest, 0))); ! 2838: if (insert_regs (src_eqv, 0, 0)) ! 2839: src_eqv_hash_code = HASH (src_eqv, eqvmode); ! 2840: elt = insert (src_eqv, 0, src_eqv_hash_code, eqvmode); ! 2841: elt->in_memory = src_eqv_in_memory; ! 2842: elt->in_struct = src_eqv_in_struct; ! 2843: elt->equivalence_only = 1; ! 2844: src_eqv_elt = elt->first_same_value; ! 2845: } ! 2846: ! 2847: for (i = 0; i < n_sets; i++) ! 2848: if (set[i] && ! src_volatile[i]) ! 2849: { ! 2850: if (GET_CODE (SET_DEST (set[i])) == STRICT_LOW_PART) ! 2851: { ! 2852: src_elt[i] = src_eqv_elt; ! 2853: src_hash_code[i] = src_eqv_hash_code; ! 2854: } ! 2855: else if (src_elt[i] == 0) ! 2856: { ! 2857: register rtx src = SET_SRC (set[i]); ! 2858: register rtx dest = SET_DEST (set[i]); ! 2859: register struct table_elt *elt; ! 2860: enum machine_mode mode ! 2861: = GET_MODE (src) == VOIDmode ? GET_MODE (dest) : GET_MODE (src); ! 2862: ! 2863: /* Note that these insert_regs calls cannot remove ! 2864: any of the src_elt's, because they would have failed to match ! 2865: if not still valid. */ ! 2866: if (insert_regs (src, 0, 0)) ! 2867: src_hash_code[i] = HASH (src, mode); ! 2868: elt = insert (src, src_eqv_elt, src_hash_code[i], mode); ! 2869: elt->in_memory = src_in_memory[i]; ! 2870: elt->in_struct = src_in_struct[i]; ! 2871: src_elt[i] = elt->first_same_value; ! 2872: } ! 2873: } ! 2874: ! 2875: invalidate_from_clobbers (&writes_memory, x); ! 2876: ! 2877: /* Now invalidate everything set by this instruction. ! 2878: If a SUBREG or other funny destination is being set, ! 2879: set[i] is still nonzero, so here we invalidate the reg ! 2880: a part of which is being set. */ ! 2881: ! 2882: for (i = 0; i < n_sets; i++) ! 2883: if (set[i]) ! 2884: { ! 2885: register rtx dest = inner_dest[i]; ! 2886: ! 2887: /* Needed for registers to remove the register from its ! 2888: previous quantity's chain. ! 2889: Needed for memory if this is a nonvarying address, unless ! 2890: we have just done an invalidate_memory that covers even those. */ ! 2891: if (GET_CODE (dest) == REG || GET_CODE (dest) == SUBREG ! 2892: || (! writes_memory.all && ! cse_rtx_addr_varies_p (dest))) ! 2893: invalidate (dest); ! 2894: } ! 2895: ! 2896: /* Make sure registers mentioned in destinations ! 2897: are safe for use in an expression to be inserted. ! 2898: This removes from the hash table ! 2899: any invalid entry that refers to one of these registers. */ ! 2900: ! 2901: for (i = 0; i < n_sets; i++) ! 2902: if (set[i] && GET_CODE (SET_DEST (set[i])) != REG) ! 2903: mention_regs (SET_DEST (set[i])); ! 2904: ! 2905: /* We may have just removed some of the src_elt's from the hash table. ! 2906: So replace each one with the current head of the same class. */ ! 2907: ! 2908: for (i = 0; i < n_sets; i++) ! 2909: if (set[i]) ! 2910: { ! 2911: /* If the source is volatile, its destination goes in ! 2912: a class of its own. */ ! 2913: if (src_volatile[i]) ! 2914: src_elt[i] = 0; ! 2915: ! 2916: if (src_elt[i] && src_elt[i]->first_same_value == 0) ! 2917: /* If elt was removed, find current head of same class, ! 2918: or 0 if nothing remains of that class. */ ! 2919: { ! 2920: register struct table_elt *elt = src_elt[i]; ! 2921: ! 2922: while (elt && elt->first_same_value == 0) ! 2923: elt = elt->next_same_value; ! 2924: src_elt[i] = elt ? elt->first_same_value : 0; ! 2925: } ! 2926: } ! 2927: ! 2928: /* Now insert the destinations into their equivalence classes. */ ! 2929: ! 2930: for (i = 0; i < n_sets; i++) ! 2931: if (set[i]) ! 2932: { ! 2933: register rtx dest = SET_DEST (set[i]); ! 2934: register struct table_elt *elt; ! 2935: ! 2936: /* STRICT_LOW_PART isn't part of the value BEING set, ! 2937: and neither is the SUBREG inside it. ! 2938: Note that in this case SRC_ELT[I] is really SRC_EQV_ELT. */ ! 2939: if (GET_CODE (dest) == STRICT_LOW_PART) ! 2940: dest = SUBREG_REG (XEXP (dest, 0)); ! 2941: ! 2942: if (GET_CODE (dest) == REG || GET_CODE (dest) == SUBREG) ! 2943: /* Registers must also be inserted into chains for quantities. */ ! 2944: if (insert_regs (dest, src_elt[i], 1)) ! 2945: /* If `insert_regs' changes something, the hash code must be ! 2946: recalculated. */ ! 2947: dest_hash_code[i] = safe_hash (dest) % NBUCKETS; ! 2948: ! 2949: elt = insert (dest, src_elt[i], dest_hash_code[i], GET_MODE (dest)); ! 2950: elt->in_memory = GET_CODE (inner_dest[i]) == MEM; ! 2951: if (elt->in_memory) ! 2952: { ! 2953: elt->in_struct = (inner_dest[i]->in_struct ! 2954: || inner_dest[i] != SET_DEST (set[i])); ! 2955: } ! 2956: } ! 2957: ! 2958: /* Special handling for (set REG0 REG1) ! 2959: where REG0 is the "cheapest", cheaper than REG1. ! 2960: After cse, REG1 will probably not be used in the sequel, ! 2961: so (if easily done) change this insn to (set REG1 REG0) and ! 2962: replace REG1 with REG0 in the previous insn that computed their value. ! 2963: Then REG1 will become a dead store and won't cloud the situation ! 2964: for later optimizations. */ ! 2965: if (n_sets == 1 && set[0] && GET_CODE (SET_DEST (set[0])) == REG ! 2966: && GET_CODE (SET_SRC (set[0])) == REG ! 2967: && rtx_equal_p (canon_reg (SET_SRC (set[0])), SET_DEST (set[0]))) ! 2968: { ! 2969: rtx prev = PREV_INSN (insn); ! 2970: while (prev && GET_CODE (prev) == NOTE) ! 2971: prev = PREV_INSN (prev); ! 2972: ! 2973: if (prev && GET_CODE (prev) == INSN && GET_CODE (PATTERN (prev)) == SET ! 2974: && SET_DEST (PATTERN (prev)) == SET_SRC (set[0])) ! 2975: { ! 2976: rtx dest = SET_DEST (set[0]); ! 2977: SET_DEST (PATTERN (prev)) = dest; ! 2978: SET_DEST (set[0]) = SET_SRC (set[0]); ! 2979: SET_SRC (set[0]) = dest; ! 2980: } ! 2981: } ! 2982: ! 2983: /* Did this insn become an unconditional branch or become a no-op? */ ! 2984: if (GET_CODE (insn) == JUMP_INSN ! 2985: && GET_CODE (x) == SET ! 2986: && SET_DEST (x) == pc_rtx) ! 2987: { ! 2988: if (SET_SRC (x) == pc_rtx) ! 2989: { ! 2990: PUT_CODE (insn, NOTE); ! 2991: NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED; ! 2992: NOTE_SOURCE_FILE (insn) = 0; ! 2993: cse_jumps_altered = 1; ! 2994: /* If previous insn just set CC0 for us, delete it too. */ ! 2995: if (prev_insn_cc0 != 0) ! 2996: { ! 2997: PUT_CODE (prev_insn, NOTE); ! 2998: NOTE_LINE_NUMBER (prev_insn) = NOTE_INSN_DELETED; ! 2999: NOTE_SOURCE_FILE (prev_insn) = 0; ! 3000: } ! 3001: } ! 3002: else if (GET_CODE (SET_SRC (x)) == LABEL_REF) ! 3003: { ! 3004: emit_barrier_after (insn); ! 3005: cse_jumps_altered = 1; ! 3006: /* If previous insn just set CC0 for us, delete it too. */ ! 3007: if (prev_insn_cc0 != 0) ! 3008: { ! 3009: PUT_CODE (prev_insn, NOTE); ! 3010: NOTE_LINE_NUMBER (prev_insn) = NOTE_INSN_DELETED; ! 3011: NOTE_SOURCE_FILE (prev_insn) = 0; ! 3012: } ! 3013: } ! 3014: } ! 3015: ! 3016: /* If this insn used to store a value based on CC0 but now value is constant, ! 3017: and the previous insn just set CC0 for us, delete previous insn. ! 3018: Here we use the fact that nothing expects CC0 to be valid over an insn, ! 3019: which is true until the final pass. */ ! 3020: if (GET_CODE (x) == SET && prev_insn_cc0 ! 3021: && CONSTANT_P (SET_SRC (x))) ! 3022: { ! 3023: PUT_CODE (prev_insn, NOTE); ! 3024: NOTE_LINE_NUMBER (prev_insn) = NOTE_INSN_DELETED; ! 3025: NOTE_SOURCE_FILE (prev_insn) = 0; ! 3026: } ! 3027: ! 3028: prev_insn_cc0 = this_insn_cc0; ! 3029: prev_insn = insn; ! 3030: } ! 3031: ! 3032: /* Store 1 in *WRITES_PTR for those categories of memory ref ! 3033: that must be invalidated when the expression WRITTEN is stored in. ! 3034: If WRITTEN is null, say everything must be invalidated. */ ! 3035: ! 3036: static void ! 3037: note_mem_written (written, writes_ptr) ! 3038: rtx written; ! 3039: struct write_data *writes_ptr; ! 3040: { ! 3041: static struct write_data everything = {1, 1, 1}; ! 3042: ! 3043: if (written == 0) ! 3044: *writes_ptr = everything; ! 3045: else if (GET_CODE (written) == MEM) ! 3046: { ! 3047: /* Pushing or popping the stack invalidates nothing. */ ! 3048: rtx addr = XEXP (written, 0); ! 3049: if ((GET_CODE (addr) == PRE_DEC || GET_CODE (addr) == PRE_INC ! 3050: || GET_CODE (addr) == POST_DEC || GET_CODE (addr) == POST_INC) ! 3051: && GET_CODE (XEXP (addr, 0)) == REG ! 3052: && REGNO (XEXP (addr, 0)) == STACK_POINTER_REGNUM) ! 3053: return; ! 3054: if (GET_MODE (written) == BLKmode) ! 3055: *writes_ptr = everything; ! 3056: else if (cse_rtx_addr_varies_p (written)) ! 3057: { ! 3058: /* A varying address that is a sum indicates an array element, ! 3059: and that's just as good as a structure element ! 3060: in implying that we need not invalidate scalar variables. */ ! 3061: if (!(written->in_struct ! 3062: || GET_CODE (XEXP (written, 0)) == PLUS)) ! 3063: writes_ptr->all = 1; ! 3064: writes_ptr->nonscalar = 1; ! 3065: } ! 3066: writes_ptr->var = 1; ! 3067: } ! 3068: } ! 3069: ! 3070: /* Perform invalidation on the basis of everything about an insn ! 3071: except for invalidating the actual places that are SET in it. ! 3072: This includes the places CLOBBERed, and anything that might ! 3073: alias with something that is SET or CLOBBERed. ! 3074: ! 3075: W points to the writes_memory for this insn, a struct write_data ! 3076: saying which kinds of memory references must be invalidated. ! 3077: X is the pattern of the insn. */ ! 3078: ! 3079: static void ! 3080: invalidate_from_clobbers (w, x) ! 3081: struct write_data *w; ! 3082: rtx x; ! 3083: { ! 3084: /* If W->var is not set, W specifies no action. ! 3085: If W->all is set, this step gets all memory refs ! 3086: so they can be ignored in the rest of this function. */ ! 3087: if (w->var) ! 3088: invalidate_memory (w); ! 3089: ! 3090: if (GET_CODE (x) == CLOBBER) ! 3091: { ! 3092: rtx ref = XEXP (x, 0); ! 3093: if (ref ! 3094: && (GET_CODE (ref) == REG || GET_CODE (ref) == SUBREG ! 3095: || (GET_CODE (ref) == MEM && ! w->all))) ! 3096: invalidate (ref); ! 3097: } ! 3098: else if (GET_CODE (x) == PARALLEL) ! 3099: { ! 3100: register int i; ! 3101: for (i = XVECLEN (x, 0) - 1; i >= 0; i--) ! 3102: { ! 3103: register rtx y = XVECEXP (x, 0, i); ! 3104: if (GET_CODE (y) == CLOBBER) ! 3105: { ! 3106: rtx ref = XEXP (y, 0); ! 3107: if (ref ! 3108: &&(GET_CODE (ref) == REG || GET_CODE (ref) == SUBREG ! 3109: || (GET_CODE (ref) == MEM && !w->all))) ! 3110: invalidate (ref); ! 3111: } ! 3112: } ! 3113: } ! 3114: } ! 3115: ! 3116: static void cse_basic_block (); ! 3117: ! 3118: /* Perform cse on the instructions of a function. ! 3119: F is the first instruction. ! 3120: NREGS is one plus the highest pseudo-reg number used in the instruction. ! 3121: ! 3122: Returns 1 if jump_optimize should be redone due to simplifications ! 3123: in conditional jump instructions. */ ! 3124: ! 3125: int ! 3126: cse_main (f, nregs) ! 3127: /* f is the first instruction of a chain of insns for one function */ ! 3128: rtx f; ! 3129: /* nregs is the total number of registers used in it */ ! 3130: int nregs; ! 3131: { ! 3132: register rtx insn = f; ! 3133: register int i; ! 3134: ! 3135: cse_jumps_altered = 0; ! 3136: ! 3137: init_recog (); ! 3138: ! 3139: max_reg = nregs; ! 3140: ! 3141: all_minus_one = (int *) alloca (nregs * sizeof (int)); ! 3142: consec_ints = (int *) alloca (nregs * sizeof (int)); ! 3143: for (i = 0; i < nregs; i++) ! 3144: { ! 3145: all_minus_one[i] = -1; ! 3146: consec_ints[i] = i; ! 3147: } ! 3148: ! 3149: reg_next_eqv = (int *) alloca (nregs * sizeof (int)); ! 3150: reg_prev_eqv = (int *) alloca (nregs * sizeof (int)); ! 3151: reg_qty = (int *) alloca (nregs * sizeof (int)); ! 3152: reg_rtx = (rtx *) alloca (nregs * sizeof (rtx)); ! 3153: reg_in_table = (int *) alloca (nregs * sizeof (int)); ! 3154: reg_tick = (int *) alloca (nregs * sizeof (int)); ! 3155: ! 3156: /* Discard all the free elements of the previous function ! 3157: since they are allocated in the temporarily obstack. */ ! 3158: bzero (table, sizeof table); ! 3159: free_element_chain = 0; ! 3160: n_elements_made = 0; ! 3161: ! 3162: /* Loop over basic blocks */ ! 3163: while (insn) ! 3164: { ! 3165: register rtx p = insn; ! 3166: register int i = 0; ! 3167: register int last_uid; ! 3168: ! 3169: /* Find end of next basic block */ ! 3170: while (p && GET_CODE (p) != CODE_LABEL) ! 3171: { ! 3172: /* Don't cse out the end of a loop. This makes a difference ! 3173: only for the unusual loops that always execute at least once; ! 3174: all other loops have labels there so we will stop in any case. ! 3175: Cse'ing out the end of the loop is dangerous because it ! 3176: might cause an invariant expression inside the loop ! 3177: to be reused after the end of the loop. This would make it ! 3178: hard to move the expression out of the loop in loop.c, ! 3179: especially if it is one of several equivalent expressions ! 3180: and loop.c would like to eliminate it. ! 3181: The occasional optimizations lost by this will all come back ! 3182: if loop and cse are made to work alternatingly. */ ! 3183: if (GET_CODE (p) == NOTE ! 3184: && NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_END) ! 3185: break; ! 3186: ! 3187: last_uid = INSN_UID (p); ! 3188: p = NEXT_INSN (p); ! 3189: i++; ! 3190: } ! 3191: ! 3192: cse_basic_block_end = last_uid; ! 3193: cse_basic_block_start = INSN_UID (insn); ! 3194: ! 3195: max_qty = max_reg + i * MAX_SETS_PER_INSN; ! 3196: ! 3197: cse_basic_block (insn, p); ! 3198: ! 3199: insn = p ? NEXT_INSN (p) : 0; ! 3200: } ! 3201: ! 3202: /* Tell refers_to_mem_p that qty_const info is not available. */ ! 3203: qty_const = 0; ! 3204: ! 3205: if (max_elements_made < n_elements_made) ! 3206: max_elements_made = n_elements_made; ! 3207: ! 3208: return cse_jumps_altered; ! 3209: } ! 3210: ! 3211: static void ! 3212: cse_basic_block (from, to) ! 3213: register rtx from, to; ! 3214: { ! 3215: register rtx insn; ! 3216: int *qv1 = (int *) alloca (max_qty * sizeof (int)); ! 3217: int *qv2 = (int *) alloca (max_qty * sizeof (int)); ! 3218: rtx *qv3 = (rtx *) alloca (max_qty * sizeof (rtx)); ! 3219: ! 3220: qty_first_reg = qv1; ! 3221: qty_last_reg = qv2; ! 3222: qty_const = qv3; ! 3223: qty_const_insn = (rtx *) alloca (max_qty * sizeof (rtx)); ! 3224: ! 3225: new_basic_block (); ! 3226: ! 3227: for (insn = from; insn != to; insn = NEXT_INSN (insn)) ! 3228: { ! 3229: register RTX_CODE code = GET_CODE (insn); ! 3230: if (code == INSN || code == JUMP_INSN || code == CALL_INSN) ! 3231: cse_insn (insn); ! 3232: /* Memory, and some registers, are invalidate by subroutine calls. */ ! 3233: if (code == CALL_INSN) ! 3234: { ! 3235: register int i; ! 3236: static struct write_data everything = {1, 1, 1}; ! 3237: invalidate_memory (&everything); ! 3238: for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) ! 3239: if (call_used_regs[i] && reg_rtx[i] ! 3240: && i != FRAME_POINTER_REGNUM ! 3241: && i != ARG_POINTER_REGNUM) ! 3242: invalidate (reg_rtx[i]); ! 3243: } ! 3244: /* Loop beginnings are often followed by jumps ! 3245: (that enter the loop above the endtest). ! 3246: See if we can prove the loop will be executed at least once; ! 3247: if so, delete the jump. Also perhaps we can prove loop ! 3248: will never be executed and delete the entire thing. */ ! 3249: if (code == NOTE ! 3250: && NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_BEG ! 3251: && GET_CODE (NEXT_INSN (insn)) == JUMP_INSN) ! 3252: { ! 3253: predecide_loop_entry (insn); ! 3254: /* Whether that jump was deleted or not, ! 3255: it certainly is the end of the basic block. ! 3256: Since the jump is unconditional, ! 3257: it requires no further processing here. */ ! 3258: break; ! 3259: } ! 3260: } ! 3261: ! 3262: if (next_qty > max_qty) ! 3263: abort (); ! 3264: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.