|
|
1.1 root 1: /* Instruction scheduling pass. 1.1.1.8 ! root 2: Copyright (C) 1992, 1993, 1994, 1995 Free Software Foundation, Inc. 1.1 root 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 1.1.1.8 ! root 20: the Free Software Foundation, 59 Temple Place - Suite 330, ! 21: Boston, MA 02111-1307, USA. */ 1.1 root 22: 23: /* Instruction scheduling pass. 24: 25: This pass implements list scheduling within basic blocks. It is 26: run after flow analysis, but before register allocation. The 27: scheduler works as follows: 28: 29: We compute insn priorities based on data dependencies. Flow 30: analysis only creates a fraction of the data-dependencies we must 31: observe: namely, only those dependencies which the combiner can be 32: expected to use. For this pass, we must therefore create the 33: remaining dependencies we need to observe: register dependencies, 34: memory dependencies, dependencies to keep function calls in order, 35: and the dependence between a conditional branch and the setting of 36: condition codes are all dealt with here. 37: 38: The scheduler first traverses the data flow graph, starting with 39: the last instruction, and proceeding to the first, assigning 40: values to insn_priority as it goes. This sorts the instructions 41: topologically by data dependence. 42: 43: Once priorities have been established, we order the insns using 44: list scheduling. This works as follows: starting with a list of 45: all the ready insns, and sorted according to priority number, we 46: schedule the insn from the end of the list by placing its 47: predecessors in the list according to their priority order. We 48: consider this insn scheduled by setting the pointer to the "end" of 49: the list to point to the previous insn. When an insn has no 1.1.1.4 root 50: predecessors, we either queue it until sufficient time has elapsed 51: or add it to the ready list. As the instructions are scheduled or 52: when stalls are introduced, the queue advances and dumps insns into 53: the ready list. When all insns down to the lowest priority have 54: been scheduled, the critical path of the basic block has been made 55: as short as possible. The remaining insns are then scheduled in 56: remaining slots. 57: 58: Function unit conflicts are resolved during reverse list scheduling 59: by tracking the time when each insn is committed to the schedule 60: and from that, the time the function units it uses must be free. 61: As insns on the ready list are considered for scheduling, those 62: that would result in a blockage of the already committed insns are 63: queued until no blockage will result. Among the remaining insns on 64: the ready list to be considered, the first one with the largest 65: potential for causing a subsequent blockage is chosen. 1.1 root 66: 1.1.1.4 root 67: The following list shows the order in which we want to break ties 68: among insns in the ready list: 1.1 root 69: 70: 1. choose insn with lowest conflict cost, ties broken by 71: 2. choose insn with the longest path to end of bb, ties broken by 72: 3. choose insn that kills the most registers, ties broken by 73: 4. choose insn that conflicts with the most ready insns, or finally 74: 5. choose insn with lowest UID. 75: 76: Memory references complicate matters. Only if we can be certain 77: that memory references are not part of the data dependency graph 78: (via true, anti, or output dependence), can we move operations past 79: memory references. To first approximation, reads can be done 80: independently, while writes introduce dependencies. Better 81: approximations will yield fewer dependencies. 82: 83: Dependencies set up by memory references are treated in exactly the 84: same way as other dependencies, by using LOG_LINKS. 85: 86: Having optimized the critical path, we may have also unduly 87: extended the lifetimes of some registers. If an operation requires 88: that constants be loaded into registers, it is certainly desirable 89: to load those constants as early as necessary, but no earlier. 90: I.e., it will not do to load up a bunch of registers at the 91: beginning of a basic block only to use them at the end, if they 92: could be loaded later, since this may result in excessive register 93: utilization. 94: 95: Note that since branches are never in basic blocks, but only end 96: basic blocks, this pass will not do any branch scheduling. But 97: that is ok, since we can use GNU's delayed branch scheduling 98: pass to take care of this case. 99: 100: Also note that no further optimizations based on algebraic identities 101: are performed, so this pass would be a good one to perform instruction 102: splitting, such as breaking up a multiply instruction into shifts 103: and adds where that is profitable. 104: 105: Given the memory aliasing analysis that this pass should perform, 106: it should be possible to remove redundant stores to memory, and to 107: load values from registers instead of hitting memory. 108: 109: This pass must update information that subsequent passes expect to be 110: correct. Namely: reg_n_refs, reg_n_sets, reg_n_deaths, 111: reg_n_calls_crossed, and reg_live_length. Also, basic_block_head, 112: basic_block_end. 113: 114: The information in the line number notes is carefully retained by this 115: pass. All other NOTE insns are grouped in their same relative order at 116: the beginning of basic blocks that have been scheduled. */ 117: 118: #include <stdio.h> 119: #include "config.h" 120: #include "rtl.h" 121: #include "basic-block.h" 122: #include "regs.h" 123: #include "hard-reg-set.h" 124: #include "flags.h" 125: #include "insn-config.h" 126: #include "insn-attr.h" 127: 1.1.1.4 root 128: #ifdef INSN_SCHEDULING 1.1 root 129: /* Arrays set up by scheduling for the same respective purposes as 130: similar-named arrays set up by flow analysis. We work with these 131: arrays during the scheduling pass so we can compare values against 132: unscheduled code. 133: 134: Values of these arrays are copied at the end of this pass into the 135: arrays set up by flow analysis. */ 136: static short *sched_reg_n_deaths; 137: static int *sched_reg_n_calls_crossed; 138: static int *sched_reg_live_length; 139: 140: /* Element N is the next insn that sets (hard or pseudo) register 141: N within the current basic block; or zero, if there is no 142: such insn. Needed for new registers which may be introduced 143: by splitting insns. */ 144: static rtx *reg_last_uses; 145: static rtx *reg_last_sets; 1.1.1.7 root 146: static regset reg_pending_sets; 147: static int reg_pending_sets_all; 1.1 root 148: 149: /* Vector indexed by INSN_UID giving the original ordering of the insns. */ 150: static int *insn_luid; 151: #define INSN_LUID(INSN) (insn_luid[INSN_UID (INSN)]) 152: 153: /* Vector indexed by INSN_UID giving each instruction a priority. */ 154: static int *insn_priority; 155: #define INSN_PRIORITY(INSN) (insn_priority[INSN_UID (INSN)]) 156: 1.1.1.3 root 157: static short *insn_costs; 158: #define INSN_COST(INSN) insn_costs[INSN_UID (INSN)] 159: 1.1.1.4 root 160: /* Vector indexed by INSN_UID giving an encoding of the function units 161: used. */ 162: static short *insn_units; 163: #define INSN_UNIT(INSN) insn_units[INSN_UID (INSN)] 164: 165: /* Vector indexed by INSN_UID giving an encoding of the blockage range 166: function. The unit and the range are encoded. */ 167: static unsigned int *insn_blockage; 168: #define INSN_BLOCKAGE(INSN) insn_blockage[INSN_UID (INSN)] 169: #define UNIT_BITS 5 170: #define BLOCKAGE_MASK ((1 << BLOCKAGE_BITS) - 1) 171: #define ENCODE_BLOCKAGE(U,R) \ 172: ((((U) << UNIT_BITS) << BLOCKAGE_BITS \ 173: | MIN_BLOCKAGE_COST (R)) << BLOCKAGE_BITS \ 174: | MAX_BLOCKAGE_COST (R)) 175: #define UNIT_BLOCKED(B) ((B) >> (2 * BLOCKAGE_BITS)) 176: #define BLOCKAGE_RANGE(B) \ 177: (((((B) >> BLOCKAGE_BITS) & BLOCKAGE_MASK) << (HOST_BITS_PER_INT / 2)) \ 178: | (B) & BLOCKAGE_MASK) 179: 180: /* Encodings of the `<name>_unit_blockage_range' function. */ 181: #define MIN_BLOCKAGE_COST(R) ((R) >> (HOST_BITS_PER_INT / 2)) 182: #define MAX_BLOCKAGE_COST(R) ((R) & ((1 << (HOST_BITS_PER_INT / 2)) - 1)) 183: 1.1 root 184: #define DONE_PRIORITY -1 185: #define MAX_PRIORITY 0x7fffffff 186: #define TAIL_PRIORITY 0x7ffffffe 187: #define LAUNCH_PRIORITY 0x7f000001 188: #define DONE_PRIORITY_P(INSN) (INSN_PRIORITY (INSN) < 0) 189: #define LOW_PRIORITY_P(INSN) ((INSN_PRIORITY (INSN) & 0x7f000000) == 0) 190: 1.1.1.2 root 191: /* Vector indexed by INSN_UID giving number of insns referring to this insn. */ 1.1 root 192: static int *insn_ref_count; 193: #define INSN_REF_COUNT(INSN) (insn_ref_count[INSN_UID (INSN)]) 194: 195: /* Vector indexed by INSN_UID giving line-number note in effect for each 196: insn. For line-number notes, this indicates whether the note may be 197: reused. */ 198: static rtx *line_note; 199: #define LINE_NOTE(INSN) (line_note[INSN_UID (INSN)]) 200: 201: /* Vector indexed by basic block number giving the starting line-number 202: for each basic block. */ 203: static rtx *line_note_head; 204: 205: /* List of important notes we must keep around. This is a pointer to the 206: last element in the list. */ 207: static rtx note_list; 208: 209: /* Regsets telling whether a given register is live or dead before the last 210: scheduled insn. Must scan the instructions once before scheduling to 211: determine what registers are live or dead at the end of the block. */ 212: static regset bb_dead_regs; 213: static regset bb_live_regs; 214: 215: /* Regset telling whether a given register is live after the insn currently 216: being scheduled. Before processing an insn, this is equal to bb_live_regs 1.1.1.3 root 217: above. This is used so that we can find registers that are newly born/dead 1.1 root 218: after processing an insn. */ 219: static regset old_live_regs; 220: 221: /* The chain of REG_DEAD notes. REG_DEAD notes are removed from all insns 222: during the initial scan and reused later. If there are not exactly as 223: many REG_DEAD notes in the post scheduled code as there were in the 224: prescheduled code then we trigger an abort because this indicates a bug. */ 225: static rtx dead_notes; 226: 227: /* Queues, etc. */ 228: 229: /* An instruction is ready to be scheduled when all insns following it 230: have already been scheduled. It is important to ensure that all 231: insns which use its result will not be executed until its result 1.1.1.4 root 232: has been computed. An insn is maintained in one of four structures: 1.1 root 233: 1.1.1.4 root 234: (P) the "Pending" set of insns which cannot be scheduled until 235: their dependencies have been satisfied. 236: (Q) the "Queued" set of insns that can be scheduled when sufficient 237: time has passed. 238: (R) the "Ready" list of unscheduled, uncommitted insns. 239: (S) the "Scheduled" list of insns. 240: 241: Initially, all insns are either "Pending" or "Ready" depending on 242: whether their dependencies are satisfied. 243: 244: Insns move from the "Ready" list to the "Scheduled" list as they 245: are committed to the schedule. As this occurs, the insns in the 246: "Pending" list have their dependencies satisfied and move to either 247: the "Ready" list or the "Queued" set depending on whether 248: sufficient time has passed to make them ready. As time passes, 249: insns move from the "Queued" set to the "Ready" list. Insns may 250: move from the "Ready" list to the "Queued" set if they are blocked 251: due to a function unit conflict. 252: 253: The "Pending" list (P) are the insns in the LOG_LINKS of the unscheduled 254: insns, i.e., those that are ready, queued, and pending. 255: The "Queued" set (Q) is implemented by the variable `insn_queue'. 256: The "Ready" list (R) is implemented by the variables `ready' and 257: `n_ready'. 258: The "Scheduled" list (S) is the new insn chain built by this pass. 259: 260: The transition (R->S) is implemented in the scheduling loop in 261: `schedule_block' when the best insn to schedule is chosen. 262: The transition (R->Q) is implemented in `schedule_select' when an 263: insn is found to to have a function unit conflict with the already 264: committed insns. 265: The transitions (P->R and P->Q) are implemented in `schedule_insn' as 266: insns move from the ready list to the scheduled list. 267: The transition (Q->R) is implemented at the top of the scheduling 268: loop in `schedule_block' as time passes or stalls are introduced. */ 269: 270: /* Implement a circular buffer to delay instructions until sufficient 271: time has passed. INSN_QUEUE_SIZE is a power of two larger than 272: MAX_BLOCKAGE and MAX_READY_COST computed by genattr.c. This is the 273: longest time an isnsn may be queued. */ 274: static rtx insn_queue[INSN_QUEUE_SIZE]; 1.1 root 275: static int q_ptr = 0; 276: static int q_size = 0; 1.1.1.4 root 277: #define NEXT_Q(X) (((X)+1) & (INSN_QUEUE_SIZE-1)) 278: #define NEXT_Q_AFTER(X,C) (((X)+C) & (INSN_QUEUE_SIZE-1)) 279: 280: /* Vector indexed by INSN_UID giving the minimum clock tick at which 281: the insn becomes ready. This is used to note timing constraints for 282: insns in the pending list. */ 283: static int *insn_tick; 284: #define INSN_TICK(INSN) (insn_tick[INSN_UID (INSN)]) 1.1.1.3 root 285: 1.1.1.6 root 286: /* Data structure for keeping track of register information 287: during that register's life. */ 288: 289: struct sometimes 290: { 291: short offset; short bit; 292: short live_length; short calls_crossed; 293: }; 294: 1.1 root 295: /* Forward declarations. */ 1.1.1.6 root 296: static rtx canon_rtx PROTO((rtx)); 297: static int rtx_equal_for_memref_p PROTO((rtx, rtx)); 298: static rtx find_symbolic_term PROTO((rtx)); 299: static int memrefs_conflict_p PROTO((int, rtx, int, rtx, 300: HOST_WIDE_INT)); 301: static void add_dependence PROTO((rtx, rtx, enum reg_note)); 302: static void remove_dependence PROTO((rtx, rtx)); 303: static rtx find_insn_list PROTO((rtx, rtx)); 304: static int insn_unit PROTO((rtx)); 305: static unsigned int blockage_range PROTO((int, rtx)); 306: static void clear_units PROTO((void)); 307: static void prepare_unit PROTO((int)); 308: static int actual_hazard_this_instance PROTO((int, int, rtx, int, int)); 309: static void schedule_unit PROTO((int, rtx, int)); 310: static int actual_hazard PROTO((int, rtx, int, int)); 311: static int potential_hazard PROTO((int, rtx, int)); 312: static int insn_cost PROTO((rtx, rtx, rtx)); 313: static int priority PROTO((rtx)); 314: static void free_pending_lists PROTO((void)); 315: static void add_insn_mem_dependence PROTO((rtx *, rtx *, rtx, rtx)); 316: static void flush_pending_lists PROTO((rtx)); 317: static void sched_analyze_1 PROTO((rtx, rtx)); 318: static void sched_analyze_2 PROTO((rtx, rtx)); 1.1.1.7 root 319: static void sched_analyze_insn PROTO((rtx, rtx, rtx)); 1.1.1.6 root 320: static int sched_analyze PROTO((rtx, rtx)); 321: static void sched_note_set PROTO((int, rtx, int)); 322: static int rank_for_schedule PROTO((rtx *, rtx *)); 323: static void swap_sort PROTO((rtx *, int)); 324: static void queue_insn PROTO((rtx, int)); 325: static int birthing_insn PROTO((rtx)); 326: static void adjust_priority PROTO((rtx)); 327: static int schedule_insn PROTO((rtx, rtx *, int, int)); 328: static int schedule_select PROTO((rtx *, int, int, FILE *)); 329: static void create_reg_dead_note PROTO((rtx, rtx)); 330: static void attach_deaths PROTO((rtx, rtx, int)); 331: static void attach_deaths_insn PROTO((rtx)); 332: static rtx unlink_notes PROTO((rtx, rtx)); 333: static int new_sometimes_live PROTO((struct sometimes *, int, int, 334: int)); 335: static void finish_sometimes_live PROTO((struct sometimes *, int)); 336: static void schedule_block PROTO((int, FILE *)); 337: static rtx regno_use_in PROTO((int, rtx)); 338: static void split_hard_reg_notes PROTO((rtx, rtx, rtx, rtx)); 339: static void new_insn_dead_notes PROTO((rtx, rtx, rtx, rtx)); 340: static void update_n_sets PROTO((rtx, int)); 341: static void update_flow_info PROTO((rtx, rtx, rtx, rtx)); 1.1 root 342: 343: /* Main entry point of this file. */ 1.1.1.6 root 344: void schedule_insns PROTO((FILE *)); 345: 1.1.1.4 root 346: #endif /* INSN_SCHEDULING */ 1.1 root 347: 348: #define SIZE_FOR_MODE(X) (GET_MODE_SIZE (GET_MODE (X))) 349: 350: /* Vector indexed by N giving the initial (unchanging) value known 351: for pseudo-register N. */ 352: static rtx *reg_known_value; 353: 1.1.1.5 root 354: /* Vector recording for each reg_known_value whether it is due to a 355: REG_EQUIV note. Future passes (viz., reload) may replace the 356: pseudo with the equivalent expression and so we account for the 357: dependences that would be introduced if that happens. */ 358: /* ??? This is a problem only on the Convex. The REG_EQUIV notes created in 359: assign_parms mention the arg pointer, and there are explicit insns in the 360: RTL that modify the arg pointer. Thus we must ensure that such insns don't 361: get scheduled across each other because that would invalidate the REG_EQUIV 362: notes. One could argue that the REG_EQUIV notes are wrong, but solving 363: the problem in the scheduler will likely give better code, so we do it 364: here. */ 365: static char *reg_known_equiv_p; 366: 1.1 root 367: /* Indicates number of valid entries in reg_known_value. */ 368: static int reg_known_value_size; 369: 370: static rtx 371: canon_rtx (x) 372: rtx x; 373: { 374: if (GET_CODE (x) == REG && REGNO (x) >= FIRST_PSEUDO_REGISTER 375: && REGNO (x) <= reg_known_value_size) 376: return reg_known_value[REGNO (x)]; 377: else if (GET_CODE (x) == PLUS) 378: { 379: rtx x0 = canon_rtx (XEXP (x, 0)); 380: rtx x1 = canon_rtx (XEXP (x, 1)); 381: 382: if (x0 != XEXP (x, 0) || x1 != XEXP (x, 1)) 383: { 384: /* We can tolerate LO_SUMs being offset here; these 385: rtl are used for nothing other than comparisons. */ 386: if (GET_CODE (x0) == CONST_INT) 387: return plus_constant_for_output (x1, INTVAL (x0)); 388: else if (GET_CODE (x1) == CONST_INT) 389: return plus_constant_for_output (x0, INTVAL (x1)); 390: return gen_rtx (PLUS, GET_MODE (x), x0, x1); 391: } 392: } 393: return x; 394: } 395: 396: /* Set up all info needed to perform alias analysis on memory references. */ 397: 398: void 399: init_alias_analysis () 400: { 401: int maxreg = max_reg_num (); 402: rtx insn; 403: rtx note; 404: rtx set; 405: 406: reg_known_value_size = maxreg; 407: 408: reg_known_value 409: = (rtx *) oballoc ((maxreg-FIRST_PSEUDO_REGISTER) * sizeof (rtx)) 410: - FIRST_PSEUDO_REGISTER; 1.1.1.7 root 411: bzero ((char *) (reg_known_value + FIRST_PSEUDO_REGISTER), 1.1 root 412: (maxreg-FIRST_PSEUDO_REGISTER) * sizeof (rtx)); 413: 1.1.1.5 root 414: reg_known_equiv_p 1.1.1.7 root 415: = (char *) oballoc ((maxreg -FIRST_PSEUDO_REGISTER) * sizeof (char)) 1.1.1.5 root 416: - FIRST_PSEUDO_REGISTER; 1.1.1.7 root 417: bzero (reg_known_equiv_p + FIRST_PSEUDO_REGISTER, 418: (maxreg - FIRST_PSEUDO_REGISTER) * sizeof (char)); 1.1.1.5 root 419: 1.1 root 420: /* Fill in the entries with known constant values. */ 421: for (insn = get_insns (); insn; insn = NEXT_INSN (insn)) 422: if ((set = single_set (insn)) != 0 423: && GET_CODE (SET_DEST (set)) == REG 424: && REGNO (SET_DEST (set)) >= FIRST_PSEUDO_REGISTER 425: && (((note = find_reg_note (insn, REG_EQUAL, 0)) != 0 426: && reg_n_sets[REGNO (SET_DEST (set))] == 1) 1.1.1.4 root 427: || (note = find_reg_note (insn, REG_EQUIV, NULL_RTX)) != 0) 1.1 root 428: && GET_CODE (XEXP (note, 0)) != EXPR_LIST) 1.1.1.5 root 429: { 430: int regno = REGNO (SET_DEST (set)); 431: reg_known_value[regno] = XEXP (note, 0); 432: reg_known_equiv_p[regno] = REG_NOTE_KIND (note) == REG_EQUIV; 433: } 1.1 root 434: 435: /* Fill in the remaining entries. */ 436: while (--maxreg >= FIRST_PSEUDO_REGISTER) 437: if (reg_known_value[maxreg] == 0) 438: reg_known_value[maxreg] = regno_reg_rtx[maxreg]; 439: } 440: 441: /* Return 1 if X and Y are identical-looking rtx's. 442: 443: We use the data in reg_known_value above to see if two registers with 444: different numbers are, in fact, equivalent. */ 445: 446: static int 447: rtx_equal_for_memref_p (x, y) 448: rtx x, y; 449: { 450: register int i; 451: register int j; 452: register enum rtx_code code; 453: register char *fmt; 454: 455: if (x == 0 && y == 0) 456: return 1; 457: if (x == 0 || y == 0) 458: return 0; 459: x = canon_rtx (x); 460: y = canon_rtx (y); 461: 462: if (x == y) 463: return 1; 464: 465: code = GET_CODE (x); 466: /* Rtx's of different codes cannot be equal. */ 467: if (code != GET_CODE (y)) 468: return 0; 469: 470: /* (MULT:SI x y) and (MULT:HI x y) are NOT equivalent. 471: (REG:SI x) and (REG:HI x) are NOT equivalent. */ 472: 473: if (GET_MODE (x) != GET_MODE (y)) 474: return 0; 475: 476: /* REG, LABEL_REF, and SYMBOL_REF can be compared nonrecursively. */ 477: 478: if (code == REG) 479: return REGNO (x) == REGNO (y); 480: if (code == LABEL_REF) 481: return XEXP (x, 0) == XEXP (y, 0); 482: if (code == SYMBOL_REF) 483: return XSTR (x, 0) == XSTR (y, 0); 484: 1.1.1.7 root 485: /* For commutative operations, the RTX match if the operand match in any 486: order. Also handle the simple binary and unary cases without a loop. */ 487: if (code == EQ || code == NE || GET_RTX_CLASS (code) == 'c') 488: return ((rtx_equal_for_memref_p (XEXP (x, 0), XEXP (y, 0)) 489: && rtx_equal_for_memref_p (XEXP (x, 1), XEXP (y, 1))) 490: || (rtx_equal_for_memref_p (XEXP (x, 0), XEXP (y, 1)) 491: && rtx_equal_for_memref_p (XEXP (x, 1), XEXP (y, 0)))); 492: else if (GET_RTX_CLASS (code) == '<' || GET_RTX_CLASS (code) == '2') 493: return (rtx_equal_for_memref_p (XEXP (x, 0), XEXP (y, 0)) 494: && rtx_equal_for_memref_p (XEXP (x, 1), XEXP (y, 1))); 495: else if (GET_RTX_CLASS (code) == '1') 496: return rtx_equal_for_memref_p (XEXP (x, 0), XEXP (y, 0)); 497: 1.1 root 498: /* Compare the elements. If any pair of corresponding elements 499: fail to match, return 0 for the whole things. */ 500: 501: fmt = GET_RTX_FORMAT (code); 502: for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) 503: { 504: switch (fmt[i]) 505: { 1.1.1.4 root 506: case 'w': 507: if (XWINT (x, i) != XWINT (y, i)) 508: return 0; 509: break; 510: 1.1 root 511: case 'n': 512: case 'i': 513: if (XINT (x, i) != XINT (y, i)) 514: return 0; 515: break; 516: 517: case 'V': 518: case 'E': 519: /* Two vectors must have the same length. */ 520: if (XVECLEN (x, i) != XVECLEN (y, i)) 521: return 0; 522: 523: /* And the corresponding elements must match. */ 524: for (j = 0; j < XVECLEN (x, i); j++) 525: if (rtx_equal_for_memref_p (XVECEXP (x, i, j), XVECEXP (y, i, j)) == 0) 526: return 0; 527: break; 528: 529: case 'e': 530: if (rtx_equal_for_memref_p (XEXP (x, i), XEXP (y, i)) == 0) 531: return 0; 532: break; 533: 534: case 'S': 535: case 's': 536: if (strcmp (XSTR (x, i), XSTR (y, i))) 537: return 0; 538: break; 539: 540: case 'u': 541: /* These are just backpointers, so they don't matter. */ 542: break; 543: 544: case '0': 545: break; 546: 547: /* It is believed that rtx's at this level will never 548: contain anything but integers and other rtx's, 549: except for within LABEL_REFs and SYMBOL_REFs. */ 550: default: 551: abort (); 552: } 553: } 554: return 1; 555: } 556: 557: /* Given an rtx X, find a SYMBOL_REF or LABEL_REF within 558: X and return it, or return 0 if none found. */ 559: 560: static rtx 561: find_symbolic_term (x) 562: rtx x; 563: { 564: register int i; 565: register enum rtx_code code; 566: register char *fmt; 567: 568: code = GET_CODE (x); 569: if (code == SYMBOL_REF || code == LABEL_REF) 570: return x; 571: if (GET_RTX_CLASS (code) == 'o') 572: return 0; 573: 574: fmt = GET_RTX_FORMAT (code); 575: for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) 576: { 577: rtx t; 578: 579: if (fmt[i] == 'e') 580: { 581: t = find_symbolic_term (XEXP (x, i)); 582: if (t != 0) 583: return t; 584: } 585: else if (fmt[i] == 'E') 586: break; 587: } 588: return 0; 589: } 590: 591: /* Return nonzero if X and Y (memory addresses) could reference the 592: same location in memory. C is an offset accumulator. When 593: C is nonzero, we are testing aliases between X and Y + C. 594: XSIZE is the size in bytes of the X reference, 595: similarly YSIZE is the size in bytes for Y. 596: 597: If XSIZE or YSIZE is zero, we do not know the amount of memory being 598: referenced (the reference was BLKmode), so make the most pessimistic 599: assumptions. 600: 601: We recognize the following cases of non-conflicting memory: 602: 603: (1) addresses involving the frame pointer cannot conflict 604: with addresses involving static variables. 605: (2) static variables with different addresses cannot conflict. 606: 1.1.1.3 root 607: Nice to notice that varying addresses cannot conflict with fp if no 1.1 root 608: local variables had their addresses taken, but that's too hard now. */ 609: 1.1.1.5 root 610: /* ??? In Fortran, references to a array parameter can never conflict with 611: another array parameter. */ 612: 1.1 root 613: static int 614: memrefs_conflict_p (xsize, x, ysize, y, c) 615: rtx x, y; 616: int xsize, ysize; 1.1.1.4 root 617: HOST_WIDE_INT c; 1.1 root 618: { 619: if (GET_CODE (x) == HIGH) 620: x = XEXP (x, 0); 621: else if (GET_CODE (x) == LO_SUM) 622: x = XEXP (x, 1); 623: else 624: x = canon_rtx (x); 625: if (GET_CODE (y) == HIGH) 626: y = XEXP (y, 0); 627: else if (GET_CODE (y) == LO_SUM) 628: y = XEXP (y, 1); 629: else 630: y = canon_rtx (y); 631: 632: if (rtx_equal_for_memref_p (x, y)) 633: return (xsize == 0 || ysize == 0 || 634: (c >= 0 && xsize > c) || (c < 0 && ysize+c > 0)); 635: 1.1.1.6 root 636: if (y == frame_pointer_rtx || y == hard_frame_pointer_rtx 637: || y == stack_pointer_rtx) 1.1 root 638: { 639: rtx t = y; 640: int tsize = ysize; 641: y = x; ysize = xsize; 642: x = t; xsize = tsize; 643: } 644: 1.1.1.6 root 645: if (x == frame_pointer_rtx || x == hard_frame_pointer_rtx 646: || x == stack_pointer_rtx) 1.1 root 647: { 648: rtx y1; 649: 650: if (CONSTANT_P (y)) 651: return 0; 652: 653: if (GET_CODE (y) == PLUS 654: && canon_rtx (XEXP (y, 0)) == x 655: && (y1 = canon_rtx (XEXP (y, 1))) 656: && GET_CODE (y1) == CONST_INT) 657: { 658: c += INTVAL (y1); 659: return (xsize == 0 || ysize == 0 660: || (c >= 0 && xsize > c) || (c < 0 && ysize+c > 0)); 661: } 662: 663: if (GET_CODE (y) == PLUS 664: && (y1 = canon_rtx (XEXP (y, 0))) 665: && CONSTANT_P (y1)) 666: return 0; 667: 668: return 1; 669: } 670: 671: if (GET_CODE (x) == PLUS) 672: { 1.1.1.3 root 673: /* The fact that X is canonicalized means that this 674: PLUS rtx is canonicalized. */ 1.1 root 675: rtx x0 = XEXP (x, 0); 676: rtx x1 = XEXP (x, 1); 677: 678: if (GET_CODE (y) == PLUS) 679: { 1.1.1.3 root 680: /* The fact that Y is canonicalized means that this 681: PLUS rtx is canonicalized. */ 1.1 root 682: rtx y0 = XEXP (y, 0); 683: rtx y1 = XEXP (y, 1); 684: 685: if (rtx_equal_for_memref_p (x1, y1)) 686: return memrefs_conflict_p (xsize, x0, ysize, y0, c); 687: if (rtx_equal_for_memref_p (x0, y0)) 688: return memrefs_conflict_p (xsize, x1, ysize, y1, c); 689: if (GET_CODE (x1) == CONST_INT) 690: if (GET_CODE (y1) == CONST_INT) 691: return memrefs_conflict_p (xsize, x0, ysize, y0, 692: c - INTVAL (x1) + INTVAL (y1)); 693: else 694: return memrefs_conflict_p (xsize, x0, ysize, y, c - INTVAL (x1)); 695: else if (GET_CODE (y1) == CONST_INT) 696: return memrefs_conflict_p (xsize, x, ysize, y0, c + INTVAL (y1)); 697: 698: /* Handle case where we cannot understand iteration operators, 699: but we notice that the base addresses are distinct objects. */ 700: x = find_symbolic_term (x); 701: if (x == 0) 702: return 1; 703: y = find_symbolic_term (y); 704: if (y == 0) 705: return 1; 706: return rtx_equal_for_memref_p (x, y); 707: } 708: else if (GET_CODE (x1) == CONST_INT) 709: return memrefs_conflict_p (xsize, x0, ysize, y, c - INTVAL (x1)); 710: } 711: else if (GET_CODE (y) == PLUS) 712: { 1.1.1.3 root 713: /* The fact that Y is canonicalized means that this 714: PLUS rtx is canonicalized. */ 1.1 root 715: rtx y0 = XEXP (y, 0); 716: rtx y1 = XEXP (y, 1); 717: 718: if (GET_CODE (y1) == CONST_INT) 719: return memrefs_conflict_p (xsize, x, ysize, y0, c + INTVAL (y1)); 720: else 721: return 1; 722: } 723: 724: if (GET_CODE (x) == GET_CODE (y)) 725: switch (GET_CODE (x)) 726: { 727: case MULT: 728: { 729: /* Handle cases where we expect the second operands to be the 730: same, and check only whether the first operand would conflict 731: or not. */ 732: rtx x0, y0; 733: rtx x1 = canon_rtx (XEXP (x, 1)); 734: rtx y1 = canon_rtx (XEXP (y, 1)); 735: if (! rtx_equal_for_memref_p (x1, y1)) 736: return 1; 737: x0 = canon_rtx (XEXP (x, 0)); 738: y0 = canon_rtx (XEXP (y, 0)); 739: if (rtx_equal_for_memref_p (x0, y0)) 740: return (xsize == 0 || ysize == 0 741: || (c >= 0 && xsize > c) || (c < 0 && ysize+c > 0)); 742: 743: /* Can't properly adjust our sizes. */ 744: if (GET_CODE (x1) != CONST_INT) 745: return 1; 746: xsize /= INTVAL (x1); 747: ysize /= INTVAL (x1); 748: c /= INTVAL (x1); 749: return memrefs_conflict_p (xsize, x0, ysize, y0, c); 750: } 751: } 752: 753: if (CONSTANT_P (x)) 754: { 755: if (GET_CODE (x) == CONST_INT && GET_CODE (y) == CONST_INT) 756: { 757: c += (INTVAL (y) - INTVAL (x)); 758: return (xsize == 0 || ysize == 0 759: || (c >= 0 && xsize > c) || (c < 0 && ysize+c > 0)); 760: } 761: 762: if (GET_CODE (x) == CONST) 763: { 764: if (GET_CODE (y) == CONST) 765: return memrefs_conflict_p (xsize, canon_rtx (XEXP (x, 0)), 766: ysize, canon_rtx (XEXP (y, 0)), c); 767: else 768: return memrefs_conflict_p (xsize, canon_rtx (XEXP (x, 0)), 769: ysize, y, c); 770: } 771: if (GET_CODE (y) == CONST) 772: return memrefs_conflict_p (xsize, x, ysize, 773: canon_rtx (XEXP (y, 0)), c); 774: 775: if (CONSTANT_P (y)) 776: return (rtx_equal_for_memref_p (x, y) 777: && (xsize == 0 || ysize == 0 778: || (c >= 0 && xsize > c) || (c < 0 && ysize+c > 0))); 779: 780: return 1; 781: } 782: return 1; 783: } 784: 785: /* Functions to compute memory dependencies. 786: 787: Since we process the insns in execution order, we can build tables 788: to keep track of what registers are fixed (and not aliased), what registers 789: are varying in known ways, and what registers are varying in unknown 790: ways. 791: 792: If both memory references are volatile, then there must always be a 793: dependence between the two references, since their order can not be 794: changed. A volatile and non-volatile reference can be interchanged 795: though. 796: 1.1.1.5 root 797: A MEM_IN_STRUCT reference at a non-QImode varying address can never 798: conflict with a non-MEM_IN_STRUCT reference at a fixed address. We must 799: allow QImode aliasing because the ANSI C standard allows character 800: pointers to alias anything. We are assuming that characters are 801: always QImode here. */ 1.1 root 802: 803: /* Read dependence: X is read after read in MEM takes place. There can 804: only be a dependence here if both reads are volatile. */ 805: 806: int 807: read_dependence (mem, x) 808: rtx mem; 809: rtx x; 810: { 811: return MEM_VOLATILE_P (x) && MEM_VOLATILE_P (mem); 812: } 813: 814: /* True dependence: X is read after store in MEM takes place. */ 815: 816: int 817: true_dependence (mem, x) 818: rtx mem; 819: rtx x; 820: { 1.1.1.4 root 821: /* If X is an unchanging read, then it can't possibly conflict with any 822: non-unchanging store. It may conflict with an unchanging write though, 823: because there may be a single store to this address to initialize it. 824: Just fall through to the code below to resolve the case where we have 825: both an unchanging read and an unchanging write. This won't handle all 826: cases optimally, but the possible performance loss should be 827: negligible. */ 828: if (RTX_UNCHANGING_P (x) && ! RTX_UNCHANGING_P (mem)) 1.1 root 829: return 0; 830: 831: return ((MEM_VOLATILE_P (x) && MEM_VOLATILE_P (mem)) 832: || (memrefs_conflict_p (SIZE_FOR_MODE (mem), XEXP (mem, 0), 833: SIZE_FOR_MODE (x), XEXP (x, 0), 0) 834: && ! (MEM_IN_STRUCT_P (mem) && rtx_addr_varies_p (mem) 1.1.1.5 root 835: && GET_MODE (mem) != QImode 1.1 root 836: && ! MEM_IN_STRUCT_P (x) && ! rtx_addr_varies_p (x)) 837: && ! (MEM_IN_STRUCT_P (x) && rtx_addr_varies_p (x) 1.1.1.5 root 838: && GET_MODE (x) != QImode 1.1 root 839: && ! MEM_IN_STRUCT_P (mem) && ! rtx_addr_varies_p (mem)))); 840: } 841: 842: /* Anti dependence: X is written after read in MEM takes place. */ 843: 844: int 845: anti_dependence (mem, x) 846: rtx mem; 847: rtx x; 848: { 1.1.1.4 root 849: /* If MEM is an unchanging read, then it can't possibly conflict with 850: the store to X, because there is at most one store to MEM, and it must 1.1.1.8 ! root 851: have occurred somewhere before MEM. */ 1.1 root 852: if (RTX_UNCHANGING_P (mem)) 853: return 0; 854: 855: return ((MEM_VOLATILE_P (x) && MEM_VOLATILE_P (mem)) 856: || (memrefs_conflict_p (SIZE_FOR_MODE (mem), XEXP (mem, 0), 857: SIZE_FOR_MODE (x), XEXP (x, 0), 0) 858: && ! (MEM_IN_STRUCT_P (mem) && rtx_addr_varies_p (mem) 1.1.1.5 root 859: && GET_MODE (mem) != QImode 1.1 root 860: && ! MEM_IN_STRUCT_P (x) && ! rtx_addr_varies_p (x)) 861: && ! (MEM_IN_STRUCT_P (x) && rtx_addr_varies_p (x) 1.1.1.5 root 862: && GET_MODE (x) != QImode 1.1 root 863: && ! MEM_IN_STRUCT_P (mem) && ! rtx_addr_varies_p (mem)))); 864: } 865: 866: /* Output dependence: X is written after store in MEM takes place. */ 867: 868: int 869: output_dependence (mem, x) 870: rtx mem; 871: rtx x; 872: { 873: return ((MEM_VOLATILE_P (x) && MEM_VOLATILE_P (mem)) 874: || (memrefs_conflict_p (SIZE_FOR_MODE (mem), XEXP (mem, 0), 875: SIZE_FOR_MODE (x), XEXP (x, 0), 0) 876: && ! (MEM_IN_STRUCT_P (mem) && rtx_addr_varies_p (mem) 1.1.1.5 root 877: && GET_MODE (mem) != QImode 1.1 root 878: && ! MEM_IN_STRUCT_P (x) && ! rtx_addr_varies_p (x)) 879: && ! (MEM_IN_STRUCT_P (x) && rtx_addr_varies_p (x) 1.1.1.5 root 880: && GET_MODE (x) != QImode 1.1 root 881: && ! MEM_IN_STRUCT_P (mem) && ! rtx_addr_varies_p (mem)))); 882: } 883: 1.1.1.3 root 884: /* Helper functions for instruction scheduling. */ 885: 886: /* Add ELEM wrapped in an INSN_LIST with reg note kind DEP_TYPE to the 887: LOG_LINKS of INSN, if not already there. DEP_TYPE indicates the type 888: of dependence that this link represents. */ 889: 1.1.1.6 root 890: static void 1.1.1.3 root 891: add_dependence (insn, elem, dep_type) 892: rtx insn; 893: rtx elem; 894: enum reg_note dep_type; 895: { 896: rtx link, next; 897: 898: /* Don't depend an insn on itself. */ 899: if (insn == elem) 900: return; 901: 902: /* If elem is part of a sequence that must be scheduled together, then 903: make the dependence point to the last insn of the sequence. 904: When HAVE_cc0, it is possible for NOTEs to exist between users and 905: setters of the condition codes, so we must skip past notes here. 906: Otherwise, NOTEs are impossible here. */ 907: 908: next = NEXT_INSN (elem); 909: 910: #ifdef HAVE_cc0 911: while (next && GET_CODE (next) == NOTE) 912: next = NEXT_INSN (next); 913: #endif 914: 915: if (next && SCHED_GROUP_P (next)) 916: { 917: /* Notes will never intervene here though, so don't bother checking 918: for them. */ 1.1.1.5 root 919: /* We must reject CODE_LABELs, so that we don't get confused by one 920: that has LABEL_PRESERVE_P set, which is represented by the same 921: bit in the rtl as SCHED_GROUP_P. A CODE_LABEL can never be 922: SCHED_GROUP_P. */ 923: while (NEXT_INSN (next) && SCHED_GROUP_P (NEXT_INSN (next)) 924: && GET_CODE (NEXT_INSN (next)) != CODE_LABEL) 1.1.1.3 root 925: next = NEXT_INSN (next); 926: 927: /* Again, don't depend an insn on itself. */ 928: if (insn == next) 929: return; 930: 931: /* Make the dependence to NEXT, the last insn of the group, instead 932: of the original ELEM. */ 933: elem = next; 934: } 935: 936: /* Check that we don't already have this dependence. */ 937: for (link = LOG_LINKS (insn); link; link = XEXP (link, 1)) 938: if (XEXP (link, 0) == elem) 939: { 940: /* If this is a more restrictive type of dependence than the existing 941: one, then change the existing dependence to this type. */ 942: if ((int) dep_type < (int) REG_NOTE_KIND (link)) 943: PUT_REG_NOTE_KIND (link, dep_type); 944: return; 945: } 946: /* Might want to check one level of transitivity to save conses. */ 947: 948: link = rtx_alloc (INSN_LIST); 949: /* Insn dependency, not data dependency. */ 950: PUT_REG_NOTE_KIND (link, dep_type); 951: XEXP (link, 0) = elem; 952: XEXP (link, 1) = LOG_LINKS (insn); 953: LOG_LINKS (insn) = link; 954: } 955: 956: /* Remove ELEM wrapped in an INSN_LIST from the LOG_LINKS 957: of INSN. Abort if not found. */ 1.1.1.6 root 958: 959: static void 1.1.1.3 root 960: remove_dependence (insn, elem) 961: rtx insn; 962: rtx elem; 963: { 964: rtx prev, link; 965: int found = 0; 966: 967: for (prev = 0, link = LOG_LINKS (insn); link; 968: prev = link, link = XEXP (link, 1)) 969: { 970: if (XEXP (link, 0) == elem) 971: { 972: if (prev) 973: XEXP (prev, 1) = XEXP (link, 1); 974: else 975: LOG_LINKS (insn) = XEXP (link, 1); 976: found = 1; 977: } 978: } 979: 980: if (! found) 981: abort (); 982: return; 983: } 984: 1.1 root 985: #ifndef INSN_SCHEDULING 1.1.1.6 root 986: void 987: schedule_insns (dump_file) 988: FILE *dump_file; 989: { 990: } 1.1 root 991: #else 992: #ifndef __GNUC__ 993: #define __inline 994: #endif 995: 996: /* Computation of memory dependencies. */ 997: 998: /* The *_insns and *_mems are paired lists. Each pending memory operation 999: will have a pointer to the MEM rtx on one list and a pointer to the 1000: containing insn on the other list in the same place in the list. */ 1001: 1002: /* We can't use add_dependence like the old code did, because a single insn 1003: may have multiple memory accesses, and hence needs to be on the list 1004: once for each memory access. Add_dependence won't let you add an insn 1005: to a list more than once. */ 1006: 1007: /* An INSN_LIST containing all insns with pending read operations. */ 1008: static rtx pending_read_insns; 1009: 1010: /* An EXPR_LIST containing all MEM rtx's which are pending reads. */ 1011: static rtx pending_read_mems; 1012: 1013: /* An INSN_LIST containing all insns with pending write operations. */ 1014: static rtx pending_write_insns; 1015: 1016: /* An EXPR_LIST containing all MEM rtx's which are pending writes. */ 1017: static rtx pending_write_mems; 1018: 1019: /* Indicates the combined length of the two pending lists. We must prevent 1020: these lists from ever growing too large since the number of dependencies 1021: produced is at least O(N*N), and execution time is at least O(4*N*N), as 1022: a function of the length of these pending lists. */ 1023: 1024: static int pending_lists_length; 1025: 1026: /* An INSN_LIST containing all INSN_LISTs allocated but currently unused. */ 1027: 1028: static rtx unused_insn_list; 1029: 1030: /* An EXPR_LIST containing all EXPR_LISTs allocated but currently unused. */ 1031: 1032: static rtx unused_expr_list; 1033: 1034: /* The last insn upon which all memory references must depend. 1035: This is an insn which flushed the pending lists, creating a dependency 1036: between it and all previously pending memory references. This creates 1037: a barrier (or a checkpoint) which no memory reference is allowed to cross. 1038: 1039: This includes all non constant CALL_INSNs. When we do interprocedural 1040: alias analysis, this restriction can be relaxed. 1041: This may also be an INSN that writes memory if the pending lists grow 1042: too large. */ 1043: 1044: static rtx last_pending_memory_flush; 1045: 1046: /* The last function call we have seen. All hard regs, and, of course, 1047: the last function call, must depend on this. */ 1048: 1049: static rtx last_function_call; 1050: 1051: /* The LOG_LINKS field of this is a list of insns which use a pseudo register 1052: that does not already cross a call. We create dependencies between each 1053: of those insn and the next call insn, to ensure that they won't cross a call 1054: after scheduling is done. */ 1055: 1056: static rtx sched_before_next_call; 1057: 1058: /* Pointer to the last instruction scheduled. Used by rank_for_schedule, 1059: so that insns independent of the last scheduled insn will be preferred 1060: over dependent instructions. */ 1061: 1062: static rtx last_scheduled_insn; 1063: 1064: /* Process an insn's memory dependencies. There are four kinds of 1065: dependencies: 1066: 1067: (0) read dependence: read follows read 1068: (1) true dependence: read follows write 1069: (2) anti dependence: write follows read 1070: (3) output dependence: write follows write 1071: 1072: We are careful to build only dependencies which actually exist, and 1073: use transitivity to avoid building too many links. */ 1074: 1075: /* Return the INSN_LIST containing INSN in LIST, or NULL 1076: if LIST does not contain INSN. */ 1077: 1078: __inline static rtx 1079: find_insn_list (insn, list) 1080: rtx insn; 1081: rtx list; 1082: { 1083: while (list) 1084: { 1085: if (XEXP (list, 0) == insn) 1086: return list; 1087: list = XEXP (list, 1); 1088: } 1089: return 0; 1090: } 1091: 1.1.1.4 root 1092: /* Compute the function units used by INSN. This caches the value 1093: returned by function_units_used. A function unit is encoded as the 1094: unit number if the value is non-negative and the compliment of a 1095: mask if the value is negative. A function unit index is the 1096: non-negative encoding. */ 1.1 root 1097: 1098: __inline static int 1.1.1.4 root 1099: insn_unit (insn) 1.1 root 1100: rtx insn; 1101: { 1.1.1.4 root 1102: register int unit = INSN_UNIT (insn); 1.1 root 1103: 1.1.1.4 root 1104: if (unit == 0) 1105: { 1106: recog_memoized (insn); 1.1.1.3 root 1107: 1.1.1.4 root 1108: /* A USE insn, or something else we don't need to understand. 1109: We can't pass these directly to function_units_used because it will 1110: trigger a fatal error for unrecognizable insns. */ 1111: if (INSN_CODE (insn) < 0) 1112: unit = -1; 1113: else 1114: { 1115: unit = function_units_used (insn); 1116: /* Increment non-negative values so we can cache zero. */ 1117: if (unit >= 0) unit++; 1118: } 1119: /* We only cache 16 bits of the result, so if the value is out of 1120: range, don't cache it. */ 1121: if (FUNCTION_UNITS_SIZE < HOST_BITS_PER_SHORT 1122: || unit >= 0 1123: || (~unit & ((1 << (HOST_BITS_PER_SHORT - 1)) - 1)) == 0) 1124: INSN_UNIT (insn) = unit; 1125: } 1126: return (unit > 0 ? unit - 1 : unit); 1127: } 1128: 1129: /* Compute the blockage range for executing INSN on UNIT. This caches 1130: the value returned by the blockage_range_function for the unit. 1131: These values are encoded in an int where the upper half gives the 1132: minimum value and the lower half gives the maximum value. */ 1133: 1134: __inline static unsigned int 1135: blockage_range (unit, insn) 1136: int unit; 1137: rtx insn; 1138: { 1139: unsigned int blockage = INSN_BLOCKAGE (insn); 1140: unsigned int range; 1.1 root 1141: 1.1.1.4 root 1142: if (UNIT_BLOCKED (blockage) != unit + 1) 1.1.1.3 root 1143: { 1.1.1.4 root 1144: range = function_units[unit].blockage_range_function (insn); 1145: /* We only cache the blockage range for one unit and then only if 1146: the values fit. */ 1147: if (HOST_BITS_PER_INT >= UNIT_BITS + 2 * BLOCKAGE_BITS) 1148: INSN_BLOCKAGE (insn) = ENCODE_BLOCKAGE (unit + 1, range); 1149: } 1150: else 1151: range = BLOCKAGE_RANGE (blockage); 1152: 1153: return range; 1154: } 1155: 1156: /* A vector indexed by function unit instance giving the last insn to use 1157: the unit. The value of the function unit instance index for unit U 1158: instance I is (U + I * FUNCTION_UNITS_SIZE). */ 1159: static rtx unit_last_insn[FUNCTION_UNITS_SIZE * MAX_MULTIPLICITY]; 1160: 1161: /* A vector indexed by function unit instance giving the minimum time when 1162: the unit will unblock based on the maximum blockage cost. */ 1163: static int unit_tick[FUNCTION_UNITS_SIZE * MAX_MULTIPLICITY]; 1164: 1165: /* A vector indexed by function unit number giving the number of insns 1166: that remain to use the unit. */ 1167: static int unit_n_insns[FUNCTION_UNITS_SIZE]; 1168: 1169: /* Reset the function unit state to the null state. */ 1170: 1171: static void 1172: clear_units () 1173: { 1.1.1.7 root 1174: bzero ((char *) unit_last_insn, sizeof (unit_last_insn)); 1175: bzero ((char *) unit_tick, sizeof (unit_tick)); 1176: bzero ((char *) unit_n_insns, sizeof (unit_n_insns)); 1.1.1.4 root 1177: } 1178: 1179: /* Record an insn as one that will use the units encoded by UNIT. */ 1180: 1181: __inline static void 1182: prepare_unit (unit) 1183: int unit; 1184: { 1185: int i; 1186: 1187: if (unit >= 0) 1188: unit_n_insns[unit]++; 1189: else 1190: for (i = 0, unit = ~unit; unit; i++, unit >>= 1) 1191: if ((unit & 1) != 0) 1192: prepare_unit (i); 1193: } 1194: 1195: /* Return the actual hazard cost of executing INSN on the unit UNIT, 1196: instance INSTANCE at time CLOCK if the previous actual hazard cost 1197: was COST. */ 1198: 1199: __inline static int 1200: actual_hazard_this_instance (unit, instance, insn, clock, cost) 1201: int unit, instance, clock, cost; 1202: rtx insn; 1203: { 1204: int tick = unit_tick[instance]; 1205: 1206: if (tick - clock > cost) 1207: { 1208: /* The scheduler is operating in reverse, so INSN is the executing 1209: insn and the unit's last insn is the candidate insn. We want a 1210: more exact measure of the blockage if we execute INSN at CLOCK 1211: given when we committed the execution of the unit's last insn. 1212: 1213: The blockage value is given by either the unit's max blockage 1214: constant, blockage range function, or blockage function. Use 1215: the most exact form for the given unit. */ 1216: 1217: if (function_units[unit].blockage_range_function) 1218: { 1219: if (function_units[unit].blockage_function) 1220: tick += (function_units[unit].blockage_function 1221: (insn, unit_last_insn[instance]) 1222: - function_units[unit].max_blockage); 1223: else 1224: tick += ((int) MAX_BLOCKAGE_COST (blockage_range (unit, insn)) 1225: - function_units[unit].max_blockage); 1226: } 1227: if (tick - clock > cost) 1228: cost = tick - clock; 1229: } 1230: return cost; 1231: } 1232: 1233: /* Record INSN as having begun execution on the units encoded by UNIT at 1234: time CLOCK. */ 1235: 1236: __inline static void 1237: schedule_unit (unit, insn, clock) 1238: int unit, clock; 1239: rtx insn; 1240: { 1241: int i; 1242: 1243: if (unit >= 0) 1244: { 1245: int instance = unit; 1246: #if MAX_MULTIPLICITY > 1 1247: /* Find the first free instance of the function unit and use that 1248: one. We assume that one is free. */ 1249: for (i = function_units[unit].multiplicity - 1; i > 0; i--) 1250: { 1251: if (! actual_hazard_this_instance (unit, instance, insn, clock, 0)) 1252: break; 1253: instance += FUNCTION_UNITS_SIZE; 1254: } 1255: #endif 1256: unit_last_insn[instance] = insn; 1257: unit_tick[instance] = (clock + function_units[unit].max_blockage); 1.1.1.3 root 1258: } 1.1 root 1259: else 1.1.1.4 root 1260: for (i = 0, unit = ~unit; unit; i++, unit >>= 1) 1261: if ((unit & 1) != 0) 1262: schedule_unit (i, insn, clock); 1263: } 1264: 1265: /* Return the actual hazard cost of executing INSN on the units encoded by 1266: UNIT at time CLOCK if the previous actual hazard cost was COST. */ 1267: 1268: __inline static int 1269: actual_hazard (unit, insn, clock, cost) 1270: int unit, clock, cost; 1271: rtx insn; 1272: { 1273: int i; 1274: 1275: if (unit >= 0) 1276: { 1277: /* Find the instance of the function unit with the minimum hazard. */ 1278: int instance = unit; 1279: int best_cost = actual_hazard_this_instance (unit, instance, insn, 1280: clock, cost); 1281: int this_cost; 1282: 1283: #if MAX_MULTIPLICITY > 1 1284: if (best_cost > cost) 1285: { 1286: for (i = function_units[unit].multiplicity - 1; i > 0; i--) 1287: { 1288: instance += FUNCTION_UNITS_SIZE; 1289: this_cost = actual_hazard_this_instance (unit, instance, insn, 1290: clock, cost); 1291: if (this_cost < best_cost) 1292: { 1293: best_cost = this_cost; 1294: if (this_cost <= cost) 1295: break; 1296: } 1297: } 1298: } 1299: #endif 1300: cost = MAX (cost, best_cost); 1301: } 1302: else 1303: for (i = 0, unit = ~unit; unit; i++, unit >>= 1) 1304: if ((unit & 1) != 0) 1305: cost = actual_hazard (i, insn, clock, cost); 1306: 1307: return cost; 1308: } 1309: 1310: /* Return the potential hazard cost of executing an instruction on the 1311: units encoded by UNIT if the previous potential hazard cost was COST. 1312: An insn with a large blockage time is chosen in preference to one 1313: with a smaller time; an insn that uses a unit that is more likely 1314: to be used is chosen in preference to one with a unit that is less 1315: used. We are trying to minimize a subsequent actual hazard. */ 1316: 1317: __inline static int 1318: potential_hazard (unit, insn, cost) 1319: int unit, cost; 1320: rtx insn; 1321: { 1322: int i, ncost; 1323: unsigned int minb, maxb; 1324: 1325: if (unit >= 0) 1326: { 1327: minb = maxb = function_units[unit].max_blockage; 1328: if (maxb > 1) 1329: { 1330: if (function_units[unit].blockage_range_function) 1331: { 1332: maxb = minb = blockage_range (unit, insn); 1333: maxb = MAX_BLOCKAGE_COST (maxb); 1334: minb = MIN_BLOCKAGE_COST (minb); 1335: } 1336: 1337: if (maxb > 1) 1338: { 1339: /* Make the number of instructions left dominate. Make the 1340: minimum delay dominate the maximum delay. If all these 1341: are the same, use the unit number to add an arbitrary 1342: ordering. Other terms can be added. */ 1343: ncost = minb * 0x40 + maxb; 1344: ncost *= (unit_n_insns[unit] - 1) * 0x1000 + unit; 1345: if (ncost > cost) 1346: cost = ncost; 1347: } 1348: } 1349: } 1350: else 1351: for (i = 0, unit = ~unit; unit; i++, unit >>= 1) 1352: if ((unit & 1) != 0) 1353: cost = potential_hazard (i, insn, cost); 1354: 1355: return cost; 1356: } 1357: 1358: /* Compute cost of executing INSN given the dependence LINK on the insn USED. 1359: This is the number of virtual cycles taken between instruction issue and 1360: instruction results. */ 1361: 1362: __inline static int 1363: insn_cost (insn, link, used) 1364: rtx insn, link, used; 1365: { 1366: register int cost = INSN_COST (insn); 1367: 1368: if (cost == 0) 1.1 root 1369: { 1.1.1.4 root 1370: recog_memoized (insn); 1371: 1372: /* A USE insn, or something else we don't need to understand. 1373: We can't pass these directly to result_ready_cost because it will 1374: trigger a fatal error for unrecognizable insns. */ 1375: if (INSN_CODE (insn) < 0) 1376: { 1377: INSN_COST (insn) = 1; 1378: return 1; 1379: } 1380: else 1381: { 1382: cost = result_ready_cost (insn); 1.1 root 1383: 1.1.1.4 root 1384: if (cost < 1) 1385: cost = 1; 1.1 root 1386: 1.1.1.4 root 1387: INSN_COST (insn) = cost; 1388: } 1.1 root 1389: } 1.1.1.4 root 1390: 1391: /* A USE insn should never require the value used to be computed. This 1392: allows the computation of a function's result and parameter values to 1393: overlap the return and call. */ 1394: recog_memoized (used); 1395: if (INSN_CODE (used) < 0) 1396: LINK_COST_FREE (link) = 1; 1397: 1398: /* If some dependencies vary the cost, compute the adjustment. Most 1399: commonly, the adjustment is complete: either the cost is ignored 1400: (in the case of an output- or anti-dependence), or the cost is 1401: unchanged. These values are cached in the link as LINK_COST_FREE 1402: and LINK_COST_ZERO. */ 1403: 1404: if (LINK_COST_FREE (link)) 1405: cost = 1; 1406: #ifdef ADJUST_COST 1407: else if (! LINK_COST_ZERO (link)) 1408: { 1409: int ncost = cost; 1410: 1411: ADJUST_COST (used, link, insn, ncost); 1412: if (ncost <= 1) 1413: LINK_COST_FREE (link) = ncost = 1; 1414: if (cost == ncost) 1415: LINK_COST_ZERO (link) = 1; 1416: cost = ncost; 1417: } 1418: #endif 1419: return cost; 1.1 root 1420: } 1421: 1422: /* Compute the priority number for INSN. */ 1423: 1424: static int 1425: priority (insn) 1426: rtx insn; 1427: { 1428: if (insn && GET_RTX_CLASS (GET_CODE (insn)) == 'i') 1429: { 1430: int prev_priority; 1431: int max_priority; 1432: int this_priority = INSN_PRIORITY (insn); 1433: rtx prev; 1434: 1435: if (this_priority > 0) 1436: return this_priority; 1437: 1438: max_priority = 1; 1439: 1440: /* Nonzero if these insns must be scheduled together. */ 1441: if (SCHED_GROUP_P (insn)) 1442: { 1443: prev = insn; 1444: while (SCHED_GROUP_P (prev)) 1445: { 1446: prev = PREV_INSN (prev); 1447: INSN_REF_COUNT (prev) += 1; 1448: } 1449: } 1450: 1451: for (prev = LOG_LINKS (insn); prev; prev = XEXP (prev, 1)) 1452: { 1453: rtx x = XEXP (prev, 0); 1454: 1.1.1.7 root 1455: /* A dependence pointing to a note or deleted insn is always 1456: obsolete, because sched_analyze_insn will have created any 1457: necessary new dependences which replace it. Notes and deleted 1458: insns can be created when instructions are deleted by insn 1459: splitting, or by register allocation. */ 1460: if (GET_CODE (x) == NOTE || INSN_DELETED_P (x)) 1.1 root 1461: { 1462: remove_dependence (insn, x); 1463: continue; 1464: } 1465: 1.1.1.4 root 1466: /* Clear the link cost adjustment bits. */ 1467: LINK_COST_FREE (prev) = 0; 1468: #ifdef ADJUST_COST 1469: LINK_COST_ZERO (prev) = 0; 1470: #endif 1471: 1.1 root 1472: /* This priority calculation was chosen because it results in the 1473: least instruction movement, and does not hurt the performance 1474: of the resulting code compared to the old algorithm. 1475: This makes the sched algorithm more stable, which results 1476: in better code, because there is less register pressure, 1477: cross jumping is more likely to work, and debugging is easier. 1478: 1479: When all instructions have a latency of 1, there is no need to 1480: move any instructions. Subtracting one here ensures that in such 1481: cases all instructions will end up with a priority of one, and 1482: hence no scheduling will be done. 1483: 1484: The original code did not subtract the one, and added the 1485: insn_cost of the current instruction to its priority (e.g. 1486: move the insn_cost call down to the end). */ 1487: 1.1.1.7 root 1488: prev_priority = priority (x) + insn_cost (x, prev, insn) - 1; 1.1 root 1489: 1490: if (prev_priority > max_priority) 1491: max_priority = prev_priority; 1492: INSN_REF_COUNT (x) += 1; 1493: } 1494: 1.1.1.4 root 1495: prepare_unit (insn_unit (insn)); 1.1 root 1496: INSN_PRIORITY (insn) = max_priority; 1497: return INSN_PRIORITY (insn); 1498: } 1499: return 0; 1500: } 1501: 1502: /* Remove all INSN_LISTs and EXPR_LISTs from the pending lists and add 1503: them to the unused_*_list variables, so that they can be reused. */ 1504: 1505: static void 1506: free_pending_lists () 1507: { 1508: register rtx link, prev_link; 1509: 1510: if (pending_read_insns) 1511: { 1512: prev_link = pending_read_insns; 1513: link = XEXP (prev_link, 1); 1514: 1515: while (link) 1516: { 1517: prev_link = link; 1518: link = XEXP (link, 1); 1519: } 1520: 1521: XEXP (prev_link, 1) = unused_insn_list; 1522: unused_insn_list = pending_read_insns; 1523: pending_read_insns = 0; 1524: } 1525: 1526: if (pending_write_insns) 1527: { 1528: prev_link = pending_write_insns; 1529: link = XEXP (prev_link, 1); 1530: 1531: while (link) 1532: { 1533: prev_link = link; 1534: link = XEXP (link, 1); 1535: } 1536: 1537: XEXP (prev_link, 1) = unused_insn_list; 1538: unused_insn_list = pending_write_insns; 1539: pending_write_insns = 0; 1540: } 1541: 1542: if (pending_read_mems) 1543: { 1544: prev_link = pending_read_mems; 1545: link = XEXP (prev_link, 1); 1546: 1547: while (link) 1548: { 1549: prev_link = link; 1550: link = XEXP (link, 1); 1551: } 1552: 1553: XEXP (prev_link, 1) = unused_expr_list; 1554: unused_expr_list = pending_read_mems; 1555: pending_read_mems = 0; 1556: } 1557: 1558: if (pending_write_mems) 1559: { 1560: prev_link = pending_write_mems; 1561: link = XEXP (prev_link, 1); 1562: 1563: while (link) 1564: { 1565: prev_link = link; 1566: link = XEXP (link, 1); 1567: } 1568: 1569: XEXP (prev_link, 1) = unused_expr_list; 1570: unused_expr_list = pending_write_mems; 1571: pending_write_mems = 0; 1572: } 1573: } 1574: 1575: /* Add an INSN and MEM reference pair to a pending INSN_LIST and MEM_LIST. 1576: The MEM is a memory reference contained within INSN, which we are saving 1577: so that we can do memory aliasing on it. */ 1578: 1579: static void 1580: add_insn_mem_dependence (insn_list, mem_list, insn, mem) 1581: rtx *insn_list, *mem_list, insn, mem; 1582: { 1583: register rtx link; 1584: 1585: if (unused_insn_list) 1586: { 1587: link = unused_insn_list; 1588: unused_insn_list = XEXP (link, 1); 1589: } 1590: else 1591: link = rtx_alloc (INSN_LIST); 1592: XEXP (link, 0) = insn; 1593: XEXP (link, 1) = *insn_list; 1594: *insn_list = link; 1595: 1596: if (unused_expr_list) 1597: { 1598: link = unused_expr_list; 1599: unused_expr_list = XEXP (link, 1); 1600: } 1601: else 1602: link = rtx_alloc (EXPR_LIST); 1603: XEXP (link, 0) = mem; 1604: XEXP (link, 1) = *mem_list; 1605: *mem_list = link; 1606: 1607: pending_lists_length++; 1608: } 1609: 1610: /* Make a dependency between every memory reference on the pending lists 1611: and INSN, thus flushing the pending lists. */ 1612: 1613: static void 1614: flush_pending_lists (insn) 1615: rtx insn; 1616: { 1617: rtx link; 1618: 1619: while (pending_read_insns) 1620: { 1621: add_dependence (insn, XEXP (pending_read_insns, 0), REG_DEP_ANTI); 1622: 1623: link = pending_read_insns; 1624: pending_read_insns = XEXP (pending_read_insns, 1); 1625: XEXP (link, 1) = unused_insn_list; 1626: unused_insn_list = link; 1627: 1628: link = pending_read_mems; 1629: pending_read_mems = XEXP (pending_read_mems, 1); 1630: XEXP (link, 1) = unused_expr_list; 1631: unused_expr_list = link; 1632: } 1633: while (pending_write_insns) 1634: { 1635: add_dependence (insn, XEXP (pending_write_insns, 0), REG_DEP_ANTI); 1636: 1637: link = pending_write_insns; 1638: pending_write_insns = XEXP (pending_write_insns, 1); 1639: XEXP (link, 1) = unused_insn_list; 1640: unused_insn_list = link; 1641: 1642: link = pending_write_mems; 1643: pending_write_mems = XEXP (pending_write_mems, 1); 1644: XEXP (link, 1) = unused_expr_list; 1645: unused_expr_list = link; 1646: } 1647: pending_lists_length = 0; 1648: 1649: if (last_pending_memory_flush) 1650: add_dependence (insn, last_pending_memory_flush, REG_DEP_ANTI); 1651: 1652: last_pending_memory_flush = insn; 1653: } 1654: 1655: /* Analyze a single SET or CLOBBER rtx, X, creating all dependencies generated 1656: by the write to the destination of X, and reads of everything mentioned. */ 1657: 1658: static void 1659: sched_analyze_1 (x, insn) 1660: rtx x; 1661: rtx insn; 1662: { 1663: register int regno; 1664: register rtx dest = SET_DEST (x); 1665: 1666: if (dest == 0) 1667: return; 1668: 1669: while (GET_CODE (dest) == STRICT_LOW_PART || GET_CODE (dest) == SUBREG 1670: || GET_CODE (dest) == ZERO_EXTRACT || GET_CODE (dest) == SIGN_EXTRACT) 1671: { 1672: if (GET_CODE (dest) == ZERO_EXTRACT || GET_CODE (dest) == SIGN_EXTRACT) 1673: { 1674: /* The second and third arguments are values read by this insn. */ 1675: sched_analyze_2 (XEXP (dest, 1), insn); 1676: sched_analyze_2 (XEXP (dest, 2), insn); 1677: } 1678: dest = SUBREG_REG (dest); 1679: } 1680: 1681: if (GET_CODE (dest) == REG) 1682: { 1.1.1.7 root 1683: register int i; 1.1 root 1684: 1685: regno = REGNO (dest); 1686: 1687: /* A hard reg in a wide mode may really be multiple registers. 1688: If so, mark all of them just like the first. */ 1689: if (regno < FIRST_PSEUDO_REGISTER) 1690: { 1691: i = HARD_REGNO_NREGS (regno, GET_MODE (dest)); 1692: while (--i >= 0) 1693: { 1694: rtx u; 1695: 1696: for (u = reg_last_uses[regno+i]; u; u = XEXP (u, 1)) 1697: add_dependence (insn, XEXP (u, 0), REG_DEP_ANTI); 1698: reg_last_uses[regno + i] = 0; 1699: if (reg_last_sets[regno + i]) 1700: add_dependence (insn, reg_last_sets[regno + i], 1701: REG_DEP_OUTPUT); 1.1.1.7 root 1702: reg_pending_sets[(regno + i) / REGSET_ELT_BITS] 1703: |= (REGSET_ELT_TYPE) 1 << ((regno + i) % REGSET_ELT_BITS); 1.1 root 1704: if ((call_used_regs[i] || global_regs[i]) 1705: && last_function_call) 1706: /* Function calls clobber all call_used regs. */ 1707: add_dependence (insn, last_function_call, REG_DEP_ANTI); 1708: } 1709: } 1710: else 1711: { 1712: rtx u; 1713: 1714: for (u = reg_last_uses[regno]; u; u = XEXP (u, 1)) 1715: add_dependence (insn, XEXP (u, 0), REG_DEP_ANTI); 1716: reg_last_uses[regno] = 0; 1717: if (reg_last_sets[regno]) 1718: add_dependence (insn, reg_last_sets[regno], REG_DEP_OUTPUT); 1.1.1.7 root 1719: reg_pending_sets[regno / REGSET_ELT_BITS] 1720: |= (REGSET_ELT_TYPE) 1 << (regno % REGSET_ELT_BITS); 1.1 root 1721: 1.1.1.5 root 1722: /* Pseudos that are REG_EQUIV to something may be replaced 1723: by that during reloading. We need only add dependencies for 1724: the address in the REG_EQUIV note. */ 1725: if (! reload_completed 1726: && reg_known_equiv_p[regno] 1727: && GET_CODE (reg_known_value[regno]) == MEM) 1728: sched_analyze_2 (XEXP (reg_known_value[regno], 0), insn); 1729: 1.1 root 1730: /* Don't let it cross a call after scheduling if it doesn't 1731: already cross one. */ 1732: if (reg_n_calls_crossed[regno] == 0 && last_function_call) 1733: add_dependence (insn, last_function_call, REG_DEP_ANTI); 1734: } 1735: } 1736: else if (GET_CODE (dest) == MEM) 1737: { 1738: /* Writing memory. */ 1739: 1740: if (pending_lists_length > 32) 1741: { 1742: /* Flush all pending reads and writes to prevent the pending lists 1743: from getting any larger. Insn scheduling runs too slowly when 1744: these lists get long. The number 32 was chosen because it 1.1.1.3 root 1745: seems like a reasonable number. When compiling GCC with itself, 1.1 root 1746: this flush occurs 8 times for sparc, and 10 times for m88k using 1747: the number 32. */ 1748: flush_pending_lists (insn); 1749: } 1750: else 1751: { 1752: rtx pending, pending_mem; 1753: 1754: pending = pending_read_insns; 1755: pending_mem = pending_read_mems; 1756: while (pending) 1757: { 1758: /* If a dependency already exists, don't create a new one. */ 1759: if (! find_insn_list (XEXP (pending, 0), LOG_LINKS (insn))) 1.1.1.5 root 1760: if (anti_dependence (XEXP (pending_mem, 0), dest)) 1.1 root 1761: add_dependence (insn, XEXP (pending, 0), REG_DEP_ANTI); 1762: 1763: pending = XEXP (pending, 1); 1764: pending_mem = XEXP (pending_mem, 1); 1765: } 1766: 1767: pending = pending_write_insns; 1768: pending_mem = pending_write_mems; 1769: while (pending) 1770: { 1771: /* If a dependency already exists, don't create a new one. */ 1772: if (! find_insn_list (XEXP (pending, 0), LOG_LINKS (insn))) 1773: if (output_dependence (XEXP (pending_mem, 0), dest)) 1774: add_dependence (insn, XEXP (pending, 0), REG_DEP_OUTPUT); 1775: 1776: pending = XEXP (pending, 1); 1777: pending_mem = XEXP (pending_mem, 1); 1778: } 1779: 1780: if (last_pending_memory_flush) 1781: add_dependence (insn, last_pending_memory_flush, REG_DEP_ANTI); 1782: 1783: add_insn_mem_dependence (&pending_write_insns, &pending_write_mems, 1784: insn, dest); 1785: } 1786: sched_analyze_2 (XEXP (dest, 0), insn); 1787: } 1788: 1789: /* Analyze reads. */ 1790: if (GET_CODE (x) == SET) 1791: sched_analyze_2 (SET_SRC (x), insn); 1792: } 1793: 1794: /* Analyze the uses of memory and registers in rtx X in INSN. */ 1795: 1796: static void 1797: sched_analyze_2 (x, insn) 1798: rtx x; 1799: rtx insn; 1800: { 1801: register int i; 1802: register int j; 1803: register enum rtx_code code; 1804: register char *fmt; 1805: 1806: if (x == 0) 1807: return; 1808: 1809: code = GET_CODE (x); 1810: 1.1.1.2 root 1811: switch (code) 1812: { 1813: case CONST_INT: 1814: case CONST_DOUBLE: 1815: case SYMBOL_REF: 1816: case CONST: 1817: case LABEL_REF: 1818: /* Ignore constants. Note that we must handle CONST_DOUBLE here 1819: because it may have a cc0_rtx in its CONST_DOUBLE_CHAIN field, but 1820: this does not mean that this insn is using cc0. */ 1821: return; 1.1 root 1822: 1823: #ifdef HAVE_cc0 1.1.1.2 root 1824: case CC0: 1825: { 1.1.1.3 root 1826: rtx link, prev; 1.1 root 1827: 1.1.1.3 root 1828: /* There may be a note before this insn now, but all notes will 1829: be removed before we actually try to schedule the insns, so 1830: it won't cause a problem later. We must avoid it here though. */ 1831: 1832: /* User of CC0 depends on immediately preceding insn. */ 1.1.1.2 root 1833: SCHED_GROUP_P (insn) = 1; 1.1 root 1834: 1.1.1.3 root 1835: /* Make a copy of all dependencies on the immediately previous insn, 1836: and add to this insn. This is so that all the dependencies will 1.1.1.4 root 1837: apply to the group. Remove an explicit dependence on this insn 1838: as SCHED_GROUP_P now represents it. */ 1.1.1.3 root 1839: 1840: prev = PREV_INSN (insn); 1841: while (GET_CODE (prev) == NOTE) 1842: prev = PREV_INSN (prev); 1.1 root 1843: 1.1.1.4 root 1844: if (find_insn_list (prev, LOG_LINKS (insn))) 1845: remove_dependence (insn, prev); 1846: 1.1.1.3 root 1847: for (link = LOG_LINKS (prev); link; link = XEXP (link, 1)) 1.1.1.5 root 1848: add_dependence (insn, XEXP (link, 0), REG_NOTE_KIND (link)); 1.1 root 1849: 1.1.1.2 root 1850: return; 1851: } 1.1 root 1852: #endif 1853: 1.1.1.2 root 1854: case REG: 1855: { 1856: int regno = REGNO (x); 1857: if (regno < FIRST_PSEUDO_REGISTER) 1858: { 1859: int i; 1.1 root 1860: 1.1.1.2 root 1861: i = HARD_REGNO_NREGS (regno, GET_MODE (x)); 1862: while (--i >= 0) 1863: { 1864: reg_last_uses[regno + i] 1865: = gen_rtx (INSN_LIST, VOIDmode, 1866: insn, reg_last_uses[regno + i]); 1867: if (reg_last_sets[regno + i]) 1868: add_dependence (insn, reg_last_sets[regno + i], 0); 1869: if ((call_used_regs[regno + i] || global_regs[regno + i]) 1870: && last_function_call) 1871: /* Function calls clobber all call_used regs. */ 1872: add_dependence (insn, last_function_call, REG_DEP_ANTI); 1873: } 1874: } 1875: else 1876: { 1877: reg_last_uses[regno] 1878: = gen_rtx (INSN_LIST, VOIDmode, insn, reg_last_uses[regno]); 1879: if (reg_last_sets[regno]) 1880: add_dependence (insn, reg_last_sets[regno], 0); 1881: 1.1.1.5 root 1882: /* Pseudos that are REG_EQUIV to something may be replaced 1883: by that during reloading. We need only add dependencies for 1884: the address in the REG_EQUIV note. */ 1885: if (! reload_completed 1886: && reg_known_equiv_p[regno] 1887: && GET_CODE (reg_known_value[regno]) == MEM) 1888: sched_analyze_2 (XEXP (reg_known_value[regno], 0), insn); 1889: 1.1.1.2 root 1890: /* If the register does not already cross any calls, then add this 1891: insn to the sched_before_next_call list so that it will still 1892: not cross calls after scheduling. */ 1893: if (reg_n_calls_crossed[regno] == 0) 1894: add_dependence (sched_before_next_call, insn, REG_DEP_ANTI); 1895: } 1896: return; 1897: } 1.1 root 1898: 1.1.1.2 root 1899: case MEM: 1900: { 1901: /* Reading memory. */ 1.1 root 1902: 1.1.1.4 root 1903: rtx pending, pending_mem; 1904: 1905: pending = pending_read_insns; 1906: pending_mem = pending_read_mems; 1907: while (pending) 1.1.1.2 root 1908: { 1.1.1.4 root 1909: /* If a dependency already exists, don't create a new one. */ 1910: if (! find_insn_list (XEXP (pending, 0), LOG_LINKS (insn))) 1911: if (read_dependence (XEXP (pending_mem, 0), x)) 1912: add_dependence (insn, XEXP (pending, 0), REG_DEP_ANTI); 1.1 root 1913: 1.1.1.4 root 1914: pending = XEXP (pending, 1); 1915: pending_mem = XEXP (pending_mem, 1); 1916: } 1.1 root 1917: 1.1.1.4 root 1918: pending = pending_write_insns; 1919: pending_mem = pending_write_mems; 1920: while (pending) 1921: { 1922: /* If a dependency already exists, don't create a new one. */ 1923: if (! find_insn_list (XEXP (pending, 0), LOG_LINKS (insn))) 1924: if (true_dependence (XEXP (pending_mem, 0), x)) 1925: add_dependence (insn, XEXP (pending, 0), 0); 1.1 root 1926: 1.1.1.4 root 1927: pending = XEXP (pending, 1); 1928: pending_mem = XEXP (pending_mem, 1); 1929: } 1930: if (last_pending_memory_flush) 1931: add_dependence (insn, last_pending_memory_flush, REG_DEP_ANTI); 1.1 root 1932: 1.1.1.4 root 1933: /* Always add these dependencies to pending_reads, since 1934: this insn may be followed by a write. */ 1935: add_insn_mem_dependence (&pending_read_insns, &pending_read_mems, 1936: insn, x); 1.1 root 1937: 1.1.1.2 root 1938: /* Take advantage of tail recursion here. */ 1939: sched_analyze_2 (XEXP (x, 0), insn); 1940: return; 1941: } 1.1 root 1942: 1.1.1.2 root 1943: case ASM_OPERANDS: 1944: case ASM_INPUT: 1945: case UNSPEC_VOLATILE: 1.1.1.3 root 1946: case TRAP_IF: 1.1.1.2 root 1947: { 1948: rtx u; 1.1 root 1949: 1.1.1.2 root 1950: /* Traditional and volatile asm instructions must be considered to use 1.1.1.6 root 1951: and clobber all hard registers, all pseudo-registers and all of 1952: memory. So must TRAP_IF and UNSPEC_VOLATILE operations. 1953: 1954: Consider for instance a volatile asm that changes the fpu rounding 1955: mode. An insn should not be moved across this even if it only uses 1956: pseudo-regs because it might give an incorrectly rounded result. */ 1.1.1.3 root 1957: if (code != ASM_OPERANDS || MEM_VOLATILE_P (x)) 1.1.1.2 root 1958: { 1.1.1.6 root 1959: int max_reg = max_reg_num (); 1960: for (i = 0; i < max_reg; i++) 1.1.1.2 root 1961: { 1962: for (u = reg_last_uses[i]; u; u = XEXP (u, 1)) 1.1.1.5 root 1963: add_dependence (insn, XEXP (u, 0), REG_DEP_ANTI); 1.1.1.2 root 1964: reg_last_uses[i] = 0; 1.1.1.5 root 1965: if (reg_last_sets[i]) 1.1.1.2 root 1966: add_dependence (insn, reg_last_sets[i], 0); 1967: } 1.1.1.7 root 1968: reg_pending_sets_all = 1; 1.1 root 1969: 1.1.1.2 root 1970: flush_pending_lists (insn); 1971: } 1.1 root 1972: 1.1.1.2 root 1973: /* For all ASM_OPERANDS, we must traverse the vector of input operands. 1974: We can not just fall through here since then we would be confused 1975: by the ASM_INPUT rtx inside ASM_OPERANDS, which do not indicate 1976: traditional asms unlike their normal usage. */ 1.1 root 1977: 1.1.1.2 root 1978: if (code == ASM_OPERANDS) 1979: { 1980: for (j = 0; j < ASM_OPERANDS_INPUT_LENGTH (x); j++) 1981: sched_analyze_2 (ASM_OPERANDS_INPUT (x, j), insn); 1982: return; 1983: } 1984: break; 1985: } 1.1 root 1986: 1.1.1.2 root 1987: case PRE_DEC: 1988: case POST_DEC: 1989: case PRE_INC: 1990: case POST_INC: 1.1.1.4 root 1991: /* These both read and modify the result. We must handle them as writes 1992: to get proper dependencies for following instructions. We must handle 1993: them as reads to get proper dependencies from this to previous 1994: instructions. Thus we need to pass them to both sched_analyze_1 1995: and sched_analyze_2. We must call sched_analyze_2 first in order 1996: to get the proper antecedent for the read. */ 1997: sched_analyze_2 (XEXP (x, 0), insn); 1.1.1.2 root 1998: sched_analyze_1 (x, insn); 1999: return; 1.1 root 2000: } 2001: 2002: /* Other cases: walk the insn. */ 2003: fmt = GET_RTX_FORMAT (code); 2004: for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) 2005: { 2006: if (fmt[i] == 'e') 2007: sched_analyze_2 (XEXP (x, i), insn); 2008: else if (fmt[i] == 'E') 2009: for (j = 0; j < XVECLEN (x, i); j++) 2010: sched_analyze_2 (XVECEXP (x, i, j), insn); 2011: } 2012: } 2013: 2014: /* Analyze an INSN with pattern X to find all dependencies. */ 2015: 2016: static void 1.1.1.7 root 2017: sched_analyze_insn (x, insn, loop_notes) 1.1 root 2018: rtx x, insn; 1.1.1.7 root 2019: rtx loop_notes; 1.1 root 2020: { 2021: register RTX_CODE code = GET_CODE (x); 2022: rtx link; 1.1.1.7 root 2023: int maxreg = max_reg_num (); 2024: int i; 1.1 root 2025: 2026: if (code == SET || code == CLOBBER) 2027: sched_analyze_1 (x, insn); 2028: else if (code == PARALLEL) 2029: { 2030: register int i; 2031: for (i = XVECLEN (x, 0) - 1; i >= 0; i--) 2032: { 2033: code = GET_CODE (XVECEXP (x, 0, i)); 2034: if (code == SET || code == CLOBBER) 2035: sched_analyze_1 (XVECEXP (x, 0, i), insn); 2036: else 2037: sched_analyze_2 (XVECEXP (x, 0, i), insn); 2038: } 2039: } 2040: else 2041: sched_analyze_2 (x, insn); 2042: 1.1.1.7 root 2043: /* Mark registers CLOBBERED or used by called function. */ 2044: if (GET_CODE (insn) == CALL_INSN) 2045: for (link = CALL_INSN_FUNCTION_USAGE (insn); link; link = XEXP (link, 1)) 2046: { 2047: if (GET_CODE (XEXP (link, 0)) == CLOBBER) 2048: sched_analyze_1 (XEXP (link, 0), insn); 2049: else 2050: sched_analyze_2 (XEXP (link, 0), insn); 2051: } 2052: 2053: /* If there is a LOOP_{BEG,END} note in the middle of a basic block, then 2054: we must be sure that no instructions are scheduled across it. 2055: Otherwise, the reg_n_refs info (which depends on loop_depth) would 2056: become incorrect. */ 2057: 2058: if (loop_notes) 2059: { 2060: int max_reg = max_reg_num (); 2061: rtx link; 2062: 2063: for (i = 0; i < max_reg; i++) 2064: { 2065: rtx u; 2066: for (u = reg_last_uses[i]; u; u = XEXP (u, 1)) 2067: add_dependence (insn, XEXP (u, 0), REG_DEP_ANTI); 2068: reg_last_uses[i] = 0; 2069: if (reg_last_sets[i]) 2070: add_dependence (insn, reg_last_sets[i], 0); 2071: } 2072: reg_pending_sets_all = 1; 2073: 2074: flush_pending_lists (insn); 2075: 2076: link = loop_notes; 2077: while (XEXP (link, 1)) 2078: link = XEXP (link, 1); 2079: XEXP (link, 1) = REG_NOTES (insn); 2080: REG_NOTES (insn) = loop_notes; 2081: } 2082: 2083: /* After reload, it is possible for an instruction to have a REG_DEAD note 2084: for a register that actually dies a few instructions earlier. For 2085: example, this can happen with SECONDARY_MEMORY_NEEDED reloads. 2086: In this case, we must consider the insn to use the register mentioned 2087: in the REG_DEAD note. Otherwise, we may accidentally move this insn 2088: after another insn that sets the register, thus getting obviously invalid 2089: rtl. This confuses reorg which believes that REG_DEAD notes are still 2090: meaningful. 2091: 2092: ??? We would get better code if we fixed reload to put the REG_DEAD 2093: notes in the right places, but that may not be worth the effort. */ 2094: 2095: if (reload_completed) 2096: { 2097: rtx note; 2098: 2099: for (note = REG_NOTES (insn); note; note = XEXP (note, 1)) 2100: if (REG_NOTE_KIND (note) == REG_DEAD) 2101: sched_analyze_2 (XEXP (note, 0), insn); 2102: } 2103: 2104: for (i = 0; i < regset_size; i++) 2105: { 2106: REGSET_ELT_TYPE sets = reg_pending_sets[i]; 2107: if (sets) 2108: { 2109: register int bit; 2110: for (bit = 0; bit < REGSET_ELT_BITS; bit++) 2111: if (sets & ((REGSET_ELT_TYPE) 1 << bit)) 2112: reg_last_sets[i * REGSET_ELT_BITS + bit] = insn; 2113: reg_pending_sets[i] = 0; 2114: } 2115: } 2116: if (reg_pending_sets_all) 2117: { 2118: for (i = 0; i < maxreg; i++) 2119: reg_last_sets[i] = insn; 2120: reg_pending_sets_all = 0; 2121: } 2122: 1.1.1.6 root 2123: /* Handle function calls and function returns created by the epilogue 2124: threading code. */ 2125: if (GET_CODE (insn) == CALL_INSN || GET_CODE (insn) == JUMP_INSN) 1.1 root 2126: { 2127: rtx dep_insn; 2128: rtx prev_dep_insn; 2129: 2130: /* When scheduling instructions, we make sure calls don't lose their 1.1.1.6 root 2131: accompanying USE insns by depending them one on another in order. 2132: 2133: Also, we must do the same thing for returns created by the epilogue 2134: threading code. Note this code works only in this special case, 2135: because other passes make no guarantee that they will never emit 2136: an instruction between a USE and a RETURN. There is such a guarantee 2137: for USE instructions immediately before a call. */ 1.1 root 2138: 2139: prev_dep_insn = insn; 2140: dep_insn = PREV_INSN (insn); 2141: while (GET_CODE (dep_insn) == INSN 1.1.1.7 root 2142: && GET_CODE (PATTERN (dep_insn)) == USE 2143: && GET_CODE (XEXP (PATTERN (dep_insn), 0)) == REG) 1.1 root 2144: { 2145: SCHED_GROUP_P (prev_dep_insn) = 1; 2146: 2147: /* Make a copy of all dependencies on dep_insn, and add to insn. 2148: This is so that all of the dependencies will apply to the 2149: group. */ 2150: 2151: for (link = LOG_LINKS (dep_insn); link; link = XEXP (link, 1)) 1.1.1.5 root 2152: add_dependence (insn, XEXP (link, 0), REG_NOTE_KIND (link)); 1.1 root 2153: 2154: prev_dep_insn = dep_insn; 2155: dep_insn = PREV_INSN (dep_insn); 2156: } 2157: } 2158: } 2159: 2160: /* Analyze every insn between HEAD and TAIL inclusive, creating LOG_LINKS 2161: for every dependency. */ 2162: 2163: static int 2164: sched_analyze (head, tail) 2165: rtx head, tail; 2166: { 2167: register rtx insn; 2168: register int n_insns = 0; 2169: register rtx u; 2170: register int luid = 0; 1.1.1.7 root 2171: rtx loop_notes = 0; 1.1 root 2172: 2173: for (insn = head; ; insn = NEXT_INSN (insn)) 2174: { 2175: INSN_LUID (insn) = luid++; 2176: 2177: if (GET_CODE (insn) == INSN || GET_CODE (insn) == JUMP_INSN) 2178: { 1.1.1.7 root 2179: sched_analyze_insn (PATTERN (insn), insn, loop_notes); 2180: loop_notes = 0; 1.1 root 2181: n_insns += 1; 2182: } 2183: else if (GET_CODE (insn) == CALL_INSN) 2184: { 2185: rtx x; 2186: register int i; 2187: 2188: /* Any instruction using a hard register which may get clobbered 2189: by a call needs to be marked as dependent on this call. 2190: This prevents a use of a hard return reg from being moved 2191: past a void call (i.e. it does not explicitly set the hard 2192: return reg). */ 2193: 1.1.1.7 root 2194: /* If this call is followed by a NOTE_INSN_SETJMP, then assume that 2195: all registers, not just hard registers, may be clobbered by this 2196: call. */ 2197: 2198: /* Insn, being a CALL_INSN, magically depends on 2199: `last_function_call' already. */ 2200: 2201: if (NEXT_INSN (insn) && GET_CODE (NEXT_INSN (insn)) == NOTE 2202: && NOTE_LINE_NUMBER (NEXT_INSN (insn)) == NOTE_INSN_SETJMP) 2203: { 2204: int max_reg = max_reg_num (); 2205: for (i = 0; i < max_reg; i++) 2206: { 2207: for (u = reg_last_uses[i]; u; u = XEXP (u, 1)) 2208: add_dependence (insn, XEXP (u, 0), REG_DEP_ANTI); 2209: reg_last_uses[i] = 0; 2210: if (reg_last_sets[i]) 2211: add_dependence (insn, reg_last_sets[i], 0); 2212: } 2213: reg_pending_sets_all = 1; 2214: 2215: /* Add a fake REG_NOTE which we will later convert 2216: back into a NOTE_INSN_SETJMP note. */ 2217: REG_NOTES (insn) = gen_rtx (EXPR_LIST, REG_DEAD, 2218: GEN_INT (NOTE_INSN_SETJMP), 2219: REG_NOTES (insn)); 2220: } 2221: else 2222: { 2223: for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) 2224: if (call_used_regs[i] || global_regs[i]) 2225: { 2226: for (u = reg_last_uses[i]; u; u = XEXP (u, 1)) 2227: add_dependence (insn, XEXP (u, 0), REG_DEP_ANTI); 2228: reg_last_uses[i] = 0; 2229: if (reg_last_sets[i]) 2230: add_dependence (insn, reg_last_sets[i], REG_DEP_ANTI); 2231: reg_pending_sets[i / REGSET_ELT_BITS] 2232: |= (REGSET_ELT_TYPE) 1 << (i % REGSET_ELT_BITS); 2233: } 2234: } 1.1 root 2235: 2236: /* For each insn which shouldn't cross a call, add a dependence 2237: between that insn and this call insn. */ 2238: x = LOG_LINKS (sched_before_next_call); 2239: while (x) 2240: { 2241: add_dependence (insn, XEXP (x, 0), REG_DEP_ANTI); 2242: x = XEXP (x, 1); 2243: } 2244: LOG_LINKS (sched_before_next_call) = 0; 2245: 1.1.1.7 root 2246: sched_analyze_insn (PATTERN (insn), insn, loop_notes); 2247: loop_notes = 0; 1.1 root 2248: 2249: /* We don't need to flush memory for a function call which does 2250: not involve memory. */ 2251: if (! CONST_CALL_P (insn)) 2252: { 2253: /* In the absence of interprocedural alias analysis, 2254: we must flush all pending reads and writes, and 2255: start new dependencies starting from here. */ 2256: flush_pending_lists (insn); 2257: } 2258: 2259: /* Depend this function call (actually, the user of this 2260: function call) on all hard register clobberage. */ 2261: last_function_call = insn; 2262: n_insns += 1; 2263: } 1.1.1.7 root 2264: else if (GET_CODE (insn) == NOTE 2265: && (NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_BEG 2266: || NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_END)) 2267: loop_notes = gen_rtx (EXPR_LIST, REG_DEAD, 2268: GEN_INT (NOTE_LINE_NUMBER (insn)), loop_notes); 1.1 root 2269: 2270: if (insn == tail) 2271: return n_insns; 2272: } 2273: } 2274: 2275: /* Called when we see a set of a register. If death is true, then we are 2276: scanning backwards. Mark that register as unborn. If nobody says 2277: otherwise, that is how things will remain. If death is false, then we 2278: are scanning forwards. Mark that register as being born. */ 2279: 2280: static void 2281: sched_note_set (b, x, death) 2282: int b; 2283: rtx x; 2284: int death; 2285: { 1.1.1.7 root 2286: register int regno; 1.1 root 2287: register rtx reg = SET_DEST (x); 2288: int subreg_p = 0; 2289: 2290: if (reg == 0) 2291: return; 2292: 2293: while (GET_CODE (reg) == SUBREG || GET_CODE (reg) == STRICT_LOW_PART 2294: || GET_CODE (reg) == SIGN_EXTRACT || GET_CODE (reg) == ZERO_EXTRACT) 2295: { 2296: /* Must treat modification of just one hardware register of a multi-reg 2297: value or just a byte field of a register exactly the same way that 1.1.1.4 root 2298: mark_set_1 in flow.c does, i.e. anything except a paradoxical subreg 2299: does not kill the entire register. */ 2300: if (GET_CODE (reg) != SUBREG 2301: || REG_SIZE (SUBREG_REG (reg)) > REG_SIZE (reg)) 1.1 root 2302: subreg_p = 1; 2303: 2304: reg = SUBREG_REG (reg); 2305: } 2306: 2307: if (GET_CODE (reg) != REG) 2308: return; 2309: 2310: /* Global registers are always live, so the code below does not apply 2311: to them. */ 2312: 2313: regno = REGNO (reg); 2314: if (regno >= FIRST_PSEUDO_REGISTER || ! global_regs[regno]) 2315: { 2316: register int offset = regno / REGSET_ELT_BITS; 1.1.1.4 root 2317: register REGSET_ELT_TYPE bit 2318: = (REGSET_ELT_TYPE) 1 << (regno % REGSET_ELT_BITS); 1.1 root 2319: 2320: if (death) 2321: { 2322: /* If we only set part of the register, then this set does not 2323: kill it. */ 2324: if (subreg_p) 2325: return; 2326: 2327: /* Try killing this register. */ 2328: if (regno < FIRST_PSEUDO_REGISTER) 2329: { 2330: int j = HARD_REGNO_NREGS (regno, GET_MODE (reg)); 2331: while (--j >= 0) 2332: { 2333: offset = (regno + j) / REGSET_ELT_BITS; 1.1.1.4 root 2334: bit = (REGSET_ELT_TYPE) 1 << ((regno + j) % REGSET_ELT_BITS); 1.1 root 2335: 2336: bb_live_regs[offset] &= ~bit; 2337: bb_dead_regs[offset] |= bit; 2338: } 2339: } 2340: else 2341: { 2342: bb_live_regs[offset] &= ~bit; 2343: bb_dead_regs[offset] |= bit; 2344: } 2345: } 2346: else 2347: { 2348: /* Make the register live again. */ 2349: if (regno < FIRST_PSEUDO_REGISTER) 2350: { 2351: int j = HARD_REGNO_NREGS (regno, GET_MODE (reg)); 2352: while (--j >= 0) 2353: { 2354: offset = (regno + j) / REGSET_ELT_BITS; 1.1.1.4 root 2355: bit = (REGSET_ELT_TYPE) 1 << ((regno + j) % REGSET_ELT_BITS); 1.1 root 2356: 2357: bb_live_regs[offset] |= bit; 2358: bb_dead_regs[offset] &= ~bit; 2359: } 2360: } 2361: else 2362: { 2363: bb_live_regs[offset] |= bit; 2364: bb_dead_regs[offset] &= ~bit; 2365: } 2366: } 2367: } 2368: } 2369: 2370: /* Macros and functions for keeping the priority queue sorted, and 1.1.1.8 ! root 2371: dealing with queueing and dequeueing of instructions. */ 1.1 root 2372: 2373: #define SCHED_SORT(READY, NEW_READY, OLD_READY) \ 2374: do { if ((NEW_READY) - (OLD_READY) == 1) \ 2375: swap_sort (READY, NEW_READY); \ 2376: else if ((NEW_READY) - (OLD_READY) > 1) \ 2377: qsort (READY, NEW_READY, sizeof (rtx), rank_for_schedule); } \ 2378: while (0) 2379: 2380: /* Returns a positive value if y is preferred; returns a negative value if 2381: x is preferred. Should never return 0, since that will make the sort 2382: unstable. */ 2383: 2384: static int 2385: rank_for_schedule (x, y) 2386: rtx *x, *y; 2387: { 2388: rtx tmp = *y; 2389: rtx tmp2 = *x; 1.1.1.4 root 2390: rtx link; 1.1 root 2391: int tmp_class, tmp2_class; 2392: int value; 2393: 2394: /* Choose the instruction with the highest priority, if different. */ 2395: if (value = INSN_PRIORITY (tmp) - INSN_PRIORITY (tmp2)) 2396: return value; 2397: 2398: if (last_scheduled_insn) 2399: { 2400: /* Classify the instructions into three classes: 2401: 1) Data dependent on last schedule insn. 2402: 2) Anti/Output dependent on last scheduled insn. 2403: 3) Independent of last scheduled insn, or has latency of one. 2404: Choose the insn from the highest numbered class if different. */ 1.1.1.4 root 2405: link = find_insn_list (tmp, LOG_LINKS (last_scheduled_insn)); 2406: if (link == 0 || insn_cost (tmp, link, last_scheduled_insn) == 1) 1.1 root 2407: tmp_class = 3; 1.1.1.4 root 2408: else if (REG_NOTE_KIND (link) == 0) /* Data dependence. */ 1.1 root 2409: tmp_class = 1; 2410: else 2411: tmp_class = 2; 2412: 1.1.1.4 root 2413: link = find_insn_list (tmp2, LOG_LINKS (last_scheduled_insn)); 2414: if (link == 0 || insn_cost (tmp2, link, last_scheduled_insn) == 1) 1.1 root 2415: tmp2_class = 3; 1.1.1.4 root 2416: else if (REG_NOTE_KIND (link) == 0) /* Data dependence. */ 1.1 root 2417: tmp2_class = 1; 2418: else 2419: tmp2_class = 2; 2420: 2421: if (value = tmp_class - tmp2_class) 2422: return value; 2423: } 2424: 2425: /* If insns are equally good, sort by INSN_LUID (original insn order), 2426: so that we make the sort stable. This minimizes instruction movement, 2427: thus minimizing sched's effect on debugging and cross-jumping. */ 2428: return INSN_LUID (tmp) - INSN_LUID (tmp2); 2429: } 2430: 2431: /* Resort the array A in which only element at index N may be out of order. */ 2432: 2433: __inline static void 2434: swap_sort (a, n) 2435: rtx *a; 2436: int n; 2437: { 2438: rtx insn = a[n-1]; 2439: int i = n-2; 2440: 2441: while (i >= 0 && rank_for_schedule (a+i, &insn) >= 0) 2442: { 2443: a[i+1] = a[i]; 2444: i -= 1; 2445: } 2446: a[i+1] = insn; 2447: } 2448: 2449: static int max_priority; 2450: 2451: /* Add INSN to the insn queue so that it fires at least N_CYCLES 2452: before the currently executing insn. */ 2453: 2454: __inline static void 2455: queue_insn (insn, n_cycles) 2456: rtx insn; 2457: int n_cycles; 2458: { 2459: int next_q = NEXT_Q_AFTER (q_ptr, n_cycles); 2460: NEXT_INSN (insn) = insn_queue[next_q]; 2461: insn_queue[next_q] = insn; 2462: q_size += 1; 2463: } 2464: 2465: /* Return nonzero if PAT is the pattern of an insn which makes a 2466: register live. */ 2467: 2468: __inline static int 2469: birthing_insn_p (pat) 2470: rtx pat; 2471: { 2472: int j; 2473: 2474: if (reload_completed == 1) 2475: return 0; 2476: 2477: if (GET_CODE (pat) == SET 2478: && GET_CODE (SET_DEST (pat)) == REG) 2479: { 2480: rtx dest = SET_DEST (pat); 2481: int i = REGNO (dest); 2482: int offset = i / REGSET_ELT_BITS; 1.1.1.4 root 2483: REGSET_ELT_TYPE bit = (REGSET_ELT_TYPE) 1 << (i % REGSET_ELT_BITS); 1.1 root 2484: 2485: /* It would be more accurate to use refers_to_regno_p or 2486: reg_mentioned_p to determine when the dest is not live before this 2487: insn. */ 2488: 2489: if (bb_live_regs[offset] & bit) 2490: return (reg_n_sets[i] == 1); 2491: 2492: return 0; 2493: } 2494: if (GET_CODE (pat) == PARALLEL) 2495: { 2496: for (j = 0; j < XVECLEN (pat, 0); j++) 2497: if (birthing_insn_p (XVECEXP (pat, 0, j))) 2498: return 1; 2499: } 2500: return 0; 2501: } 2502: 1.1.1.4 root 2503: /* PREV is an insn that is ready to execute. Adjust its priority if that 2504: will help shorten register lifetimes. */ 1.1 root 2505: 1.1.1.4 root 2506: __inline static void 2507: adjust_priority (prev) 1.1 root 2508: rtx prev; 2509: { 2510: /* Trying to shorten register lives after reload has completed 2511: is useless and wrong. It gives inaccurate schedules. */ 2512: if (reload_completed == 0) 2513: { 1.1.1.4 root 2514: rtx note; 2515: int n_deaths = 0; 2516: 1.1.1.5 root 2517: /* ??? This code has no effect, because REG_DEAD notes are removed 2518: before we ever get here. */ 1.1 root 2519: for (note = REG_NOTES (prev); note; note = XEXP (note, 1)) 2520: if (REG_NOTE_KIND (note) == REG_DEAD) 2521: n_deaths += 1; 2522: 2523: /* Defer scheduling insns which kill registers, since that 2524: shortens register lives. Prefer scheduling insns which 2525: make registers live for the same reason. */ 2526: switch (n_deaths) 2527: { 2528: default: 2529: INSN_PRIORITY (prev) >>= 3; 2530: break; 2531: case 3: 2532: INSN_PRIORITY (prev) >>= 2; 2533: break; 2534: case 2: 2535: case 1: 2536: INSN_PRIORITY (prev) >>= 1; 2537: break; 2538: case 0: 1.1.1.4 root 2539: if (birthing_insn_p (PATTERN (prev))) 1.1 root 2540: { 2541: int max = max_priority; 2542: 2543: if (max > INSN_PRIORITY (prev)) 2544: INSN_PRIORITY (prev) = max; 2545: } 2546: break; 2547: } 2548: } 2549: } 2550: 2551: /* INSN is the "currently executing insn". Launch each insn which was 2552: waiting on INSN (in the backwards dataflow sense). READY is a 2553: vector of insns which are ready to fire. N_READY is the number of 1.1.1.4 root 2554: elements in READY. CLOCK is the current virtual cycle. */ 1.1 root 2555: 2556: static int 1.1.1.4 root 2557: schedule_insn (insn, ready, n_ready, clock) 1.1 root 2558: rtx insn; 2559: rtx *ready; 2560: int n_ready; 1.1.1.4 root 2561: int clock; 1.1 root 2562: { 2563: rtx link; 2564: int new_ready = n_ready; 2565: 1.1.1.4 root 2566: if (MAX_BLOCKAGE > 1) 2567: schedule_unit (insn_unit (insn), insn, clock); 2568: 1.1 root 2569: if (LOG_LINKS (insn) == 0) 2570: return n_ready; 2571: 1.1.1.4 root 2572: /* This is used by the function adjust_priority above. */ 1.1 root 2573: if (n_ready > 0) 2574: max_priority = MAX (INSN_PRIORITY (ready[0]), INSN_PRIORITY (insn)); 2575: else 2576: max_priority = INSN_PRIORITY (insn); 2577: 2578: for (link = LOG_LINKS (insn); link != 0; link = XEXP (link, 1)) 2579: { 2580: rtx prev = XEXP (link, 0); 1.1.1.4 root 2581: int cost = insn_cost (prev, link, insn); 2582: 2583: if ((INSN_REF_COUNT (prev) -= 1) != 0) 2584: { 2585: /* We satisfied one requirement to fire PREV. Record the earliest 2586: time when PREV can fire. No need to do this if the cost is 1, 2587: because PREV can fire no sooner than the next cycle. */ 2588: if (cost > 1) 2589: INSN_TICK (prev) = MAX (INSN_TICK (prev), clock + cost); 2590: } 2591: else 2592: { 2593: /* We satisfied the last requirement to fire PREV. Ensure that all 2594: timing requirements are satisfied. */ 2595: if (INSN_TICK (prev) - clock > cost) 2596: cost = INSN_TICK (prev) - clock; 2597: 2598: /* Adjust the priority of PREV and either put it on the ready 2599: list or queue it. */ 2600: adjust_priority (prev); 2601: if (cost <= 1) 2602: ready[new_ready++] = prev; 2603: else 2604: queue_insn (prev, cost); 2605: } 2606: } 2607: 2608: return new_ready; 2609: } 1.1 root 2610: 1.1.1.4 root 2611: /* Given N_READY insns in the ready list READY at time CLOCK, queue 2612: those that are blocked due to function unit hazards and rearrange 2613: the remaining ones to minimize subsequent function unit hazards. */ 2614: 2615: static int 2616: schedule_select (ready, n_ready, clock, file) 2617: rtx *ready; 2618: int n_ready, clock; 2619: FILE *file; 2620: { 2621: int pri = INSN_PRIORITY (ready[0]); 2622: int i, j, k, q, cost, best_cost, best_insn = 0, new_ready = n_ready; 2623: rtx insn; 2624: 2625: /* Work down the ready list in groups of instructions with the same 2626: priority value. Queue insns in the group that are blocked and 2627: select among those that remain for the one with the largest 2628: potential hazard. */ 2629: for (i = 0; i < n_ready; i = j) 2630: { 2631: int opri = pri; 2632: for (j = i + 1; j < n_ready; j++) 2633: if ((pri = INSN_PRIORITY (ready[j])) != opri) 2634: break; 2635: 2636: /* Queue insns in the group that are blocked. */ 2637: for (k = i, q = 0; k < j; k++) 2638: { 2639: insn = ready[k]; 2640: if ((cost = actual_hazard (insn_unit (insn), insn, clock, 0)) != 0) 2641: { 2642: q++; 2643: ready[k] = 0; 2644: queue_insn (insn, cost); 2645: if (file) 2646: fprintf (file, "\n;; blocking insn %d for %d cycles", 2647: INSN_UID (insn), cost); 2648: } 2649: } 2650: new_ready -= q; 2651: 2652: /* Check the next group if all insns were queued. */ 2653: if (j - i - q == 0) 2654: continue; 2655: 2656: /* If more than one remains, select the first one with the largest 2657: potential hazard. */ 2658: else if (j - i - q > 1) 2659: { 2660: best_cost = -1; 2661: for (k = i; k < j; k++) 2662: { 2663: if ((insn = ready[k]) == 0) 2664: continue; 2665: if ((cost = potential_hazard (insn_unit (insn), insn, 0)) 2666: > best_cost) 2667: { 2668: best_cost = cost; 2669: best_insn = k; 2670: } 2671: } 2672: } 2673: /* We have found a suitable insn to schedule. */ 2674: break; 1.1 root 2675: } 2676: 1.1.1.4 root 2677: /* Move the best insn to be front of the ready list. */ 2678: if (best_insn != 0) 2679: { 2680: if (file) 2681: { 2682: fprintf (file, ", now"); 2683: for (i = 0; i < n_ready; i++) 2684: if (ready[i]) 2685: fprintf (file, " %d", INSN_UID (ready[i])); 2686: fprintf (file, "\n;; insn %d has a greater potential hazard", 2687: INSN_UID (ready[best_insn])); 2688: } 2689: for (i = best_insn; i > 0; i--) 2690: { 2691: insn = ready[i-1]; 2692: ready[i-1] = ready[i]; 2693: ready[i] = insn; 2694: } 2695: } 2696: 2697: /* Compact the ready list. */ 2698: if (new_ready < n_ready) 2699: for (i = j = 0; i < n_ready; i++) 2700: if (ready[i]) 2701: ready[j++] = ready[i]; 2702: 1.1 root 2703: return new_ready; 2704: } 2705: 2706: /* Add a REG_DEAD note for REG to INSN, reusing a REG_DEAD note from the 2707: dead_notes list. */ 2708: 2709: static void 2710: create_reg_dead_note (reg, insn) 2711: rtx reg, insn; 2712: { 1.1.1.7 root 2713: rtx link; 1.1 root 2714: 1.1.1.5 root 2715: /* The number of registers killed after scheduling must be the same as the 2716: number of registers killed before scheduling. The number of REG_DEAD 2717: notes may not be conserved, i.e. two SImode hard register REG_DEAD notes 2718: might become one DImode hard register REG_DEAD note, but the number of 2719: registers killed will be conserved. 2720: 2721: We carefully remove REG_DEAD notes from the dead_notes list, so that 2722: there will be none left at the end. If we run out early, then there 2723: is a bug somewhere in flow, combine and/or sched. */ 2724: 2725: if (dead_notes == 0) 1.1 root 2726: { 2727: #if 1 2728: abort (); 2729: #else 2730: link = rtx_alloc (EXPR_LIST); 2731: PUT_REG_NOTE_KIND (link, REG_DEAD); 2732: #endif 2733: } 2734: else 1.1.1.5 root 2735: { 2736: /* Number of regs killed by REG. */ 2737: int regs_killed = (REGNO (reg) >= FIRST_PSEUDO_REGISTER ? 1 2738: : HARD_REGNO_NREGS (REGNO (reg), GET_MODE (reg))); 2739: /* Number of regs killed by REG_DEAD notes taken off the list. */ 2740: int reg_note_regs; 2741: 2742: link = dead_notes; 2743: reg_note_regs = (REGNO (XEXP (link, 0)) >= FIRST_PSEUDO_REGISTER ? 1 2744: : HARD_REGNO_NREGS (REGNO (XEXP (link, 0)), 2745: GET_MODE (XEXP (link, 0)))); 2746: while (reg_note_regs < regs_killed) 2747: { 2748: link = XEXP (link, 1); 2749: reg_note_regs += (REGNO (XEXP (link, 0)) >= FIRST_PSEUDO_REGISTER ? 1 2750: : HARD_REGNO_NREGS (REGNO (XEXP (link, 0)), 2751: GET_MODE (XEXP (link, 0)))); 2752: } 2753: dead_notes = XEXP (link, 1); 2754: 2755: /* If we took too many regs kills off, put the extra ones back. */ 2756: while (reg_note_regs > regs_killed) 2757: { 2758: rtx temp_reg, temp_link; 2759: 2760: temp_reg = gen_rtx (REG, word_mode, 0); 2761: temp_link = rtx_alloc (EXPR_LIST); 2762: PUT_REG_NOTE_KIND (temp_link, REG_DEAD); 2763: XEXP (temp_link, 0) = temp_reg; 2764: XEXP (temp_link, 1) = dead_notes; 2765: dead_notes = temp_link; 2766: reg_note_regs--; 2767: } 2768: } 1.1 root 2769: 2770: XEXP (link, 0) = reg; 2771: XEXP (link, 1) = REG_NOTES (insn); 2772: REG_NOTES (insn) = link; 2773: } 2774: 2775: /* Subroutine on attach_deaths_insn--handles the recursive search 2776: through INSN. If SET_P is true, then x is being modified by the insn. */ 2777: 2778: static void 2779: attach_deaths (x, insn, set_p) 2780: rtx x; 2781: rtx insn; 2782: int set_p; 2783: { 2784: register int i; 2785: register int j; 2786: register enum rtx_code code; 2787: register char *fmt; 2788: 2789: if (x == 0) 2790: return; 2791: 2792: code = GET_CODE (x); 2793: 2794: switch (code) 2795: { 2796: case CONST_INT: 2797: case CONST_DOUBLE: 2798: case LABEL_REF: 2799: case SYMBOL_REF: 2800: case CONST: 2801: case CODE_LABEL: 2802: case PC: 2803: case CC0: 2804: /* Get rid of the easy cases first. */ 2805: return; 2806: 2807: case REG: 2808: { 2809: /* If the register dies in this insn, queue that note, and mark 2810: this register as needing to die. */ 2811: /* This code is very similar to mark_used_1 (if set_p is false) 2812: and mark_set_1 (if set_p is true) in flow.c. */ 2813: 2814: register int regno = REGNO (x); 2815: register int offset = regno / REGSET_ELT_BITS; 1.1.1.4 root 2816: register REGSET_ELT_TYPE bit 2817: = (REGSET_ELT_TYPE) 1 << (regno % REGSET_ELT_BITS); 2818: REGSET_ELT_TYPE all_needed = (old_live_regs[offset] & bit); 2819: REGSET_ELT_TYPE some_needed = (old_live_regs[offset] & bit); 1.1 root 2820: 2821: if (set_p) 2822: return; 2823: 2824: if (regno < FIRST_PSEUDO_REGISTER) 2825: { 2826: int n; 2827: 2828: n = HARD_REGNO_NREGS (regno, GET_MODE (x)); 2829: while (--n > 0) 2830: { 2831: some_needed |= (old_live_regs[(regno + n) / REGSET_ELT_BITS] 1.1.1.4 root 2832: & ((REGSET_ELT_TYPE) 1 2833: << ((regno + n) % REGSET_ELT_BITS))); 1.1 root 2834: all_needed &= (old_live_regs[(regno + n) / REGSET_ELT_BITS] 1.1.1.4 root 2835: & ((REGSET_ELT_TYPE) 1 2836: << ((regno + n) % REGSET_ELT_BITS))); 1.1 root 2837: } 2838: } 2839: 2840: /* If it wasn't live before we started, then add a REG_DEAD note. 2841: We must check the previous lifetime info not the current info, 2842: because we may have to execute this code several times, e.g. 2843: once for a clobber (which doesn't add a note) and later 2844: for a use (which does add a note). 2845: 2846: Always make the register live. We must do this even if it was 2847: live before, because this may be an insn which sets and uses 2848: the same register, in which case the register has already been 2849: killed, so we must make it live again. 2850: 2851: Global registers are always live, and should never have a REG_DEAD 2852: note added for them, so none of the code below applies to them. */ 2853: 2854: if (regno >= FIRST_PSEUDO_REGISTER || ! global_regs[regno]) 2855: { 2856: /* Never add REG_DEAD notes for the FRAME_POINTER_REGNUM or the 2857: STACK_POINTER_REGNUM, since these are always considered to be 2858: live. Similarly for ARG_POINTER_REGNUM if it is fixed. */ 2859: if (regno != FRAME_POINTER_REGNUM 1.1.1.6 root 2860: #if HARD_FRAME_POINTER_REGNUM != FRAME_POINTER_REGNUM 2861: && ! (regno == HARD_FRAME_POINTER_REGNUM) 2862: #endif 1.1 root 2863: #if ARG_POINTER_REGNUM != FRAME_POINTER_REGNUM 2864: && ! (regno == ARG_POINTER_REGNUM && fixed_regs[regno]) 2865: #endif 2866: && regno != STACK_POINTER_REGNUM) 2867: { 1.1.1.8 ! root 2868: /* ??? It is perhaps a dead_or_set_p bug that it does ! 2869: not check for REG_UNUSED notes itself. This is necessary ! 2870: for the case where the SET_DEST is a subreg of regno, as ! 2871: dead_or_set_p handles subregs specially. */ ! 2872: if (! all_needed && ! dead_or_set_p (insn, x) ! 2873: && ! find_reg_note (insn, REG_UNUSED, x)) 1.1 root 2874: { 1.1.1.7 root 2875: /* Check for the case where the register dying partially 2876: overlaps the register set by this insn. */ 2877: if (regno < FIRST_PSEUDO_REGISTER 2878: && HARD_REGNO_NREGS (regno, GET_MODE (x)) > 1) 2879: { 2880: int n = HARD_REGNO_NREGS (regno, GET_MODE (x)); 2881: while (--n >= 0) 2882: some_needed |= dead_or_set_regno_p (insn, regno + n); 2883: } 2884: 1.1 root 2885: /* If none of the words in X is needed, make a REG_DEAD 2886: note. Otherwise, we must make partial REG_DEAD 2887: notes. */ 2888: if (! some_needed) 2889: create_reg_dead_note (x, insn); 2890: else 2891: { 2892: int i; 2893: 2894: /* Don't make a REG_DEAD note for a part of a 2895: register that is set in the insn. */ 2896: for (i = HARD_REGNO_NREGS (regno, GET_MODE (x)) - 1; 2897: i >= 0; i--) 2898: if ((old_live_regs[(regno + i) / REGSET_ELT_BITS] 1.1.1.4 root 2899: & ((REGSET_ELT_TYPE) 1 2900: << ((regno +i) % REGSET_ELT_BITS))) == 0 1.1 root 2901: && ! dead_or_set_regno_p (insn, regno + i)) 1.1.1.7 root 2902: create_reg_dead_note (gen_rtx (REG, 2903: reg_raw_mode[regno + i], 1.1 root 2904: regno + i), 2905: insn); 2906: } 2907: } 2908: } 2909: 2910: if (regno < FIRST_PSEUDO_REGISTER) 2911: { 2912: int j = HARD_REGNO_NREGS (regno, GET_MODE (x)); 2913: while (--j >= 0) 2914: { 2915: offset = (regno + j) / REGSET_ELT_BITS; 1.1.1.4 root 2916: bit 2917: = (REGSET_ELT_TYPE) 1 << ((regno + j) % REGSET_ELT_BITS); 1.1 root 2918: 2919: bb_dead_regs[offset] &= ~bit; 2920: bb_live_regs[offset] |= bit; 2921: } 2922: } 2923: else 2924: { 2925: bb_dead_regs[offset] &= ~bit; 2926: bb_live_regs[offset] |= bit; 2927: } 2928: } 2929: return; 2930: } 2931: 2932: case MEM: 2933: /* Handle tail-recursive case. */ 2934: attach_deaths (XEXP (x, 0), insn, 0); 2935: return; 2936: 2937: case SUBREG: 2938: case STRICT_LOW_PART: 2939: /* These two cases preserve the value of SET_P, so handle them 2940: separately. */ 2941: attach_deaths (XEXP (x, 0), insn, set_p); 2942: return; 2943: 2944: case ZERO_EXTRACT: 2945: case SIGN_EXTRACT: 2946: /* This case preserves the value of SET_P for the first operand, but 2947: clears it for the other two. */ 2948: attach_deaths (XEXP (x, 0), insn, set_p); 2949: attach_deaths (XEXP (x, 1), insn, 0); 2950: attach_deaths (XEXP (x, 2), insn, 0); 2951: return; 2952: 2953: default: 2954: /* Other cases: walk the insn. */ 2955: fmt = GET_RTX_FORMAT (code); 2956: for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) 2957: { 2958: if (fmt[i] == 'e') 2959: attach_deaths (XEXP (x, i), insn, 0); 2960: else if (fmt[i] == 'E') 2961: for (j = 0; j < XVECLEN (x, i); j++) 2962: attach_deaths (XVECEXP (x, i, j), insn, 0); 2963: } 2964: } 2965: } 2966: 2967: /* After INSN has executed, add register death notes for each register 2968: that is dead after INSN. */ 2969: 2970: static void 2971: attach_deaths_insn (insn) 2972: rtx insn; 2973: { 2974: rtx x = PATTERN (insn); 2975: register RTX_CODE code = GET_CODE (x); 1.1.1.7 root 2976: rtx link; 1.1 root 2977: 2978: if (code == SET) 2979: { 2980: attach_deaths (SET_SRC (x), insn, 0); 2981: 2982: /* A register might die here even if it is the destination, e.g. 2983: it is the target of a volatile read and is otherwise unused. 2984: Hence we must always call attach_deaths for the SET_DEST. */ 2985: attach_deaths (SET_DEST (x), insn, 1); 2986: } 2987: else if (code == PARALLEL) 2988: { 2989: register int i; 2990: for (i = XVECLEN (x, 0) - 1; i >= 0; i--) 2991: { 2992: code = GET_CODE (XVECEXP (x, 0, i)); 2993: if (code == SET) 2994: { 2995: attach_deaths (SET_SRC (XVECEXP (x, 0, i)), insn, 0); 2996: 2997: attach_deaths (SET_DEST (XVECEXP (x, 0, i)), insn, 1); 2998: } 1.1.1.4 root 2999: /* Flow does not add REG_DEAD notes to registers that die in 3000: clobbers, so we can't either. */ 3001: else if (code != CLOBBER) 1.1 root 3002: attach_deaths (XVECEXP (x, 0, i), insn, 0); 3003: } 3004: } 1.1.1.7 root 3005: /* If this is a CLOBBER, only add REG_DEAD notes to registers inside a 3006: MEM being clobbered, just like flow. */ 3007: else if (code == CLOBBER && GET_CODE (XEXP (x, 0)) == MEM) 3008: attach_deaths (XEXP (XEXP (x, 0), 0), insn, 0); 3009: /* Otherwise don't add a death note to things being clobbered. */ 1.1.1.4 root 3010: else if (code != CLOBBER) 1.1 root 3011: attach_deaths (x, insn, 0); 1.1.1.7 root 3012: 3013: /* Make death notes for things used in the called function. */ 3014: if (GET_CODE (insn) == CALL_INSN) 3015: for (link = CALL_INSN_FUNCTION_USAGE (insn); link; link = XEXP (link, 1)) 3016: attach_deaths (XEXP (XEXP (link, 0), 0), insn, 3017: GET_CODE (XEXP (link, 0)) == CLOBBER); 1.1 root 3018: } 3019: 3020: /* Delete notes beginning with INSN and maybe put them in the chain 3021: of notes ended by NOTE_LIST. 3022: Returns the insn following the notes. */ 3023: 3024: static rtx 3025: unlink_notes (insn, tail) 3026: rtx insn, tail; 3027: { 3028: rtx prev = PREV_INSN (insn); 3029: 3030: while (insn != tail && GET_CODE (insn) == NOTE) 3031: { 3032: rtx next = NEXT_INSN (insn); 3033: /* Delete the note from its current position. */ 3034: if (prev) 3035: NEXT_INSN (prev) = next; 3036: if (next) 3037: PREV_INSN (next) = prev; 3038: 3039: if (write_symbols != NO_DEBUG && NOTE_LINE_NUMBER (insn) > 0) 3040: /* Record line-number notes so they can be reused. */ 3041: LINE_NOTE (insn) = insn; 1.1.1.7 root 3042: 3043: /* Don't save away NOTE_INSN_SETJMPs, because they must remain 3044: immediately after the call they follow. We use a fake 3045: (REG_DEAD (const_int -1)) note to remember them. 3046: Likewise with NOTE_INSN_LOOP_BEG and NOTE_INSN_LOOP_END. */ 3047: else if (NOTE_LINE_NUMBER (insn) != NOTE_INSN_SETJMP 3048: && NOTE_LINE_NUMBER (insn) != NOTE_INSN_LOOP_BEG 3049: && NOTE_LINE_NUMBER (insn) != NOTE_INSN_LOOP_END) 1.1 root 3050: { 3051: /* Insert the note at the end of the notes list. */ 3052: PREV_INSN (insn) = note_list; 3053: if (note_list) 3054: NEXT_INSN (note_list) = insn; 3055: note_list = insn; 3056: } 3057: 3058: insn = next; 3059: } 3060: return insn; 3061: } 3062: 3063: /* Constructor for `sometimes' data structure. */ 3064: 3065: static int 3066: new_sometimes_live (regs_sometimes_live, offset, bit, sometimes_max) 3067: struct sometimes *regs_sometimes_live; 3068: int offset, bit; 3069: int sometimes_max; 3070: { 3071: register struct sometimes *p; 3072: register int regno = offset * REGSET_ELT_BITS + bit; 3073: 3074: /* There should never be a register greater than max_regno here. If there 3075: is, it means that a define_split has created a new pseudo reg. This 3076: is not allowed, since there will not be flow info available for any 3077: new register, so catch the error here. */ 3078: if (regno >= max_regno) 3079: abort (); 3080: 3081: p = ®s_sometimes_live[sometimes_max]; 3082: p->offset = offset; 3083: p->bit = bit; 3084: p->live_length = 0; 3085: p->calls_crossed = 0; 3086: sometimes_max++; 3087: return sometimes_max; 3088: } 3089: 3090: /* Count lengths of all regs we are currently tracking, 3091: and find new registers no longer live. */ 3092: 3093: static void 3094: finish_sometimes_live (regs_sometimes_live, sometimes_max) 3095: struct sometimes *regs_sometimes_live; 3096: int sometimes_max; 3097: { 3098: int i; 3099: 3100: for (i = 0; i < sometimes_max; i++) 3101: { 3102: register struct sometimes *p = ®s_sometimes_live[i]; 3103: int regno; 3104: 3105: regno = p->offset * REGSET_ELT_BITS + p->bit; 3106: 3107: sched_reg_live_length[regno] += p->live_length; 3108: sched_reg_n_calls_crossed[regno] += p->calls_crossed; 3109: } 3110: } 3111: 1.1.1.8 ! root 3112: /* Search INSN for fake REG_DEAD notes for NOTE_INSN_SETJMP, ! 3113: NOTE_INSN_LOOP_BEG, and NOTE_INSN_LOOP_END; and convert them back ! 3114: into NOTEs. LAST is the last instruction output by the instruction ! 3115: scheduler. Return the new value of LAST. */ ! 3116: ! 3117: static rtx ! 3118: reemit_notes (insn, last) ! 3119: rtx insn; ! 3120: rtx last; ! 3121: { ! 3122: rtx note; ! 3123: ! 3124: for (note = REG_NOTES (insn); note; note = XEXP (note, 1)) ! 3125: { ! 3126: if (REG_NOTE_KIND (note) == REG_DEAD ! 3127: && GET_CODE (XEXP (note, 0)) == CONST_INT) ! 3128: { ! 3129: if (INTVAL (XEXP (note, 0)) == NOTE_INSN_SETJMP) ! 3130: emit_note_after (INTVAL (XEXP (note, 0)), insn); ! 3131: else ! 3132: last = emit_note_before (INTVAL (XEXP (note, 0)), last); ! 3133: remove_note (insn, note); ! 3134: } ! 3135: } ! 3136: return last; ! 3137: } ! 3138: 1.1 root 3139: /* Use modified list scheduling to rearrange insns in basic block 3140: B. FILE, if nonzero, is where we dump interesting output about 3141: this pass. */ 3142: 3143: static void 3144: schedule_block (b, file) 3145: int b; 3146: FILE *file; 3147: { 3148: rtx insn, last; 3149: rtx *ready, link; 3150: int i, j, n_ready = 0, new_ready, n_insns = 0; 3151: int sched_n_insns = 0; 1.1.1.4 root 3152: int clock; 1.1 root 3153: #define NEED_NOTHING 0 3154: #define NEED_HEAD 1 3155: #define NEED_TAIL 2 3156: int new_needs; 3157: 3158: /* HEAD and TAIL delimit the region being scheduled. */ 3159: rtx head = basic_block_head[b]; 3160: rtx tail = basic_block_end[b]; 3161: /* PREV_HEAD and NEXT_TAIL are the boundaries of the insns 3162: being scheduled. When the insns have been ordered, 3163: these insns delimit where the new insns are to be 3164: spliced back into the insn chain. */ 3165: rtx next_tail; 3166: rtx prev_head; 3167: 3168: /* Keep life information accurate. */ 3169: register struct sometimes *regs_sometimes_live; 3170: int sometimes_max; 3171: 3172: if (file) 3173: fprintf (file, ";;\t -- basic block number %d from %d to %d --\n", 3174: b, INSN_UID (basic_block_head[b]), INSN_UID (basic_block_end[b])); 3175: 3176: i = max_reg_num (); 3177: reg_last_uses = (rtx *) alloca (i * sizeof (rtx)); 1.1.1.7 root 3178: bzero ((char *) reg_last_uses, i * sizeof (rtx)); 1.1 root 3179: reg_last_sets = (rtx *) alloca (i * sizeof (rtx)); 1.1.1.7 root 3180: bzero ((char *) reg_last_sets, i * sizeof (rtx)); 3181: reg_pending_sets = (regset) alloca (regset_bytes); 3182: bzero ((char *) reg_pending_sets, regset_bytes); 3183: reg_pending_sets_all = 0; 1.1.1.4 root 3184: clear_units (); 1.1 root 3185: 3186: /* Remove certain insns at the beginning from scheduling, 3187: by advancing HEAD. */ 3188: 3189: /* At the start of a function, before reload has run, don't delay getting 3190: parameters from hard registers into pseudo registers. */ 3191: if (reload_completed == 0 && b == 0) 3192: { 3193: while (head != tail 3194: && GET_CODE (head) == NOTE 3195: && NOTE_LINE_NUMBER (head) != NOTE_INSN_FUNCTION_BEG) 3196: head = NEXT_INSN (head); 3197: while (head != tail 3198: && GET_CODE (head) == INSN 3199: && GET_CODE (PATTERN (head)) == SET) 3200: { 3201: rtx src = SET_SRC (PATTERN (head)); 3202: while (GET_CODE (src) == SUBREG 3203: || GET_CODE (src) == SIGN_EXTEND 3204: || GET_CODE (src) == ZERO_EXTEND 3205: || GET_CODE (src) == SIGN_EXTRACT 3206: || GET_CODE (src) == ZERO_EXTRACT) 3207: src = XEXP (src, 0); 3208: if (GET_CODE (src) != REG 3209: || REGNO (src) >= FIRST_PSEUDO_REGISTER) 3210: break; 3211: /* Keep this insn from ever being scheduled. */ 3212: INSN_REF_COUNT (head) = 1; 3213: head = NEXT_INSN (head); 3214: } 3215: } 3216: 3217: /* Don't include any notes or labels at the beginning of the 3218: basic block, or notes at the ends of basic blocks. */ 3219: while (head != tail) 3220: { 3221: if (GET_CODE (head) == NOTE) 3222: head = NEXT_INSN (head); 3223: else if (GET_CODE (tail) == NOTE) 3224: tail = PREV_INSN (tail); 3225: else if (GET_CODE (head) == CODE_LABEL) 3226: head = NEXT_INSN (head); 3227: else break; 3228: } 3229: /* If the only insn left is a NOTE or a CODE_LABEL, then there is no need 3230: to schedule this block. */ 3231: if (head == tail 3232: && (GET_CODE (head) == NOTE || GET_CODE (head) == CODE_LABEL)) 3233: return; 3234: 3235: #if 0 3236: /* This short-cut doesn't work. It does not count call insns crossed by 3237: registers in reg_sometimes_live. It does not mark these registers as 3238: dead if they die in this block. It does not mark these registers live 3239: (or create new reg_sometimes_live entries if necessary) if they are born 3240: in this block. 3241: 3242: The easy solution is to just always schedule a block. This block only 3243: has one insn, so this won't slow down this pass by much. */ 3244: 3245: if (head == tail) 3246: return; 3247: #endif 3248: 3249: /* Now HEAD through TAIL are the insns actually to be rearranged; 3250: Let PREV_HEAD and NEXT_TAIL enclose them. */ 3251: prev_head = PREV_INSN (head); 3252: next_tail = NEXT_INSN (tail); 3253: 3254: /* Initialize basic block data structures. */ 3255: dead_notes = 0; 3256: pending_read_insns = 0; 3257: pending_read_mems = 0; 3258: pending_write_insns = 0; 3259: pending_write_mems = 0; 3260: pending_lists_length = 0; 3261: last_pending_memory_flush = 0; 3262: last_function_call = 0; 3263: last_scheduled_insn = 0; 3264: 3265: LOG_LINKS (sched_before_next_call) = 0; 3266: 3267: n_insns += sched_analyze (head, tail); 3268: if (n_insns == 0) 3269: { 3270: free_pending_lists (); 3271: return; 3272: } 3273: 3274: /* Allocate vector to hold insns to be rearranged (except those 3275: insns which are controlled by an insn with SCHED_GROUP_P set). 3276: All these insns are included between ORIG_HEAD and ORIG_TAIL, 3277: as those variables ultimately are set up. */ 3278: ready = (rtx *) alloca ((n_insns+1) * sizeof (rtx)); 3279: 3280: /* TAIL is now the last of the insns to be rearranged. 3281: Put those insns into the READY vector. */ 3282: insn = tail; 3283: 1.1.1.4 root 3284: /* For all branches, calls, uses, and cc0 setters, force them to remain 3285: in order at the end of the block by adding dependencies and giving 3286: the last a high priority. There may be notes present, and prev_head 3287: may also be a note. 3288: 3289: Branches must obviously remain at the end. Calls should remain at the 3290: end since moving them results in worse register allocation. Uses remain 3291: at the end to ensure proper register allocation. cc0 setters remaim 3292: at the end because they can't be moved away from their cc0 user. */ 3293: last = 0; 3294: while (GET_CODE (insn) == CALL_INSN || GET_CODE (insn) == JUMP_INSN 3295: || (GET_CODE (insn) == INSN 3296: && (GET_CODE (PATTERN (insn)) == USE 3297: #ifdef HAVE_cc0 3298: || sets_cc0_p (PATTERN (insn)) 3299: #endif 3300: )) 3301: || GET_CODE (insn) == NOTE) 3302: { 3303: if (GET_CODE (insn) != NOTE) 3304: { 3305: priority (insn); 3306: if (last == 0) 3307: { 3308: ready[n_ready++] = insn; 3309: INSN_PRIORITY (insn) = TAIL_PRIORITY - i; 3310: INSN_REF_COUNT (insn) = 0; 3311: } 3312: else if (! find_insn_list (insn, LOG_LINKS (last))) 3313: { 3314: add_dependence (last, insn, REG_DEP_ANTI); 3315: INSN_REF_COUNT (insn)++; 3316: } 3317: last = insn; 3318: 3319: /* Skip over insns that are part of a group. */ 3320: while (SCHED_GROUP_P (insn)) 3321: { 3322: insn = prev_nonnote_insn (insn); 3323: priority (insn); 3324: } 3325: } 3326: 3327: insn = PREV_INSN (insn); 3328: /* Don't overrun the bounds of the basic block. */ 3329: if (insn == prev_head) 3330: break; 1.1 root 3331: } 3332: 3333: /* Assign priorities to instructions. Also check whether they 3334: are in priority order already. If so then I will be nonnegative. 3335: We use this shortcut only before reloading. */ 3336: #if 0 3337: i = reload_completed ? DONE_PRIORITY : MAX_PRIORITY; 3338: #endif 3339: 3340: for (; insn != prev_head; insn = PREV_INSN (insn)) 3341: { 3342: if (GET_RTX_CLASS (GET_CODE (insn)) == 'i') 3343: { 3344: priority (insn); 3345: if (INSN_REF_COUNT (insn) == 0) 1.1.1.4 root 3346: { 3347: if (last == 0) 3348: ready[n_ready++] = insn; 3349: else 3350: { 3351: /* Make this dependent on the last of the instructions 3352: that must remain in order at the end of the block. */ 3353: add_dependence (last, insn, REG_DEP_ANTI); 3354: INSN_REF_COUNT (insn) = 1; 3355: } 3356: } 1.1 root 3357: if (SCHED_GROUP_P (insn)) 3358: { 3359: while (SCHED_GROUP_P (insn)) 3360: { 3361: insn = PREV_INSN (insn); 3362: while (GET_CODE (insn) == NOTE) 3363: insn = PREV_INSN (insn); 3364: priority (insn); 3365: } 3366: continue; 3367: } 3368: #if 0 3369: if (i < 0) 3370: continue; 3371: if (INSN_PRIORITY (insn) < i) 3372: i = INSN_PRIORITY (insn); 3373: else if (INSN_PRIORITY (insn) > i) 3374: i = DONE_PRIORITY; 3375: #endif 3376: } 3377: } 3378: 3379: #if 0 3380: /* This short-cut doesn't work. It does not count call insns crossed by 3381: registers in reg_sometimes_live. It does not mark these registers as 3382: dead if they die in this block. It does not mark these registers live 3383: (or create new reg_sometimes_live entries if necessary) if they are born 3384: in this block. 3385: 3386: The easy solution is to just always schedule a block. These blocks tend 3387: to be very short, so this doesn't slow down this pass by much. */ 3388: 3389: /* If existing order is good, don't bother to reorder. */ 3390: if (i != DONE_PRIORITY) 3391: { 3392: if (file) 3393: fprintf (file, ";; already scheduled\n"); 3394: 3395: if (reload_completed == 0) 3396: { 3397: for (i = 0; i < sometimes_max; i++) 3398: regs_sometimes_live[i].live_length += n_insns; 3399: 3400: finish_sometimes_live (regs_sometimes_live, sometimes_max); 3401: } 3402: free_pending_lists (); 3403: return; 3404: } 3405: #endif 3406: 3407: /* Scan all the insns to be scheduled, removing NOTE insns 3408: and register death notes. 3409: Line number NOTE insns end up in NOTE_LIST. 3410: Register death notes end up in DEAD_NOTES. 3411: 3412: Recreate the register life information for the end of this basic 3413: block. */ 3414: 3415: if (reload_completed == 0) 3416: { 1.1.1.7 root 3417: bcopy ((char *) basic_block_live_at_start[b], (char *) bb_live_regs, 3418: regset_bytes); 3419: bzero ((char *) bb_dead_regs, regset_bytes); 1.1 root 3420: 3421: if (b == 0) 3422: { 3423: /* This is the first block in the function. There may be insns 3424: before head that we can't schedule. We still need to examine 3425: them though for accurate register lifetime analysis. */ 3426: 3427: /* We don't want to remove any REG_DEAD notes as the code below 3428: does. */ 3429: 3430: for (insn = basic_block_head[b]; insn != head; 3431: insn = NEXT_INSN (insn)) 3432: if (GET_RTX_CLASS (GET_CODE (insn)) == 'i') 3433: { 3434: /* See if the register gets born here. */ 3435: /* We must check for registers being born before we check for 3436: registers dying. It is possible for a register to be born 3437: and die in the same insn, e.g. reading from a volatile 3438: memory location into an otherwise unused register. Such 3439: a register must be marked as dead after this insn. */ 3440: if (GET_CODE (PATTERN (insn)) == SET 3441: || GET_CODE (PATTERN (insn)) == CLOBBER) 3442: sched_note_set (b, PATTERN (insn), 0); 3443: else if (GET_CODE (PATTERN (insn)) == PARALLEL) 3444: { 3445: int j; 3446: for (j = XVECLEN (PATTERN (insn), 0) - 1; j >= 0; j--) 3447: if (GET_CODE (XVECEXP (PATTERN (insn), 0, j)) == SET 3448: || GET_CODE (XVECEXP (PATTERN (insn), 0, j)) == CLOBBER) 3449: sched_note_set (b, XVECEXP (PATTERN (insn), 0, j), 0); 3450: 3451: /* ??? This code is obsolete and should be deleted. It 3452: is harmless though, so we will leave it in for now. */ 3453: for (j = XVECLEN (PATTERN (insn), 0) - 1; j >= 0; j--) 3454: if (GET_CODE (XVECEXP (PATTERN (insn), 0, j)) == USE) 3455: sched_note_set (b, XVECEXP (PATTERN (insn), 0, j), 0); 3456: } 3457: 3458: for (link = REG_NOTES (insn); link; link = XEXP (link, 1)) 3459: { 3460: if ((REG_NOTE_KIND (link) == REG_DEAD 3461: || REG_NOTE_KIND (link) == REG_UNUSED) 1.1.1.8 ! root 3462: /* Verify that the REG_NOTE has a valid value. */ 1.1 root 3463: && GET_CODE (XEXP (link, 0)) == REG) 3464: { 3465: register int regno = REGNO (XEXP (link, 0)); 3466: register int offset = regno / REGSET_ELT_BITS; 1.1.1.4 root 3467: register REGSET_ELT_TYPE bit 3468: = (REGSET_ELT_TYPE) 1 << (regno % REGSET_ELT_BITS); 1.1 root 3469: 3470: if (regno < FIRST_PSEUDO_REGISTER) 3471: { 3472: int j = HARD_REGNO_NREGS (regno, 3473: GET_MODE (XEXP (link, 0))); 3474: while (--j >= 0) 3475: { 3476: offset = (regno + j) / REGSET_ELT_BITS; 1.1.1.4 root 3477: bit = ((REGSET_ELT_TYPE) 1 3478: << ((regno + j) % REGSET_ELT_BITS)); 1.1 root 3479: 3480: bb_live_regs[offset] &= ~bit; 3481: bb_dead_regs[offset] |= bit; 3482: } 3483: } 3484: else 3485: { 3486: bb_live_regs[offset] &= ~bit; 3487: bb_dead_regs[offset] |= bit; 3488: } 3489: } 3490: } 3491: } 3492: } 3493: } 3494: 3495: /* If debugging information is being produced, keep track of the line 3496: number notes for each insn. */ 3497: if (write_symbols != NO_DEBUG) 3498: { 3499: /* We must use the true line number for the first insn in the block 3500: that was computed and saved at the start of this pass. We can't 3501: use the current line number, because scheduling of the previous 3502: block may have changed the current line number. */ 3503: rtx line = line_note_head[b]; 3504: 3505: for (insn = basic_block_head[b]; 3506: insn != next_tail; 3507: insn = NEXT_INSN (insn)) 3508: if (GET_CODE (insn) == NOTE && NOTE_LINE_NUMBER (insn) > 0) 3509: line = insn; 3510: else 3511: LINE_NOTE (insn) = line; 3512: } 3513: 3514: for (insn = head; insn != next_tail; insn = NEXT_INSN (insn)) 3515: { 3516: rtx prev, next, link; 3517: 3518: /* Farm out notes. This is needed to keep the debugger from 3519: getting completely deranged. */ 3520: if (GET_CODE (insn) == NOTE) 3521: { 3522: prev = insn; 3523: insn = unlink_notes (insn, next_tail); 3524: if (prev == tail) 3525: abort (); 3526: if (prev == head) 3527: abort (); 3528: if (insn == next_tail) 3529: abort (); 3530: } 3531: 3532: if (reload_completed == 0 3533: && GET_RTX_CLASS (GET_CODE (insn)) == 'i') 3534: { 3535: /* See if the register gets born here. */ 3536: /* We must check for registers being born before we check for 3537: registers dying. It is possible for a register to be born and 3538: die in the same insn, e.g. reading from a volatile memory 3539: location into an otherwise unused register. Such a register 3540: must be marked as dead after this insn. */ 3541: if (GET_CODE (PATTERN (insn)) == SET 3542: || GET_CODE (PATTERN (insn)) == CLOBBER) 3543: sched_note_set (b, PATTERN (insn), 0); 3544: else if (GET_CODE (PATTERN (insn)) == PARALLEL) 3545: { 3546: int j; 3547: for (j = XVECLEN (PATTERN (insn), 0) - 1; j >= 0; j--) 3548: if (GET_CODE (XVECEXP (PATTERN (insn), 0, j)) == SET 3549: || GET_CODE (XVECEXP (PATTERN (insn), 0, j)) == CLOBBER) 3550: sched_note_set (b, XVECEXP (PATTERN (insn), 0, j), 0); 3551: 3552: /* ??? This code is obsolete and should be deleted. It 3553: is harmless though, so we will leave it in for now. */ 3554: for (j = XVECLEN (PATTERN (insn), 0) - 1; j >= 0; j--) 3555: if (GET_CODE (XVECEXP (PATTERN (insn), 0, j)) == USE) 3556: sched_note_set (b, XVECEXP (PATTERN (insn), 0, j), 0); 3557: } 3558: 3559: /* Need to know what registers this insn kills. */ 3560: for (prev = 0, link = REG_NOTES (insn); link; link = next) 3561: { 3562: next = XEXP (link, 1); 3563: if ((REG_NOTE_KIND (link) == REG_DEAD 3564: || REG_NOTE_KIND (link) == REG_UNUSED) 1.1.1.8 ! root 3565: /* Verify that the REG_NOTE has a valid value. */ 1.1 root 3566: && GET_CODE (XEXP (link, 0)) == REG) 3567: { 3568: register int regno = REGNO (XEXP (link, 0)); 3569: register int offset = regno / REGSET_ELT_BITS; 1.1.1.4 root 3570: register REGSET_ELT_TYPE bit 3571: = (REGSET_ELT_TYPE) 1 << (regno % REGSET_ELT_BITS); 1.1 root 3572: 3573: /* Only unlink REG_DEAD notes; leave REG_UNUSED notes 3574: alone. */ 3575: if (REG_NOTE_KIND (link) == REG_DEAD) 3576: { 3577: if (prev) 3578: XEXP (prev, 1) = next; 3579: else 3580: REG_NOTES (insn) = next; 3581: XEXP (link, 1) = dead_notes; 3582: dead_notes = link; 3583: } 3584: else 3585: prev = link; 3586: 3587: if (regno < FIRST_PSEUDO_REGISTER) 3588: { 3589: int j = HARD_REGNO_NREGS (regno, 3590: GET_MODE (XEXP (link, 0))); 3591: while (--j >= 0) 3592: { 3593: offset = (regno + j) / REGSET_ELT_BITS; 1.1.1.4 root 3594: bit = ((REGSET_ELT_TYPE) 1 3595: << ((regno + j) % REGSET_ELT_BITS)); 1.1 root 3596: 3597: bb_live_regs[offset] &= ~bit; 3598: bb_dead_regs[offset] |= bit; 3599: } 3600: } 3601: else 3602: { 3603: bb_live_regs[offset] &= ~bit; 3604: bb_dead_regs[offset] |= bit; 3605: } 3606: } 3607: else 3608: prev = link; 3609: } 3610: } 3611: } 3612: 3613: if (reload_completed == 0) 3614: { 3615: /* Keep track of register lives. */ 3616: old_live_regs = (regset) alloca (regset_bytes); 3617: regs_sometimes_live 3618: = (struct sometimes *) alloca (max_regno * sizeof (struct sometimes)); 3619: sometimes_max = 0; 3620: 3621: /* Start with registers live at end. */ 3622: for (j = 0; j < regset_size; j++) 3623: { 1.1.1.4 root 3624: REGSET_ELT_TYPE live = bb_live_regs[j]; 1.1 root 3625: old_live_regs[j] = live; 3626: if (live) 3627: { 1.1.1.6 root 3628: register int bit; 1.1 root 3629: for (bit = 0; bit < REGSET_ELT_BITS; bit++) 1.1.1.4 root 3630: if (live & ((REGSET_ELT_TYPE) 1 << bit)) 1.1 root 3631: sometimes_max = new_sometimes_live (regs_sometimes_live, j, 3632: bit, sometimes_max); 3633: } 3634: } 3635: } 3636: 3637: SCHED_SORT (ready, n_ready, 1); 3638: 3639: if (file) 3640: { 3641: fprintf (file, ";; ready list initially:\n;; "); 3642: for (i = 0; i < n_ready; i++) 3643: fprintf (file, "%d ", INSN_UID (ready[i])); 3644: fprintf (file, "\n\n"); 3645: 3646: for (insn = head; insn != next_tail; insn = NEXT_INSN (insn)) 3647: if (INSN_PRIORITY (insn) > 0) 3648: fprintf (file, ";; insn[%4d]: priority = %4d, ref_count = %4d\n", 3649: INSN_UID (insn), INSN_PRIORITY (insn), 3650: INSN_REF_COUNT (insn)); 3651: } 3652: 3653: /* Now HEAD and TAIL are going to become disconnected 3654: entirely from the insn chain. */ 1.1.1.4 root 3655: tail = 0; 1.1 root 3656: 3657: /* Q_SIZE will always be zero here. */ 1.1.1.4 root 3658: q_ptr = 0; clock = 0; 1.1.1.7 root 3659: bzero ((char *) insn_queue, sizeof (insn_queue)); 1.1 root 3660: 3661: /* Now, perform list scheduling. */ 3662: 3663: /* Where we start inserting insns is after TAIL. */ 3664: last = next_tail; 3665: 3666: new_needs = (NEXT_INSN (prev_head) == basic_block_head[b] 3667: ? NEED_HEAD : NEED_NOTHING); 3668: if (PREV_INSN (next_tail) == basic_block_end[b]) 3669: new_needs |= NEED_TAIL; 3670: 3671: new_ready = n_ready; 3672: while (sched_n_insns < n_insns) 3673: { 1.1.1.4 root 3674: q_ptr = NEXT_Q (q_ptr); clock++; 1.1 root 3675: 3676: /* Add all pending insns that can be scheduled without stalls to the 3677: ready list. */ 3678: for (insn = insn_queue[q_ptr]; insn; insn = NEXT_INSN (insn)) 3679: { 3680: if (file) 1.1.1.4 root 3681: fprintf (file, ";; launching %d before %d with no stalls at T-%d\n", 3682: INSN_UID (insn), INSN_UID (last), clock); 1.1 root 3683: ready[new_ready++] = insn; 3684: q_size -= 1; 3685: } 3686: insn_queue[q_ptr] = 0; 3687: 3688: /* If there are no ready insns, stall until one is ready and add all 3689: of the pending insns at that point to the ready list. */ 3690: if (new_ready == 0) 3691: { 3692: register int stalls; 3693: 1.1.1.4 root 3694: for (stalls = 1; stalls < INSN_QUEUE_SIZE; stalls++) 1.1 root 3695: if (insn = insn_queue[NEXT_Q_AFTER (q_ptr, stalls)]) 3696: { 3697: for (; insn; insn = NEXT_INSN (insn)) 3698: { 3699: if (file) 1.1.1.4 root 3700: fprintf (file, ";; launching %d before %d with %d stalls at T-%d\n", 3701: INSN_UID (insn), INSN_UID (last), stalls, clock); 1.1 root 3702: ready[new_ready++] = insn; 3703: q_size -= 1; 3704: } 3705: insn_queue[NEXT_Q_AFTER (q_ptr, stalls)] = 0; 3706: break; 3707: } 3708: 1.1.1.4 root 3709: q_ptr = NEXT_Q_AFTER (q_ptr, stalls); clock += stalls; 1.1 root 3710: } 3711: 3712: /* There should be some instructions waiting to fire. */ 3713: if (new_ready == 0) 3714: abort (); 3715: 1.1.1.4 root 3716: if (file) 3717: { 3718: fprintf (file, ";; ready list at T-%d:", clock); 3719: for (i = 0; i < new_ready; i++) 3720: fprintf (file, " %d (%x)", 3721: INSN_UID (ready[i]), INSN_PRIORITY (ready[i])); 3722: } 3723: 3724: /* Sort the ready list and choose the best insn to schedule. Select 3725: which insn should issue in this cycle and queue those that are 3726: blocked by function unit hazards. 3727: 1.1 root 3728: N_READY holds the number of items that were scheduled the last time, 3729: minus the one instruction scheduled on the last loop iteration; it 3730: is not modified for any other reason in this loop. */ 1.1.1.4 root 3731: 1.1 root 3732: SCHED_SORT (ready, new_ready, n_ready); 1.1.1.4 root 3733: if (MAX_BLOCKAGE > 1) 3734: { 3735: new_ready = schedule_select (ready, new_ready, clock, file); 3736: if (new_ready == 0) 3737: { 3738: if (file) 3739: fprintf (file, "\n"); 1.1.1.5 root 3740: /* We must set n_ready here, to ensure that sorting always 3741: occurs when we come back to the SCHED_SORT line above. */ 3742: n_ready = 0; 1.1.1.4 root 3743: continue; 3744: } 3745: } 1.1 root 3746: n_ready = new_ready; 3747: last_scheduled_insn = insn = ready[0]; 3748: 1.1.1.4 root 3749: /* The first insn scheduled becomes the new tail. */ 3750: if (tail == 0) 3751: tail = insn; 3752: 3753: if (file) 3754: { 3755: fprintf (file, ", now"); 3756: for (i = 0; i < n_ready; i++) 3757: fprintf (file, " %d", INSN_UID (ready[i])); 3758: fprintf (file, "\n"); 3759: } 3760: 1.1 root 3761: if (DONE_PRIORITY_P (insn)) 3762: abort (); 3763: 3764: if (reload_completed == 0) 3765: { 3766: /* Process this insn, and each insn linked to this one which must 3767: be immediately output after this insn. */ 3768: do 3769: { 3770: /* First we kill registers set by this insn, and then we 3771: make registers used by this insn live. This is the opposite 3772: order used above because we are traversing the instructions 3773: backwards. */ 3774: 3775: /* Strictly speaking, we should scan REG_UNUSED notes and make 3776: every register mentioned there live, however, we will just 3777: kill them again immediately below, so there doesn't seem to 3778: be any reason why we bother to do this. */ 3779: 3780: /* See if this is the last notice we must take of a register. */ 3781: if (GET_CODE (PATTERN (insn)) == SET 3782: || GET_CODE (PATTERN (insn)) == CLOBBER) 3783: sched_note_set (b, PATTERN (insn), 1); 3784: else if (GET_CODE (PATTERN (insn)) == PARALLEL) 3785: { 3786: int j; 3787: for (j = XVECLEN (PATTERN (insn), 0) - 1; j >= 0; j--) 3788: if (GET_CODE (XVECEXP (PATTERN (insn), 0, j)) == SET 3789: || GET_CODE (XVECEXP (PATTERN (insn), 0, j)) == CLOBBER) 3790: sched_note_set (b, XVECEXP (PATTERN (insn), 0, j), 1); 3791: } 3792: 3793: /* This code keeps life analysis information up to date. */ 3794: if (GET_CODE (insn) == CALL_INSN) 3795: { 3796: register struct sometimes *p; 3797: 3798: /* A call kills all call used and global registers, except 3799: for those mentioned in the call pattern which will be 3800: made live again later. */ 3801: for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) 3802: if (call_used_regs[i] || global_regs[i]) 3803: { 3804: register int offset = i / REGSET_ELT_BITS; 1.1.1.4 root 3805: register REGSET_ELT_TYPE bit 3806: = (REGSET_ELT_TYPE) 1 << (i % REGSET_ELT_BITS); 1.1 root 3807: 3808: bb_live_regs[offset] &= ~bit; 3809: bb_dead_regs[offset] |= bit; 3810: } 3811: 3812: /* Regs live at the time of a call instruction must not 3813: go in a register clobbered by calls. Record this for 3814: all regs now live. Note that insns which are born or 3815: die in a call do not cross a call, so this must be done 3816: after the killings (above) and before the births 3817: (below). */ 3818: p = regs_sometimes_live; 3819: for (i = 0; i < sometimes_max; i++, p++) 1.1.1.4 root 3820: if (bb_live_regs[p->offset] 3821: & ((REGSET_ELT_TYPE) 1 << p->bit)) 1.1 root 3822: p->calls_crossed += 1; 3823: } 3824: 3825: /* Make every register used live, and add REG_DEAD notes for 3826: registers which were not live before we started. */ 3827: attach_deaths_insn (insn); 3828: 3829: /* Find registers now made live by that instruction. */ 3830: for (i = 0; i < regset_size; i++) 3831: { 1.1.1.4 root 3832: REGSET_ELT_TYPE diff = bb_live_regs[i] & ~old_live_regs[i]; 1.1 root 3833: if (diff) 3834: { 3835: register int bit; 3836: old_live_regs[i] |= diff; 3837: for (bit = 0; bit < REGSET_ELT_BITS; bit++) 1.1.1.4 root 3838: if (diff & ((REGSET_ELT_TYPE) 1 << bit)) 1.1 root 3839: sometimes_max 3840: = new_sometimes_live (regs_sometimes_live, i, bit, 3841: sometimes_max); 3842: } 3843: } 3844: 3845: /* Count lengths of all regs we are worrying about now, 3846: and handle registers no longer live. */ 3847: 3848: for (i = 0; i < sometimes_max; i++) 3849: { 3850: register struct sometimes *p = ®s_sometimes_live[i]; 3851: int regno = p->offset*REGSET_ELT_BITS + p->bit; 3852: 3853: p->live_length += 1; 3854: 1.1.1.4 root 3855: if ((bb_live_regs[p->offset] 3856: & ((REGSET_ELT_TYPE) 1 << p->bit)) == 0) 1.1 root 3857: { 3858: /* This is the end of one of this register's lifetime 3859: segments. Save the lifetime info collected so far, 3860: and clear its bit in the old_live_regs entry. */ 3861: sched_reg_live_length[regno] += p->live_length; 3862: sched_reg_n_calls_crossed[regno] += p->calls_crossed; 1.1.1.4 root 3863: old_live_regs[p->offset] 3864: &= ~((REGSET_ELT_TYPE) 1 << p->bit); 1.1 root 3865: 3866: /* Delete the reg_sometimes_live entry for this reg by 3867: copying the last entry over top of it. */ 3868: *p = regs_sometimes_live[--sometimes_max]; 3869: /* ...and decrement i so that this newly copied entry 3870: will be processed. */ 3871: i--; 3872: } 3873: } 3874: 3875: link = insn; 3876: insn = PREV_INSN (insn); 3877: } 3878: while (SCHED_GROUP_P (link)); 3879: 3880: /* Set INSN back to the insn we are scheduling now. */ 3881: insn = ready[0]; 3882: } 3883: 3884: /* Schedule INSN. Remove it from the ready list. */ 3885: ready += 1; 3886: n_ready -= 1; 3887: 3888: sched_n_insns += 1; 3889: NEXT_INSN (insn) = last; 3890: PREV_INSN (last) = insn; 3891: last = insn; 3892: 1.1.1.7 root 3893: /* Check to see if we need to re-emit any notes here. */ 1.1.1.8 ! root 3894: last = reemit_notes (insn, last); 1.1.1.7 root 3895: 1.1 root 3896: /* Everything that precedes INSN now either becomes "ready", if 3897: it can execute immediately before INSN, or "pending", if 3898: there must be a delay. Give INSN high enough priority that 3899: at least one (maybe more) reg-killing insns can be launched 3900: ahead of all others. Mark INSN as scheduled by changing its 3901: priority to -1. */ 3902: INSN_PRIORITY (insn) = LAUNCH_PRIORITY; 1.1.1.4 root 3903: new_ready = schedule_insn (insn, ready, n_ready, clock); 1.1 root 3904: INSN_PRIORITY (insn) = DONE_PRIORITY; 3905: 3906: /* Schedule all prior insns that must not be moved. */ 3907: if (SCHED_GROUP_P (insn)) 3908: { 1.1.1.8 ! root 3909: /* Disable these insns from being launched, in case one of the ! 3910: insns in the group has a dependency on an earlier one. */ 1.1 root 3911: link = insn; 3912: while (SCHED_GROUP_P (link)) 3913: { 3914: /* Disable these insns from being launched by anybody. */ 3915: link = PREV_INSN (link); 3916: INSN_REF_COUNT (link) = 0; 3917: } 3918: 1.1.1.8 ! root 3919: /* Now handle each group insn like the main insn was handled ! 3920: above. */ 1.1 root 3921: while (SCHED_GROUP_P (insn)) 3922: { 3923: insn = PREV_INSN (insn); 3924: 3925: sched_n_insns += 1; 3926: NEXT_INSN (insn) = last; 3927: PREV_INSN (last) = insn; 3928: last = insn; 1.1.1.8 ! root 3929: ! 3930: last = reemit_notes (insn, last); ! 3931: ! 3932: /* ??? Why don't we set LAUNCH_PRIORITY here? */ ! 3933: new_ready = schedule_insn (insn, ready, new_ready, clock); ! 3934: INSN_PRIORITY (insn) = DONE_PRIORITY; 1.1 root 3935: } 3936: } 3937: } 3938: if (q_size != 0) 3939: abort (); 3940: 3941: if (reload_completed == 0) 3942: finish_sometimes_live (regs_sometimes_live, sometimes_max); 3943: 3944: /* HEAD is now the first insn in the chain of insns that 3945: been scheduled by the loop above. 3946: TAIL is the last of those insns. */ 3947: head = insn; 3948: 3949: /* NOTE_LIST is the end of a chain of notes previously found 3950: among the insns. Insert them at the beginning of the insns. */ 3951: if (note_list != 0) 3952: { 3953: rtx note_head = note_list; 3954: while (PREV_INSN (note_head)) 3955: note_head = PREV_INSN (note_head); 3956: 3957: PREV_INSN (head) = note_list; 3958: NEXT_INSN (note_list) = head; 3959: head = note_head; 3960: } 3961: 1.1.1.5 root 3962: /* There should be no REG_DEAD notes leftover at the end. 1.1 root 3963: In practice, this can occur as the result of bugs in flow, combine.c, 3964: and/or sched.c. The values of the REG_DEAD notes remaining are 3965: meaningless, because dead_notes is just used as a free list. */ 3966: #if 1 3967: if (dead_notes != 0) 3968: abort (); 3969: #endif 3970: 3971: if (new_needs & NEED_HEAD) 3972: basic_block_head[b] = head; 3973: PREV_INSN (head) = prev_head; 3974: NEXT_INSN (prev_head) = head; 3975: 3976: if (new_needs & NEED_TAIL) 3977: basic_block_end[b] = tail; 3978: NEXT_INSN (tail) = next_tail; 3979: PREV_INSN (next_tail) = tail; 3980: 3981: /* Restore the line-number notes of each insn. */ 3982: if (write_symbols != NO_DEBUG) 3983: { 3984: rtx line, note, prev, new; 3985: int notes = 0; 3986: 3987: head = basic_block_head[b]; 3988: next_tail = NEXT_INSN (basic_block_end[b]); 3989: 3990: /* Determine the current line-number. We want to know the current 3991: line number of the first insn of the block here, in case it is 3992: different from the true line number that was saved earlier. If 3993: different, then we need a line number note before the first insn 3994: of this block. If it happens to be the same, then we don't want to 3995: emit another line number note here. */ 3996: for (line = head; line; line = PREV_INSN (line)) 3997: if (GET_CODE (line) == NOTE && NOTE_LINE_NUMBER (line) > 0) 3998: break; 3999: 4000: /* Walk the insns keeping track of the current line-number and inserting 4001: the line-number notes as needed. */ 4002: for (insn = head; insn != next_tail; insn = NEXT_INSN (insn)) 4003: if (GET_CODE (insn) == NOTE && NOTE_LINE_NUMBER (insn) > 0) 4004: line = insn; 1.1.1.6 root 4005: /* This used to emit line number notes before every non-deleted note. 4006: However, this confuses a debugger, because line notes not separated 4007: by real instructions all end up at the same address. I can find no 4008: use for line number notes before other notes, so none are emitted. */ 4009: else if (GET_CODE (insn) != NOTE 1.1 root 4010: && (note = LINE_NOTE (insn)) != 0 4011: && note != line 4012: && (line == 0 4013: || NOTE_LINE_NUMBER (note) != NOTE_LINE_NUMBER (line) 4014: || NOTE_SOURCE_FILE (note) != NOTE_SOURCE_FILE (line))) 4015: { 4016: line = note; 4017: prev = PREV_INSN (insn); 4018: if (LINE_NOTE (note)) 4019: { 1.1.1.3 root 4020: /* Re-use the original line-number note. */ 1.1 root 4021: LINE_NOTE (note) = 0; 4022: PREV_INSN (note) = prev; 4023: NEXT_INSN (prev) = note; 4024: PREV_INSN (insn) = note; 4025: NEXT_INSN (note) = insn; 4026: } 4027: else 4028: { 4029: notes++; 4030: new = emit_note_after (NOTE_LINE_NUMBER (note), prev); 4031: NOTE_SOURCE_FILE (new) = NOTE_SOURCE_FILE (note); 4032: } 4033: } 4034: if (file && notes) 4035: fprintf (file, ";; added %d line-number notes\n", notes); 4036: } 4037: 4038: if (file) 4039: { 1.1.1.4 root 4040: fprintf (file, ";; total time = %d\n;; new basic block head = %d\n;; new basic block end = %d\n\n", 4041: clock, INSN_UID (basic_block_head[b]), INSN_UID (basic_block_end[b])); 1.1 root 4042: } 4043: 4044: /* Yow! We're done! */ 4045: free_pending_lists (); 4046: 4047: return; 4048: } 4049: 4050: /* Subroutine of split_hard_reg_notes. Searches X for any reference to 4051: REGNO, returning the rtx of the reference found if any. Otherwise, 4052: returns 0. */ 4053: 1.1.1.6 root 4054: static rtx 1.1 root 4055: regno_use_in (regno, x) 4056: int regno; 4057: rtx x; 4058: { 4059: register char *fmt; 4060: int i, j; 4061: rtx tem; 4062: 4063: if (GET_CODE (x) == REG && REGNO (x) == regno) 4064: return x; 4065: 4066: fmt = GET_RTX_FORMAT (GET_CODE (x)); 4067: for (i = GET_RTX_LENGTH (GET_CODE (x)) - 1; i >= 0; i--) 4068: { 4069: if (fmt[i] == 'e') 4070: { 4071: if (tem = regno_use_in (regno, XEXP (x, i))) 4072: return tem; 4073: } 4074: else if (fmt[i] == 'E') 4075: for (j = XVECLEN (x, i) - 1; j >= 0; j--) 4076: if (tem = regno_use_in (regno , XVECEXP (x, i, j))) 4077: return tem; 4078: } 4079: 4080: return 0; 4081: } 4082: 4083: /* Subroutine of update_flow_info. Determines whether any new REG_NOTEs are 4084: needed for the hard register mentioned in the note. This can happen 4085: if the reference to the hard register in the original insn was split into 4086: several smaller hard register references in the split insns. */ 4087: 4088: static void 4089: split_hard_reg_notes (note, first, last, orig_insn) 4090: rtx note, first, last, orig_insn; 4091: { 4092: rtx reg, temp, link; 4093: int n_regs, i, new_reg; 4094: rtx insn; 4095: 4096: /* Assume that this is a REG_DEAD note. */ 4097: if (REG_NOTE_KIND (note) != REG_DEAD) 4098: abort (); 4099: 4100: reg = XEXP (note, 0); 4101: 4102: n_regs = HARD_REGNO_NREGS (REGNO (reg), GET_MODE (reg)); 4103: 1.1.1.5 root 4104: for (i = 0; i < n_regs; i++) 1.1 root 4105: { 4106: new_reg = REGNO (reg) + i; 4107: 4108: /* Check for references to new_reg in the split insns. */ 4109: for (insn = last; ; insn = PREV_INSN (insn)) 4110: { 4111: if (GET_RTX_CLASS (GET_CODE (insn)) == 'i' 4112: && (temp = regno_use_in (new_reg, PATTERN (insn)))) 4113: { 4114: /* Create a new reg dead note here. */ 4115: link = rtx_alloc (EXPR_LIST); 4116: PUT_REG_NOTE_KIND (link, REG_DEAD); 4117: XEXP (link, 0) = temp; 4118: XEXP (link, 1) = REG_NOTES (insn); 4119: REG_NOTES (insn) = link; 1.1.1.5 root 4120: 4121: /* If killed multiple registers here, then add in the excess. */ 4122: i += HARD_REGNO_NREGS (REGNO (temp), GET_MODE (temp)) - 1; 4123: 1.1 root 4124: break; 4125: } 4126: /* It isn't mentioned anywhere, so no new reg note is needed for 4127: this register. */ 4128: if (insn == first) 4129: break; 4130: } 4131: } 4132: } 4133: 4134: /* Subroutine of update_flow_info. Determines whether a SET or CLOBBER in an 4135: insn created by splitting needs a REG_DEAD or REG_UNUSED note added. */ 4136: 4137: static void 4138: new_insn_dead_notes (pat, insn, last, orig_insn) 4139: rtx pat, insn, last, orig_insn; 4140: { 4141: rtx dest, tem, set; 4142: 4143: /* PAT is either a CLOBBER or a SET here. */ 4144: dest = XEXP (pat, 0); 4145: 4146: while (GET_CODE (dest) == ZERO_EXTRACT || GET_CODE (dest) == SUBREG 4147: || GET_CODE (dest) == STRICT_LOW_PART 4148: || GET_CODE (dest) == SIGN_EXTRACT) 4149: dest = XEXP (dest, 0); 4150: 4151: if (GET_CODE (dest) == REG) 4152: { 4153: for (tem = last; tem != insn; tem = PREV_INSN (tem)) 4154: { 4155: if (GET_RTX_CLASS (GET_CODE (tem)) == 'i' 4156: && reg_overlap_mentioned_p (dest, PATTERN (tem)) 4157: && (set = single_set (tem))) 4158: { 4159: rtx tem_dest = SET_DEST (set); 4160: 4161: while (GET_CODE (tem_dest) == ZERO_EXTRACT 4162: || GET_CODE (tem_dest) == SUBREG 4163: || GET_CODE (tem_dest) == STRICT_LOW_PART 4164: || GET_CODE (tem_dest) == SIGN_EXTRACT) 4165: tem_dest = XEXP (tem_dest, 0); 4166: 1.1.1.7 root 4167: if (! rtx_equal_p (tem_dest, dest)) 1.1 root 4168: { 4169: /* Use the same scheme as combine.c, don't put both REG_DEAD 4170: and REG_UNUSED notes on the same insn. */ 4171: if (! find_regno_note (tem, REG_UNUSED, REGNO (dest)) 4172: && ! find_regno_note (tem, REG_DEAD, REGNO (dest))) 4173: { 4174: rtx note = rtx_alloc (EXPR_LIST); 4175: PUT_REG_NOTE_KIND (note, REG_DEAD); 4176: XEXP (note, 0) = dest; 4177: XEXP (note, 1) = REG_NOTES (tem); 4178: REG_NOTES (tem) = note; 4179: } 4180: /* The reg only dies in one insn, the last one that uses 4181: it. */ 4182: break; 4183: } 4184: else if (reg_overlap_mentioned_p (dest, SET_SRC (set))) 4185: /* We found an instruction that both uses the register, 4186: and sets it, so no new REG_NOTE is needed for this set. */ 4187: break; 4188: } 4189: } 4190: /* If this is a set, it must die somewhere, unless it is the dest of 4191: the original insn, and hence is live after the original insn. Abort 4192: if it isn't supposed to be live after the original insn. 4193: 4194: If this is a clobber, then just add a REG_UNUSED note. */ 4195: if (tem == insn) 4196: { 4197: int live_after_orig_insn = 0; 4198: rtx pattern = PATTERN (orig_insn); 4199: int i; 4200: 4201: if (GET_CODE (pat) == CLOBBER) 4202: { 4203: rtx note = rtx_alloc (EXPR_LIST); 4204: PUT_REG_NOTE_KIND (note, REG_UNUSED); 4205: XEXP (note, 0) = dest; 4206: XEXP (note, 1) = REG_NOTES (insn); 4207: REG_NOTES (insn) = note; 4208: return; 4209: } 4210: 4211: /* The original insn could have multiple sets, so search the 4212: insn for all sets. */ 4213: if (GET_CODE (pattern) == SET) 4214: { 4215: if (reg_overlap_mentioned_p (dest, SET_DEST (pattern))) 4216: live_after_orig_insn = 1; 4217: } 4218: else if (GET_CODE (pattern) == PARALLEL) 4219: { 4220: for (i = 0; i < XVECLEN (pattern, 0); i++) 4221: if (GET_CODE (XVECEXP (pattern, 0, i)) == SET 4222: && reg_overlap_mentioned_p (dest, 4223: SET_DEST (XVECEXP (pattern, 4224: 0, i)))) 4225: live_after_orig_insn = 1; 4226: } 4227: 4228: if (! live_after_orig_insn) 4229: abort (); 4230: } 4231: } 4232: } 4233: 4234: /* Subroutine of update_flow_info. Update the value of reg_n_sets for all 4235: registers modified by X. INC is -1 if the containing insn is being deleted, 4236: and is 1 if the containing insn is a newly generated insn. */ 4237: 4238: static void 4239: update_n_sets (x, inc) 4240: rtx x; 4241: int inc; 4242: { 4243: rtx dest = SET_DEST (x); 4244: 4245: while (GET_CODE (dest) == STRICT_LOW_PART || GET_CODE (dest) == SUBREG 4246: || GET_CODE (dest) == ZERO_EXTRACT || GET_CODE (dest) == SIGN_EXTRACT) 4247: dest = SUBREG_REG (dest); 4248: 4249: if (GET_CODE (dest) == REG) 4250: { 4251: int regno = REGNO (dest); 4252: 4253: if (regno < FIRST_PSEUDO_REGISTER) 4254: { 4255: register int i; 4256: int endregno = regno + HARD_REGNO_NREGS (regno, GET_MODE (dest)); 4257: 4258: for (i = regno; i < endregno; i++) 4259: reg_n_sets[i] += inc; 4260: } 4261: else 4262: reg_n_sets[regno] += inc; 4263: } 4264: } 4265: 4266: /* Updates all flow-analysis related quantities (including REG_NOTES) for 4267: the insns from FIRST to LAST inclusive that were created by splitting 4268: ORIG_INSN. NOTES are the original REG_NOTES. */ 4269: 4270: static void 4271: update_flow_info (notes, first, last, orig_insn) 4272: rtx notes; 4273: rtx first, last; 4274: rtx orig_insn; 4275: { 4276: rtx insn, note; 4277: rtx next; 4278: rtx orig_dest, temp; 4279: rtx set; 4280: 4281: /* Get and save the destination set by the original insn. */ 4282: 4283: orig_dest = single_set (orig_insn); 4284: if (orig_dest) 4285: orig_dest = SET_DEST (orig_dest); 4286: 4287: /* Move REG_NOTES from the original insn to where they now belong. */ 4288: 4289: for (note = notes; note; note = next) 4290: { 4291: next = XEXP (note, 1); 4292: switch (REG_NOTE_KIND (note)) 4293: { 4294: case REG_DEAD: 4295: case REG_UNUSED: 4296: /* Move these notes from the original insn to the last new insn where 4297: the register is now set. */ 4298: 4299: for (insn = last; ; insn = PREV_INSN (insn)) 4300: { 4301: if (GET_RTX_CLASS (GET_CODE (insn)) == 'i' 4302: && reg_mentioned_p (XEXP (note, 0), PATTERN (insn))) 4303: { 1.1.1.5 root 4304: /* If this note refers to a multiple word hard register, it 4305: may have been split into several smaller hard register 4306: references, so handle it specially. */ 4307: temp = XEXP (note, 0); 4308: if (REG_NOTE_KIND (note) == REG_DEAD 4309: && GET_CODE (temp) == REG 4310: && REGNO (temp) < FIRST_PSEUDO_REGISTER 4311: && HARD_REGNO_NREGS (REGNO (temp), GET_MODE (temp)) > 1) 4312: split_hard_reg_notes (note, first, last, orig_insn); 4313: else 4314: { 4315: XEXP (note, 1) = REG_NOTES (insn); 4316: REG_NOTES (insn) = note; 4317: } 1.1 root 4318: 4319: /* Sometimes need to convert REG_UNUSED notes to REG_DEAD 4320: notes. */ 1.1.1.3 root 4321: /* ??? This won't handle multiple word registers correctly, 1.1 root 4322: but should be good enough for now. */ 4323: if (REG_NOTE_KIND (note) == REG_UNUSED 4324: && ! dead_or_set_p (insn, XEXP (note, 0))) 4325: PUT_REG_NOTE_KIND (note, REG_DEAD); 4326: 4327: /* The reg only dies in one insn, the last one that uses 4328: it. */ 4329: break; 4330: } 4331: /* It must die somewhere, fail it we couldn't find where it died. 4332: 4333: If this is a REG_UNUSED note, then it must be a temporary 4334: register that was not needed by this instantiation of the 4335: pattern, so we can safely ignore it. */ 4336: if (insn == first) 4337: { 4338: if (REG_NOTE_KIND (note) != REG_UNUSED) 4339: abort (); 4340: 4341: break; 4342: } 4343: } 4344: break; 4345: 4346: case REG_WAS_0: 4347: /* This note applies to the dest of the original insn. Find the 4348: first new insn that now has the same dest, and move the note 4349: there. */ 4350: 4351: if (! orig_dest) 4352: abort (); 4353: 4354: for (insn = first; ; insn = NEXT_INSN (insn)) 4355: { 4356: if (GET_RTX_CLASS (GET_CODE (insn)) == 'i' 4357: && (temp = single_set (insn)) 4358: && rtx_equal_p (SET_DEST (temp), orig_dest)) 4359: { 4360: XEXP (note, 1) = REG_NOTES (insn); 4361: REG_NOTES (insn) = note; 4362: /* The reg is only zero before one insn, the first that 4363: uses it. */ 4364: break; 4365: } 4366: /* It must be set somewhere, fail if we couldn't find where it 4367: was set. */ 4368: if (insn == last) 4369: abort (); 4370: } 4371: break; 4372: 4373: case REG_EQUAL: 4374: case REG_EQUIV: 4375: /* A REG_EQUIV or REG_EQUAL note on an insn with more than one 4376: set is meaningless. Just drop the note. */ 4377: if (! orig_dest) 4378: break; 4379: 4380: case REG_NO_CONFLICT: 4381: /* These notes apply to the dest of the original insn. Find the last 4382: new insn that now has the same dest, and move the note there. */ 4383: 4384: if (! orig_dest) 4385: abort (); 4386: 4387: for (insn = last; ; insn = PREV_INSN (insn)) 4388: { 4389: if (GET_RTX_CLASS (GET_CODE (insn)) == 'i' 4390: && (temp = single_set (insn)) 4391: && rtx_equal_p (SET_DEST (temp), orig_dest)) 4392: { 4393: XEXP (note, 1) = REG_NOTES (insn); 4394: REG_NOTES (insn) = note; 4395: /* Only put this note on one of the new insns. */ 4396: break; 4397: } 4398: 4399: /* The original dest must still be set someplace. Abort if we 4400: couldn't find it. */ 4401: if (insn == first) 4402: abort (); 4403: } 4404: break; 4405: 4406: case REG_LIBCALL: 4407: /* Move a REG_LIBCALL note to the first insn created, and update 4408: the corresponding REG_RETVAL note. */ 4409: XEXP (note, 1) = REG_NOTES (first); 4410: REG_NOTES (first) = note; 4411: 4412: insn = XEXP (note, 0); 1.1.1.4 root 4413: note = find_reg_note (insn, REG_RETVAL, NULL_RTX); 1.1 root 4414: if (note) 4415: XEXP (note, 0) = first; 4416: break; 4417: 4418: case REG_RETVAL: 4419: /* Move a REG_RETVAL note to the last insn created, and update 4420: the corresponding REG_LIBCALL note. */ 4421: XEXP (note, 1) = REG_NOTES (last); 4422: REG_NOTES (last) = note; 4423: 4424: insn = XEXP (note, 0); 1.1.1.4 root 4425: note = find_reg_note (insn, REG_LIBCALL, NULL_RTX); 1.1 root 4426: if (note) 4427: XEXP (note, 0) = last; 4428: break; 4429: 4430: case REG_NONNEG: 4431: /* This should be moved to whichever instruction is a JUMP_INSN. */ 4432: 4433: for (insn = last; ; insn = PREV_INSN (insn)) 4434: { 4435: if (GET_CODE (insn) == JUMP_INSN) 4436: { 4437: XEXP (note, 1) = REG_NOTES (insn); 4438: REG_NOTES (insn) = note; 4439: /* Only put this note on one of the new insns. */ 4440: break; 4441: } 4442: /* Fail if we couldn't find a JUMP_INSN. */ 4443: if (insn == first) 4444: abort (); 4445: } 4446: break; 4447: 4448: case REG_INC: 4449: /* This should be moved to whichever instruction now has the 4450: increment operation. */ 4451: abort (); 4452: 4453: case REG_LABEL: 4454: /* Should be moved to the new insn(s) which use the label. */ 1.1.1.2 root 4455: for (insn = first; insn != NEXT_INSN (last); insn = NEXT_INSN (insn)) 4456: if (GET_RTX_CLASS (GET_CODE (insn)) == 'i' 4457: && reg_mentioned_p (XEXP (note, 0), PATTERN (insn))) 4458: REG_NOTES (insn) = gen_rtx (EXPR_LIST, REG_LABEL, 4459: XEXP (note, 0), REG_NOTES (insn)); 4460: break; 1.1 root 4461: 4462: case REG_CC_SETTER: 4463: case REG_CC_USER: 4464: /* These two notes will never appear until after reorg, so we don't 4465: have to handle them here. */ 4466: default: 4467: abort (); 4468: } 4469: } 4470: 4471: /* Each new insn created, except the last, has a new set. If the destination 4472: is a register, then this reg is now live across several insns, whereas 4473: previously the dest reg was born and died within the same insn. To 4474: reflect this, we now need a REG_DEAD note on the insn where this 4475: dest reg dies. 4476: 4477: Similarly, the new insns may have clobbers that need REG_UNUSED notes. */ 4478: 4479: for (insn = first; insn != last; insn = NEXT_INSN (insn)) 4480: { 4481: rtx pat; 4482: int i; 4483: 4484: pat = PATTERN (insn); 4485: if (GET_CODE (pat) == SET || GET_CODE (pat) == CLOBBER) 4486: new_insn_dead_notes (pat, insn, last, orig_insn); 4487: else if (GET_CODE (pat) == PARALLEL) 4488: { 4489: for (i = 0; i < XVECLEN (pat, 0); i++) 4490: if (GET_CODE (XVECEXP (pat, 0, i)) == SET 4491: || GET_CODE (XVECEXP (pat, 0, i)) == CLOBBER) 4492: new_insn_dead_notes (XVECEXP (pat, 0, i), insn, last, orig_insn); 4493: } 4494: } 4495: 4496: /* If any insn, except the last, uses the register set by the last insn, 4497: then we need a new REG_DEAD note on that insn. In this case, there 4498: would not have been a REG_DEAD note for this register in the original 4499: insn because it was used and set within one insn. 4500: 4501: There is no new REG_DEAD note needed if the last insn uses the register 4502: that it is setting. */ 4503: 4504: set = single_set (last); 4505: if (set) 4506: { 4507: rtx dest = SET_DEST (set); 4508: 4509: while (GET_CODE (dest) == ZERO_EXTRACT || GET_CODE (dest) == SUBREG 4510: || GET_CODE (dest) == STRICT_LOW_PART 4511: || GET_CODE (dest) == SIGN_EXTRACT) 4512: dest = XEXP (dest, 0); 4513: 4514: if (GET_CODE (dest) == REG 4515: && ! reg_overlap_mentioned_p (dest, SET_SRC (set))) 4516: { 4517: for (insn = PREV_INSN (last); ; insn = PREV_INSN (insn)) 4518: { 4519: if (GET_RTX_CLASS (GET_CODE (insn)) == 'i' 4520: && reg_mentioned_p (dest, PATTERN (insn)) 4521: && (set = single_set (insn))) 4522: { 4523: rtx insn_dest = SET_DEST (set); 4524: 4525: while (GET_CODE (insn_dest) == ZERO_EXTRACT 4526: || GET_CODE (insn_dest) == SUBREG 4527: || GET_CODE (insn_dest) == STRICT_LOW_PART 4528: || GET_CODE (insn_dest) == SIGN_EXTRACT) 4529: insn_dest = XEXP (insn_dest, 0); 4530: 4531: if (insn_dest != dest) 4532: { 4533: note = rtx_alloc (EXPR_LIST); 4534: PUT_REG_NOTE_KIND (note, REG_DEAD); 4535: XEXP (note, 0) = dest; 4536: XEXP (note, 1) = REG_NOTES (insn); 4537: REG_NOTES (insn) = note; 4538: /* The reg only dies in one insn, the last one 4539: that uses it. */ 4540: break; 4541: } 4542: } 4543: if (insn == first) 4544: break; 4545: } 4546: } 4547: } 4548: 4549: /* If the original dest is modifying a multiple register target, and the 4550: original instruction was split such that the original dest is now set 4551: by two or more SUBREG sets, then the split insns no longer kill the 4552: destination of the original insn. 4553: 4554: In this case, if there exists an instruction in the same basic block, 4555: before the split insn, which uses the original dest, and this use is 4556: killed by the original insn, then we must remove the REG_DEAD note on 4557: this insn, because it is now superfluous. 4558: 4559: This does not apply when a hard register gets split, because the code 4560: knows how to handle overlapping hard registers properly. */ 4561: if (orig_dest && GET_CODE (orig_dest) == REG) 4562: { 4563: int found_orig_dest = 0; 4564: int found_split_dest = 0; 4565: 4566: for (insn = first; ; insn = NEXT_INSN (insn)) 4567: { 4568: set = single_set (insn); 4569: if (set) 4570: { 4571: if (GET_CODE (SET_DEST (set)) == REG 4572: && REGNO (SET_DEST (set)) == REGNO (orig_dest)) 4573: { 4574: found_orig_dest = 1; 4575: break; 4576: } 4577: else if (GET_CODE (SET_DEST (set)) == SUBREG 4578: && SUBREG_REG (SET_DEST (set)) == orig_dest) 4579: { 4580: found_split_dest = 1; 4581: break; 4582: } 4583: } 4584: 4585: if (insn == last) 4586: break; 4587: } 4588: 4589: if (found_split_dest) 4590: { 4591: /* Search backwards from FIRST, looking for the first insn that uses 4592: the original dest. Stop if we pass a CODE_LABEL or a JUMP_INSN. 4593: If we find an insn, and it has a REG_DEAD note, then delete the 4594: note. */ 4595: 4596: for (insn = first; insn; insn = PREV_INSN (insn)) 4597: { 4598: if (GET_CODE (insn) == CODE_LABEL 4599: || GET_CODE (insn) == JUMP_INSN) 4600: break; 4601: else if (GET_RTX_CLASS (GET_CODE (insn)) == 'i' 4602: && reg_mentioned_p (orig_dest, insn)) 4603: { 4604: note = find_regno_note (insn, REG_DEAD, REGNO (orig_dest)); 4605: if (note) 4606: remove_note (insn, note); 4607: } 4608: } 4609: } 4610: else if (! found_orig_dest) 4611: { 4612: /* This should never happen. */ 4613: abort (); 4614: } 4615: } 4616: 4617: /* Update reg_n_sets. This is necessary to prevent local alloc from 4618: converting REG_EQUAL notes to REG_EQUIV when splitting has modified 4619: a reg from set once to set multiple times. */ 4620: 4621: { 4622: rtx x = PATTERN (orig_insn); 4623: RTX_CODE code = GET_CODE (x); 4624: 4625: if (code == SET || code == CLOBBER) 4626: update_n_sets (x, -1); 4627: else if (code == PARALLEL) 4628: { 4629: int i; 4630: for (i = XVECLEN (x, 0) - 1; i >= 0; i--) 4631: { 4632: code = GET_CODE (XVECEXP (x, 0, i)); 4633: if (code == SET || code == CLOBBER) 4634: update_n_sets (XVECEXP (x, 0, i), -1); 4635: } 4636: } 4637: 4638: for (insn = first; ; insn = NEXT_INSN (insn)) 4639: { 4640: x = PATTERN (insn); 4641: code = GET_CODE (x); 4642: 4643: if (code == SET || code == CLOBBER) 4644: update_n_sets (x, 1); 4645: else if (code == PARALLEL) 4646: { 4647: int i; 4648: for (i = XVECLEN (x, 0) - 1; i >= 0; i--) 4649: { 4650: code = GET_CODE (XVECEXP (x, 0, i)); 4651: if (code == SET || code == CLOBBER) 4652: update_n_sets (XVECEXP (x, 0, i), 1); 4653: } 4654: } 4655: 4656: if (insn == last) 4657: break; 4658: } 4659: } 4660: } 4661: 4662: /* The one entry point in this file. DUMP_FILE is the dump file for 4663: this pass. */ 4664: 4665: void 4666: schedule_insns (dump_file) 4667: FILE *dump_file; 4668: { 4669: int max_uid = MAX_INSNS_PER_SPLIT * (get_max_uid () + 1); 1.1.1.7 root 4670: int b; 1.1 root 4671: rtx insn; 4672: 4673: /* Taking care of this degenerate case makes the rest of 4674: this code simpler. */ 4675: if (n_basic_blocks == 0) 4676: return; 4677: 4678: /* Create an insn here so that we can hang dependencies off of it later. */ 1.1.1.4 root 4679: sched_before_next_call 4680: = gen_rtx (INSN, VOIDmode, 0, NULL_RTX, NULL_RTX, 4681: NULL_RTX, 0, NULL_RTX, 0); 1.1 root 4682: 4683: /* Initialize the unused_*_lists. We can't use the ones left over from 4684: the previous function, because gcc has freed that memory. We can use 4685: the ones left over from the first sched pass in the second pass however, 4686: so only clear them on the first sched pass. The first pass is before 4687: reload if flag_schedule_insns is set, otherwise it is afterwards. */ 4688: 4689: if (reload_completed == 0 || ! flag_schedule_insns) 4690: { 4691: unused_insn_list = 0; 4692: unused_expr_list = 0; 4693: } 4694: 4695: /* We create no insns here, only reorder them, so we 4696: remember how far we can cut back the stack on exit. */ 4697: 4698: /* Allocate data for this pass. See comments, above, 4699: for what these vectors do. */ 4700: insn_luid = (int *) alloca (max_uid * sizeof (int)); 4701: insn_priority = (int *) alloca (max_uid * sizeof (int)); 1.1.1.4 root 4702: insn_tick = (int *) alloca (max_uid * sizeof (int)); 1.1.1.3 root 4703: insn_costs = (short *) alloca (max_uid * sizeof (short)); 1.1.1.4 root 4704: insn_units = (short *) alloca (max_uid * sizeof (short)); 4705: insn_blockage = (unsigned int *) alloca (max_uid * sizeof (unsigned int)); 1.1 root 4706: insn_ref_count = (int *) alloca (max_uid * sizeof (int)); 4707: 4708: if (reload_completed == 0) 4709: { 4710: sched_reg_n_deaths = (short *) alloca (max_regno * sizeof (short)); 4711: sched_reg_n_calls_crossed = (int *) alloca (max_regno * sizeof (int)); 4712: sched_reg_live_length = (int *) alloca (max_regno * sizeof (int)); 4713: bb_dead_regs = (regset) alloca (regset_bytes); 4714: bb_live_regs = (regset) alloca (regset_bytes); 1.1.1.7 root 4715: bzero ((char *) sched_reg_n_calls_crossed, max_regno * sizeof (int)); 4716: bzero ((char *) sched_reg_live_length, max_regno * sizeof (int)); 4717: bcopy ((char *) reg_n_deaths, (char *) sched_reg_n_deaths, 4718: max_regno * sizeof (short)); 1.1 root 4719: init_alias_analysis (); 4720: } 4721: else 4722: { 4723: sched_reg_n_deaths = 0; 4724: sched_reg_n_calls_crossed = 0; 4725: sched_reg_live_length = 0; 4726: bb_dead_regs = 0; 4727: bb_live_regs = 0; 4728: if (! flag_schedule_insns) 4729: init_alias_analysis (); 4730: } 4731: 4732: if (write_symbols != NO_DEBUG) 4733: { 4734: rtx line; 4735: 4736: line_note = (rtx *) alloca (max_uid * sizeof (rtx)); 1.1.1.7 root 4737: bzero ((char *) line_note, max_uid * sizeof (rtx)); 1.1 root 4738: line_note_head = (rtx *) alloca (n_basic_blocks * sizeof (rtx)); 1.1.1.7 root 4739: bzero ((char *) line_note_head, n_basic_blocks * sizeof (rtx)); 1.1 root 4740: 4741: /* Determine the line-number at the start of each basic block. 4742: This must be computed and saved now, because after a basic block's 4743: predecessor has been scheduled, it is impossible to accurately 4744: determine the correct line number for the first insn of the block. */ 4745: 4746: for (b = 0; b < n_basic_blocks; b++) 4747: for (line = basic_block_head[b]; line; line = PREV_INSN (line)) 4748: if (GET_CODE (line) == NOTE && NOTE_LINE_NUMBER (line) > 0) 4749: { 4750: line_note_head[b] = line; 4751: break; 4752: } 4753: } 4754: 1.1.1.7 root 4755: bzero ((char *) insn_luid, max_uid * sizeof (int)); 4756: bzero ((char *) insn_priority, max_uid * sizeof (int)); 4757: bzero ((char *) insn_tick, max_uid * sizeof (int)); 4758: bzero ((char *) insn_costs, max_uid * sizeof (short)); 4759: bzero ((char *) insn_units, max_uid * sizeof (short)); 4760: bzero ((char *) insn_blockage, max_uid * sizeof (unsigned int)); 4761: bzero ((char *) insn_ref_count, max_uid * sizeof (int)); 1.1 root 4762: 4763: /* Schedule each basic block, block by block. */ 4764: 1.1.1.6 root 4765: /* ??? Add a NOTE after the last insn of the last basic block. It is not 4766: known why this is done. */ 4767: 4768: insn = basic_block_end[n_basic_blocks-1]; 4769: if (NEXT_INSN (insn) == 0 4770: || (GET_CODE (insn) != NOTE 4771: && GET_CODE (insn) != CODE_LABEL 4772: /* Don't emit a NOTE if it would end up between an unconditional 4773: jump and a BARRIER. */ 4774: && ! (GET_CODE (insn) == JUMP_INSN 4775: && GET_CODE (NEXT_INSN (insn)) == BARRIER))) 1.1 root 4776: emit_note_after (NOTE_INSN_DELETED, basic_block_end[n_basic_blocks-1]); 4777: 4778: for (b = 0; b < n_basic_blocks; b++) 4779: { 4780: rtx insn, next; 4781: 4782: note_list = 0; 4783: 4784: for (insn = basic_block_head[b]; ; insn = next) 4785: { 4786: rtx prev; 4787: rtx set; 4788: 4789: /* Can't use `next_real_insn' because that 4790: might go across CODE_LABELS and short-out basic blocks. */ 4791: next = NEXT_INSN (insn); 4792: if (GET_CODE (insn) != INSN) 4793: { 4794: if (insn == basic_block_end[b]) 4795: break; 4796: 4797: continue; 4798: } 4799: 4800: /* Don't split no-op move insns. These should silently disappear 4801: later in final. Splitting such insns would break the code 4802: that handles REG_NO_CONFLICT blocks. */ 4803: set = single_set (insn); 4804: if (set && rtx_equal_p (SET_SRC (set), SET_DEST (set))) 4805: { 4806: if (insn == basic_block_end[b]) 4807: break; 4808: 4809: /* Nops get in the way while scheduling, so delete them now if 4810: register allocation has already been done. It is too risky 4811: to try to do this before register allocation, and there are 4812: unlikely to be very many nops then anyways. */ 4813: if (reload_completed) 4814: { 4815: PUT_CODE (insn, NOTE); 4816: NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED; 4817: NOTE_SOURCE_FILE (insn) = 0; 4818: } 4819: 4820: continue; 4821: } 4822: 4823: /* Split insns here to get max fine-grain parallelism. */ 4824: prev = PREV_INSN (insn); 4825: if (reload_completed == 0) 4826: { 4827: rtx last, first = PREV_INSN (insn); 4828: rtx notes = REG_NOTES (insn); 4829: 4830: last = try_split (PATTERN (insn), insn, 1); 4831: if (last != insn) 4832: { 4833: /* try_split returns the NOTE that INSN became. */ 4834: first = NEXT_INSN (first); 4835: update_flow_info (notes, first, last, insn); 4836: 4837: PUT_CODE (insn, NOTE); 4838: NOTE_SOURCE_FILE (insn) = 0; 4839: NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED; 4840: if (insn == basic_block_head[b]) 4841: basic_block_head[b] = first; 4842: if (insn == basic_block_end[b]) 4843: { 4844: basic_block_end[b] = last; 4845: break; 4846: } 4847: } 4848: } 4849: 4850: if (insn == basic_block_end[b]) 4851: break; 4852: } 4853: 4854: schedule_block (b, dump_file); 4855: 4856: #ifdef USE_C_ALLOCA 4857: alloca (0); 4858: #endif 4859: } 4860: 1.1.1.4 root 4861: /* Reposition the prologue and epilogue notes in case we moved the 4862: prologue/epilogue insns. */ 4863: if (reload_completed) 4864: reposition_prologue_and_epilogue_notes (get_insns ()); 4865: 1.1 root 4866: if (write_symbols != NO_DEBUG) 4867: { 4868: rtx line = 0; 4869: rtx insn = get_insns (); 4870: int active_insn = 0; 4871: int notes = 0; 4872: 4873: /* Walk the insns deleting redundant line-number notes. Many of these 4874: are already present. The remainder tend to occur at basic 4875: block boundaries. */ 4876: for (insn = get_last_insn (); insn; insn = PREV_INSN (insn)) 4877: if (GET_CODE (insn) == NOTE && NOTE_LINE_NUMBER (insn) > 0) 4878: { 4879: /* If there are no active insns following, INSN is redundant. */ 4880: if (active_insn == 0) 4881: { 4882: notes++; 4883: NOTE_SOURCE_FILE (insn) = 0; 4884: NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED; 4885: } 4886: /* If the line number is unchanged, LINE is redundant. */ 4887: else if (line 4888: && NOTE_LINE_NUMBER (line) == NOTE_LINE_NUMBER (insn) 4889: && NOTE_SOURCE_FILE (line) == NOTE_SOURCE_FILE (insn)) 4890: { 4891: notes++; 4892: NOTE_SOURCE_FILE (line) = 0; 4893: NOTE_LINE_NUMBER (line) = NOTE_INSN_DELETED; 4894: line = insn; 4895: } 4896: else 4897: line = insn; 4898: active_insn = 0; 4899: } 4900: else if (! ((GET_CODE (insn) == NOTE 4901: && NOTE_LINE_NUMBER (insn) == NOTE_INSN_DELETED) 4902: || (GET_CODE (insn) == INSN 4903: && (GET_CODE (PATTERN (insn)) == USE 4904: || GET_CODE (PATTERN (insn)) == CLOBBER)))) 4905: active_insn++; 4906: 4907: if (dump_file && notes) 4908: fprintf (dump_file, ";; deleted %d line-number notes\n", notes); 4909: } 4910: 4911: if (reload_completed == 0) 4912: { 4913: int regno; 4914: for (regno = 0; regno < max_regno; regno++) 4915: if (sched_reg_live_length[regno]) 4916: { 4917: if (dump_file) 4918: { 4919: if (reg_live_length[regno] > sched_reg_live_length[regno]) 4920: fprintf (dump_file, 4921: ";; register %d life shortened from %d to %d\n", 4922: regno, reg_live_length[regno], 4923: sched_reg_live_length[regno]); 4924: /* Negative values are special; don't overwrite the current 4925: reg_live_length value if it is negative. */ 4926: else if (reg_live_length[regno] < sched_reg_live_length[regno] 4927: && reg_live_length[regno] >= 0) 4928: fprintf (dump_file, 4929: ";; register %d life extended from %d to %d\n", 4930: regno, reg_live_length[regno], 4931: sched_reg_live_length[regno]); 4932: 1.1.1.6 root 4933: if (! reg_n_calls_crossed[regno] 4934: && sched_reg_n_calls_crossed[regno]) 1.1 root 4935: fprintf (dump_file, 4936: ";; register %d now crosses calls\n", regno); 1.1.1.6 root 4937: else if (reg_n_calls_crossed[regno] 4938: && ! sched_reg_n_calls_crossed[regno] 4939: && reg_basic_block[regno] != REG_BLOCK_GLOBAL) 4940: fprintf (dump_file, 4941: ";; register %d no longer crosses calls\n", regno); 4942: 1.1 root 4943: } 1.1.1.2 root 4944: /* Negative values are special; don't overwrite the current 4945: reg_live_length value if it is negative. */ 4946: if (reg_live_length[regno] >= 0) 4947: reg_live_length[regno] = sched_reg_live_length[regno]; 1.1.1.6 root 4948: 4949: /* We can't change the value of reg_n_calls_crossed to zero for 4950: pseudos which are live in more than one block. 4951: 4952: This is because combine might have made an optimization which 4953: invalidated basic_block_live_at_start and reg_n_calls_crossed, 4954: but it does not update them. If we update reg_n_calls_crossed 4955: here, the two variables are now inconsistent, and this might 4956: confuse the caller-save code into saving a register that doesn't 4957: need to be saved. This is only a problem when we zero calls 4958: crossed for a pseudo live in multiple basic blocks. 4959: 4960: Alternatively, we could try to correctly update basic block live 4961: at start here in sched, but that seems complicated. */ 4962: if (sched_reg_n_calls_crossed[regno] 4963: || reg_basic_block[regno] != REG_BLOCK_GLOBAL) 4964: reg_n_calls_crossed[regno] = sched_reg_n_calls_crossed[regno]; 1.1 root 4965: } 4966: } 4967: } 4968: #endif /* INSN_SCHEDULING */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.