|
|
1.1 ! root 1: /* Instruction scheduling pass. ! 2: Copyright (C) 1992 Free Software Foundation, Inc. ! 3: Contributed by Michael Tiemann ([email protected]) ! 4: Enhanced by, and currently maintained by, Jim Wilson ([email protected]) ! 5: ! 6: This file is part of GNU CC. ! 7: ! 8: GNU CC is free software; you can redistribute it and/or modify ! 9: it under the terms of the GNU General Public License as published by ! 10: the Free Software Foundation; either version 2, or (at your option) ! 11: any later version. ! 12: ! 13: GNU CC is distributed in the hope that it will be useful, ! 14: but WITHOUT ANY WARRANTY; without even the implied warranty of ! 15: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ! 16: GNU General Public License for more details. ! 17: ! 18: You should have received a copy of the GNU General Public License ! 19: along with GNU CC; see the file COPYING. If not, write to ! 20: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ ! 21: ! 22: /* Instruction scheduling pass. ! 23: ! 24: This pass implements list scheduling within basic blocks. It is ! 25: run after flow analysis, but before register allocation. The ! 26: scheduler works as follows: ! 27: ! 28: We compute insn priorities based on data dependencies. Flow ! 29: analysis only creates a fraction of the data-dependencies we must ! 30: observe: namely, only those dependencies which the combiner can be ! 31: expected to use. For this pass, we must therefore create the ! 32: remaining dependencies we need to observe: register dependencies, ! 33: memory dependencies, dependencies to keep function calls in order, ! 34: and the dependence between a conditional branch and the setting of ! 35: condition codes are all dealt with here. ! 36: ! 37: The scheduler first traverses the data flow graph, starting with ! 38: the last instruction, and proceeding to the first, assigning ! 39: values to insn_priority as it goes. This sorts the instructions ! 40: topologically by data dependence. ! 41: ! 42: Once priorities have been established, we order the insns using ! 43: list scheduling. This works as follows: starting with a list of ! 44: all the ready insns, and sorted according to priority number, we ! 45: schedule the insn from the end of the list by placing its ! 46: predecessors in the list according to their priority order. We ! 47: consider this insn scheduled by setting the pointer to the "end" of ! 48: the list to point to the previous insn. When an insn has no ! 49: predecessors, we also add it to the ready list. When all insns down ! 50: to the lowest priority have been scheduled, the critical path of the ! 51: basic block has been made as short as possible. The remaining insns ! 52: are then scheduled in remaining slots. ! 53: ! 54: The following list shows the order in which we want to break ties: ! 55: ! 56: 1. choose insn with lowest conflict cost, ties broken by ! 57: 2. choose insn with the longest path to end of bb, ties broken by ! 58: 3. choose insn that kills the most registers, ties broken by ! 59: 4. choose insn that conflicts with the most ready insns, or finally ! 60: 5. choose insn with lowest UID. ! 61: ! 62: Memory references complicate matters. Only if we can be certain ! 63: that memory references are not part of the data dependency graph ! 64: (via true, anti, or output dependence), can we move operations past ! 65: memory references. To first approximation, reads can be done ! 66: independently, while writes introduce dependencies. Better ! 67: approximations will yield fewer dependencies. ! 68: ! 69: Dependencies set up by memory references are treated in exactly the ! 70: same way as other dependencies, by using LOG_LINKS. ! 71: ! 72: Having optimized the critical path, we may have also unduly ! 73: extended the lifetimes of some registers. If an operation requires ! 74: that constants be loaded into registers, it is certainly desirable ! 75: to load those constants as early as necessary, but no earlier. ! 76: I.e., it will not do to load up a bunch of registers at the ! 77: beginning of a basic block only to use them at the end, if they ! 78: could be loaded later, since this may result in excessive register ! 79: utilization. ! 80: ! 81: Note that since branches are never in basic blocks, but only end ! 82: basic blocks, this pass will not do any branch scheduling. But ! 83: that is ok, since we can use GNU's delayed branch scheduling ! 84: pass to take care of this case. ! 85: ! 86: Also note that no further optimizations based on algebraic identities ! 87: are performed, so this pass would be a good one to perform instruction ! 88: splitting, such as breaking up a multiply instruction into shifts ! 89: and adds where that is profitable. ! 90: ! 91: Given the memory aliasing analysis that this pass should perform, ! 92: it should be possible to remove redundant stores to memory, and to ! 93: load values from registers instead of hitting memory. ! 94: ! 95: This pass must update information that subsequent passes expect to be ! 96: correct. Namely: reg_n_refs, reg_n_sets, reg_n_deaths, ! 97: reg_n_calls_crossed, and reg_live_length. Also, basic_block_head, ! 98: basic_block_end. ! 99: ! 100: The information in the line number notes is carefully retained by this ! 101: pass. All other NOTE insns are grouped in their same relative order at ! 102: the beginning of basic blocks that have been scheduled. */ ! 103: ! 104: #include <stdio.h> ! 105: #include "config.h" ! 106: #include "rtl.h" ! 107: #include "basic-block.h" ! 108: #include "regs.h" ! 109: #include "hard-reg-set.h" ! 110: #include "flags.h" ! 111: #include "insn-config.h" ! 112: #include "insn-attr.h" ! 113: ! 114: /* Arrays set up by scheduling for the same respective purposes as ! 115: similar-named arrays set up by flow analysis. We work with these ! 116: arrays during the scheduling pass so we can compare values against ! 117: unscheduled code. ! 118: ! 119: Values of these arrays are copied at the end of this pass into the ! 120: arrays set up by flow analysis. */ ! 121: static short *sched_reg_n_deaths; ! 122: static int *sched_reg_n_calls_crossed; ! 123: static int *sched_reg_live_length; ! 124: ! 125: /* Element N is the next insn that sets (hard or pseudo) register ! 126: N within the current basic block; or zero, if there is no ! 127: such insn. Needed for new registers which may be introduced ! 128: by splitting insns. */ ! 129: static rtx *reg_last_uses; ! 130: static rtx *reg_last_sets; ! 131: ! 132: /* Vector indexed by INSN_UID giving the original ordering of the insns. */ ! 133: static int *insn_luid; ! 134: #define INSN_LUID(INSN) (insn_luid[INSN_UID (INSN)]) ! 135: ! 136: /* Vector indexed by INSN_UID giving each instruction a priority. */ ! 137: static int *insn_priority; ! 138: #define INSN_PRIORITY(INSN) (insn_priority[INSN_UID (INSN)]) ! 139: ! 140: #define DONE_PRIORITY -1 ! 141: #define MAX_PRIORITY 0x7fffffff ! 142: #define TAIL_PRIORITY 0x7ffffffe ! 143: #define LAUNCH_PRIORITY 0x7f000001 ! 144: #define DONE_PRIORITY_P(INSN) (INSN_PRIORITY (INSN) < 0) ! 145: #define LOW_PRIORITY_P(INSN) ((INSN_PRIORITY (INSN) & 0x7f000000) == 0) ! 146: ! 147: /* Vector indexed by INSN_UID giving number of insns refering to this insn. */ ! 148: static int *insn_ref_count; ! 149: #define INSN_REF_COUNT(INSN) (insn_ref_count[INSN_UID (INSN)]) ! 150: ! 151: /* Vector indexed by INSN_UID giving line-number note in effect for each ! 152: insn. For line-number notes, this indicates whether the note may be ! 153: reused. */ ! 154: static rtx *line_note; ! 155: #define LINE_NOTE(INSN) (line_note[INSN_UID (INSN)]) ! 156: ! 157: /* Vector indexed by basic block number giving the starting line-number ! 158: for each basic block. */ ! 159: static rtx *line_note_head; ! 160: ! 161: /* List of important notes we must keep around. This is a pointer to the ! 162: last element in the list. */ ! 163: static rtx note_list; ! 164: ! 165: /* Regsets telling whether a given register is live or dead before the last ! 166: scheduled insn. Must scan the instructions once before scheduling to ! 167: determine what registers are live or dead at the end of the block. */ ! 168: static regset bb_dead_regs; ! 169: static regset bb_live_regs; ! 170: ! 171: /* Regset telling whether a given register is live after the insn currently ! 172: being scheduled. Before processing an insn, this is equal to bb_live_regs ! 173: above. This is used so that we can find regsiters that are newly born/dead ! 174: after processing an insn. */ ! 175: static regset old_live_regs; ! 176: ! 177: /* The chain of REG_DEAD notes. REG_DEAD notes are removed from all insns ! 178: during the initial scan and reused later. If there are not exactly as ! 179: many REG_DEAD notes in the post scheduled code as there were in the ! 180: prescheduled code then we trigger an abort because this indicates a bug. */ ! 181: static rtx dead_notes; ! 182: ! 183: /* Queues, etc. */ ! 184: ! 185: /* An instruction is ready to be scheduled when all insns following it ! 186: have already been scheduled. It is important to ensure that all ! 187: insns which use its result will not be executed until its result ! 188: has been computed. We maintain three lists (conceptually): ! 189: ! 190: (1) a "Ready" list of unscheduled, uncommitted insns ! 191: (2) a "Scheduled" list of scheduled insns ! 192: (3) a "Pending" list of insns which can be scheduled, but ! 193: for stalls. ! 194: ! 195: Insns move from the "Ready" list to the "Pending" list when ! 196: all insns following them have been scheduled. ! 197: ! 198: Insns move from the "Pending" list to the "Scheduled" list ! 199: when there is sufficient space in the pipeline to prevent ! 200: stalls between the insn and scheduled insns which use it. ! 201: ! 202: The "Pending" list acts as a buffer to prevent insns ! 203: from avalanching. ! 204: ! 205: The "Ready" list is implemented by the variable `ready'. ! 206: The "Pending" list are the insns in the LOG_LINKS of ready insns. ! 207: The "Scheduled" list is the new insn chain built by this pass. */ ! 208: ! 209: /* Implement a circular buffer from which instructions are issued. */ ! 210: #define Q_SIZE 128 ! 211: static rtx insn_queue[Q_SIZE]; ! 212: static int q_ptr = 0; ! 213: static int q_size = 0; ! 214: #define NEXT_Q(X) (((X)+1) & (Q_SIZE-1)) ! 215: #define NEXT_Q_AFTER(X,C) (((X)+C) & (Q_SIZE-1)) ! 216: ! 217: /* Forward declarations. */ ! 218: static void sched_analyze_2 (); ! 219: static void schedule_block (); ! 220: ! 221: /* Main entry point of this file. */ ! 222: void schedule_insns (); ! 223: ! 224: #define SIZE_FOR_MODE(X) (GET_MODE_SIZE (GET_MODE (X))) ! 225: ! 226: /* Vector indexed by N giving the initial (unchanging) value known ! 227: for pseudo-register N. */ ! 228: static rtx *reg_known_value; ! 229: ! 230: /* Indicates number of valid entries in reg_known_value. */ ! 231: static int reg_known_value_size; ! 232: ! 233: static rtx ! 234: canon_rtx (x) ! 235: rtx x; ! 236: { ! 237: if (GET_CODE (x) == REG && REGNO (x) >= FIRST_PSEUDO_REGISTER ! 238: && REGNO (x) <= reg_known_value_size) ! 239: return reg_known_value[REGNO (x)]; ! 240: else if (GET_CODE (x) == PLUS) ! 241: { ! 242: rtx x0 = canon_rtx (XEXP (x, 0)); ! 243: rtx x1 = canon_rtx (XEXP (x, 1)); ! 244: ! 245: if (x0 != XEXP (x, 0) || x1 != XEXP (x, 1)) ! 246: { ! 247: /* We can tolerate LO_SUMs being offset here; these ! 248: rtl are used for nothing other than comparisons. */ ! 249: if (GET_CODE (x0) == CONST_INT) ! 250: return plus_constant_for_output (x1, INTVAL (x0)); ! 251: else if (GET_CODE (x1) == CONST_INT) ! 252: return plus_constant_for_output (x0, INTVAL (x1)); ! 253: return gen_rtx (PLUS, GET_MODE (x), x0, x1); ! 254: } ! 255: } ! 256: return x; ! 257: } ! 258: ! 259: /* Set up all info needed to perform alias analysis on memory references. */ ! 260: ! 261: void ! 262: init_alias_analysis () ! 263: { ! 264: int maxreg = max_reg_num (); ! 265: rtx insn; ! 266: rtx note; ! 267: rtx set; ! 268: ! 269: reg_known_value_size = maxreg; ! 270: ! 271: reg_known_value ! 272: = (rtx *) oballoc ((maxreg-FIRST_PSEUDO_REGISTER) * sizeof (rtx)) ! 273: - FIRST_PSEUDO_REGISTER; ! 274: bzero (reg_known_value+FIRST_PSEUDO_REGISTER, ! 275: (maxreg-FIRST_PSEUDO_REGISTER) * sizeof (rtx)); ! 276: ! 277: /* Fill in the entries with known constant values. */ ! 278: for (insn = get_insns (); insn; insn = NEXT_INSN (insn)) ! 279: if ((set = single_set (insn)) != 0 ! 280: && GET_CODE (SET_DEST (set)) == REG ! 281: && REGNO (SET_DEST (set)) >= FIRST_PSEUDO_REGISTER ! 282: && (((note = find_reg_note (insn, REG_EQUAL, 0)) != 0 ! 283: && reg_n_sets[REGNO (SET_DEST (set))] == 1) ! 284: || (note = find_reg_note (insn, REG_EQUIV, 0)) != 0) ! 285: && GET_CODE (XEXP (note, 0)) != EXPR_LIST) ! 286: reg_known_value[REGNO (SET_DEST (set))] = XEXP (note, 0); ! 287: ! 288: /* Fill in the remaining entries. */ ! 289: while (--maxreg >= FIRST_PSEUDO_REGISTER) ! 290: if (reg_known_value[maxreg] == 0) ! 291: reg_known_value[maxreg] = regno_reg_rtx[maxreg]; ! 292: } ! 293: ! 294: /* Return 1 if X and Y are identical-looking rtx's. ! 295: ! 296: We use the data in reg_known_value above to see if two registers with ! 297: different numbers are, in fact, equivalent. */ ! 298: ! 299: static int ! 300: rtx_equal_for_memref_p (x, y) ! 301: rtx x, y; ! 302: { ! 303: register int i; ! 304: register int j; ! 305: register enum rtx_code code; ! 306: register char *fmt; ! 307: ! 308: if (x == 0 && y == 0) ! 309: return 1; ! 310: if (x == 0 || y == 0) ! 311: return 0; ! 312: x = canon_rtx (x); ! 313: y = canon_rtx (y); ! 314: ! 315: if (x == y) ! 316: return 1; ! 317: ! 318: code = GET_CODE (x); ! 319: /* Rtx's of different codes cannot be equal. */ ! 320: if (code != GET_CODE (y)) ! 321: return 0; ! 322: ! 323: /* (MULT:SI x y) and (MULT:HI x y) are NOT equivalent. ! 324: (REG:SI x) and (REG:HI x) are NOT equivalent. */ ! 325: ! 326: if (GET_MODE (x) != GET_MODE (y)) ! 327: return 0; ! 328: ! 329: /* REG, LABEL_REF, and SYMBOL_REF can be compared nonrecursively. */ ! 330: ! 331: if (code == REG) ! 332: return REGNO (x) == REGNO (y); ! 333: if (code == LABEL_REF) ! 334: return XEXP (x, 0) == XEXP (y, 0); ! 335: if (code == SYMBOL_REF) ! 336: return XSTR (x, 0) == XSTR (y, 0); ! 337: ! 338: /* Compare the elements. If any pair of corresponding elements ! 339: fail to match, return 0 for the whole things. */ ! 340: ! 341: fmt = GET_RTX_FORMAT (code); ! 342: for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) ! 343: { ! 344: switch (fmt[i]) ! 345: { ! 346: case 'n': ! 347: case 'i': ! 348: if (XINT (x, i) != XINT (y, i)) ! 349: return 0; ! 350: break; ! 351: ! 352: case 'V': ! 353: case 'E': ! 354: /* Two vectors must have the same length. */ ! 355: if (XVECLEN (x, i) != XVECLEN (y, i)) ! 356: return 0; ! 357: ! 358: /* And the corresponding elements must match. */ ! 359: for (j = 0; j < XVECLEN (x, i); j++) ! 360: if (rtx_equal_for_memref_p (XVECEXP (x, i, j), XVECEXP (y, i, j)) == 0) ! 361: return 0; ! 362: break; ! 363: ! 364: case 'e': ! 365: if (rtx_equal_for_memref_p (XEXP (x, i), XEXP (y, i)) == 0) ! 366: return 0; ! 367: break; ! 368: ! 369: case 'S': ! 370: case 's': ! 371: if (strcmp (XSTR (x, i), XSTR (y, i))) ! 372: return 0; ! 373: break; ! 374: ! 375: case 'u': ! 376: /* These are just backpointers, so they don't matter. */ ! 377: break; ! 378: ! 379: case '0': ! 380: break; ! 381: ! 382: /* It is believed that rtx's at this level will never ! 383: contain anything but integers and other rtx's, ! 384: except for within LABEL_REFs and SYMBOL_REFs. */ ! 385: default: ! 386: abort (); ! 387: } ! 388: } ! 389: return 1; ! 390: } ! 391: ! 392: /* Given an rtx X, find a SYMBOL_REF or LABEL_REF within ! 393: X and return it, or return 0 if none found. */ ! 394: ! 395: static rtx ! 396: find_symbolic_term (x) ! 397: rtx x; ! 398: { ! 399: register int i; ! 400: register enum rtx_code code; ! 401: register char *fmt; ! 402: ! 403: code = GET_CODE (x); ! 404: if (code == SYMBOL_REF || code == LABEL_REF) ! 405: return x; ! 406: if (GET_RTX_CLASS (code) == 'o') ! 407: return 0; ! 408: ! 409: fmt = GET_RTX_FORMAT (code); ! 410: for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) ! 411: { ! 412: rtx t; ! 413: ! 414: if (fmt[i] == 'e') ! 415: { ! 416: t = find_symbolic_term (XEXP (x, i)); ! 417: if (t != 0) ! 418: return t; ! 419: } ! 420: else if (fmt[i] == 'E') ! 421: break; ! 422: } ! 423: return 0; ! 424: } ! 425: ! 426: /* Return nonzero if X and Y (memory addresses) could reference the ! 427: same location in memory. C is an offset accumulator. When ! 428: C is nonzero, we are testing aliases between X and Y + C. ! 429: XSIZE is the size in bytes of the X reference, ! 430: similarly YSIZE is the size in bytes for Y. ! 431: ! 432: If XSIZE or YSIZE is zero, we do not know the amount of memory being ! 433: referenced (the reference was BLKmode), so make the most pessimistic ! 434: assumptions. ! 435: ! 436: We recognize the following cases of non-conflicting memory: ! 437: ! 438: (1) addresses involving the frame pointer cannot conflict ! 439: with addresses involving static variables. ! 440: (2) static variables with different addresses cannot conflict. ! 441: ! 442: Nice to notice that varying addresses cannot confict with fp if no ! 443: local variables had their addresses taken, but that's too hard now. */ ! 444: ! 445: static int ! 446: memrefs_conflict_p (xsize, x, ysize, y, c) ! 447: rtx x, y; ! 448: int xsize, ysize; ! 449: int c; ! 450: { ! 451: if (GET_CODE (x) == HIGH) ! 452: x = XEXP (x, 0); ! 453: else if (GET_CODE (x) == LO_SUM) ! 454: x = XEXP (x, 1); ! 455: else ! 456: x = canon_rtx (x); ! 457: if (GET_CODE (y) == HIGH) ! 458: y = XEXP (y, 0); ! 459: else if (GET_CODE (y) == LO_SUM) ! 460: y = XEXP (y, 1); ! 461: else ! 462: y = canon_rtx (y); ! 463: ! 464: if (rtx_equal_for_memref_p (x, y)) ! 465: return (xsize == 0 || ysize == 0 || ! 466: (c >= 0 && xsize > c) || (c < 0 && ysize+c > 0)); ! 467: ! 468: if (y == frame_pointer_rtx || y == stack_pointer_rtx) ! 469: { ! 470: rtx t = y; ! 471: int tsize = ysize; ! 472: y = x; ysize = xsize; ! 473: x = t; xsize = tsize; ! 474: } ! 475: ! 476: if (x == frame_pointer_rtx || x == stack_pointer_rtx) ! 477: { ! 478: rtx y1; ! 479: ! 480: if (CONSTANT_P (y)) ! 481: return 0; ! 482: ! 483: if (GET_CODE (y) == PLUS ! 484: && canon_rtx (XEXP (y, 0)) == x ! 485: && (y1 = canon_rtx (XEXP (y, 1))) ! 486: && GET_CODE (y1) == CONST_INT) ! 487: { ! 488: c += INTVAL (y1); ! 489: return (xsize == 0 || ysize == 0 ! 490: || (c >= 0 && xsize > c) || (c < 0 && ysize+c > 0)); ! 491: } ! 492: ! 493: if (GET_CODE (y) == PLUS ! 494: && (y1 = canon_rtx (XEXP (y, 0))) ! 495: && CONSTANT_P (y1)) ! 496: return 0; ! 497: ! 498: return 1; ! 499: } ! 500: ! 501: if (GET_CODE (x) == PLUS) ! 502: { ! 503: /* The fact that X is canonnicallized means that this ! 504: PLUS rtx is canonnicallized. */ ! 505: rtx x0 = XEXP (x, 0); ! 506: rtx x1 = XEXP (x, 1); ! 507: ! 508: if (GET_CODE (y) == PLUS) ! 509: { ! 510: /* The fact that Y is canonnicallized means that this ! 511: PLUS rtx is canonnicallized. */ ! 512: rtx y0 = XEXP (y, 0); ! 513: rtx y1 = XEXP (y, 1); ! 514: ! 515: if (rtx_equal_for_memref_p (x1, y1)) ! 516: return memrefs_conflict_p (xsize, x0, ysize, y0, c); ! 517: if (rtx_equal_for_memref_p (x0, y0)) ! 518: return memrefs_conflict_p (xsize, x1, ysize, y1, c); ! 519: if (GET_CODE (x1) == CONST_INT) ! 520: if (GET_CODE (y1) == CONST_INT) ! 521: return memrefs_conflict_p (xsize, x0, ysize, y0, ! 522: c - INTVAL (x1) + INTVAL (y1)); ! 523: else ! 524: return memrefs_conflict_p (xsize, x0, ysize, y, c - INTVAL (x1)); ! 525: else if (GET_CODE (y1) == CONST_INT) ! 526: return memrefs_conflict_p (xsize, x, ysize, y0, c + INTVAL (y1)); ! 527: ! 528: /* Handle case where we cannot understand iteration operators, ! 529: but we notice that the base addresses are distinct objects. */ ! 530: x = find_symbolic_term (x); ! 531: if (x == 0) ! 532: return 1; ! 533: y = find_symbolic_term (y); ! 534: if (y == 0) ! 535: return 1; ! 536: return rtx_equal_for_memref_p (x, y); ! 537: } ! 538: else if (GET_CODE (x1) == CONST_INT) ! 539: return memrefs_conflict_p (xsize, x0, ysize, y, c - INTVAL (x1)); ! 540: } ! 541: else if (GET_CODE (y) == PLUS) ! 542: { ! 543: /* The fact that Y is canonnicallized means that this ! 544: PLUS rtx is canonnicallized. */ ! 545: rtx y0 = XEXP (y, 0); ! 546: rtx y1 = XEXP (y, 1); ! 547: ! 548: if (GET_CODE (y1) == CONST_INT) ! 549: return memrefs_conflict_p (xsize, x, ysize, y0, c + INTVAL (y1)); ! 550: else ! 551: return 1; ! 552: } ! 553: ! 554: if (GET_CODE (x) == GET_CODE (y)) ! 555: switch (GET_CODE (x)) ! 556: { ! 557: case MULT: ! 558: { ! 559: /* Handle cases where we expect the second operands to be the ! 560: same, and check only whether the first operand would conflict ! 561: or not. */ ! 562: rtx x0, y0; ! 563: rtx x1 = canon_rtx (XEXP (x, 1)); ! 564: rtx y1 = canon_rtx (XEXP (y, 1)); ! 565: if (! rtx_equal_for_memref_p (x1, y1)) ! 566: return 1; ! 567: x0 = canon_rtx (XEXP (x, 0)); ! 568: y0 = canon_rtx (XEXP (y, 0)); ! 569: if (rtx_equal_for_memref_p (x0, y0)) ! 570: return (xsize == 0 || ysize == 0 ! 571: || (c >= 0 && xsize > c) || (c < 0 && ysize+c > 0)); ! 572: ! 573: /* Can't properly adjust our sizes. */ ! 574: if (GET_CODE (x1) != CONST_INT) ! 575: return 1; ! 576: xsize /= INTVAL (x1); ! 577: ysize /= INTVAL (x1); ! 578: c /= INTVAL (x1); ! 579: return memrefs_conflict_p (xsize, x0, ysize, y0, c); ! 580: } ! 581: } ! 582: ! 583: if (CONSTANT_P (x)) ! 584: { ! 585: if (GET_CODE (x) == CONST_INT && GET_CODE (y) == CONST_INT) ! 586: { ! 587: c += (INTVAL (y) - INTVAL (x)); ! 588: return (xsize == 0 || ysize == 0 ! 589: || (c >= 0 && xsize > c) || (c < 0 && ysize+c > 0)); ! 590: } ! 591: ! 592: if (GET_CODE (x) == CONST) ! 593: { ! 594: if (GET_CODE (y) == CONST) ! 595: return memrefs_conflict_p (xsize, canon_rtx (XEXP (x, 0)), ! 596: ysize, canon_rtx (XEXP (y, 0)), c); ! 597: else ! 598: return memrefs_conflict_p (xsize, canon_rtx (XEXP (x, 0)), ! 599: ysize, y, c); ! 600: } ! 601: if (GET_CODE (y) == CONST) ! 602: return memrefs_conflict_p (xsize, x, ysize, ! 603: canon_rtx (XEXP (y, 0)), c); ! 604: ! 605: if (CONSTANT_P (y)) ! 606: return (rtx_equal_for_memref_p (x, y) ! 607: && (xsize == 0 || ysize == 0 ! 608: || (c >= 0 && xsize > c) || (c < 0 && ysize+c > 0))); ! 609: ! 610: return 1; ! 611: } ! 612: return 1; ! 613: } ! 614: ! 615: /* Functions to compute memory dependencies. ! 616: ! 617: Since we process the insns in execution order, we can build tables ! 618: to keep track of what registers are fixed (and not aliased), what registers ! 619: are varying in known ways, and what registers are varying in unknown ! 620: ways. ! 621: ! 622: If both memory references are volatile, then there must always be a ! 623: dependence between the two references, since their order can not be ! 624: changed. A volatile and non-volatile reference can be interchanged ! 625: though. ! 626: ! 627: A MEM_IN_STRUCT reference at a varying address can never conflict with a ! 628: non-MEM_IN_STRUCT reference at a fixed address. */ ! 629: ! 630: /* Read dependence: X is read after read in MEM takes place. There can ! 631: only be a dependence here if both reads are volatile. */ ! 632: ! 633: int ! 634: read_dependence (mem, x) ! 635: rtx mem; ! 636: rtx x; ! 637: { ! 638: return MEM_VOLATILE_P (x) && MEM_VOLATILE_P (mem); ! 639: } ! 640: ! 641: /* True dependence: X is read after store in MEM takes place. */ ! 642: ! 643: int ! 644: true_dependence (mem, x) ! 645: rtx mem; ! 646: rtx x; ! 647: { ! 648: if (RTX_UNCHANGING_P (x)) ! 649: return 0; ! 650: ! 651: return ((MEM_VOLATILE_P (x) && MEM_VOLATILE_P (mem)) ! 652: || (memrefs_conflict_p (SIZE_FOR_MODE (mem), XEXP (mem, 0), ! 653: SIZE_FOR_MODE (x), XEXP (x, 0), 0) ! 654: && ! (MEM_IN_STRUCT_P (mem) && rtx_addr_varies_p (mem) ! 655: && ! MEM_IN_STRUCT_P (x) && ! rtx_addr_varies_p (x)) ! 656: && ! (MEM_IN_STRUCT_P (x) && rtx_addr_varies_p (x) ! 657: && ! MEM_IN_STRUCT_P (mem) && ! rtx_addr_varies_p (mem)))); ! 658: } ! 659: ! 660: /* Anti dependence: X is written after read in MEM takes place. */ ! 661: ! 662: int ! 663: anti_dependence (mem, x) ! 664: rtx mem; ! 665: rtx x; ! 666: { ! 667: if (RTX_UNCHANGING_P (mem)) ! 668: return 0; ! 669: ! 670: return ((MEM_VOLATILE_P (x) && MEM_VOLATILE_P (mem)) ! 671: || (memrefs_conflict_p (SIZE_FOR_MODE (mem), XEXP (mem, 0), ! 672: SIZE_FOR_MODE (x), XEXP (x, 0), 0) ! 673: && ! (MEM_IN_STRUCT_P (mem) && rtx_addr_varies_p (mem) ! 674: && ! MEM_IN_STRUCT_P (x) && ! rtx_addr_varies_p (x)) ! 675: && ! (MEM_IN_STRUCT_P (x) && rtx_addr_varies_p (x) ! 676: && ! MEM_IN_STRUCT_P (mem) && ! rtx_addr_varies_p (mem)))); ! 677: } ! 678: ! 679: /* Output dependence: X is written after store in MEM takes place. */ ! 680: ! 681: int ! 682: output_dependence (mem, x) ! 683: rtx mem; ! 684: rtx x; ! 685: { ! 686: return ((MEM_VOLATILE_P (x) && MEM_VOLATILE_P (mem)) ! 687: || (memrefs_conflict_p (SIZE_FOR_MODE (mem), XEXP (mem, 0), ! 688: SIZE_FOR_MODE (x), XEXP (x, 0), 0) ! 689: && ! (MEM_IN_STRUCT_P (mem) && rtx_addr_varies_p (mem) ! 690: && ! MEM_IN_STRUCT_P (x) && ! rtx_addr_varies_p (x)) ! 691: && ! (MEM_IN_STRUCT_P (x) && rtx_addr_varies_p (x) ! 692: && ! MEM_IN_STRUCT_P (mem) && ! rtx_addr_varies_p (mem)))); ! 693: } ! 694: ! 695: #ifndef INSN_SCHEDULING ! 696: void schedule_insns () {} ! 697: #else ! 698: #ifndef __GNUC__ ! 699: #define __inline ! 700: #endif ! 701: ! 702: /* Computation of memory dependencies. */ ! 703: ! 704: /* The *_insns and *_mems are paired lists. Each pending memory operation ! 705: will have a pointer to the MEM rtx on one list and a pointer to the ! 706: containing insn on the other list in the same place in the list. */ ! 707: ! 708: /* We can't use add_dependence like the old code did, because a single insn ! 709: may have multiple memory accesses, and hence needs to be on the list ! 710: once for each memory access. Add_dependence won't let you add an insn ! 711: to a list more than once. */ ! 712: ! 713: /* An INSN_LIST containing all insns with pending read operations. */ ! 714: static rtx pending_read_insns; ! 715: ! 716: /* An EXPR_LIST containing all MEM rtx's which are pending reads. */ ! 717: static rtx pending_read_mems; ! 718: ! 719: /* An INSN_LIST containing all insns with pending write operations. */ ! 720: static rtx pending_write_insns; ! 721: ! 722: /* An EXPR_LIST containing all MEM rtx's which are pending writes. */ ! 723: static rtx pending_write_mems; ! 724: ! 725: /* Indicates the combined length of the two pending lists. We must prevent ! 726: these lists from ever growing too large since the number of dependencies ! 727: produced is at least O(N*N), and execution time is at least O(4*N*N), as ! 728: a function of the length of these pending lists. */ ! 729: ! 730: static int pending_lists_length; ! 731: ! 732: /* An INSN_LIST containing all INSN_LISTs allocated but currently unused. */ ! 733: ! 734: static rtx unused_insn_list; ! 735: ! 736: /* An EXPR_LIST containing all EXPR_LISTs allocated but currently unused. */ ! 737: ! 738: static rtx unused_expr_list; ! 739: ! 740: /* The last insn upon which all memory references must depend. ! 741: This is an insn which flushed the pending lists, creating a dependency ! 742: between it and all previously pending memory references. This creates ! 743: a barrier (or a checkpoint) which no memory reference is allowed to cross. ! 744: ! 745: This includes all non constant CALL_INSNs. When we do interprocedural ! 746: alias analysis, this restriction can be relaxed. ! 747: This may also be an INSN that writes memory if the pending lists grow ! 748: too large. */ ! 749: ! 750: static rtx last_pending_memory_flush; ! 751: ! 752: /* The last function call we have seen. All hard regs, and, of course, ! 753: the last function call, must depend on this. */ ! 754: ! 755: static rtx last_function_call; ! 756: ! 757: /* The LOG_LINKS field of this is a list of insns which use a pseudo register ! 758: that does not already cross a call. We create dependencies between each ! 759: of those insn and the next call insn, to ensure that they won't cross a call ! 760: after scheduling is done. */ ! 761: ! 762: static rtx sched_before_next_call; ! 763: ! 764: /* Pointer to the last instruction scheduled. Used by rank_for_schedule, ! 765: so that insns independent of the last scheduled insn will be preferred ! 766: over dependent instructions. */ ! 767: ! 768: static rtx last_scheduled_insn; ! 769: ! 770: /* Process an insn's memory dependencies. There are four kinds of ! 771: dependencies: ! 772: ! 773: (0) read dependence: read follows read ! 774: (1) true dependence: read follows write ! 775: (2) anti dependence: write follows read ! 776: (3) output dependence: write follows write ! 777: ! 778: We are careful to build only dependencies which actually exist, and ! 779: use transitivity to avoid building too many links. */ ! 780: ! 781: /* Return the INSN_LIST containing INSN in LIST, or NULL ! 782: if LIST does not contain INSN. */ ! 783: ! 784: __inline static rtx ! 785: find_insn_list (insn, list) ! 786: rtx insn; ! 787: rtx list; ! 788: { ! 789: while (list) ! 790: { ! 791: if (XEXP (list, 0) == insn) ! 792: return list; ! 793: list = XEXP (list, 1); ! 794: } ! 795: return 0; ! 796: } ! 797: ! 798: /* Compute cost of executing INSN. This is the number of virtual ! 799: cycles taken between instruction issue and instruction results. */ ! 800: ! 801: __inline static int ! 802: insn_cost (insn) ! 803: rtx insn; ! 804: { ! 805: register int cost; ! 806: ! 807: recog_memoized (insn); ! 808: ! 809: /* A USE insn, or something else we don't need to understand. ! 810: We can't pass these directly to result_ready_cost because it will trigger ! 811: a fatal error for unrecognizable insns. */ ! 812: if (INSN_CODE (insn) < 0) ! 813: return 1; ! 814: else ! 815: { ! 816: cost = result_ready_cost (insn); ! 817: ! 818: if (cost < 1) ! 819: cost = 1; ! 820: ! 821: return cost; ! 822: } ! 823: } ! 824: ! 825: /* Compute the priority number for INSN. */ ! 826: ! 827: static int ! 828: priority (insn) ! 829: rtx insn; ! 830: { ! 831: if (insn && GET_RTX_CLASS (GET_CODE (insn)) == 'i') ! 832: { ! 833: int prev_priority; ! 834: int max_priority; ! 835: int this_priority = INSN_PRIORITY (insn); ! 836: rtx prev; ! 837: ! 838: if (this_priority > 0) ! 839: return this_priority; ! 840: ! 841: max_priority = 1; ! 842: ! 843: /* Nonzero if these insns must be scheduled together. */ ! 844: if (SCHED_GROUP_P (insn)) ! 845: { ! 846: prev = insn; ! 847: while (SCHED_GROUP_P (prev)) ! 848: { ! 849: prev = PREV_INSN (prev); ! 850: INSN_REF_COUNT (prev) += 1; ! 851: } ! 852: } ! 853: ! 854: for (prev = LOG_LINKS (insn); prev; prev = XEXP (prev, 1)) ! 855: { ! 856: rtx x = XEXP (prev, 0); ! 857: ! 858: /* A dependence pointing to a note is always obsolete, because ! 859: sched_analyze_insn will have created any necessary new dependences ! 860: which replace it. Notes can be created when instructions are ! 861: deleted by insn splitting, or by register allocation. */ ! 862: if (GET_CODE (x) == NOTE) ! 863: { ! 864: remove_dependence (insn, x); ! 865: continue; ! 866: } ! 867: ! 868: /* This priority calculation was chosen because it results in the ! 869: least instruction movement, and does not hurt the performance ! 870: of the resulting code compared to the old algorithm. ! 871: This makes the sched algorithm more stable, which results ! 872: in better code, because there is less register pressure, ! 873: cross jumping is more likely to work, and debugging is easier. ! 874: ! 875: When all instructions have a latency of 1, there is no need to ! 876: move any instructions. Subtracting one here ensures that in such ! 877: cases all instructions will end up with a priority of one, and ! 878: hence no scheduling will be done. ! 879: ! 880: The original code did not subtract the one, and added the ! 881: insn_cost of the current instruction to its priority (e.g. ! 882: move the insn_cost call down to the end). */ ! 883: ! 884: if (REG_NOTE_KIND (prev) == 0) ! 885: /* Data dependence. */ ! 886: prev_priority = priority (x) + insn_cost (x) - 1; ! 887: else ! 888: /* Anti or output dependence. Don't add the latency of this ! 889: insn's result, because it isn't being used. */ ! 890: prev_priority = priority (x); ! 891: ! 892: if (prev_priority > max_priority) ! 893: max_priority = prev_priority; ! 894: INSN_REF_COUNT (x) += 1; ! 895: } ! 896: ! 897: INSN_PRIORITY (insn) = max_priority; ! 898: return INSN_PRIORITY (insn); ! 899: } ! 900: return 0; ! 901: } ! 902: ! 903: /* Remove all INSN_LISTs and EXPR_LISTs from the pending lists and add ! 904: them to the unused_*_list variables, so that they can be reused. */ ! 905: ! 906: static void ! 907: free_pending_lists () ! 908: { ! 909: register rtx link, prev_link; ! 910: ! 911: if (pending_read_insns) ! 912: { ! 913: prev_link = pending_read_insns; ! 914: link = XEXP (prev_link, 1); ! 915: ! 916: while (link) ! 917: { ! 918: prev_link = link; ! 919: link = XEXP (link, 1); ! 920: } ! 921: ! 922: XEXP (prev_link, 1) = unused_insn_list; ! 923: unused_insn_list = pending_read_insns; ! 924: pending_read_insns = 0; ! 925: } ! 926: ! 927: if (pending_write_insns) ! 928: { ! 929: prev_link = pending_write_insns; ! 930: link = XEXP (prev_link, 1); ! 931: ! 932: while (link) ! 933: { ! 934: prev_link = link; ! 935: link = XEXP (link, 1); ! 936: } ! 937: ! 938: XEXP (prev_link, 1) = unused_insn_list; ! 939: unused_insn_list = pending_write_insns; ! 940: pending_write_insns = 0; ! 941: } ! 942: ! 943: if (pending_read_mems) ! 944: { ! 945: prev_link = pending_read_mems; ! 946: link = XEXP (prev_link, 1); ! 947: ! 948: while (link) ! 949: { ! 950: prev_link = link; ! 951: link = XEXP (link, 1); ! 952: } ! 953: ! 954: XEXP (prev_link, 1) = unused_expr_list; ! 955: unused_expr_list = pending_read_mems; ! 956: pending_read_mems = 0; ! 957: } ! 958: ! 959: if (pending_write_mems) ! 960: { ! 961: prev_link = pending_write_mems; ! 962: link = XEXP (prev_link, 1); ! 963: ! 964: while (link) ! 965: { ! 966: prev_link = link; ! 967: link = XEXP (link, 1); ! 968: } ! 969: ! 970: XEXP (prev_link, 1) = unused_expr_list; ! 971: unused_expr_list = pending_write_mems; ! 972: pending_write_mems = 0; ! 973: } ! 974: } ! 975: ! 976: /* Add an INSN and MEM reference pair to a pending INSN_LIST and MEM_LIST. ! 977: The MEM is a memory reference contained within INSN, which we are saving ! 978: so that we can do memory aliasing on it. */ ! 979: ! 980: static void ! 981: add_insn_mem_dependence (insn_list, mem_list, insn, mem) ! 982: rtx *insn_list, *mem_list, insn, mem; ! 983: { ! 984: register rtx link; ! 985: ! 986: if (unused_insn_list) ! 987: { ! 988: link = unused_insn_list; ! 989: unused_insn_list = XEXP (link, 1); ! 990: } ! 991: else ! 992: link = rtx_alloc (INSN_LIST); ! 993: XEXP (link, 0) = insn; ! 994: XEXP (link, 1) = *insn_list; ! 995: *insn_list = link; ! 996: ! 997: if (unused_expr_list) ! 998: { ! 999: link = unused_expr_list; ! 1000: unused_expr_list = XEXP (link, 1); ! 1001: } ! 1002: else ! 1003: link = rtx_alloc (EXPR_LIST); ! 1004: XEXP (link, 0) = mem; ! 1005: XEXP (link, 1) = *mem_list; ! 1006: *mem_list = link; ! 1007: ! 1008: pending_lists_length++; ! 1009: } ! 1010: ! 1011: /* Make a dependency between every memory reference on the pending lists ! 1012: and INSN, thus flushing the pending lists. */ ! 1013: ! 1014: static void ! 1015: flush_pending_lists (insn) ! 1016: rtx insn; ! 1017: { ! 1018: rtx link; ! 1019: ! 1020: while (pending_read_insns) ! 1021: { ! 1022: add_dependence (insn, XEXP (pending_read_insns, 0), REG_DEP_ANTI); ! 1023: ! 1024: link = pending_read_insns; ! 1025: pending_read_insns = XEXP (pending_read_insns, 1); ! 1026: XEXP (link, 1) = unused_insn_list; ! 1027: unused_insn_list = link; ! 1028: ! 1029: link = pending_read_mems; ! 1030: pending_read_mems = XEXP (pending_read_mems, 1); ! 1031: XEXP (link, 1) = unused_expr_list; ! 1032: unused_expr_list = link; ! 1033: } ! 1034: while (pending_write_insns) ! 1035: { ! 1036: add_dependence (insn, XEXP (pending_write_insns, 0), REG_DEP_ANTI); ! 1037: ! 1038: link = pending_write_insns; ! 1039: pending_write_insns = XEXP (pending_write_insns, 1); ! 1040: XEXP (link, 1) = unused_insn_list; ! 1041: unused_insn_list = link; ! 1042: ! 1043: link = pending_write_mems; ! 1044: pending_write_mems = XEXP (pending_write_mems, 1); ! 1045: XEXP (link, 1) = unused_expr_list; ! 1046: unused_expr_list = link; ! 1047: } ! 1048: pending_lists_length = 0; ! 1049: ! 1050: if (last_pending_memory_flush) ! 1051: add_dependence (insn, last_pending_memory_flush, REG_DEP_ANTI); ! 1052: ! 1053: last_pending_memory_flush = insn; ! 1054: } ! 1055: ! 1056: /* Analyze a single SET or CLOBBER rtx, X, creating all dependencies generated ! 1057: by the write to the destination of X, and reads of everything mentioned. */ ! 1058: ! 1059: static void ! 1060: sched_analyze_1 (x, insn) ! 1061: rtx x; ! 1062: rtx insn; ! 1063: { ! 1064: register int regno; ! 1065: register rtx dest = SET_DEST (x); ! 1066: ! 1067: if (dest == 0) ! 1068: return; ! 1069: ! 1070: while (GET_CODE (dest) == STRICT_LOW_PART || GET_CODE (dest) == SUBREG ! 1071: || GET_CODE (dest) == ZERO_EXTRACT || GET_CODE (dest) == SIGN_EXTRACT) ! 1072: { ! 1073: if (GET_CODE (dest) == ZERO_EXTRACT || GET_CODE (dest) == SIGN_EXTRACT) ! 1074: { ! 1075: /* The second and third arguments are values read by this insn. */ ! 1076: sched_analyze_2 (XEXP (dest, 1), insn); ! 1077: sched_analyze_2 (XEXP (dest, 2), insn); ! 1078: } ! 1079: dest = SUBREG_REG (dest); ! 1080: } ! 1081: ! 1082: if (GET_CODE (dest) == REG) ! 1083: { ! 1084: register int offset, bit, i; ! 1085: ! 1086: regno = REGNO (dest); ! 1087: ! 1088: /* A hard reg in a wide mode may really be multiple registers. ! 1089: If so, mark all of them just like the first. */ ! 1090: if (regno < FIRST_PSEUDO_REGISTER) ! 1091: { ! 1092: i = HARD_REGNO_NREGS (regno, GET_MODE (dest)); ! 1093: while (--i >= 0) ! 1094: { ! 1095: rtx u; ! 1096: ! 1097: for (u = reg_last_uses[regno+i]; u; u = XEXP (u, 1)) ! 1098: add_dependence (insn, XEXP (u, 0), REG_DEP_ANTI); ! 1099: reg_last_uses[regno + i] = 0; ! 1100: if (reg_last_sets[regno + i]) ! 1101: add_dependence (insn, reg_last_sets[regno + i], ! 1102: REG_DEP_OUTPUT); ! 1103: reg_last_sets[regno + i] = insn; ! 1104: if ((call_used_regs[i] || global_regs[i]) ! 1105: && last_function_call) ! 1106: /* Function calls clobber all call_used regs. */ ! 1107: add_dependence (insn, last_function_call, REG_DEP_ANTI); ! 1108: } ! 1109: } ! 1110: else ! 1111: { ! 1112: rtx u; ! 1113: ! 1114: for (u = reg_last_uses[regno]; u; u = XEXP (u, 1)) ! 1115: add_dependence (insn, XEXP (u, 0), REG_DEP_ANTI); ! 1116: reg_last_uses[regno] = 0; ! 1117: if (reg_last_sets[regno]) ! 1118: add_dependence (insn, reg_last_sets[regno], REG_DEP_OUTPUT); ! 1119: reg_last_sets[regno] = insn; ! 1120: ! 1121: /* Don't let it cross a call after scheduling if it doesn't ! 1122: already cross one. */ ! 1123: if (reg_n_calls_crossed[regno] == 0 && last_function_call) ! 1124: add_dependence (insn, last_function_call, REG_DEP_ANTI); ! 1125: } ! 1126: } ! 1127: else if (GET_CODE (dest) == MEM) ! 1128: { ! 1129: /* Writing memory. */ ! 1130: ! 1131: if (pending_lists_length > 32) ! 1132: { ! 1133: /* Flush all pending reads and writes to prevent the pending lists ! 1134: from getting any larger. Insn scheduling runs too slowly when ! 1135: these lists get long. The number 32 was chosen because it ! 1136: seems like a resonable number. When compiling GCC with itself, ! 1137: this flush occurs 8 times for sparc, and 10 times for m88k using ! 1138: the number 32. */ ! 1139: flush_pending_lists (insn); ! 1140: } ! 1141: else ! 1142: { ! 1143: rtx pending, pending_mem; ! 1144: ! 1145: pending = pending_read_insns; ! 1146: pending_mem = pending_read_mems; ! 1147: while (pending) ! 1148: { ! 1149: /* If a dependency already exists, don't create a new one. */ ! 1150: if (! find_insn_list (XEXP (pending, 0), LOG_LINKS (insn))) ! 1151: if (anti_dependence (XEXP (pending_mem, 0), dest, insn)) ! 1152: add_dependence (insn, XEXP (pending, 0), REG_DEP_ANTI); ! 1153: ! 1154: pending = XEXP (pending, 1); ! 1155: pending_mem = XEXP (pending_mem, 1); ! 1156: } ! 1157: ! 1158: pending = pending_write_insns; ! 1159: pending_mem = pending_write_mems; ! 1160: while (pending) ! 1161: { ! 1162: /* If a dependency already exists, don't create a new one. */ ! 1163: if (! find_insn_list (XEXP (pending, 0), LOG_LINKS (insn))) ! 1164: if (output_dependence (XEXP (pending_mem, 0), dest)) ! 1165: add_dependence (insn, XEXP (pending, 0), REG_DEP_OUTPUT); ! 1166: ! 1167: pending = XEXP (pending, 1); ! 1168: pending_mem = XEXP (pending_mem, 1); ! 1169: } ! 1170: ! 1171: if (last_pending_memory_flush) ! 1172: add_dependence (insn, last_pending_memory_flush, REG_DEP_ANTI); ! 1173: ! 1174: add_insn_mem_dependence (&pending_write_insns, &pending_write_mems, ! 1175: insn, dest); ! 1176: } ! 1177: sched_analyze_2 (XEXP (dest, 0), insn); ! 1178: } ! 1179: ! 1180: /* Analyze reads. */ ! 1181: if (GET_CODE (x) == SET) ! 1182: sched_analyze_2 (SET_SRC (x), insn); ! 1183: else if (GET_CODE (x) != CLOBBER) ! 1184: sched_analyze_2 (dest, insn); ! 1185: } ! 1186: ! 1187: /* Analyze the uses of memory and registers in rtx X in INSN. */ ! 1188: ! 1189: static void ! 1190: sched_analyze_2 (x, insn) ! 1191: rtx x; ! 1192: rtx insn; ! 1193: { ! 1194: register int i; ! 1195: register int j; ! 1196: register enum rtx_code code; ! 1197: register char *fmt; ! 1198: ! 1199: if (x == 0) ! 1200: return; ! 1201: ! 1202: code = GET_CODE (x); ! 1203: ! 1204: /* Get rid of the easy cases first. */ ! 1205: ! 1206: /* Ignore constants. Note that we must handle CONST_DOUBLE here ! 1207: because it may have a cc0_rtx in its CONST_DOUBLE_CHAIN field, but ! 1208: this does not mean that this insn is using cc0. */ ! 1209: if (code == CONST_INT || code == CONST_DOUBLE || code == SYMBOL_REF ! 1210: || code == CONST || code == LABEL_REF) ! 1211: return; ! 1212: ! 1213: #ifdef HAVE_cc0 ! 1214: else if (code == CC0) ! 1215: { ! 1216: rtx link; ! 1217: ! 1218: /* User of CC0 depends on immediately preceding insn. ! 1219: All notes are removed from the list of insns to schedule before we ! 1220: reach here, so the previous insn must be the setter of cc0. */ ! 1221: if (GET_CODE (PREV_INSN (insn)) != INSN) ! 1222: abort (); ! 1223: SCHED_GROUP_P (insn) = 1; ! 1224: ! 1225: /* Make a copy of all dependencies on PREV_INSN, and add to this insn. ! 1226: This is so that all the dependencies will apply to the group. */ ! 1227: ! 1228: for (link = LOG_LINKS (PREV_INSN (insn)); link; link = XEXP (link, 1)) ! 1229: add_dependence (insn, XEXP (link, 0), GET_MODE (link)); ! 1230: ! 1231: return; ! 1232: } ! 1233: #endif ! 1234: ! 1235: else if (code == REG) ! 1236: { ! 1237: int regno = REGNO (x); ! 1238: if (regno < FIRST_PSEUDO_REGISTER) ! 1239: { ! 1240: int i; ! 1241: ! 1242: i = HARD_REGNO_NREGS (regno, GET_MODE (x)); ! 1243: while (--i >= 0) ! 1244: { ! 1245: reg_last_uses[regno + i] ! 1246: = gen_rtx (INSN_LIST, VOIDmode, ! 1247: insn, reg_last_uses[regno + i]); ! 1248: if (reg_last_sets[regno + i]) ! 1249: add_dependence (insn, reg_last_sets[regno + i], 0); ! 1250: if ((call_used_regs[regno + i] || global_regs[regno + i]) ! 1251: && last_function_call) ! 1252: /* Function calls clobber all call_used regs. */ ! 1253: add_dependence (insn, last_function_call, REG_DEP_ANTI); ! 1254: } ! 1255: } ! 1256: else ! 1257: { ! 1258: reg_last_uses[regno] ! 1259: = gen_rtx (INSN_LIST, VOIDmode, insn, reg_last_uses[regno]); ! 1260: if (reg_last_sets[regno]) ! 1261: add_dependence (insn, reg_last_sets[regno], 0); ! 1262: ! 1263: /* If the register does not already cross any calls, then add this ! 1264: insn to the sched_before_next_call list so that it will still ! 1265: not cross calls after scheduling. */ ! 1266: if (reg_n_calls_crossed[regno] == 0) ! 1267: add_dependence (sched_before_next_call, insn, REG_DEP_ANTI); ! 1268: } ! 1269: return; ! 1270: } ! 1271: ! 1272: /* The interesting case. */ ! 1273: else if (code == MEM) ! 1274: { ! 1275: /* Reading memory. */ ! 1276: ! 1277: /* Don't create a dependence for memory references which are known to ! 1278: be unchanging, such as constant pool accesses. These will never ! 1279: conflict with any other memory access. */ ! 1280: if (RTX_UNCHANGING_P (x) == 0) ! 1281: { ! 1282: rtx pending, pending_mem; ! 1283: ! 1284: pending = pending_read_insns; ! 1285: pending_mem = pending_read_mems; ! 1286: while (pending) ! 1287: { ! 1288: /* If a dependency already exists, don't create a new one. */ ! 1289: if (! find_insn_list (XEXP (pending, 0), LOG_LINKS (insn))) ! 1290: if (read_dependence (XEXP (pending_mem, 0), x)) ! 1291: add_dependence (insn, XEXP (pending, 0), REG_DEP_ANTI); ! 1292: ! 1293: pending = XEXP (pending, 1); ! 1294: pending_mem = XEXP (pending_mem, 1); ! 1295: } ! 1296: ! 1297: pending = pending_write_insns; ! 1298: pending_mem = pending_write_mems; ! 1299: while (pending) ! 1300: { ! 1301: /* If a dependency already exists, don't create a new one. */ ! 1302: if (! find_insn_list (XEXP (pending, 0), LOG_LINKS (insn))) ! 1303: if (true_dependence (XEXP (pending_mem, 0), x)) ! 1304: add_dependence (insn, XEXP (pending, 0), 0); ! 1305: ! 1306: pending = XEXP (pending, 1); ! 1307: pending_mem = XEXP (pending_mem, 1); ! 1308: } ! 1309: if (last_pending_memory_flush) ! 1310: add_dependence (insn, last_pending_memory_flush, REG_DEP_ANTI); ! 1311: ! 1312: /* Always add these dependencies to pending_reads, since ! 1313: this insn may be followed by a write. */ ! 1314: add_insn_mem_dependence (&pending_read_insns, &pending_read_mems, ! 1315: insn, x); ! 1316: } ! 1317: /* Take advantage of tail recursion here. */ ! 1318: sched_analyze_2 (XEXP (x, 0), insn); ! 1319: return; ! 1320: } ! 1321: ! 1322: else if (code == ASM_OPERANDS || code == ASM_INPUT ! 1323: || code == UNSPEC_VOLATILE) ! 1324: { ! 1325: rtx u; ! 1326: ! 1327: /* Traditional and volatile asm instructions must be considered to use ! 1328: and clobber all hard registers and all of memory. So must ! 1329: UNSPEC_VOLATILE operations. */ ! 1330: if ((code == ASM_OPERANDS && MEM_VOLATILE_P (x)) || code == ASM_INPUT ! 1331: || code == UNSPEC_VOLATILE) ! 1332: { ! 1333: for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) ! 1334: { ! 1335: for (u = reg_last_uses[i]; u; u = XEXP (u, 1)) ! 1336: if (GET_CODE (PATTERN (XEXP (u, 0))) != USE) ! 1337: add_dependence (insn, XEXP (u, 0), REG_DEP_ANTI); ! 1338: reg_last_uses[i] = 0; ! 1339: if (reg_last_sets[i] ! 1340: && GET_CODE (PATTERN (reg_last_sets[i])) != USE) ! 1341: add_dependence (insn, reg_last_sets[i], 0); ! 1342: reg_last_sets[i] = insn; ! 1343: } ! 1344: ! 1345: flush_pending_lists (insn); ! 1346: } ! 1347: ! 1348: /* For all ASM_OPERANDS, we must traverse the vector of input operands. ! 1349: We can not just fall through here since then we would be confused ! 1350: by the ASM_INPUT rtx inside ASM_OPERANDS, which do not indicate ! 1351: traditional asms unlike their normal usage. */ ! 1352: ! 1353: if (code == ASM_OPERANDS) ! 1354: { ! 1355: for (j = 0; j < ASM_OPERANDS_INPUT_LENGTH (x); j++) ! 1356: sched_analyze_2 (ASM_OPERANDS_INPUT (x, j), insn); ! 1357: return; ! 1358: } ! 1359: } ! 1360: ! 1361: /* Other cases: walk the insn. */ ! 1362: fmt = GET_RTX_FORMAT (code); ! 1363: for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) ! 1364: { ! 1365: if (fmt[i] == 'e') ! 1366: sched_analyze_2 (XEXP (x, i), insn); ! 1367: else if (fmt[i] == 'E') ! 1368: for (j = 0; j < XVECLEN (x, i); j++) ! 1369: sched_analyze_2 (XVECEXP (x, i, j), insn); ! 1370: } ! 1371: } ! 1372: ! 1373: /* Analyze an INSN with pattern X to find all dependencies. */ ! 1374: ! 1375: static void ! 1376: sched_analyze_insn (x, insn) ! 1377: rtx x, insn; ! 1378: { ! 1379: register RTX_CODE code = GET_CODE (x); ! 1380: rtx link; ! 1381: ! 1382: if (code == SET || code == CLOBBER) ! 1383: sched_analyze_1 (x, insn); ! 1384: else if (code == PARALLEL) ! 1385: { ! 1386: register int i; ! 1387: for (i = XVECLEN (x, 0) - 1; i >= 0; i--) ! 1388: { ! 1389: code = GET_CODE (XVECEXP (x, 0, i)); ! 1390: if (code == SET || code == CLOBBER) ! 1391: sched_analyze_1 (XVECEXP (x, 0, i), insn); ! 1392: else ! 1393: sched_analyze_2 (XVECEXP (x, 0, i), insn); ! 1394: } ! 1395: } ! 1396: else ! 1397: sched_analyze_2 (x, insn); ! 1398: ! 1399: for (link = REG_NOTES (insn); link; link = XEXP (link, 1)) ! 1400: { ! 1401: /* Any REG_INC note is a SET of the register indicated. */ ! 1402: if (REG_NOTE_KIND (link) == REG_INC) ! 1403: { ! 1404: rtx dest = XEXP (link, 0); ! 1405: int regno = REGNO (dest); ! 1406: int i; ! 1407: ! 1408: /* A hard reg in a wide mode may really be multiple registers. ! 1409: If so, mark all of them just like the first. */ ! 1410: if (regno < FIRST_PSEUDO_REGISTER) ! 1411: { ! 1412: i = HARD_REGNO_NREGS (regno, GET_MODE (dest)); ! 1413: while (--i >= 0) ! 1414: { ! 1415: rtx u; ! 1416: ! 1417: for (u = reg_last_uses[regno+i]; u; u = XEXP (u, 1)) ! 1418: add_dependence (insn, XEXP (u, 0), REG_DEP_ANTI); ! 1419: reg_last_uses[regno + i] = 0; ! 1420: if (reg_last_sets[regno + i]) ! 1421: add_dependence (insn, reg_last_sets[regno + i], ! 1422: REG_DEP_OUTPUT); ! 1423: reg_last_sets[regno + i] = insn; ! 1424: if ((call_used_regs[i] || global_regs[i]) ! 1425: && last_function_call) ! 1426: /* Function calls clobber all call_used regs. */ ! 1427: add_dependence (insn, last_function_call, REG_DEP_ANTI); ! 1428: } ! 1429: } ! 1430: else ! 1431: { ! 1432: rtx u; ! 1433: ! 1434: for (u = reg_last_uses[regno]; u; u = XEXP (u, 1)) ! 1435: add_dependence (insn, XEXP (u, 0), REG_DEP_ANTI); ! 1436: reg_last_uses[regno] = 0; ! 1437: if (reg_last_sets[regno]) ! 1438: add_dependence (insn, reg_last_sets[regno], REG_DEP_OUTPUT); ! 1439: reg_last_sets[regno] = insn; ! 1440: ! 1441: /* Don't let it cross a call after scheduling if it doesn't ! 1442: already cross one. */ ! 1443: if (reg_n_calls_crossed[regno] == 0 && last_function_call) ! 1444: add_dependence (insn, last_function_call, 0); ! 1445: } ! 1446: } ! 1447: } ! 1448: ! 1449: /* Handle function calls. */ ! 1450: if (GET_CODE (insn) == CALL_INSN) ! 1451: { ! 1452: rtx dep_insn; ! 1453: rtx prev_dep_insn; ! 1454: ! 1455: /* When scheduling instructions, we make sure calls don't lose their ! 1456: accompanying USE insns by depending them one on another in order. */ ! 1457: ! 1458: prev_dep_insn = insn; ! 1459: dep_insn = PREV_INSN (insn); ! 1460: while (GET_CODE (dep_insn) == INSN ! 1461: && GET_CODE (PATTERN (dep_insn)) == USE) ! 1462: { ! 1463: SCHED_GROUP_P (prev_dep_insn) = 1; ! 1464: ! 1465: /* Make a copy of all dependencies on dep_insn, and add to insn. ! 1466: This is so that all of the dependencies will apply to the ! 1467: group. */ ! 1468: ! 1469: for (link = LOG_LINKS (dep_insn); link; link = XEXP (link, 1)) ! 1470: add_dependence (insn, XEXP (link, 0), GET_MODE (link)); ! 1471: ! 1472: prev_dep_insn = dep_insn; ! 1473: dep_insn = PREV_INSN (dep_insn); ! 1474: } ! 1475: } ! 1476: } ! 1477: ! 1478: /* Analyze every insn between HEAD and TAIL inclusive, creating LOG_LINKS ! 1479: for every dependency. */ ! 1480: ! 1481: static int ! 1482: sched_analyze (head, tail) ! 1483: rtx head, tail; ! 1484: { ! 1485: register rtx insn; ! 1486: register int n_insns = 0; ! 1487: register rtx u; ! 1488: register int luid = 0; ! 1489: ! 1490: for (insn = head; ; insn = NEXT_INSN (insn)) ! 1491: { ! 1492: INSN_LUID (insn) = luid++; ! 1493: ! 1494: if (GET_CODE (insn) == INSN || GET_CODE (insn) == JUMP_INSN) ! 1495: { ! 1496: sched_analyze_insn (PATTERN (insn), insn); ! 1497: n_insns += 1; ! 1498: } ! 1499: else if (GET_CODE (insn) == CALL_INSN) ! 1500: { ! 1501: rtx dest = 0; ! 1502: rtx x; ! 1503: register int i; ! 1504: ! 1505: /* Any instruction using a hard register which may get clobbered ! 1506: by a call needs to be marked as dependent on this call. ! 1507: This prevents a use of a hard return reg from being moved ! 1508: past a void call (i.e. it does not explicitly set the hard ! 1509: return reg). */ ! 1510: ! 1511: for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) ! 1512: if (call_used_regs[i] || global_regs[i]) ! 1513: { ! 1514: for (u = reg_last_uses[i]; u; u = XEXP (u, 1)) ! 1515: if (GET_CODE (PATTERN (XEXP (u, 0))) != USE) ! 1516: add_dependence (insn, XEXP (u, 0), REG_DEP_ANTI); ! 1517: reg_last_uses[i] = 0; ! 1518: if (reg_last_sets[i] ! 1519: && GET_CODE (PATTERN (reg_last_sets[i])) != USE) ! 1520: add_dependence (insn, reg_last_sets[i], REG_DEP_ANTI); ! 1521: reg_last_sets[i] = insn; ! 1522: /* Insn, being a CALL_INSN, magically depends on ! 1523: `last_function_call' already. */ ! 1524: } ! 1525: ! 1526: /* For each insn which shouldn't cross a call, add a dependence ! 1527: between that insn and this call insn. */ ! 1528: x = LOG_LINKS (sched_before_next_call); ! 1529: while (x) ! 1530: { ! 1531: add_dependence (insn, XEXP (x, 0), REG_DEP_ANTI); ! 1532: x = XEXP (x, 1); ! 1533: } ! 1534: LOG_LINKS (sched_before_next_call) = 0; ! 1535: ! 1536: sched_analyze_insn (PATTERN (insn), insn); ! 1537: ! 1538: /* We don't need to flush memory for a function call which does ! 1539: not involve memory. */ ! 1540: if (! CONST_CALL_P (insn)) ! 1541: { ! 1542: /* In the absence of interprocedural alias analysis, ! 1543: we must flush all pending reads and writes, and ! 1544: start new dependencies starting from here. */ ! 1545: flush_pending_lists (insn); ! 1546: } ! 1547: ! 1548: /* Depend this function call (actually, the user of this ! 1549: function call) on all hard register clobberage. */ ! 1550: last_function_call = insn; ! 1551: n_insns += 1; ! 1552: } ! 1553: ! 1554: if (insn == tail) ! 1555: return n_insns; ! 1556: } ! 1557: } ! 1558: ! 1559: /* Called when we see a set of a register. If death is true, then we are ! 1560: scanning backwards. Mark that register as unborn. If nobody says ! 1561: otherwise, that is how things will remain. If death is false, then we ! 1562: are scanning forwards. Mark that register as being born. */ ! 1563: ! 1564: static void ! 1565: sched_note_set (b, x, death) ! 1566: int b; ! 1567: rtx x; ! 1568: int death; ! 1569: { ! 1570: register int regno, j; ! 1571: register rtx reg = SET_DEST (x); ! 1572: int subreg_p = 0; ! 1573: ! 1574: if (reg == 0) ! 1575: return; ! 1576: ! 1577: while (GET_CODE (reg) == SUBREG || GET_CODE (reg) == STRICT_LOW_PART ! 1578: || GET_CODE (reg) == SIGN_EXTRACT || GET_CODE (reg) == ZERO_EXTRACT) ! 1579: { ! 1580: /* Must treat modification of just one hardware register of a multi-reg ! 1581: value or just a byte field of a register exactly the same way that ! 1582: mark_set_1 in flow.c does. */ ! 1583: if (GET_CODE (reg) == ZERO_EXTRACT ! 1584: || GET_CODE (reg) == SIGN_EXTRACT ! 1585: || (GET_CODE (reg) == SUBREG ! 1586: && REG_SIZE (SUBREG_REG (reg)) > REG_SIZE (reg))) ! 1587: subreg_p = 1; ! 1588: ! 1589: reg = SUBREG_REG (reg); ! 1590: } ! 1591: ! 1592: if (GET_CODE (reg) != REG) ! 1593: return; ! 1594: ! 1595: /* Global registers are always live, so the code below does not apply ! 1596: to them. */ ! 1597: ! 1598: regno = REGNO (reg); ! 1599: if (regno >= FIRST_PSEUDO_REGISTER || ! global_regs[regno]) ! 1600: { ! 1601: register int offset = regno / REGSET_ELT_BITS; ! 1602: register int bit = 1 << (regno % REGSET_ELT_BITS); ! 1603: ! 1604: if (death) ! 1605: { ! 1606: /* If we only set part of the register, then this set does not ! 1607: kill it. */ ! 1608: if (subreg_p) ! 1609: return; ! 1610: ! 1611: /* Try killing this register. */ ! 1612: if (regno < FIRST_PSEUDO_REGISTER) ! 1613: { ! 1614: int j = HARD_REGNO_NREGS (regno, GET_MODE (reg)); ! 1615: while (--j >= 0) ! 1616: { ! 1617: offset = (regno + j) / REGSET_ELT_BITS; ! 1618: bit = 1 << ((regno + j) % REGSET_ELT_BITS); ! 1619: ! 1620: bb_live_regs[offset] &= ~bit; ! 1621: bb_dead_regs[offset] |= bit; ! 1622: } ! 1623: } ! 1624: else ! 1625: { ! 1626: bb_live_regs[offset] &= ~bit; ! 1627: bb_dead_regs[offset] |= bit; ! 1628: } ! 1629: } ! 1630: else ! 1631: { ! 1632: /* Make the register live again. */ ! 1633: if (regno < FIRST_PSEUDO_REGISTER) ! 1634: { ! 1635: int j = HARD_REGNO_NREGS (regno, GET_MODE (reg)); ! 1636: while (--j >= 0) ! 1637: { ! 1638: offset = (regno + j) / REGSET_ELT_BITS; ! 1639: bit = 1 << ((regno + j) % REGSET_ELT_BITS); ! 1640: ! 1641: bb_live_regs[offset] |= bit; ! 1642: bb_dead_regs[offset] &= ~bit; ! 1643: } ! 1644: } ! 1645: else ! 1646: { ! 1647: bb_live_regs[offset] |= bit; ! 1648: bb_dead_regs[offset] &= ~bit; ! 1649: } ! 1650: } ! 1651: } ! 1652: } ! 1653: ! 1654: /* Macros and functions for keeping the priority queue sorted, and ! 1655: dealing with queueing and unqueueing of instructions. */ ! 1656: ! 1657: #define SCHED_SORT(READY, NEW_READY, OLD_READY) \ ! 1658: do { if ((NEW_READY) - (OLD_READY) == 1) \ ! 1659: swap_sort (READY, NEW_READY); \ ! 1660: else if ((NEW_READY) - (OLD_READY) > 1) \ ! 1661: qsort (READY, NEW_READY, sizeof (rtx), rank_for_schedule); } \ ! 1662: while (0) ! 1663: ! 1664: /* Returns a positive value if y is preferred; returns a negative value if ! 1665: x is preferred. Should never return 0, since that will make the sort ! 1666: unstable. */ ! 1667: ! 1668: static int ! 1669: rank_for_schedule (x, y) ! 1670: rtx *x, *y; ! 1671: { ! 1672: rtx tmp = *y; ! 1673: rtx tmp2 = *x; ! 1674: rtx tmp_dep, tmp2_dep; ! 1675: int tmp_class, tmp2_class; ! 1676: int value; ! 1677: ! 1678: /* Choose the instruction with the highest priority, if different. */ ! 1679: if (value = INSN_PRIORITY (tmp) - INSN_PRIORITY (tmp2)) ! 1680: return value; ! 1681: ! 1682: if (last_scheduled_insn) ! 1683: { ! 1684: /* Classify the instructions into three classes: ! 1685: 1) Data dependent on last schedule insn. ! 1686: 2) Anti/Output dependent on last scheduled insn. ! 1687: 3) Independent of last scheduled insn, or has latency of one. ! 1688: Choose the insn from the highest numbered class if different. */ ! 1689: tmp_dep = find_insn_list (tmp, LOG_LINKS (last_scheduled_insn)); ! 1690: if (tmp_dep == 0 || insn_cost (tmp) == 1) ! 1691: tmp_class = 3; ! 1692: else if (REG_NOTE_KIND (tmp_dep) == 0) ! 1693: tmp_class = 1; ! 1694: else ! 1695: tmp_class = 2; ! 1696: ! 1697: tmp2_dep = find_insn_list (tmp2, LOG_LINKS (last_scheduled_insn)); ! 1698: if (tmp2_dep == 0 || insn_cost (tmp2) == 1) ! 1699: tmp2_class = 3; ! 1700: else if (REG_NOTE_KIND (tmp2_dep) == 0) ! 1701: tmp2_class = 1; ! 1702: else ! 1703: tmp2_class = 2; ! 1704: ! 1705: if (value = tmp_class - tmp2_class) ! 1706: return value; ! 1707: } ! 1708: ! 1709: /* If insns are equally good, sort by INSN_LUID (original insn order), ! 1710: so that we make the sort stable. This minimizes instruction movement, ! 1711: thus minimizing sched's effect on debugging and cross-jumping. */ ! 1712: return INSN_LUID (tmp) - INSN_LUID (tmp2); ! 1713: } ! 1714: ! 1715: /* Resort the array A in which only element at index N may be out of order. */ ! 1716: ! 1717: __inline static void ! 1718: swap_sort (a, n) ! 1719: rtx *a; ! 1720: int n; ! 1721: { ! 1722: rtx insn = a[n-1]; ! 1723: int i = n-2; ! 1724: ! 1725: while (i >= 0 && rank_for_schedule (a+i, &insn) >= 0) ! 1726: { ! 1727: a[i+1] = a[i]; ! 1728: i -= 1; ! 1729: } ! 1730: a[i+1] = insn; ! 1731: } ! 1732: ! 1733: static int max_priority; ! 1734: ! 1735: /* Add INSN to the insn queue so that it fires at least N_CYCLES ! 1736: before the currently executing insn. */ ! 1737: ! 1738: __inline static void ! 1739: queue_insn (insn, n_cycles) ! 1740: rtx insn; ! 1741: int n_cycles; ! 1742: { ! 1743: int next_q = NEXT_Q_AFTER (q_ptr, n_cycles); ! 1744: NEXT_INSN (insn) = insn_queue[next_q]; ! 1745: insn_queue[next_q] = insn; ! 1746: q_size += 1; ! 1747: } ! 1748: ! 1749: /* Return nonzero if PAT is the pattern of an insn which makes a ! 1750: register live. */ ! 1751: ! 1752: __inline static int ! 1753: birthing_insn_p (pat) ! 1754: rtx pat; ! 1755: { ! 1756: int j; ! 1757: ! 1758: if (reload_completed == 1) ! 1759: return 0; ! 1760: ! 1761: if (GET_CODE (pat) == SET ! 1762: && GET_CODE (SET_DEST (pat)) == REG) ! 1763: { ! 1764: rtx dest = SET_DEST (pat); ! 1765: int i = REGNO (dest); ! 1766: int offset = i / REGSET_ELT_BITS; ! 1767: int bit = 1 << (i % REGSET_ELT_BITS); ! 1768: ! 1769: /* It would be more accurate to use refers_to_regno_p or ! 1770: reg_mentioned_p to determine when the dest is not live before this ! 1771: insn. */ ! 1772: ! 1773: if (bb_live_regs[offset] & bit) ! 1774: return (reg_n_sets[i] == 1); ! 1775: ! 1776: return 0; ! 1777: } ! 1778: if (GET_CODE (pat) == PARALLEL) ! 1779: { ! 1780: for (j = 0; j < XVECLEN (pat, 0); j++) ! 1781: if (birthing_insn_p (XVECEXP (pat, 0, j))) ! 1782: return 1; ! 1783: } ! 1784: return 0; ! 1785: } ! 1786: ! 1787: /* If PREV is an insn which is immediately ready to execute, return 1, ! 1788: otherwise return 0. We may adjust its priority if that will help shorten ! 1789: register lifetimes. */ ! 1790: ! 1791: static int ! 1792: launch_link (prev) ! 1793: rtx prev; ! 1794: { ! 1795: rtx pat = PATTERN (prev); ! 1796: rtx note; ! 1797: /* MAX of (a) number of cycles needed by prev ! 1798: (b) number of cycles before needed resources are free. */ ! 1799: int n_cycles = insn_cost (prev); ! 1800: int n_deaths = 0; ! 1801: ! 1802: /* Trying to shorten register lives after reload has completed ! 1803: is useless and wrong. It gives inaccurate schedules. */ ! 1804: if (reload_completed == 0) ! 1805: { ! 1806: for (note = REG_NOTES (prev); note; note = XEXP (note, 1)) ! 1807: if (REG_NOTE_KIND (note) == REG_DEAD) ! 1808: n_deaths += 1; ! 1809: ! 1810: /* Defer scheduling insns which kill registers, since that ! 1811: shortens register lives. Prefer scheduling insns which ! 1812: make registers live for the same reason. */ ! 1813: switch (n_deaths) ! 1814: { ! 1815: default: ! 1816: INSN_PRIORITY (prev) >>= 3; ! 1817: break; ! 1818: case 3: ! 1819: INSN_PRIORITY (prev) >>= 2; ! 1820: break; ! 1821: case 2: ! 1822: case 1: ! 1823: INSN_PRIORITY (prev) >>= 1; ! 1824: break; ! 1825: case 0: ! 1826: if (birthing_insn_p (pat)) ! 1827: { ! 1828: int max = max_priority; ! 1829: ! 1830: if (max > INSN_PRIORITY (prev)) ! 1831: INSN_PRIORITY (prev) = max; ! 1832: } ! 1833: break; ! 1834: } ! 1835: } ! 1836: ! 1837: if (n_cycles <= 1) ! 1838: return 1; ! 1839: queue_insn (prev, n_cycles); ! 1840: return 0; ! 1841: } ! 1842: ! 1843: /* INSN is the "currently executing insn". Launch each insn which was ! 1844: waiting on INSN (in the backwards dataflow sense). READY is a ! 1845: vector of insns which are ready to fire. N_READY is the number of ! 1846: elements in READY. */ ! 1847: ! 1848: static int ! 1849: launch_links (insn, ready, n_ready) ! 1850: rtx insn; ! 1851: rtx *ready; ! 1852: int n_ready; ! 1853: { ! 1854: rtx link; ! 1855: int new_ready = n_ready; ! 1856: ! 1857: if (LOG_LINKS (insn) == 0) ! 1858: return n_ready; ! 1859: ! 1860: /* This is used by the function launch_link above. */ ! 1861: if (n_ready > 0) ! 1862: max_priority = MAX (INSN_PRIORITY (ready[0]), INSN_PRIORITY (insn)); ! 1863: else ! 1864: max_priority = INSN_PRIORITY (insn); ! 1865: ! 1866: for (link = LOG_LINKS (insn); link != 0; link = XEXP (link, 1)) ! 1867: { ! 1868: rtx prev = XEXP (link, 0); ! 1869: ! 1870: if ((INSN_REF_COUNT (prev) -= 1) == 0 && launch_link (prev)) ! 1871: ready[new_ready++] = prev; ! 1872: } ! 1873: ! 1874: return new_ready; ! 1875: } ! 1876: ! 1877: /* Add a REG_DEAD note for REG to INSN, reusing a REG_DEAD note from the ! 1878: dead_notes list. */ ! 1879: ! 1880: static void ! 1881: create_reg_dead_note (reg, insn) ! 1882: rtx reg, insn; ! 1883: { ! 1884: rtx link = dead_notes; ! 1885: ! 1886: if (link == 0) ! 1887: /* In theory, we should not end up with more REG_DEAD reg notes than we ! 1888: started with. In practice, this can occur as the result of bugs in ! 1889: flow, combine and/or sched. */ ! 1890: { ! 1891: #if 1 ! 1892: abort (); ! 1893: #else ! 1894: link = rtx_alloc (EXPR_LIST); ! 1895: PUT_REG_NOTE_KIND (link, REG_DEAD); ! 1896: #endif ! 1897: } ! 1898: else ! 1899: dead_notes = XEXP (dead_notes, 1); ! 1900: ! 1901: XEXP (link, 0) = reg; ! 1902: XEXP (link, 1) = REG_NOTES (insn); ! 1903: REG_NOTES (insn) = link; ! 1904: } ! 1905: ! 1906: /* Subroutine on attach_deaths_insn--handles the recursive search ! 1907: through INSN. If SET_P is true, then x is being modified by the insn. */ ! 1908: ! 1909: static void ! 1910: attach_deaths (x, insn, set_p) ! 1911: rtx x; ! 1912: rtx insn; ! 1913: int set_p; ! 1914: { ! 1915: register int i; ! 1916: register int j; ! 1917: register enum rtx_code code; ! 1918: register char *fmt; ! 1919: ! 1920: if (x == 0) ! 1921: return; ! 1922: ! 1923: code = GET_CODE (x); ! 1924: ! 1925: switch (code) ! 1926: { ! 1927: case CONST_INT: ! 1928: case CONST_DOUBLE: ! 1929: case LABEL_REF: ! 1930: case SYMBOL_REF: ! 1931: case CONST: ! 1932: case CODE_LABEL: ! 1933: case PC: ! 1934: case CC0: ! 1935: /* Get rid of the easy cases first. */ ! 1936: return; ! 1937: ! 1938: case REG: ! 1939: { ! 1940: /* If the register dies in this insn, queue that note, and mark ! 1941: this register as needing to die. */ ! 1942: /* This code is very similar to mark_used_1 (if set_p is false) ! 1943: and mark_set_1 (if set_p is true) in flow.c. */ ! 1944: ! 1945: register int regno = REGNO (x); ! 1946: register int offset = regno / REGSET_ELT_BITS; ! 1947: register int bit = 1 << (regno % REGSET_ELT_BITS); ! 1948: int all_needed = (old_live_regs[offset] & bit); ! 1949: int some_needed = (old_live_regs[offset] & bit); ! 1950: ! 1951: if (set_p) ! 1952: return; ! 1953: ! 1954: if (regno < FIRST_PSEUDO_REGISTER) ! 1955: { ! 1956: int n; ! 1957: ! 1958: n = HARD_REGNO_NREGS (regno, GET_MODE (x)); ! 1959: while (--n > 0) ! 1960: { ! 1961: some_needed |= (old_live_regs[(regno + n) / REGSET_ELT_BITS] ! 1962: & 1 << ((regno + n) % REGSET_ELT_BITS)); ! 1963: all_needed &= (old_live_regs[(regno + n) / REGSET_ELT_BITS] ! 1964: & 1 << ((regno + n) % REGSET_ELT_BITS)); ! 1965: } ! 1966: } ! 1967: ! 1968: /* If it wasn't live before we started, then add a REG_DEAD note. ! 1969: We must check the previous lifetime info not the current info, ! 1970: because we may have to execute this code several times, e.g. ! 1971: once for a clobber (which doesn't add a note) and later ! 1972: for a use (which does add a note). ! 1973: ! 1974: Always make the register live. We must do this even if it was ! 1975: live before, because this may be an insn which sets and uses ! 1976: the same register, in which case the register has already been ! 1977: killed, so we must make it live again. ! 1978: ! 1979: Global registers are always live, and should never have a REG_DEAD ! 1980: note added for them, so none of the code below applies to them. */ ! 1981: ! 1982: if (regno >= FIRST_PSEUDO_REGISTER || ! global_regs[regno]) ! 1983: { ! 1984: /* Never add REG_DEAD notes for the FRAME_POINTER_REGNUM or the ! 1985: STACK_POINTER_REGNUM, since these are always considered to be ! 1986: live. Similarly for ARG_POINTER_REGNUM if it is fixed. */ ! 1987: if (regno != FRAME_POINTER_REGNUM ! 1988: #if ARG_POINTER_REGNUM != FRAME_POINTER_REGNUM ! 1989: && ! (regno == ARG_POINTER_REGNUM && fixed_regs[regno]) ! 1990: #endif ! 1991: && regno != STACK_POINTER_REGNUM) ! 1992: { ! 1993: if (! all_needed && ! dead_or_set_p (insn, x)) ! 1994: { ! 1995: /* If none of the words in X is needed, make a REG_DEAD ! 1996: note. Otherwise, we must make partial REG_DEAD ! 1997: notes. */ ! 1998: if (! some_needed) ! 1999: create_reg_dead_note (x, insn); ! 2000: else ! 2001: { ! 2002: int i; ! 2003: ! 2004: /* Don't make a REG_DEAD note for a part of a ! 2005: register that is set in the insn. */ ! 2006: for (i = HARD_REGNO_NREGS (regno, GET_MODE (x)) - 1; ! 2007: i >= 0; i--) ! 2008: if ((old_live_regs[(regno + i) / REGSET_ELT_BITS] ! 2009: & 1 << ((regno +i) % REGSET_ELT_BITS)) == 0 ! 2010: && ! dead_or_set_regno_p (insn, regno + i)) ! 2011: create_reg_dead_note (gen_rtx (REG, word_mode, ! 2012: regno + i), ! 2013: insn); ! 2014: } ! 2015: } ! 2016: } ! 2017: ! 2018: if (regno < FIRST_PSEUDO_REGISTER) ! 2019: { ! 2020: int j = HARD_REGNO_NREGS (regno, GET_MODE (x)); ! 2021: while (--j >= 0) ! 2022: { ! 2023: offset = (regno + j) / REGSET_ELT_BITS; ! 2024: bit = 1 << ((regno + j) % REGSET_ELT_BITS); ! 2025: ! 2026: bb_dead_regs[offset] &= ~bit; ! 2027: bb_live_regs[offset] |= bit; ! 2028: } ! 2029: } ! 2030: else ! 2031: { ! 2032: bb_dead_regs[offset] &= ~bit; ! 2033: bb_live_regs[offset] |= bit; ! 2034: } ! 2035: } ! 2036: return; ! 2037: } ! 2038: ! 2039: case MEM: ! 2040: /* Handle tail-recursive case. */ ! 2041: attach_deaths (XEXP (x, 0), insn, 0); ! 2042: return; ! 2043: ! 2044: case SUBREG: ! 2045: case STRICT_LOW_PART: ! 2046: /* These two cases preserve the value of SET_P, so handle them ! 2047: separately. */ ! 2048: attach_deaths (XEXP (x, 0), insn, set_p); ! 2049: return; ! 2050: ! 2051: case ZERO_EXTRACT: ! 2052: case SIGN_EXTRACT: ! 2053: /* This case preserves the value of SET_P for the first operand, but ! 2054: clears it for the other two. */ ! 2055: attach_deaths (XEXP (x, 0), insn, set_p); ! 2056: attach_deaths (XEXP (x, 1), insn, 0); ! 2057: attach_deaths (XEXP (x, 2), insn, 0); ! 2058: return; ! 2059: ! 2060: default: ! 2061: /* Other cases: walk the insn. */ ! 2062: fmt = GET_RTX_FORMAT (code); ! 2063: for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) ! 2064: { ! 2065: if (fmt[i] == 'e') ! 2066: attach_deaths (XEXP (x, i), insn, 0); ! 2067: else if (fmt[i] == 'E') ! 2068: for (j = 0; j < XVECLEN (x, i); j++) ! 2069: attach_deaths (XVECEXP (x, i, j), insn, 0); ! 2070: } ! 2071: } ! 2072: } ! 2073: ! 2074: /* After INSN has executed, add register death notes for each register ! 2075: that is dead after INSN. */ ! 2076: ! 2077: static void ! 2078: attach_deaths_insn (insn) ! 2079: rtx insn; ! 2080: { ! 2081: rtx x = PATTERN (insn); ! 2082: register RTX_CODE code = GET_CODE (x); ! 2083: ! 2084: if (code == SET) ! 2085: { ! 2086: attach_deaths (SET_SRC (x), insn, 0); ! 2087: ! 2088: /* A register might die here even if it is the destination, e.g. ! 2089: it is the target of a volatile read and is otherwise unused. ! 2090: Hence we must always call attach_deaths for the SET_DEST. */ ! 2091: attach_deaths (SET_DEST (x), insn, 1); ! 2092: } ! 2093: else if (code == PARALLEL) ! 2094: { ! 2095: register int i; ! 2096: for (i = XVECLEN (x, 0) - 1; i >= 0; i--) ! 2097: { ! 2098: code = GET_CODE (XVECEXP (x, 0, i)); ! 2099: if (code == SET) ! 2100: { ! 2101: attach_deaths (SET_SRC (XVECEXP (x, 0, i)), insn, 0); ! 2102: ! 2103: attach_deaths (SET_DEST (XVECEXP (x, 0, i)), insn, 1); ! 2104: } ! 2105: else if (code == CLOBBER) ! 2106: attach_deaths (XEXP (XVECEXP (x, 0, i), 0), insn, 1); ! 2107: else ! 2108: attach_deaths (XVECEXP (x, 0, i), insn, 0); ! 2109: } ! 2110: } ! 2111: else if (code == CLOBBER) ! 2112: attach_deaths (XEXP (x, 0), insn, 1); ! 2113: else ! 2114: attach_deaths (x, insn, 0); ! 2115: } ! 2116: ! 2117: /* Delete notes beginning with INSN and maybe put them in the chain ! 2118: of notes ended by NOTE_LIST. ! 2119: Returns the insn following the notes. */ ! 2120: ! 2121: static rtx ! 2122: unlink_notes (insn, tail) ! 2123: rtx insn, tail; ! 2124: { ! 2125: rtx prev = PREV_INSN (insn); ! 2126: ! 2127: while (insn != tail && GET_CODE (insn) == NOTE) ! 2128: { ! 2129: rtx next = NEXT_INSN (insn); ! 2130: /* Delete the note from its current position. */ ! 2131: if (prev) ! 2132: NEXT_INSN (prev) = next; ! 2133: if (next) ! 2134: PREV_INSN (next) = prev; ! 2135: ! 2136: if (write_symbols != NO_DEBUG && NOTE_LINE_NUMBER (insn) > 0) ! 2137: /* Record line-number notes so they can be reused. */ ! 2138: LINE_NOTE (insn) = insn; ! 2139: else ! 2140: { ! 2141: /* Insert the note at the end of the notes list. */ ! 2142: PREV_INSN (insn) = note_list; ! 2143: if (note_list) ! 2144: NEXT_INSN (note_list) = insn; ! 2145: note_list = insn; ! 2146: } ! 2147: ! 2148: insn = next; ! 2149: } ! 2150: return insn; ! 2151: } ! 2152: ! 2153: /* Data structure for keeping track of register information ! 2154: during that register's life. */ ! 2155: ! 2156: struct sometimes ! 2157: { ! 2158: short offset; short bit; ! 2159: short live_length; short calls_crossed; ! 2160: }; ! 2161: ! 2162: /* Constructor for `sometimes' data structure. */ ! 2163: ! 2164: static int ! 2165: new_sometimes_live (regs_sometimes_live, offset, bit, sometimes_max) ! 2166: struct sometimes *regs_sometimes_live; ! 2167: int offset, bit; ! 2168: int sometimes_max; ! 2169: { ! 2170: register struct sometimes *p; ! 2171: register int regno = offset * REGSET_ELT_BITS + bit; ! 2172: int i; ! 2173: ! 2174: /* There should never be a register greater than max_regno here. If there ! 2175: is, it means that a define_split has created a new pseudo reg. This ! 2176: is not allowed, since there will not be flow info available for any ! 2177: new register, so catch the error here. */ ! 2178: if (regno >= max_regno) ! 2179: abort (); ! 2180: ! 2181: p = ®s_sometimes_live[sometimes_max]; ! 2182: p->offset = offset; ! 2183: p->bit = bit; ! 2184: p->live_length = 0; ! 2185: p->calls_crossed = 0; ! 2186: sometimes_max++; ! 2187: return sometimes_max; ! 2188: } ! 2189: ! 2190: /* Count lengths of all regs we are currently tracking, ! 2191: and find new registers no longer live. */ ! 2192: ! 2193: static void ! 2194: finish_sometimes_live (regs_sometimes_live, sometimes_max) ! 2195: struct sometimes *regs_sometimes_live; ! 2196: int sometimes_max; ! 2197: { ! 2198: int i; ! 2199: ! 2200: for (i = 0; i < sometimes_max; i++) ! 2201: { ! 2202: register struct sometimes *p = ®s_sometimes_live[i]; ! 2203: int regno; ! 2204: ! 2205: regno = p->offset * REGSET_ELT_BITS + p->bit; ! 2206: ! 2207: sched_reg_live_length[regno] += p->live_length; ! 2208: sched_reg_n_calls_crossed[regno] += p->calls_crossed; ! 2209: } ! 2210: } ! 2211: ! 2212: /* Use modified list scheduling to rearrange insns in basic block ! 2213: B. FILE, if nonzero, is where we dump interesting output about ! 2214: this pass. */ ! 2215: ! 2216: static void ! 2217: schedule_block (b, file) ! 2218: int b; ! 2219: FILE *file; ! 2220: { ! 2221: rtx insn, last; ! 2222: rtx last_note = 0; ! 2223: rtx *ready, link; ! 2224: int i, j, n_ready = 0, new_ready, n_insns = 0; ! 2225: int sched_n_insns = 0; ! 2226: #define NEED_NOTHING 0 ! 2227: #define NEED_HEAD 1 ! 2228: #define NEED_TAIL 2 ! 2229: int new_needs; ! 2230: ! 2231: /* HEAD and TAIL delimit the region being scheduled. */ ! 2232: rtx head = basic_block_head[b]; ! 2233: rtx tail = basic_block_end[b]; ! 2234: /* PREV_HEAD and NEXT_TAIL are the boundaries of the insns ! 2235: being scheduled. When the insns have been ordered, ! 2236: these insns delimit where the new insns are to be ! 2237: spliced back into the insn chain. */ ! 2238: rtx next_tail; ! 2239: rtx prev_head; ! 2240: ! 2241: /* Keep life information accurate. */ ! 2242: register struct sometimes *regs_sometimes_live; ! 2243: int sometimes_max; ! 2244: ! 2245: if (file) ! 2246: fprintf (file, ";;\t -- basic block number %d from %d to %d --\n", ! 2247: b, INSN_UID (basic_block_head[b]), INSN_UID (basic_block_end[b])); ! 2248: ! 2249: i = max_reg_num (); ! 2250: reg_last_uses = (rtx *) alloca (i * sizeof (rtx)); ! 2251: bzero (reg_last_uses, i * sizeof (rtx)); ! 2252: reg_last_sets = (rtx *) alloca (i * sizeof (rtx)); ! 2253: bzero (reg_last_sets, i * sizeof (rtx)); ! 2254: ! 2255: /* Remove certain insns at the beginning from scheduling, ! 2256: by advancing HEAD. */ ! 2257: ! 2258: /* At the start of a function, before reload has run, don't delay getting ! 2259: parameters from hard registers into pseudo registers. */ ! 2260: if (reload_completed == 0 && b == 0) ! 2261: { ! 2262: while (head != tail ! 2263: && GET_CODE (head) == NOTE ! 2264: && NOTE_LINE_NUMBER (head) != NOTE_INSN_FUNCTION_BEG) ! 2265: head = NEXT_INSN (head); ! 2266: while (head != tail ! 2267: && GET_CODE (head) == INSN ! 2268: && GET_CODE (PATTERN (head)) == SET) ! 2269: { ! 2270: rtx src = SET_SRC (PATTERN (head)); ! 2271: while (GET_CODE (src) == SUBREG ! 2272: || GET_CODE (src) == SIGN_EXTEND ! 2273: || GET_CODE (src) == ZERO_EXTEND ! 2274: || GET_CODE (src) == SIGN_EXTRACT ! 2275: || GET_CODE (src) == ZERO_EXTRACT) ! 2276: src = XEXP (src, 0); ! 2277: if (GET_CODE (src) != REG ! 2278: || REGNO (src) >= FIRST_PSEUDO_REGISTER) ! 2279: break; ! 2280: /* Keep this insn from ever being scheduled. */ ! 2281: INSN_REF_COUNT (head) = 1; ! 2282: head = NEXT_INSN (head); ! 2283: } ! 2284: } ! 2285: ! 2286: /* Don't include any notes or labels at the beginning of the ! 2287: basic block, or notes at the ends of basic blocks. */ ! 2288: while (head != tail) ! 2289: { ! 2290: if (GET_CODE (head) == NOTE) ! 2291: head = NEXT_INSN (head); ! 2292: else if (GET_CODE (tail) == NOTE) ! 2293: tail = PREV_INSN (tail); ! 2294: else if (GET_CODE (head) == CODE_LABEL) ! 2295: head = NEXT_INSN (head); ! 2296: else break; ! 2297: } ! 2298: /* If the only insn left is a NOTE or a CODE_LABEL, then there is no need ! 2299: to schedule this block. */ ! 2300: if (head == tail ! 2301: && (GET_CODE (head) == NOTE || GET_CODE (head) == CODE_LABEL)) ! 2302: return; ! 2303: ! 2304: #if 0 ! 2305: /* This short-cut doesn't work. It does not count call insns crossed by ! 2306: registers in reg_sometimes_live. It does not mark these registers as ! 2307: dead if they die in this block. It does not mark these registers live ! 2308: (or create new reg_sometimes_live entries if necessary) if they are born ! 2309: in this block. ! 2310: ! 2311: The easy solution is to just always schedule a block. This block only ! 2312: has one insn, so this won't slow down this pass by much. */ ! 2313: ! 2314: if (head == tail) ! 2315: return; ! 2316: #endif ! 2317: ! 2318: /* Exclude certain insns at the end of the basic block by advancing TAIL. */ ! 2319: /* This isn't correct. Instead of advancing TAIL, should assign very ! 2320: high priorities to these insns to guarantee that they get scheduled last. ! 2321: If these insns are ignored, as is currently done, the register life info ! 2322: may be incorrectly computed. */ ! 2323: if (GET_CODE (tail) == INSN ! 2324: && GET_CODE (PATTERN (tail)) == USE ! 2325: && next_nonnote_insn (tail) == 0) ! 2326: { ! 2327: /* If this was the only insn in the block, then there are no insns to ! 2328: schedule. */ ! 2329: if (head == tail) ! 2330: return; ! 2331: ! 2332: /* We don't try to reorder the USE at the end of a function. */ ! 2333: tail = prev_nonnote_insn (tail); ! 2334: ! 2335: #if 0 ! 2336: /* This short-cut does not work. See comment above. */ ! 2337: if (head == tail) ! 2338: return; ! 2339: #endif ! 2340: } ! 2341: else if (GET_CODE (tail) == JUMP_INSN ! 2342: && SCHED_GROUP_P (tail) == 0 ! 2343: && GET_CODE (PREV_INSN (tail)) == INSN ! 2344: && GET_CODE (PATTERN (PREV_INSN (tail))) == USE ! 2345: && REG_FUNCTION_VALUE_P (XEXP (PATTERN (PREV_INSN (tail)), 0))) ! 2346: { ! 2347: /* Don't let the setting of the function's return value register ! 2348: move from this jump. For the same reason we want to get the ! 2349: parameters into pseudo registers as quickly as possible, we ! 2350: want to set the function's return value register as late as ! 2351: possible. */ ! 2352: ! 2353: /* If this is the only insn in the block, then there is no need to ! 2354: schedule the block. */ ! 2355: if (head == tail) ! 2356: return; ! 2357: ! 2358: tail = PREV_INSN (tail); ! 2359: if (head == tail) ! 2360: return; ! 2361: ! 2362: tail = prev_nonnote_insn (tail); ! 2363: ! 2364: #if 0 ! 2365: /* This shortcut does not work. See comment above. */ ! 2366: if (head == tail) ! 2367: return; ! 2368: #endif ! 2369: } ! 2370: ! 2371: #ifdef HAVE_cc0 ! 2372: /* This is probably wrong. Instead of doing this, should give this insn ! 2373: a very high priority to guarantee that it gets scheduled last. */ ! 2374: /* Can not separate an insn that sets the condition code from one that ! 2375: uses it. So we must leave an insn that sets cc0 where it is. */ ! 2376: if (sets_cc0_p (PATTERN (tail))) ! 2377: tail = PREV_INSN (tail); ! 2378: #endif ! 2379: ! 2380: /* Now HEAD through TAIL are the insns actually to be rearranged; ! 2381: Let PREV_HEAD and NEXT_TAIL enclose them. */ ! 2382: prev_head = PREV_INSN (head); ! 2383: next_tail = NEXT_INSN (tail); ! 2384: ! 2385: /* Initialize basic block data structures. */ ! 2386: dead_notes = 0; ! 2387: pending_read_insns = 0; ! 2388: pending_read_mems = 0; ! 2389: pending_write_insns = 0; ! 2390: pending_write_mems = 0; ! 2391: pending_lists_length = 0; ! 2392: last_pending_memory_flush = 0; ! 2393: last_function_call = 0; ! 2394: last_scheduled_insn = 0; ! 2395: ! 2396: LOG_LINKS (sched_before_next_call) = 0; ! 2397: ! 2398: n_insns += sched_analyze (head, tail); ! 2399: if (n_insns == 0) ! 2400: { ! 2401: free_pending_lists (); ! 2402: return; ! 2403: } ! 2404: ! 2405: /* Allocate vector to hold insns to be rearranged (except those ! 2406: insns which are controlled by an insn with SCHED_GROUP_P set). ! 2407: All these insns are included between ORIG_HEAD and ORIG_TAIL, ! 2408: as those variables ultimately are set up. */ ! 2409: ready = (rtx *) alloca ((n_insns+1) * sizeof (rtx)); ! 2410: ! 2411: /* TAIL is now the last of the insns to be rearranged. ! 2412: Put those insns into the READY vector. */ ! 2413: insn = tail; ! 2414: ! 2415: /* If the last insn is a branch, force it to be the last insn after ! 2416: scheduling. Also, don't try to reorder calls at the ends the basic ! 2417: block -- this will only lead to worse register allocation. */ ! 2418: if (GET_CODE (tail) == CALL_INSN || GET_CODE (tail) == JUMP_INSN) ! 2419: { ! 2420: priority (tail); ! 2421: ready[n_ready++] = tail; ! 2422: INSN_PRIORITY (tail) = TAIL_PRIORITY; ! 2423: INSN_REF_COUNT (tail) = 0; ! 2424: insn = PREV_INSN (tail); ! 2425: } ! 2426: ! 2427: /* Assign priorities to instructions. Also check whether they ! 2428: are in priority order already. If so then I will be nonnegative. ! 2429: We use this shortcut only before reloading. */ ! 2430: #if 0 ! 2431: i = reload_completed ? DONE_PRIORITY : MAX_PRIORITY; ! 2432: #endif ! 2433: ! 2434: for (; insn != prev_head; insn = PREV_INSN (insn)) ! 2435: { ! 2436: if (GET_RTX_CLASS (GET_CODE (insn)) == 'i') ! 2437: { ! 2438: priority (insn); ! 2439: if (INSN_REF_COUNT (insn) == 0) ! 2440: ready[n_ready++] = insn; ! 2441: if (SCHED_GROUP_P (insn)) ! 2442: { ! 2443: while (SCHED_GROUP_P (insn)) ! 2444: { ! 2445: insn = PREV_INSN (insn); ! 2446: while (GET_CODE (insn) == NOTE) ! 2447: insn = PREV_INSN (insn); ! 2448: priority (insn); ! 2449: } ! 2450: continue; ! 2451: } ! 2452: #if 0 ! 2453: if (i < 0) ! 2454: continue; ! 2455: if (INSN_PRIORITY (insn) < i) ! 2456: i = INSN_PRIORITY (insn); ! 2457: else if (INSN_PRIORITY (insn) > i) ! 2458: i = DONE_PRIORITY; ! 2459: #endif ! 2460: } ! 2461: } ! 2462: ! 2463: #if 0 ! 2464: /* This short-cut doesn't work. It does not count call insns crossed by ! 2465: registers in reg_sometimes_live. It does not mark these registers as ! 2466: dead if they die in this block. It does not mark these registers live ! 2467: (or create new reg_sometimes_live entries if necessary) if they are born ! 2468: in this block. ! 2469: ! 2470: The easy solution is to just always schedule a block. These blocks tend ! 2471: to be very short, so this doesn't slow down this pass by much. */ ! 2472: ! 2473: /* If existing order is good, don't bother to reorder. */ ! 2474: if (i != DONE_PRIORITY) ! 2475: { ! 2476: if (file) ! 2477: fprintf (file, ";; already scheduled\n"); ! 2478: ! 2479: if (reload_completed == 0) ! 2480: { ! 2481: for (i = 0; i < sometimes_max; i++) ! 2482: regs_sometimes_live[i].live_length += n_insns; ! 2483: ! 2484: finish_sometimes_live (regs_sometimes_live, sometimes_max); ! 2485: } ! 2486: free_pending_lists (); ! 2487: return; ! 2488: } ! 2489: #endif ! 2490: ! 2491: /* Scan all the insns to be scheduled, removing NOTE insns ! 2492: and register death notes. ! 2493: Line number NOTE insns end up in NOTE_LIST. ! 2494: Register death notes end up in DEAD_NOTES. ! 2495: ! 2496: Recreate the register life information for the end of this basic ! 2497: block. */ ! 2498: ! 2499: if (reload_completed == 0) ! 2500: { ! 2501: bcopy (basic_block_live_at_start[b], bb_live_regs, regset_bytes); ! 2502: bzero (bb_dead_regs, regset_bytes); ! 2503: ! 2504: if (b == 0) ! 2505: { ! 2506: /* This is the first block in the function. There may be insns ! 2507: before head that we can't schedule. We still need to examine ! 2508: them though for accurate register lifetime analysis. */ ! 2509: ! 2510: /* We don't want to remove any REG_DEAD notes as the code below ! 2511: does. */ ! 2512: ! 2513: for (insn = basic_block_head[b]; insn != head; ! 2514: insn = NEXT_INSN (insn)) ! 2515: if (GET_RTX_CLASS (GET_CODE (insn)) == 'i') ! 2516: { ! 2517: /* See if the register gets born here. */ ! 2518: /* We must check for registers being born before we check for ! 2519: registers dying. It is possible for a register to be born ! 2520: and die in the same insn, e.g. reading from a volatile ! 2521: memory location into an otherwise unused register. Such ! 2522: a register must be marked as dead after this insn. */ ! 2523: if (GET_CODE (PATTERN (insn)) == SET ! 2524: || GET_CODE (PATTERN (insn)) == CLOBBER) ! 2525: sched_note_set (b, PATTERN (insn), 0); ! 2526: else if (GET_CODE (PATTERN (insn)) == PARALLEL) ! 2527: { ! 2528: int j; ! 2529: for (j = XVECLEN (PATTERN (insn), 0) - 1; j >= 0; j--) ! 2530: if (GET_CODE (XVECEXP (PATTERN (insn), 0, j)) == SET ! 2531: || GET_CODE (XVECEXP (PATTERN (insn), 0, j)) == CLOBBER) ! 2532: sched_note_set (b, XVECEXP (PATTERN (insn), 0, j), 0); ! 2533: ! 2534: /* ??? This code is obsolete and should be deleted. It ! 2535: is harmless though, so we will leave it in for now. */ ! 2536: for (j = XVECLEN (PATTERN (insn), 0) - 1; j >= 0; j--) ! 2537: if (GET_CODE (XVECEXP (PATTERN (insn), 0, j)) == USE) ! 2538: sched_note_set (b, XVECEXP (PATTERN (insn), 0, j), 0); ! 2539: } ! 2540: ! 2541: for (link = REG_NOTES (insn); link; link = XEXP (link, 1)) ! 2542: { ! 2543: if ((REG_NOTE_KIND (link) == REG_DEAD ! 2544: || REG_NOTE_KIND (link) == REG_UNUSED) ! 2545: /* Verify that the REG_NOTE has a legal value. */ ! 2546: && GET_CODE (XEXP (link, 0)) == REG) ! 2547: { ! 2548: register int regno = REGNO (XEXP (link, 0)); ! 2549: register int offset = regno / REGSET_ELT_BITS; ! 2550: register int bit = 1 << (regno % REGSET_ELT_BITS); ! 2551: ! 2552: if (regno < FIRST_PSEUDO_REGISTER) ! 2553: { ! 2554: int j = HARD_REGNO_NREGS (regno, ! 2555: GET_MODE (XEXP (link, 0))); ! 2556: while (--j >= 0) ! 2557: { ! 2558: offset = (regno + j) / REGSET_ELT_BITS; ! 2559: bit = 1 << ((regno + j) % REGSET_ELT_BITS); ! 2560: ! 2561: bb_live_regs[offset] &= ~bit; ! 2562: bb_dead_regs[offset] |= bit; ! 2563: } ! 2564: } ! 2565: else ! 2566: { ! 2567: bb_live_regs[offset] &= ~bit; ! 2568: bb_dead_regs[offset] |= bit; ! 2569: } ! 2570: } ! 2571: } ! 2572: } ! 2573: } ! 2574: } ! 2575: ! 2576: /* If debugging information is being produced, keep track of the line ! 2577: number notes for each insn. */ ! 2578: if (write_symbols != NO_DEBUG) ! 2579: { ! 2580: /* We must use the true line number for the first insn in the block ! 2581: that was computed and saved at the start of this pass. We can't ! 2582: use the current line number, because scheduling of the previous ! 2583: block may have changed the current line number. */ ! 2584: rtx line = line_note_head[b]; ! 2585: ! 2586: for (insn = basic_block_head[b]; ! 2587: insn != next_tail; ! 2588: insn = NEXT_INSN (insn)) ! 2589: if (GET_CODE (insn) == NOTE && NOTE_LINE_NUMBER (insn) > 0) ! 2590: line = insn; ! 2591: else ! 2592: LINE_NOTE (insn) = line; ! 2593: } ! 2594: ! 2595: for (insn = head; insn != next_tail; insn = NEXT_INSN (insn)) ! 2596: { ! 2597: rtx prev, next, link; ! 2598: ! 2599: /* Farm out notes. This is needed to keep the debugger from ! 2600: getting completely deranged. */ ! 2601: if (GET_CODE (insn) == NOTE) ! 2602: { ! 2603: prev = insn; ! 2604: insn = unlink_notes (insn, next_tail); ! 2605: if (prev == tail) ! 2606: abort (); ! 2607: if (prev == head) ! 2608: abort (); ! 2609: if (insn == next_tail) ! 2610: abort (); ! 2611: } ! 2612: ! 2613: if (reload_completed == 0 ! 2614: && GET_RTX_CLASS (GET_CODE (insn)) == 'i') ! 2615: { ! 2616: /* See if the register gets born here. */ ! 2617: /* We must check for registers being born before we check for ! 2618: registers dying. It is possible for a register to be born and ! 2619: die in the same insn, e.g. reading from a volatile memory ! 2620: location into an otherwise unused register. Such a register ! 2621: must be marked as dead after this insn. */ ! 2622: if (GET_CODE (PATTERN (insn)) == SET ! 2623: || GET_CODE (PATTERN (insn)) == CLOBBER) ! 2624: sched_note_set (b, PATTERN (insn), 0); ! 2625: else if (GET_CODE (PATTERN (insn)) == PARALLEL) ! 2626: { ! 2627: int j; ! 2628: for (j = XVECLEN (PATTERN (insn), 0) - 1; j >= 0; j--) ! 2629: if (GET_CODE (XVECEXP (PATTERN (insn), 0, j)) == SET ! 2630: || GET_CODE (XVECEXP (PATTERN (insn), 0, j)) == CLOBBER) ! 2631: sched_note_set (b, XVECEXP (PATTERN (insn), 0, j), 0); ! 2632: ! 2633: /* ??? This code is obsolete and should be deleted. It ! 2634: is harmless though, so we will leave it in for now. */ ! 2635: for (j = XVECLEN (PATTERN (insn), 0) - 1; j >= 0; j--) ! 2636: if (GET_CODE (XVECEXP (PATTERN (insn), 0, j)) == USE) ! 2637: sched_note_set (b, XVECEXP (PATTERN (insn), 0, j), 0); ! 2638: } ! 2639: ! 2640: /* Need to know what registers this insn kills. */ ! 2641: for (prev = 0, link = REG_NOTES (insn); link; link = next) ! 2642: { ! 2643: int regno; ! 2644: ! 2645: next = XEXP (link, 1); ! 2646: if ((REG_NOTE_KIND (link) == REG_DEAD ! 2647: || REG_NOTE_KIND (link) == REG_UNUSED) ! 2648: /* Verify that the REG_NOTE has a legal value. */ ! 2649: && GET_CODE (XEXP (link, 0)) == REG) ! 2650: { ! 2651: register int regno = REGNO (XEXP (link, 0)); ! 2652: register int offset = regno / REGSET_ELT_BITS; ! 2653: register int bit = 1 << (regno % REGSET_ELT_BITS); ! 2654: ! 2655: /* Only unlink REG_DEAD notes; leave REG_UNUSED notes ! 2656: alone. */ ! 2657: if (REG_NOTE_KIND (link) == REG_DEAD) ! 2658: { ! 2659: if (prev) ! 2660: XEXP (prev, 1) = next; ! 2661: else ! 2662: REG_NOTES (insn) = next; ! 2663: XEXP (link, 1) = dead_notes; ! 2664: dead_notes = link; ! 2665: } ! 2666: else ! 2667: prev = link; ! 2668: ! 2669: if (regno < FIRST_PSEUDO_REGISTER) ! 2670: { ! 2671: int j = HARD_REGNO_NREGS (regno, ! 2672: GET_MODE (XEXP (link, 0))); ! 2673: while (--j >= 0) ! 2674: { ! 2675: offset = (regno + j) / REGSET_ELT_BITS; ! 2676: bit = 1 << ((regno + j) % REGSET_ELT_BITS); ! 2677: ! 2678: bb_live_regs[offset] &= ~bit; ! 2679: bb_dead_regs[offset] |= bit; ! 2680: } ! 2681: } ! 2682: else ! 2683: { ! 2684: bb_live_regs[offset] &= ~bit; ! 2685: bb_dead_regs[offset] |= bit; ! 2686: } ! 2687: } ! 2688: else ! 2689: prev = link; ! 2690: } ! 2691: } ! 2692: } ! 2693: ! 2694: if (reload_completed == 0) ! 2695: { ! 2696: /* Keep track of register lives. */ ! 2697: old_live_regs = (regset) alloca (regset_bytes); ! 2698: regs_sometimes_live ! 2699: = (struct sometimes *) alloca (max_regno * sizeof (struct sometimes)); ! 2700: sometimes_max = 0; ! 2701: ! 2702: /* Start with registers live at end. */ ! 2703: for (j = 0; j < regset_size; j++) ! 2704: { ! 2705: int live = bb_live_regs[j]; ! 2706: old_live_regs[j] = live; ! 2707: if (live) ! 2708: { ! 2709: register int bit; ! 2710: for (bit = 0; bit < REGSET_ELT_BITS; bit++) ! 2711: if (live & (1 << bit)) ! 2712: sometimes_max = new_sometimes_live (regs_sometimes_live, j, ! 2713: bit, sometimes_max); ! 2714: } ! 2715: } ! 2716: } ! 2717: ! 2718: SCHED_SORT (ready, n_ready, 1); ! 2719: ! 2720: if (file) ! 2721: { ! 2722: fprintf (file, ";; ready list initially:\n;; "); ! 2723: for (i = 0; i < n_ready; i++) ! 2724: fprintf (file, "%d ", INSN_UID (ready[i])); ! 2725: fprintf (file, "\n\n"); ! 2726: ! 2727: for (insn = head; insn != next_tail; insn = NEXT_INSN (insn)) ! 2728: if (INSN_PRIORITY (insn) > 0) ! 2729: fprintf (file, ";; insn[%4d]: priority = %4d, ref_count = %4d\n", ! 2730: INSN_UID (insn), INSN_PRIORITY (insn), ! 2731: INSN_REF_COUNT (insn)); ! 2732: } ! 2733: ! 2734: /* Now HEAD and TAIL are going to become disconnected ! 2735: entirely from the insn chain. */ ! 2736: tail = ready[0]; ! 2737: ! 2738: /* Q_SIZE will always be zero here. */ ! 2739: q_ptr = 0; ! 2740: bzero (insn_queue, sizeof (insn_queue)); ! 2741: ! 2742: /* Now, perform list scheduling. */ ! 2743: ! 2744: /* Where we start inserting insns is after TAIL. */ ! 2745: last = next_tail; ! 2746: ! 2747: new_needs = (NEXT_INSN (prev_head) == basic_block_head[b] ! 2748: ? NEED_HEAD : NEED_NOTHING); ! 2749: if (PREV_INSN (next_tail) == basic_block_end[b]) ! 2750: new_needs |= NEED_TAIL; ! 2751: ! 2752: new_ready = n_ready; ! 2753: while (sched_n_insns < n_insns) ! 2754: { ! 2755: q_ptr = NEXT_Q (q_ptr); ! 2756: ! 2757: /* Add all pending insns that can be scheduled without stalls to the ! 2758: ready list. */ ! 2759: for (insn = insn_queue[q_ptr]; insn; insn = NEXT_INSN (insn)) ! 2760: { ! 2761: if (file) ! 2762: fprintf (file, ";; launching %d before %d with no stalls\n", ! 2763: INSN_UID (insn), INSN_UID (last)); ! 2764: ready[new_ready++] = insn; ! 2765: q_size -= 1; ! 2766: } ! 2767: insn_queue[q_ptr] = 0; ! 2768: ! 2769: /* If there are no ready insns, stall until one is ready and add all ! 2770: of the pending insns at that point to the ready list. */ ! 2771: if (new_ready == 0) ! 2772: { ! 2773: register int stalls; ! 2774: ! 2775: for (stalls = 1; stalls < Q_SIZE; stalls++) ! 2776: if (insn = insn_queue[NEXT_Q_AFTER (q_ptr, stalls)]) ! 2777: { ! 2778: for (; insn; insn = NEXT_INSN (insn)) ! 2779: { ! 2780: if (file) ! 2781: fprintf (file, ";; issue insn %d before %d with %d stalls\n", ! 2782: INSN_UID (insn), INSN_UID (last), stalls); ! 2783: ready[new_ready++] = insn; ! 2784: q_size -= 1; ! 2785: } ! 2786: insn_queue[NEXT_Q_AFTER (q_ptr, stalls)] = 0; ! 2787: break; ! 2788: } ! 2789: ! 2790: #if 0 ! 2791: /* This looks logically correct, but on the SPEC benchmark set on ! 2792: the SPARC, I get better code without it. */ ! 2793: q_ptr = NEXT_Q_AFTER (q_ptr, stalls); ! 2794: #endif ! 2795: } ! 2796: ! 2797: /* There should be some instructions waiting to fire. */ ! 2798: if (new_ready == 0) ! 2799: abort (); ! 2800: ! 2801: /* Sort the ready list and choose the best insn to schedule. ! 2802: N_READY holds the number of items that were scheduled the last time, ! 2803: minus the one instruction scheduled on the last loop iteration; it ! 2804: is not modified for any other reason in this loop. */ ! 2805: SCHED_SORT (ready, new_ready, n_ready); ! 2806: n_ready = new_ready; ! 2807: last_scheduled_insn = insn = ready[0]; ! 2808: ! 2809: if (DONE_PRIORITY_P (insn)) ! 2810: abort (); ! 2811: ! 2812: if (reload_completed == 0) ! 2813: { ! 2814: /* Process this insn, and each insn linked to this one which must ! 2815: be immediately output after this insn. */ ! 2816: do ! 2817: { ! 2818: /* First we kill registers set by this insn, and then we ! 2819: make registers used by this insn live. This is the opposite ! 2820: order used above because we are traversing the instructions ! 2821: backwards. */ ! 2822: ! 2823: /* Strictly speaking, we should scan REG_UNUSED notes and make ! 2824: every register mentioned there live, however, we will just ! 2825: kill them again immediately below, so there doesn't seem to ! 2826: be any reason why we bother to do this. */ ! 2827: ! 2828: /* See if this is the last notice we must take of a register. */ ! 2829: if (GET_CODE (PATTERN (insn)) == SET ! 2830: || GET_CODE (PATTERN (insn)) == CLOBBER) ! 2831: sched_note_set (b, PATTERN (insn), 1); ! 2832: else if (GET_CODE (PATTERN (insn)) == PARALLEL) ! 2833: { ! 2834: int j; ! 2835: for (j = XVECLEN (PATTERN (insn), 0) - 1; j >= 0; j--) ! 2836: if (GET_CODE (XVECEXP (PATTERN (insn), 0, j)) == SET ! 2837: || GET_CODE (XVECEXP (PATTERN (insn), 0, j)) == CLOBBER) ! 2838: sched_note_set (b, XVECEXP (PATTERN (insn), 0, j), 1); ! 2839: } ! 2840: ! 2841: /* This code keeps life analysis information up to date. */ ! 2842: if (GET_CODE (insn) == CALL_INSN) ! 2843: { ! 2844: register struct sometimes *p; ! 2845: ! 2846: /* A call kills all call used and global registers, except ! 2847: for those mentioned in the call pattern which will be ! 2848: made live again later. */ ! 2849: for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) ! 2850: if (call_used_regs[i] || global_regs[i]) ! 2851: { ! 2852: register int offset = i / REGSET_ELT_BITS; ! 2853: register int bit = 1 << (i % REGSET_ELT_BITS); ! 2854: ! 2855: bb_live_regs[offset] &= ~bit; ! 2856: bb_dead_regs[offset] |= bit; ! 2857: } ! 2858: ! 2859: /* Regs live at the time of a call instruction must not ! 2860: go in a register clobbered by calls. Record this for ! 2861: all regs now live. Note that insns which are born or ! 2862: die in a call do not cross a call, so this must be done ! 2863: after the killings (above) and before the births ! 2864: (below). */ ! 2865: p = regs_sometimes_live; ! 2866: for (i = 0; i < sometimes_max; i++, p++) ! 2867: if (bb_live_regs[p->offset] & (1 << p->bit)) ! 2868: p->calls_crossed += 1; ! 2869: } ! 2870: ! 2871: /* Make every register used live, and add REG_DEAD notes for ! 2872: registers which were not live before we started. */ ! 2873: attach_deaths_insn (insn); ! 2874: ! 2875: /* Find registers now made live by that instruction. */ ! 2876: for (i = 0; i < regset_size; i++) ! 2877: { ! 2878: int diff = bb_live_regs[i] & ~old_live_regs[i]; ! 2879: if (diff) ! 2880: { ! 2881: register int bit; ! 2882: old_live_regs[i] |= diff; ! 2883: for (bit = 0; bit < REGSET_ELT_BITS; bit++) ! 2884: if (diff & (1 << bit)) ! 2885: sometimes_max ! 2886: = new_sometimes_live (regs_sometimes_live, i, bit, ! 2887: sometimes_max); ! 2888: } ! 2889: } ! 2890: ! 2891: /* Count lengths of all regs we are worrying about now, ! 2892: and handle registers no longer live. */ ! 2893: ! 2894: for (i = 0; i < sometimes_max; i++) ! 2895: { ! 2896: register struct sometimes *p = ®s_sometimes_live[i]; ! 2897: int regno = p->offset*REGSET_ELT_BITS + p->bit; ! 2898: ! 2899: p->live_length += 1; ! 2900: ! 2901: if ((bb_live_regs[p->offset] & (1 << p->bit)) == 0) ! 2902: { ! 2903: /* This is the end of one of this register's lifetime ! 2904: segments. Save the lifetime info collected so far, ! 2905: and clear its bit in the old_live_regs entry. */ ! 2906: sched_reg_live_length[regno] += p->live_length; ! 2907: sched_reg_n_calls_crossed[regno] += p->calls_crossed; ! 2908: old_live_regs[p->offset] &= ~(1 << p->bit); ! 2909: ! 2910: /* Delete the reg_sometimes_live entry for this reg by ! 2911: copying the last entry over top of it. */ ! 2912: *p = regs_sometimes_live[--sometimes_max]; ! 2913: /* ...and decrement i so that this newly copied entry ! 2914: will be processed. */ ! 2915: i--; ! 2916: } ! 2917: } ! 2918: ! 2919: link = insn; ! 2920: insn = PREV_INSN (insn); ! 2921: } ! 2922: while (SCHED_GROUP_P (link)); ! 2923: ! 2924: /* Set INSN back to the insn we are scheduling now. */ ! 2925: insn = ready[0]; ! 2926: } ! 2927: ! 2928: /* Schedule INSN. Remove it from the ready list. */ ! 2929: ready += 1; ! 2930: n_ready -= 1; ! 2931: ! 2932: sched_n_insns += 1; ! 2933: NEXT_INSN (insn) = last; ! 2934: PREV_INSN (last) = insn; ! 2935: last = insn; ! 2936: ! 2937: /* Everything that precedes INSN now either becomes "ready", if ! 2938: it can execute immediately before INSN, or "pending", if ! 2939: there must be a delay. Give INSN high enough priority that ! 2940: at least one (maybe more) reg-killing insns can be launched ! 2941: ahead of all others. Mark INSN as scheduled by changing its ! 2942: priority to -1. */ ! 2943: INSN_PRIORITY (insn) = LAUNCH_PRIORITY; ! 2944: new_ready = launch_links (insn, ready, n_ready); ! 2945: INSN_PRIORITY (insn) = DONE_PRIORITY; ! 2946: ! 2947: /* Schedule all prior insns that must not be moved. */ ! 2948: if (SCHED_GROUP_P (insn)) ! 2949: { ! 2950: /* Disable these insns from being launched. */ ! 2951: link = insn; ! 2952: while (SCHED_GROUP_P (link)) ! 2953: { ! 2954: /* Disable these insns from being launched by anybody. */ ! 2955: link = PREV_INSN (link); ! 2956: INSN_REF_COUNT (link) = 0; ! 2957: } ! 2958: ! 2959: /* None of these insns can move forward into delay slots. */ ! 2960: while (SCHED_GROUP_P (insn)) ! 2961: { ! 2962: insn = PREV_INSN (insn); ! 2963: new_ready = launch_links (insn, ready, new_ready); ! 2964: INSN_PRIORITY (insn) = DONE_PRIORITY; ! 2965: ! 2966: sched_n_insns += 1; ! 2967: NEXT_INSN (insn) = last; ! 2968: PREV_INSN (last) = insn; ! 2969: last = insn; ! 2970: } ! 2971: } ! 2972: } ! 2973: if (q_size != 0) ! 2974: abort (); ! 2975: ! 2976: if (reload_completed == 0) ! 2977: finish_sometimes_live (regs_sometimes_live, sometimes_max); ! 2978: ! 2979: /* HEAD is now the first insn in the chain of insns that ! 2980: been scheduled by the loop above. ! 2981: TAIL is the last of those insns. */ ! 2982: head = insn; ! 2983: ! 2984: /* NOTE_LIST is the end of a chain of notes previously found ! 2985: among the insns. Insert them at the beginning of the insns. */ ! 2986: if (note_list != 0) ! 2987: { ! 2988: rtx note_head = note_list; ! 2989: while (PREV_INSN (note_head)) ! 2990: note_head = PREV_INSN (note_head); ! 2991: ! 2992: PREV_INSN (head) = note_list; ! 2993: NEXT_INSN (note_list) = head; ! 2994: head = note_head; ! 2995: } ! 2996: ! 2997: /* In theory, there should be no REG_DEAD notes leftover at the end. ! 2998: In practice, this can occur as the result of bugs in flow, combine.c, ! 2999: and/or sched.c. The values of the REG_DEAD notes remaining are ! 3000: meaningless, because dead_notes is just used as a free list. */ ! 3001: #if 1 ! 3002: if (dead_notes != 0) ! 3003: abort (); ! 3004: #endif ! 3005: ! 3006: if (new_needs & NEED_HEAD) ! 3007: basic_block_head[b] = head; ! 3008: PREV_INSN (head) = prev_head; ! 3009: NEXT_INSN (prev_head) = head; ! 3010: ! 3011: if (new_needs & NEED_TAIL) ! 3012: basic_block_end[b] = tail; ! 3013: NEXT_INSN (tail) = next_tail; ! 3014: PREV_INSN (next_tail) = tail; ! 3015: ! 3016: /* Restore the line-number notes of each insn. */ ! 3017: if (write_symbols != NO_DEBUG) ! 3018: { ! 3019: rtx line, note, prev, new; ! 3020: int notes = 0; ! 3021: ! 3022: head = basic_block_head[b]; ! 3023: next_tail = NEXT_INSN (basic_block_end[b]); ! 3024: ! 3025: /* Determine the current line-number. We want to know the current ! 3026: line number of the first insn of the block here, in case it is ! 3027: different from the true line number that was saved earlier. If ! 3028: different, then we need a line number note before the first insn ! 3029: of this block. If it happens to be the same, then we don't want to ! 3030: emit another line number note here. */ ! 3031: for (line = head; line; line = PREV_INSN (line)) ! 3032: if (GET_CODE (line) == NOTE && NOTE_LINE_NUMBER (line) > 0) ! 3033: break; ! 3034: ! 3035: /* Walk the insns keeping track of the current line-number and inserting ! 3036: the line-number notes as needed. */ ! 3037: for (insn = head; insn != next_tail; insn = NEXT_INSN (insn)) ! 3038: if (GET_CODE (insn) == NOTE && NOTE_LINE_NUMBER (insn) > 0) ! 3039: line = insn; ! 3040: else if (! (GET_CODE (insn) == NOTE ! 3041: && NOTE_LINE_NUMBER (insn) == NOTE_INSN_DELETED) ! 3042: && (note = LINE_NOTE (insn)) != 0 ! 3043: && note != line ! 3044: && (line == 0 ! 3045: || NOTE_LINE_NUMBER (note) != NOTE_LINE_NUMBER (line) ! 3046: || NOTE_SOURCE_FILE (note) != NOTE_SOURCE_FILE (line))) ! 3047: { ! 3048: line = note; ! 3049: prev = PREV_INSN (insn); ! 3050: if (LINE_NOTE (note)) ! 3051: { ! 3052: /* Re-use the orignal line-number note. */ ! 3053: LINE_NOTE (note) = 0; ! 3054: PREV_INSN (note) = prev; ! 3055: NEXT_INSN (prev) = note; ! 3056: PREV_INSN (insn) = note; ! 3057: NEXT_INSN (note) = insn; ! 3058: } ! 3059: else ! 3060: { ! 3061: notes++; ! 3062: new = emit_note_after (NOTE_LINE_NUMBER (note), prev); ! 3063: NOTE_SOURCE_FILE (new) = NOTE_SOURCE_FILE (note); ! 3064: } ! 3065: } ! 3066: if (file && notes) ! 3067: fprintf (file, ";; added %d line-number notes\n", notes); ! 3068: } ! 3069: ! 3070: if (file) ! 3071: { ! 3072: fprintf (file, ";; new basic block head = %d\n;; new basic block end = %d\n\n", ! 3073: INSN_UID (basic_block_head[b]), INSN_UID (basic_block_end[b])); ! 3074: } ! 3075: ! 3076: /* Yow! We're done! */ ! 3077: free_pending_lists (); ! 3078: ! 3079: return; ! 3080: } ! 3081: ! 3082: /* Subroutine of split_hard_reg_notes. Searches X for any reference to ! 3083: REGNO, returning the rtx of the reference found if any. Otherwise, ! 3084: returns 0. */ ! 3085: ! 3086: rtx ! 3087: regno_use_in (regno, x) ! 3088: int regno; ! 3089: rtx x; ! 3090: { ! 3091: register char *fmt; ! 3092: int i, j; ! 3093: rtx tem; ! 3094: ! 3095: if (GET_CODE (x) == REG && REGNO (x) == regno) ! 3096: return x; ! 3097: ! 3098: fmt = GET_RTX_FORMAT (GET_CODE (x)); ! 3099: for (i = GET_RTX_LENGTH (GET_CODE (x)) - 1; i >= 0; i--) ! 3100: { ! 3101: if (fmt[i] == 'e') ! 3102: { ! 3103: if (tem = regno_use_in (regno, XEXP (x, i))) ! 3104: return tem; ! 3105: } ! 3106: else if (fmt[i] == 'E') ! 3107: for (j = XVECLEN (x, i) - 1; j >= 0; j--) ! 3108: if (tem = regno_use_in (regno , XVECEXP (x, i, j))) ! 3109: return tem; ! 3110: } ! 3111: ! 3112: return 0; ! 3113: } ! 3114: ! 3115: /* Subroutine of update_flow_info. Determines whether any new REG_NOTEs are ! 3116: needed for the hard register mentioned in the note. This can happen ! 3117: if the reference to the hard register in the original insn was split into ! 3118: several smaller hard register references in the split insns. */ ! 3119: ! 3120: static void ! 3121: split_hard_reg_notes (note, first, last, orig_insn) ! 3122: rtx note, first, last, orig_insn; ! 3123: { ! 3124: rtx reg, temp, link; ! 3125: int n_regs, i, new_reg; ! 3126: rtx insn; ! 3127: ! 3128: /* Assume that this is a REG_DEAD note. */ ! 3129: if (REG_NOTE_KIND (note) != REG_DEAD) ! 3130: abort (); ! 3131: ! 3132: reg = XEXP (note, 0); ! 3133: ! 3134: n_regs = HARD_REGNO_NREGS (REGNO (reg), GET_MODE (reg)); ! 3135: ! 3136: /* ??? Could add check here to see whether, the hard register is referenced ! 3137: in the same mode as in the original insn. If so, then it has not been ! 3138: split, and the rest of the code below is unnecessary. */ ! 3139: ! 3140: for (i = 1; i < n_regs; i++) ! 3141: { ! 3142: new_reg = REGNO (reg) + i; ! 3143: ! 3144: /* Check for references to new_reg in the split insns. */ ! 3145: for (insn = last; ; insn = PREV_INSN (insn)) ! 3146: { ! 3147: if (GET_RTX_CLASS (GET_CODE (insn)) == 'i' ! 3148: && (temp = regno_use_in (new_reg, PATTERN (insn)))) ! 3149: { ! 3150: /* Create a new reg dead note here. */ ! 3151: link = rtx_alloc (EXPR_LIST); ! 3152: PUT_REG_NOTE_KIND (link, REG_DEAD); ! 3153: XEXP (link, 0) = temp; ! 3154: XEXP (link, 1) = REG_NOTES (insn); ! 3155: REG_NOTES (insn) = link; ! 3156: break; ! 3157: } ! 3158: /* It isn't mentioned anywhere, so no new reg note is needed for ! 3159: this register. */ ! 3160: if (insn == first) ! 3161: break; ! 3162: } ! 3163: } ! 3164: } ! 3165: ! 3166: /* Subroutine of update_flow_info. Determines whether a SET or CLOBBER in an ! 3167: insn created by splitting needs a REG_DEAD or REG_UNUSED note added. */ ! 3168: ! 3169: static void ! 3170: new_insn_dead_notes (pat, insn, last, orig_insn) ! 3171: rtx pat, insn, last, orig_insn; ! 3172: { ! 3173: rtx dest, tem, set; ! 3174: ! 3175: /* PAT is either a CLOBBER or a SET here. */ ! 3176: dest = XEXP (pat, 0); ! 3177: ! 3178: while (GET_CODE (dest) == ZERO_EXTRACT || GET_CODE (dest) == SUBREG ! 3179: || GET_CODE (dest) == STRICT_LOW_PART ! 3180: || GET_CODE (dest) == SIGN_EXTRACT) ! 3181: dest = XEXP (dest, 0); ! 3182: ! 3183: if (GET_CODE (dest) == REG) ! 3184: { ! 3185: for (tem = last; tem != insn; tem = PREV_INSN (tem)) ! 3186: { ! 3187: if (GET_RTX_CLASS (GET_CODE (tem)) == 'i' ! 3188: && reg_overlap_mentioned_p (dest, PATTERN (tem)) ! 3189: && (set = single_set (tem))) ! 3190: { ! 3191: rtx tem_dest = SET_DEST (set); ! 3192: ! 3193: while (GET_CODE (tem_dest) == ZERO_EXTRACT ! 3194: || GET_CODE (tem_dest) == SUBREG ! 3195: || GET_CODE (tem_dest) == STRICT_LOW_PART ! 3196: || GET_CODE (tem_dest) == SIGN_EXTRACT) ! 3197: tem_dest = XEXP (tem_dest, 0); ! 3198: ! 3199: if (tem_dest != dest) ! 3200: { ! 3201: /* Use the same scheme as combine.c, don't put both REG_DEAD ! 3202: and REG_UNUSED notes on the same insn. */ ! 3203: if (! find_regno_note (tem, REG_UNUSED, REGNO (dest)) ! 3204: && ! find_regno_note (tem, REG_DEAD, REGNO (dest))) ! 3205: { ! 3206: rtx note = rtx_alloc (EXPR_LIST); ! 3207: PUT_REG_NOTE_KIND (note, REG_DEAD); ! 3208: XEXP (note, 0) = dest; ! 3209: XEXP (note, 1) = REG_NOTES (tem); ! 3210: REG_NOTES (tem) = note; ! 3211: } ! 3212: /* The reg only dies in one insn, the last one that uses ! 3213: it. */ ! 3214: break; ! 3215: } ! 3216: else if (reg_overlap_mentioned_p (dest, SET_SRC (set))) ! 3217: /* We found an instruction that both uses the register, ! 3218: and sets it, so no new REG_NOTE is needed for this set. */ ! 3219: break; ! 3220: } ! 3221: } ! 3222: /* If this is a set, it must die somewhere, unless it is the dest of ! 3223: the original insn, and hence is live after the original insn. Abort ! 3224: if it isn't supposed to be live after the original insn. ! 3225: ! 3226: If this is a clobber, then just add a REG_UNUSED note. */ ! 3227: if (tem == insn) ! 3228: { ! 3229: int live_after_orig_insn = 0; ! 3230: rtx pattern = PATTERN (orig_insn); ! 3231: int i; ! 3232: ! 3233: if (GET_CODE (pat) == CLOBBER) ! 3234: { ! 3235: rtx note = rtx_alloc (EXPR_LIST); ! 3236: PUT_REG_NOTE_KIND (note, REG_UNUSED); ! 3237: XEXP (note, 0) = dest; ! 3238: XEXP (note, 1) = REG_NOTES (insn); ! 3239: REG_NOTES (insn) = note; ! 3240: return; ! 3241: } ! 3242: ! 3243: /* The original insn could have multiple sets, so search the ! 3244: insn for all sets. */ ! 3245: if (GET_CODE (pattern) == SET) ! 3246: { ! 3247: if (reg_overlap_mentioned_p (dest, SET_DEST (pattern))) ! 3248: live_after_orig_insn = 1; ! 3249: } ! 3250: else if (GET_CODE (pattern) == PARALLEL) ! 3251: { ! 3252: for (i = 0; i < XVECLEN (pattern, 0); i++) ! 3253: if (GET_CODE (XVECEXP (pattern, 0, i)) == SET ! 3254: && reg_overlap_mentioned_p (dest, ! 3255: SET_DEST (XVECEXP (pattern, ! 3256: 0, i)))) ! 3257: live_after_orig_insn = 1; ! 3258: } ! 3259: ! 3260: if (! live_after_orig_insn) ! 3261: abort (); ! 3262: } ! 3263: } ! 3264: } ! 3265: ! 3266: /* Subroutine of update_flow_info. Update the value of reg_n_sets for all ! 3267: registers modified by X. INC is -1 if the containing insn is being deleted, ! 3268: and is 1 if the containing insn is a newly generated insn. */ ! 3269: ! 3270: static void ! 3271: update_n_sets (x, inc) ! 3272: rtx x; ! 3273: int inc; ! 3274: { ! 3275: rtx dest = SET_DEST (x); ! 3276: ! 3277: while (GET_CODE (dest) == STRICT_LOW_PART || GET_CODE (dest) == SUBREG ! 3278: || GET_CODE (dest) == ZERO_EXTRACT || GET_CODE (dest) == SIGN_EXTRACT) ! 3279: dest = SUBREG_REG (dest); ! 3280: ! 3281: if (GET_CODE (dest) == REG) ! 3282: { ! 3283: int regno = REGNO (dest); ! 3284: ! 3285: if (regno < FIRST_PSEUDO_REGISTER) ! 3286: { ! 3287: register int i; ! 3288: int endregno = regno + HARD_REGNO_NREGS (regno, GET_MODE (dest)); ! 3289: ! 3290: for (i = regno; i < endregno; i++) ! 3291: reg_n_sets[i] += inc; ! 3292: } ! 3293: else ! 3294: reg_n_sets[regno] += inc; ! 3295: } ! 3296: } ! 3297: ! 3298: /* Updates all flow-analysis related quantities (including REG_NOTES) for ! 3299: the insns from FIRST to LAST inclusive that were created by splitting ! 3300: ORIG_INSN. NOTES are the original REG_NOTES. */ ! 3301: ! 3302: static void ! 3303: update_flow_info (notes, first, last, orig_insn) ! 3304: rtx notes; ! 3305: rtx first, last; ! 3306: rtx orig_insn; ! 3307: { ! 3308: rtx insn, note; ! 3309: rtx next; ! 3310: rtx orig_dest, temp; ! 3311: rtx set; ! 3312: ! 3313: /* Get and save the destination set by the original insn. */ ! 3314: ! 3315: orig_dest = single_set (orig_insn); ! 3316: if (orig_dest) ! 3317: orig_dest = SET_DEST (orig_dest); ! 3318: ! 3319: /* Move REG_NOTES from the original insn to where they now belong. */ ! 3320: ! 3321: for (note = notes; note; note = next) ! 3322: { ! 3323: next = XEXP (note, 1); ! 3324: switch (REG_NOTE_KIND (note)) ! 3325: { ! 3326: case REG_DEAD: ! 3327: case REG_UNUSED: ! 3328: /* Move these notes from the original insn to the last new insn where ! 3329: the register is now set. */ ! 3330: ! 3331: for (insn = last; ; insn = PREV_INSN (insn)) ! 3332: { ! 3333: if (GET_RTX_CLASS (GET_CODE (insn)) == 'i' ! 3334: && reg_mentioned_p (XEXP (note, 0), PATTERN (insn))) ! 3335: { ! 3336: XEXP (note, 1) = REG_NOTES (insn); ! 3337: REG_NOTES (insn) = note; ! 3338: ! 3339: /* Sometimes need to convert REG_UNUSED notes to REG_DEAD ! 3340: notes. */ ! 3341: /* ??? This won't handle mutiple word registers correctly, ! 3342: but should be good enough for now. */ ! 3343: if (REG_NOTE_KIND (note) == REG_UNUSED ! 3344: && ! dead_or_set_p (insn, XEXP (note, 0))) ! 3345: PUT_REG_NOTE_KIND (note, REG_DEAD); ! 3346: ! 3347: /* The reg only dies in one insn, the last one that uses ! 3348: it. */ ! 3349: break; ! 3350: } ! 3351: /* It must die somewhere, fail it we couldn't find where it died. ! 3352: ! 3353: If this is a REG_UNUSED note, then it must be a temporary ! 3354: register that was not needed by this instantiation of the ! 3355: pattern, so we can safely ignore it. */ ! 3356: if (insn == first) ! 3357: { ! 3358: if (REG_NOTE_KIND (note) != REG_UNUSED) ! 3359: abort (); ! 3360: ! 3361: break; ! 3362: } ! 3363: } ! 3364: ! 3365: /* If this note refers to a multiple word hard register, it may ! 3366: have been split into several smaller hard register references. ! 3367: Check to see if there are any new register references that ! 3368: need REG_NOTES added for them. */ ! 3369: temp = XEXP (note, 0); ! 3370: if (REG_NOTE_KIND (note) == REG_DEAD ! 3371: && GET_CODE (temp) == REG ! 3372: && REGNO (temp) < FIRST_PSEUDO_REGISTER ! 3373: && HARD_REGNO_NREGS (REGNO (temp), GET_MODE (temp))) ! 3374: split_hard_reg_notes (note, first, last, orig_insn); ! 3375: break; ! 3376: ! 3377: case REG_WAS_0: ! 3378: /* This note applies to the dest of the original insn. Find the ! 3379: first new insn that now has the same dest, and move the note ! 3380: there. */ ! 3381: ! 3382: if (! orig_dest) ! 3383: abort (); ! 3384: ! 3385: for (insn = first; ; insn = NEXT_INSN (insn)) ! 3386: { ! 3387: if (GET_RTX_CLASS (GET_CODE (insn)) == 'i' ! 3388: && (temp = single_set (insn)) ! 3389: && rtx_equal_p (SET_DEST (temp), orig_dest)) ! 3390: { ! 3391: XEXP (note, 1) = REG_NOTES (insn); ! 3392: REG_NOTES (insn) = note; ! 3393: /* The reg is only zero before one insn, the first that ! 3394: uses it. */ ! 3395: break; ! 3396: } ! 3397: /* It must be set somewhere, fail if we couldn't find where it ! 3398: was set. */ ! 3399: if (insn == last) ! 3400: abort (); ! 3401: } ! 3402: break; ! 3403: ! 3404: case REG_EQUAL: ! 3405: case REG_EQUIV: ! 3406: /* A REG_EQUIV or REG_EQUAL note on an insn with more than one ! 3407: set is meaningless. Just drop the note. */ ! 3408: if (! orig_dest) ! 3409: break; ! 3410: ! 3411: case REG_NO_CONFLICT: ! 3412: /* These notes apply to the dest of the original insn. Find the last ! 3413: new insn that now has the same dest, and move the note there. */ ! 3414: ! 3415: if (! orig_dest) ! 3416: abort (); ! 3417: ! 3418: for (insn = last; ; insn = PREV_INSN (insn)) ! 3419: { ! 3420: if (GET_RTX_CLASS (GET_CODE (insn)) == 'i' ! 3421: && (temp = single_set (insn)) ! 3422: && rtx_equal_p (SET_DEST (temp), orig_dest)) ! 3423: { ! 3424: XEXP (note, 1) = REG_NOTES (insn); ! 3425: REG_NOTES (insn) = note; ! 3426: /* Only put this note on one of the new insns. */ ! 3427: break; ! 3428: } ! 3429: ! 3430: /* The original dest must still be set someplace. Abort if we ! 3431: couldn't find it. */ ! 3432: if (insn == first) ! 3433: abort (); ! 3434: } ! 3435: break; ! 3436: ! 3437: case REG_LIBCALL: ! 3438: /* Move a REG_LIBCALL note to the first insn created, and update ! 3439: the corresponding REG_RETVAL note. */ ! 3440: XEXP (note, 1) = REG_NOTES (first); ! 3441: REG_NOTES (first) = note; ! 3442: ! 3443: insn = XEXP (note, 0); ! 3444: note = find_reg_note (insn, REG_RETVAL, 0); ! 3445: if (note) ! 3446: XEXP (note, 0) = first; ! 3447: break; ! 3448: ! 3449: case REG_RETVAL: ! 3450: /* Move a REG_RETVAL note to the last insn created, and update ! 3451: the corresponding REG_LIBCALL note. */ ! 3452: XEXP (note, 1) = REG_NOTES (last); ! 3453: REG_NOTES (last) = note; ! 3454: ! 3455: insn = XEXP (note, 0); ! 3456: note = find_reg_note (insn, REG_LIBCALL, 0); ! 3457: if (note) ! 3458: XEXP (note, 0) = last; ! 3459: break; ! 3460: ! 3461: case REG_NONNEG: ! 3462: /* This should be moved to whichever instruction is a JUMP_INSN. */ ! 3463: ! 3464: for (insn = last; ; insn = PREV_INSN (insn)) ! 3465: { ! 3466: if (GET_CODE (insn) == JUMP_INSN) ! 3467: { ! 3468: XEXP (note, 1) = REG_NOTES (insn); ! 3469: REG_NOTES (insn) = note; ! 3470: /* Only put this note on one of the new insns. */ ! 3471: break; ! 3472: } ! 3473: /* Fail if we couldn't find a JUMP_INSN. */ ! 3474: if (insn == first) ! 3475: abort (); ! 3476: } ! 3477: break; ! 3478: ! 3479: case REG_INC: ! 3480: /* This should be moved to whichever instruction now has the ! 3481: increment operation. */ ! 3482: abort (); ! 3483: ! 3484: case REG_LABEL: ! 3485: /* Should be moved to the new insn(s) which use the label. */ ! 3486: abort (); ! 3487: ! 3488: case REG_CC_SETTER: ! 3489: case REG_CC_USER: ! 3490: /* These two notes will never appear until after reorg, so we don't ! 3491: have to handle them here. */ ! 3492: default: ! 3493: abort (); ! 3494: } ! 3495: } ! 3496: ! 3497: /* Each new insn created, except the last, has a new set. If the destination ! 3498: is a register, then this reg is now live across several insns, whereas ! 3499: previously the dest reg was born and died within the same insn. To ! 3500: reflect this, we now need a REG_DEAD note on the insn where this ! 3501: dest reg dies. ! 3502: ! 3503: Similarly, the new insns may have clobbers that need REG_UNUSED notes. */ ! 3504: ! 3505: for (insn = first; insn != last; insn = NEXT_INSN (insn)) ! 3506: { ! 3507: rtx pat; ! 3508: int i; ! 3509: ! 3510: pat = PATTERN (insn); ! 3511: if (GET_CODE (pat) == SET || GET_CODE (pat) == CLOBBER) ! 3512: new_insn_dead_notes (pat, insn, last, orig_insn); ! 3513: else if (GET_CODE (pat) == PARALLEL) ! 3514: { ! 3515: for (i = 0; i < XVECLEN (pat, 0); i++) ! 3516: if (GET_CODE (XVECEXP (pat, 0, i)) == SET ! 3517: || GET_CODE (XVECEXP (pat, 0, i)) == CLOBBER) ! 3518: new_insn_dead_notes (XVECEXP (pat, 0, i), insn, last, orig_insn); ! 3519: } ! 3520: } ! 3521: ! 3522: /* If any insn, except the last, uses the register set by the last insn, ! 3523: then we need a new REG_DEAD note on that insn. In this case, there ! 3524: would not have been a REG_DEAD note for this register in the original ! 3525: insn because it was used and set within one insn. ! 3526: ! 3527: There is no new REG_DEAD note needed if the last insn uses the register ! 3528: that it is setting. */ ! 3529: ! 3530: set = single_set (last); ! 3531: if (set) ! 3532: { ! 3533: rtx dest = SET_DEST (set); ! 3534: ! 3535: while (GET_CODE (dest) == ZERO_EXTRACT || GET_CODE (dest) == SUBREG ! 3536: || GET_CODE (dest) == STRICT_LOW_PART ! 3537: || GET_CODE (dest) == SIGN_EXTRACT) ! 3538: dest = XEXP (dest, 0); ! 3539: ! 3540: if (GET_CODE (dest) == REG ! 3541: && ! reg_overlap_mentioned_p (dest, SET_SRC (set))) ! 3542: { ! 3543: for (insn = PREV_INSN (last); ; insn = PREV_INSN (insn)) ! 3544: { ! 3545: if (GET_RTX_CLASS (GET_CODE (insn)) == 'i' ! 3546: && reg_mentioned_p (dest, PATTERN (insn)) ! 3547: && (set = single_set (insn))) ! 3548: { ! 3549: rtx insn_dest = SET_DEST (set); ! 3550: ! 3551: while (GET_CODE (insn_dest) == ZERO_EXTRACT ! 3552: || GET_CODE (insn_dest) == SUBREG ! 3553: || GET_CODE (insn_dest) == STRICT_LOW_PART ! 3554: || GET_CODE (insn_dest) == SIGN_EXTRACT) ! 3555: insn_dest = XEXP (insn_dest, 0); ! 3556: ! 3557: if (insn_dest != dest) ! 3558: { ! 3559: note = rtx_alloc (EXPR_LIST); ! 3560: PUT_REG_NOTE_KIND (note, REG_DEAD); ! 3561: XEXP (note, 0) = dest; ! 3562: XEXP (note, 1) = REG_NOTES (insn); ! 3563: REG_NOTES (insn) = note; ! 3564: /* The reg only dies in one insn, the last one ! 3565: that uses it. */ ! 3566: break; ! 3567: } ! 3568: } ! 3569: if (insn == first) ! 3570: break; ! 3571: } ! 3572: } ! 3573: } ! 3574: ! 3575: /* If the original dest is modifying a multiple register target, and the ! 3576: original instruction was split such that the original dest is now set ! 3577: by two or more SUBREG sets, then the split insns no longer kill the ! 3578: destination of the original insn. ! 3579: ! 3580: In this case, if there exists an instruction in the same basic block, ! 3581: before the split insn, which uses the original dest, and this use is ! 3582: killed by the original insn, then we must remove the REG_DEAD note on ! 3583: this insn, because it is now superfluous. ! 3584: ! 3585: This does not apply when a hard register gets split, because the code ! 3586: knows how to handle overlapping hard registers properly. */ ! 3587: if (orig_dest && GET_CODE (orig_dest) == REG) ! 3588: { ! 3589: int found_orig_dest = 0; ! 3590: int found_split_dest = 0; ! 3591: ! 3592: for (insn = first; ; insn = NEXT_INSN (insn)) ! 3593: { ! 3594: set = single_set (insn); ! 3595: if (set) ! 3596: { ! 3597: if (GET_CODE (SET_DEST (set)) == REG ! 3598: && REGNO (SET_DEST (set)) == REGNO (orig_dest)) ! 3599: { ! 3600: found_orig_dest = 1; ! 3601: break; ! 3602: } ! 3603: else if (GET_CODE (SET_DEST (set)) == SUBREG ! 3604: && SUBREG_REG (SET_DEST (set)) == orig_dest) ! 3605: { ! 3606: found_split_dest = 1; ! 3607: break; ! 3608: } ! 3609: } ! 3610: ! 3611: if (insn == last) ! 3612: break; ! 3613: } ! 3614: ! 3615: if (found_split_dest) ! 3616: { ! 3617: /* Search backwards from FIRST, looking for the first insn that uses ! 3618: the original dest. Stop if we pass a CODE_LABEL or a JUMP_INSN. ! 3619: If we find an insn, and it has a REG_DEAD note, then delete the ! 3620: note. */ ! 3621: ! 3622: for (insn = first; insn; insn = PREV_INSN (insn)) ! 3623: { ! 3624: if (GET_CODE (insn) == CODE_LABEL ! 3625: || GET_CODE (insn) == JUMP_INSN) ! 3626: break; ! 3627: else if (GET_RTX_CLASS (GET_CODE (insn)) == 'i' ! 3628: && reg_mentioned_p (orig_dest, insn)) ! 3629: { ! 3630: note = find_regno_note (insn, REG_DEAD, REGNO (orig_dest)); ! 3631: if (note) ! 3632: remove_note (insn, note); ! 3633: } ! 3634: } ! 3635: } ! 3636: else if (! found_orig_dest) ! 3637: { ! 3638: /* This should never happen. */ ! 3639: abort (); ! 3640: } ! 3641: } ! 3642: ! 3643: /* Update reg_n_sets. This is necessary to prevent local alloc from ! 3644: converting REG_EQUAL notes to REG_EQUIV when splitting has modified ! 3645: a reg from set once to set multiple times. */ ! 3646: ! 3647: { ! 3648: rtx x = PATTERN (orig_insn); ! 3649: RTX_CODE code = GET_CODE (x); ! 3650: ! 3651: if (code == SET || code == CLOBBER) ! 3652: update_n_sets (x, -1); ! 3653: else if (code == PARALLEL) ! 3654: { ! 3655: int i; ! 3656: for (i = XVECLEN (x, 0) - 1; i >= 0; i--) ! 3657: { ! 3658: code = GET_CODE (XVECEXP (x, 0, i)); ! 3659: if (code == SET || code == CLOBBER) ! 3660: update_n_sets (XVECEXP (x, 0, i), -1); ! 3661: } ! 3662: } ! 3663: ! 3664: for (insn = first; ; insn = NEXT_INSN (insn)) ! 3665: { ! 3666: x = PATTERN (insn); ! 3667: code = GET_CODE (x); ! 3668: ! 3669: if (code == SET || code == CLOBBER) ! 3670: update_n_sets (x, 1); ! 3671: else if (code == PARALLEL) ! 3672: { ! 3673: int i; ! 3674: for (i = XVECLEN (x, 0) - 1; i >= 0; i--) ! 3675: { ! 3676: code = GET_CODE (XVECEXP (x, 0, i)); ! 3677: if (code == SET || code == CLOBBER) ! 3678: update_n_sets (XVECEXP (x, 0, i), 1); ! 3679: } ! 3680: } ! 3681: ! 3682: if (insn == last) ! 3683: break; ! 3684: } ! 3685: } ! 3686: } ! 3687: ! 3688: /* The one entry point in this file. DUMP_FILE is the dump file for ! 3689: this pass. */ ! 3690: ! 3691: void ! 3692: schedule_insns (dump_file) ! 3693: FILE *dump_file; ! 3694: { ! 3695: int max_uid = MAX_INSNS_PER_SPLIT * (get_max_uid () + 1); ! 3696: int i, b; ! 3697: rtx insn; ! 3698: ! 3699: /* Taking care of this degenerate case makes the rest of ! 3700: this code simpler. */ ! 3701: if (n_basic_blocks == 0) ! 3702: return; ! 3703: ! 3704: /* Create an insn here so that we can hang dependencies off of it later. */ ! 3705: sched_before_next_call = gen_rtx (INSN, VOIDmode, 0, 0, 0, 0, 0, 0, 0); ! 3706: ! 3707: /* Initialize the unused_*_lists. We can't use the ones left over from ! 3708: the previous function, because gcc has freed that memory. We can use ! 3709: the ones left over from the first sched pass in the second pass however, ! 3710: so only clear them on the first sched pass. The first pass is before ! 3711: reload if flag_schedule_insns is set, otherwise it is afterwards. */ ! 3712: ! 3713: if (reload_completed == 0 || ! flag_schedule_insns) ! 3714: { ! 3715: unused_insn_list = 0; ! 3716: unused_expr_list = 0; ! 3717: } ! 3718: ! 3719: /* We create no insns here, only reorder them, so we ! 3720: remember how far we can cut back the stack on exit. */ ! 3721: ! 3722: /* Allocate data for this pass. See comments, above, ! 3723: for what these vectors do. */ ! 3724: /* ??? Instruction splitting below may create new instructions, so these ! 3725: arrays must be bigger than just max_uid. */ ! 3726: insn_luid = (int *) alloca (max_uid * sizeof (int)); ! 3727: insn_priority = (int *) alloca (max_uid * sizeof (int)); ! 3728: insn_ref_count = (int *) alloca (max_uid * sizeof (int)); ! 3729: ! 3730: if (reload_completed == 0) ! 3731: { ! 3732: sched_reg_n_deaths = (short *) alloca (max_regno * sizeof (short)); ! 3733: sched_reg_n_calls_crossed = (int *) alloca (max_regno * sizeof (int)); ! 3734: sched_reg_live_length = (int *) alloca (max_regno * sizeof (int)); ! 3735: bb_dead_regs = (regset) alloca (regset_bytes); ! 3736: bb_live_regs = (regset) alloca (regset_bytes); ! 3737: bzero (sched_reg_n_calls_crossed, max_regno * sizeof (int)); ! 3738: bzero (sched_reg_live_length, max_regno * sizeof (int)); ! 3739: bcopy (reg_n_deaths, sched_reg_n_deaths, max_regno * sizeof (short)); ! 3740: init_alias_analysis (); ! 3741: } ! 3742: else ! 3743: { ! 3744: sched_reg_n_deaths = 0; ! 3745: sched_reg_n_calls_crossed = 0; ! 3746: sched_reg_live_length = 0; ! 3747: bb_dead_regs = 0; ! 3748: bb_live_regs = 0; ! 3749: if (! flag_schedule_insns) ! 3750: init_alias_analysis (); ! 3751: } ! 3752: ! 3753: if (write_symbols != NO_DEBUG) ! 3754: { ! 3755: rtx line; ! 3756: ! 3757: line_note = (rtx *) alloca (max_uid * sizeof (rtx)); ! 3758: bzero (line_note, max_uid * sizeof (rtx)); ! 3759: line_note_head = (rtx *) alloca (n_basic_blocks * sizeof (rtx)); ! 3760: bzero (line_note_head, n_basic_blocks * sizeof (rtx)); ! 3761: ! 3762: /* Determine the line-number at the start of each basic block. ! 3763: This must be computed and saved now, because after a basic block's ! 3764: predecessor has been scheduled, it is impossible to accurately ! 3765: determine the correct line number for the first insn of the block. */ ! 3766: ! 3767: for (b = 0; b < n_basic_blocks; b++) ! 3768: for (line = basic_block_head[b]; line; line = PREV_INSN (line)) ! 3769: if (GET_CODE (line) == NOTE && NOTE_LINE_NUMBER (line) > 0) ! 3770: { ! 3771: line_note_head[b] = line; ! 3772: break; ! 3773: } ! 3774: } ! 3775: ! 3776: bzero (insn_luid, max_uid * sizeof (int)); ! 3777: bzero (insn_priority, max_uid * sizeof (int)); ! 3778: bzero (insn_ref_count, max_uid * sizeof (int)); ! 3779: ! 3780: /* Schedule each basic block, block by block. */ ! 3781: ! 3782: if (NEXT_INSN (basic_block_end[n_basic_blocks-1]) == 0 ! 3783: || (GET_CODE (basic_block_end[n_basic_blocks-1]) != NOTE ! 3784: && GET_CODE (basic_block_end[n_basic_blocks-1]) != CODE_LABEL)) ! 3785: emit_note_after (NOTE_INSN_DELETED, basic_block_end[n_basic_blocks-1]); ! 3786: ! 3787: for (b = 0; b < n_basic_blocks; b++) ! 3788: { ! 3789: rtx insn, next; ! 3790: rtx insns; ! 3791: ! 3792: note_list = 0; ! 3793: ! 3794: for (insn = basic_block_head[b]; ; insn = next) ! 3795: { ! 3796: rtx prev; ! 3797: rtx set; ! 3798: ! 3799: /* Can't use `next_real_insn' because that ! 3800: might go across CODE_LABELS and short-out basic blocks. */ ! 3801: next = NEXT_INSN (insn); ! 3802: if (GET_CODE (insn) != INSN) ! 3803: { ! 3804: if (insn == basic_block_end[b]) ! 3805: break; ! 3806: ! 3807: continue; ! 3808: } ! 3809: ! 3810: /* Don't split no-op move insns. These should silently disappear ! 3811: later in final. Splitting such insns would break the code ! 3812: that handles REG_NO_CONFLICT blocks. */ ! 3813: set = single_set (insn); ! 3814: if (set && rtx_equal_p (SET_SRC (set), SET_DEST (set))) ! 3815: { ! 3816: if (insn == basic_block_end[b]) ! 3817: break; ! 3818: ! 3819: /* Nops get in the way while scheduling, so delete them now if ! 3820: register allocation has already been done. It is too risky ! 3821: to try to do this before register allocation, and there are ! 3822: unlikely to be very many nops then anyways. */ ! 3823: if (reload_completed) ! 3824: { ! 3825: PUT_CODE (insn, NOTE); ! 3826: NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED; ! 3827: NOTE_SOURCE_FILE (insn) = 0; ! 3828: } ! 3829: ! 3830: continue; ! 3831: } ! 3832: ! 3833: /* Split insns here to get max fine-grain parallelism. */ ! 3834: prev = PREV_INSN (insn); ! 3835: if (reload_completed == 0) ! 3836: { ! 3837: rtx last, first = PREV_INSN (insn); ! 3838: rtx notes = REG_NOTES (insn); ! 3839: ! 3840: last = try_split (PATTERN (insn), insn, 1); ! 3841: if (last != insn) ! 3842: { ! 3843: /* try_split returns the NOTE that INSN became. */ ! 3844: first = NEXT_INSN (first); ! 3845: update_flow_info (notes, first, last, insn); ! 3846: ! 3847: PUT_CODE (insn, NOTE); ! 3848: NOTE_SOURCE_FILE (insn) = 0; ! 3849: NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED; ! 3850: if (insn == basic_block_head[b]) ! 3851: basic_block_head[b] = first; ! 3852: if (insn == basic_block_end[b]) ! 3853: { ! 3854: basic_block_end[b] = last; ! 3855: break; ! 3856: } ! 3857: } ! 3858: } ! 3859: ! 3860: if (insn == basic_block_end[b]) ! 3861: break; ! 3862: } ! 3863: ! 3864: schedule_block (b, dump_file); ! 3865: ! 3866: #ifdef USE_C_ALLOCA ! 3867: alloca (0); ! 3868: #endif ! 3869: } ! 3870: ! 3871: if (write_symbols != NO_DEBUG) ! 3872: { ! 3873: rtx line = 0; ! 3874: rtx insn = get_insns (); ! 3875: int active_insn = 0; ! 3876: int notes = 0; ! 3877: ! 3878: /* Walk the insns deleting redundant line-number notes. Many of these ! 3879: are already present. The remainder tend to occur at basic ! 3880: block boundaries. */ ! 3881: for (insn = get_last_insn (); insn; insn = PREV_INSN (insn)) ! 3882: if (GET_CODE (insn) == NOTE && NOTE_LINE_NUMBER (insn) > 0) ! 3883: { ! 3884: /* If there are no active insns following, INSN is redundant. */ ! 3885: if (active_insn == 0) ! 3886: { ! 3887: notes++; ! 3888: NOTE_SOURCE_FILE (insn) = 0; ! 3889: NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED; ! 3890: } ! 3891: /* If the line number is unchanged, LINE is redundant. */ ! 3892: else if (line ! 3893: && NOTE_LINE_NUMBER (line) == NOTE_LINE_NUMBER (insn) ! 3894: && NOTE_SOURCE_FILE (line) == NOTE_SOURCE_FILE (insn)) ! 3895: { ! 3896: notes++; ! 3897: NOTE_SOURCE_FILE (line) = 0; ! 3898: NOTE_LINE_NUMBER (line) = NOTE_INSN_DELETED; ! 3899: line = insn; ! 3900: } ! 3901: else ! 3902: line = insn; ! 3903: active_insn = 0; ! 3904: } ! 3905: else if (! ((GET_CODE (insn) == NOTE ! 3906: && NOTE_LINE_NUMBER (insn) == NOTE_INSN_DELETED) ! 3907: || (GET_CODE (insn) == INSN ! 3908: && (GET_CODE (PATTERN (insn)) == USE ! 3909: || GET_CODE (PATTERN (insn)) == CLOBBER)))) ! 3910: active_insn++; ! 3911: ! 3912: if (dump_file && notes) ! 3913: fprintf (dump_file, ";; deleted %d line-number notes\n", notes); ! 3914: } ! 3915: ! 3916: if (reload_completed == 0) ! 3917: { ! 3918: int regno; ! 3919: for (regno = 0; regno < max_regno; regno++) ! 3920: if (sched_reg_live_length[regno]) ! 3921: { ! 3922: if (dump_file) ! 3923: { ! 3924: if (reg_live_length[regno] > sched_reg_live_length[regno]) ! 3925: fprintf (dump_file, ! 3926: ";; register %d life shortened from %d to %d\n", ! 3927: regno, reg_live_length[regno], ! 3928: sched_reg_live_length[regno]); ! 3929: /* Negative values are special; don't overwrite the current ! 3930: reg_live_length value if it is negative. */ ! 3931: else if (reg_live_length[regno] < sched_reg_live_length[regno] ! 3932: && reg_live_length[regno] >= 0) ! 3933: fprintf (dump_file, ! 3934: ";; register %d life extended from %d to %d\n", ! 3935: regno, reg_live_length[regno], ! 3936: sched_reg_live_length[regno]); ! 3937: ! 3938: if (reg_n_calls_crossed[regno] ! 3939: && ! sched_reg_n_calls_crossed[regno]) ! 3940: fprintf (dump_file, ! 3941: ";; register %d no longer crosses calls\n", regno); ! 3942: else if (! reg_n_calls_crossed[regno] ! 3943: && sched_reg_n_calls_crossed[regno]) ! 3944: fprintf (dump_file, ! 3945: ";; register %d now crosses calls\n", regno); ! 3946: } ! 3947: reg_live_length[regno] = sched_reg_live_length[regno]; ! 3948: reg_n_calls_crossed[regno] = sched_reg_n_calls_crossed[regno]; ! 3949: } ! 3950: } ! 3951: } ! 3952: #endif /* INSN_SCHEDULING */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.