|
|
1.1 ! root 1: /* Allocate registers for pseudo-registers that span basic blocks. ! 2: Copyright (C) 1987, 1988, 1991 Free Software Foundation, Inc. ! 3: ! 4: This file is part of GNU CC. ! 5: ! 6: GNU CC is free software; you can redistribute it and/or modify ! 7: it under the terms of the GNU General Public License as published by ! 8: the Free Software Foundation; either version 2, or (at your option) ! 9: any later version. ! 10: ! 11: GNU CC is distributed in the hope that it will be useful, ! 12: but WITHOUT ANY WARRANTY; without even the implied warranty of ! 13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ! 14: GNU General Public License for more details. ! 15: ! 16: You should have received a copy of the GNU General Public License ! 17: along with GNU CC; see the file COPYING. If not, write to ! 18: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ ! 19: ! 20: ! 21: #include <stdio.h> ! 22: #include "config.h" ! 23: #include "rtl.h" ! 24: #include "flags.h" ! 25: #include "basic-block.h" ! 26: #include "hard-reg-set.h" ! 27: #include "regs.h" ! 28: #include "insn-config.h" ! 29: #include "output.h" ! 30: ! 31: /* This pass of the compiler performs global register allocation. ! 32: It assigns hard register numbers to all the pseudo registers ! 33: that were not handled in local_alloc. Assignments are recorded ! 34: in the vector reg_renumber, not by changing the rtl code. ! 35: (Such changes are made by final). The entry point is ! 36: the function global_alloc. ! 37: ! 38: After allocation is complete, the reload pass is run as a subroutine ! 39: of this pass, so that when a pseudo reg loses its hard reg due to ! 40: spilling it is possible to make a second attempt to find a hard ! 41: reg for it. The reload pass is independent in other respects ! 42: and it is run even when stupid register allocation is in use. ! 43: ! 44: 1. count the pseudo-registers still needing allocation ! 45: and assign allocation-numbers (allocnos) to them. ! 46: Set up tables reg_allocno and allocno_reg to map ! 47: reg numbers to allocnos and vice versa. ! 48: max_allocno gets the number of allocnos in use. ! 49: ! 50: 2. Allocate a max_allocno by max_allocno conflict bit matrix and clear it. ! 51: Allocate a max_allocno by FIRST_PSEUDO_REGISTER conflict matrix ! 52: for conflicts between allocnos and explicit hard register use ! 53: (which includes use of pseudo-registers allocated by local_alloc). ! 54: ! 55: 3. for each basic block ! 56: walk forward through the block, recording which ! 57: unallocated registers and which hardware registers are live. ! 58: Build the conflict matrix between the unallocated registers ! 59: and another of unallocated registers versus hardware registers. ! 60: Also record the preferred hardware registers ! 61: for each unallocated one. ! 62: ! 63: 4. Sort a table of the allocnos into order of ! 64: desirability of the variables. ! 65: ! 66: 5. Allocate the variables in that order; each if possible into ! 67: a preferred register, else into another register. */ ! 68: ! 69: /* Number of pseudo-registers still requiring allocation ! 70: (not allocated by local_allocate). */ ! 71: ! 72: static int max_allocno; ! 73: ! 74: /* Indexed by (pseudo) reg number, gives the allocno, or -1 ! 75: for pseudo registers already allocated by local_allocate. */ ! 76: ! 77: static int *reg_allocno; ! 78: ! 79: /* Indexed by allocno, gives the reg number. */ ! 80: ! 81: static int *allocno_reg; ! 82: ! 83: /* A vector of the integers from 0 to max_allocno-1, ! 84: sorted in the order of first-to-be-allocated first. */ ! 85: ! 86: static int *allocno_order; ! 87: ! 88: /* Indexed by an allocno, gives the number of consecutive ! 89: hard registers needed by that pseudo reg. */ ! 90: ! 91: static int *allocno_size; ! 92: ! 93: /* Indexed by (pseudo) reg number, gives the number of another ! 94: lower-numbered pseudo reg which can share a hard reg with this pseudo ! 95: *even if the two pseudos would otherwise appear to conflict*. */ ! 96: ! 97: static int *reg_may_share; ! 98: ! 99: /* Define the number of bits in each element of `conflicts' and what ! 100: type that element has. We use the largest integer format on the ! 101: host machine. */ ! 102: ! 103: #define INT_BITS HOST_BITS_PER_WIDE_INT ! 104: #define INT_TYPE HOST_WIDE_INT ! 105: ! 106: /* max_allocno by max_allocno array of bits, ! 107: recording whether two allocno's conflict (can't go in the same ! 108: hardware register). ! 109: ! 110: `conflicts' is not symmetric; a conflict between allocno's i and j ! 111: is recorded either in element i,j or in element j,i. */ ! 112: ! 113: static INT_TYPE *conflicts; ! 114: ! 115: /* Number of ints require to hold max_allocno bits. ! 116: This is the length of a row in `conflicts'. */ ! 117: ! 118: static int allocno_row_words; ! 119: ! 120: /* Two macros to test or store 1 in an element of `conflicts'. */ ! 121: ! 122: #define CONFLICTP(I, J) \ ! 123: (conflicts[(I) * allocno_row_words + (J) / INT_BITS] \ ! 124: & ((INT_TYPE) 1 << ((J) % INT_BITS))) ! 125: ! 126: #define SET_CONFLICT(I, J) \ ! 127: (conflicts[(I) * allocno_row_words + (J) / INT_BITS] \ ! 128: |= ((INT_TYPE) 1 << ((J) % INT_BITS))) ! 129: ! 130: /* Set of hard regs currently live (during scan of all insns). */ ! 131: ! 132: static HARD_REG_SET hard_regs_live; ! 133: ! 134: /* Indexed by N, set of hard regs conflicting with allocno N. */ ! 135: ! 136: static HARD_REG_SET *hard_reg_conflicts; ! 137: ! 138: /* Indexed by N, set of hard regs preferred by allocno N. ! 139: This is used to make allocnos go into regs that are copied to or from them, ! 140: when possible, to reduce register shuffling. */ ! 141: ! 142: static HARD_REG_SET *hard_reg_preferences; ! 143: ! 144: /* Similar, but just counts register preferences made in simple copy ! 145: operations, rather than arithmetic. These are given priority because ! 146: we can always eliminate an insn by using these, but using a register ! 147: in the above list won't always eliminate an insn. */ ! 148: ! 149: static HARD_REG_SET *hard_reg_copy_preferences; ! 150: ! 151: /* Similar to hard_reg_preferences, but includes bits for subsequent ! 152: registers when an allocno is multi-word. The above variable is used for ! 153: allocation while this is used to build reg_someone_prefers, below. */ ! 154: ! 155: static HARD_REG_SET *hard_reg_full_preferences; ! 156: ! 157: /* Indexed by N, set of hard registers that some later allocno has a ! 158: preference for. */ ! 159: ! 160: static HARD_REG_SET *regs_someone_prefers; ! 161: ! 162: /* Set of registers that global-alloc isn't supposed to use. */ ! 163: ! 164: static HARD_REG_SET no_global_alloc_regs; ! 165: ! 166: /* Set of registers used so far. */ ! 167: ! 168: static HARD_REG_SET regs_used_so_far; ! 169: ! 170: /* Number of calls crossed by each allocno. */ ! 171: ! 172: static int *allocno_calls_crossed; ! 173: ! 174: /* Number of refs (weighted) to each allocno. */ ! 175: ! 176: static int *allocno_n_refs; ! 177: ! 178: /* Guess at live length of each allocno. ! 179: This is actually the max of the live lengths of the regs. */ ! 180: ! 181: static int *allocno_live_length; ! 182: ! 183: /* Number of refs (weighted) to each hard reg, as used by local alloc. ! 184: It is zero for a reg that contains global pseudos or is explicitly used. */ ! 185: ! 186: static int local_reg_n_refs[FIRST_PSEUDO_REGISTER]; ! 187: ! 188: /* Guess at live length of each hard reg, as used by local alloc. ! 189: This is actually the sum of the live lengths of the specific regs. */ ! 190: ! 191: static int local_reg_live_length[FIRST_PSEUDO_REGISTER]; ! 192: ! 193: /* Test a bit in TABLE, a vector of HARD_REG_SETs, ! 194: for vector element I, and hard register number J. */ ! 195: ! 196: #define REGBITP(TABLE, I, J) TEST_HARD_REG_BIT (TABLE[I], J) ! 197: ! 198: /* Set to 1 a bit in a vector of HARD_REG_SETs. Works like REGBITP. */ ! 199: ! 200: #define SET_REGBIT(TABLE, I, J) SET_HARD_REG_BIT (TABLE[I], J) ! 201: ! 202: /* Bit mask for allocnos live at current point in the scan. */ ! 203: ! 204: static INT_TYPE *allocnos_live; ! 205: ! 206: /* Test, set or clear bit number I in allocnos_live, ! 207: a bit vector indexed by allocno. */ ! 208: ! 209: #define ALLOCNO_LIVE_P(I) \ ! 210: (allocnos_live[(I) / INT_BITS] & ((INT_TYPE) 1 << ((I) % INT_BITS))) ! 211: ! 212: #define SET_ALLOCNO_LIVE(I) \ ! 213: (allocnos_live[(I) / INT_BITS] |= ((INT_TYPE) 1 << ((I) % INT_BITS))) ! 214: ! 215: #define CLEAR_ALLOCNO_LIVE(I) \ ! 216: (allocnos_live[(I) / INT_BITS] &= ~((INT_TYPE) 1 << ((I) % INT_BITS))) ! 217: ! 218: /* This is turned off because it doesn't work right for DImode. ! 219: (And it is only used for DImode, so the other cases are worthless.) ! 220: The problem is that it isn't true that there is NO possibility of conflict; ! 221: only that there is no conflict if the two pseudos get the exact same regs. ! 222: If they were allocated with a partial overlap, there would be a conflict. ! 223: We can't safely turn off the conflict unless we have another way to ! 224: prevent the partial overlap. ! 225: ! 226: Idea: change hard_reg_conflicts so that instead of recording which ! 227: hard regs the allocno may not overlap, it records where the allocno ! 228: may not start. Change both where it is used and where it is updated. ! 229: Then there is a way to record that (reg:DI 108) may start at 10 ! 230: but not at 9 or 11. There is still the question of how to record ! 231: this semi-conflict between two pseudos. */ ! 232: #if 0 ! 233: /* Reg pairs for which conflict after the current insn ! 234: is inhibited by a REG_NO_CONFLICT note. ! 235: If the table gets full, we ignore any other notes--that is conservative. */ ! 236: #define NUM_NO_CONFLICT_PAIRS 4 ! 237: /* Number of pairs in use in this insn. */ ! 238: int n_no_conflict_pairs; ! 239: static struct { int allocno1, allocno2;} ! 240: no_conflict_pairs[NUM_NO_CONFLICT_PAIRS]; ! 241: #endif /* 0 */ ! 242: ! 243: /* Record all regs that are set in any one insn. ! 244: Communication from mark_reg_{store,clobber} and global_conflicts. */ ! 245: ! 246: static rtx *regs_set; ! 247: static int n_regs_set; ! 248: ! 249: /* All register that can be eliminated. */ ! 250: ! 251: static HARD_REG_SET eliminable_regset; ! 252: ! 253: static int allocno_compare (); ! 254: static void mark_reg_store (); ! 255: static void mark_reg_clobber (); ! 256: static void mark_reg_conflicts (); ! 257: static void mark_reg_live_nc (); ! 258: static void mark_reg_death (); ! 259: static void dump_conflicts (); ! 260: void dump_global_regs (); ! 261: static void find_reg (); ! 262: static void global_conflicts (); ! 263: static void expand_preferences (); ! 264: static void prune_preferences (); ! 265: static void record_conflicts (); ! 266: static void set_preference (); ! 267: ! 268: /* Perform allocation of pseudo-registers not allocated by local_alloc. ! 269: FILE is a file to output debugging information on, ! 270: or zero if such output is not desired. ! 271: ! 272: Return value is nonzero if reload failed ! 273: and we must not do any more for this function. */ ! 274: ! 275: int ! 276: global_alloc (file) ! 277: FILE *file; ! 278: { ! 279: #ifdef ELIMINABLE_REGS ! 280: static struct {int from, to; } eliminables[] = ELIMINABLE_REGS; ! 281: #endif ! 282: register int i; ! 283: rtx x; ! 284: ! 285: max_allocno = 0; ! 286: ! 287: /* A machine may have certain hard registers that ! 288: are safe to use only within a basic block. */ ! 289: ! 290: CLEAR_HARD_REG_SET (no_global_alloc_regs); ! 291: #ifdef OVERLAPPING_REGNO_P ! 292: for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) ! 293: if (OVERLAPPING_REGNO_P (i)) ! 294: SET_HARD_REG_BIT (no_global_alloc_regs, i); ! 295: #endif ! 296: ! 297: /* Build the regset of all eliminable registers and show we can't use those ! 298: that we already know won't be eliminated. */ ! 299: #ifdef ELIMINABLE_REGS ! 300: for (i = 0; i < sizeof eliminables / sizeof eliminables[0]; i++) ! 301: { ! 302: SET_HARD_REG_BIT (eliminable_regset, eliminables[i].from); ! 303: ! 304: if (! CAN_ELIMINATE (eliminables[i].from, eliminables[i].to) ! 305: || (eliminables[i].from == HARD_FRAME_POINTER_REGNUM ! 306: && (! flag_omit_frame_pointer || FRAME_POINTER_REQUIRED))) ! 307: SET_HARD_REG_BIT (no_global_alloc_regs, eliminables[i].from); ! 308: } ! 309: #if FRAME_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM ! 310: if (!flag_omit_frame_pointer || FRAME_POINTER_REQUIRED) ! 311: SET_HARD_REG_BIT (no_global_alloc_regs, HARD_FRAME_POINTER_REGNUM); ! 312: #endif ! 313: #else ! 314: SET_HARD_REG_BIT (eliminable_regset, FRAME_POINTER_REGNUM); ! 315: ! 316: /* If we know we will definitely not be eliminating the frame pointer, ! 317: don't allocate it. */ ! 318: if (! flag_omit_frame_pointer || FRAME_POINTER_REQUIRED) ! 319: SET_HARD_REG_BIT (no_global_alloc_regs, FRAME_POINTER_REGNUM); ! 320: #endif ! 321: ! 322: /* Track which registers have already been used. Start with registers ! 323: explicitly in the rtl, then registers allocated by local register ! 324: allocation. */ ! 325: ! 326: CLEAR_HARD_REG_SET (regs_used_so_far); ! 327: #ifdef LEAF_REGISTERS ! 328: /* If we are doing the leaf function optimization, and this is a leaf ! 329: function, it means that the registers that take work to save are those ! 330: that need a register window. So prefer the ones that can be used in ! 331: a leaf function. */ ! 332: { ! 333: char *cheap_regs; ! 334: static char leaf_regs[] = LEAF_REGISTERS; ! 335: ! 336: if (only_leaf_regs_used () && leaf_function_p ()) ! 337: cheap_regs = leaf_regs; ! 338: else ! 339: cheap_regs = call_used_regs; ! 340: for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) ! 341: if (regs_ever_live[i] || cheap_regs[i]) ! 342: SET_HARD_REG_BIT (regs_used_so_far, i); ! 343: } ! 344: #else ! 345: /* We consider registers that do not have to be saved over calls as if ! 346: they were already used since there is no cost in using them. */ ! 347: for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) ! 348: if (regs_ever_live[i] || call_used_regs[i]) ! 349: SET_HARD_REG_BIT (regs_used_so_far, i); ! 350: #endif ! 351: ! 352: for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++) ! 353: if (reg_renumber[i] >= 0) ! 354: SET_HARD_REG_BIT (regs_used_so_far, reg_renumber[i]); ! 355: ! 356: /* Establish mappings from register number to allocation number ! 357: and vice versa. In the process, count the allocnos. */ ! 358: ! 359: reg_allocno = (int *) alloca (max_regno * sizeof (int)); ! 360: ! 361: for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) ! 362: reg_allocno[i] = -1; ! 363: ! 364: /* Initialize the shared-hard-reg mapping ! 365: from the list of pairs that may share. */ ! 366: reg_may_share = (int *) alloca (max_regno * sizeof (int)); ! 367: bzero (reg_may_share, max_regno * sizeof (int)); ! 368: for (x = regs_may_share; x; x = XEXP (XEXP (x, 1), 1)) ! 369: { ! 370: int r1 = REGNO (XEXP (x, 0)); ! 371: int r2 = REGNO (XEXP (XEXP (x, 1), 0)); ! 372: if (r1 > r2) ! 373: reg_may_share[r1] = r2; ! 374: else ! 375: reg_may_share[r2] = r1; ! 376: } ! 377: ! 378: for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++) ! 379: /* Note that reg_live_length[i] < 0 indicates a "constant" reg ! 380: that we are supposed to refrain from putting in a hard reg. ! 381: -2 means do make an allocno but don't allocate it. */ ! 382: if (reg_n_refs[i] != 0 && reg_renumber[i] < 0 && reg_live_length[i] != -1 ! 383: /* Don't allocate pseudos that cross calls, ! 384: if this function receives a nonlocal goto. */ ! 385: && (! current_function_has_nonlocal_label ! 386: || reg_n_calls_crossed[i] == 0)) ! 387: { ! 388: if (reg_may_share[i] && reg_allocno[reg_may_share[i]] >= 0) ! 389: reg_allocno[i] = reg_allocno[reg_may_share[i]]; ! 390: else ! 391: reg_allocno[i] = max_allocno++; ! 392: if (reg_live_length[i] == 0) ! 393: abort (); ! 394: } ! 395: else ! 396: reg_allocno[i] = -1; ! 397: ! 398: allocno_reg = (int *) alloca (max_allocno * sizeof (int)); ! 399: allocno_size = (int *) alloca (max_allocno * sizeof (int)); ! 400: allocno_calls_crossed = (int *) alloca (max_allocno * sizeof (int)); ! 401: allocno_n_refs = (int *) alloca (max_allocno * sizeof (int)); ! 402: allocno_live_length = (int *) alloca (max_allocno * sizeof (int)); ! 403: bzero (allocno_size, max_allocno * sizeof (int)); ! 404: bzero (allocno_calls_crossed, max_allocno * sizeof (int)); ! 405: bzero (allocno_n_refs, max_allocno * sizeof (int)); ! 406: bzero (allocno_live_length, max_allocno * sizeof (int)); ! 407: ! 408: for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++) ! 409: if (reg_allocno[i] >= 0) ! 410: { ! 411: int allocno = reg_allocno[i]; ! 412: allocno_reg[allocno] = i; ! 413: allocno_size[allocno] = PSEUDO_REGNO_SIZE (i); ! 414: allocno_calls_crossed[allocno] += reg_n_calls_crossed[i]; ! 415: allocno_n_refs[allocno] += reg_n_refs[i]; ! 416: if (allocno_live_length[allocno] < reg_live_length[i]) ! 417: allocno_live_length[allocno] = reg_live_length[i]; ! 418: } ! 419: ! 420: /* Calculate amount of usage of each hard reg by pseudos ! 421: allocated by local-alloc. This is to see if we want to ! 422: override it. */ ! 423: bzero (local_reg_live_length, sizeof local_reg_live_length); ! 424: bzero (local_reg_n_refs, sizeof local_reg_n_refs); ! 425: for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++) ! 426: if (reg_allocno[i] < 0 && reg_renumber[i] >= 0) ! 427: { ! 428: int regno = reg_renumber[i]; ! 429: int endregno = regno + HARD_REGNO_NREGS (regno, PSEUDO_REGNO_MODE (i)); ! 430: int j; ! 431: ! 432: for (j = regno; j < endregno; j++) ! 433: { ! 434: local_reg_n_refs[j] += reg_n_refs[i]; ! 435: local_reg_live_length[j] += reg_live_length[i]; ! 436: } ! 437: } ! 438: ! 439: /* We can't override local-alloc for a reg used not just by local-alloc. */ ! 440: for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) ! 441: if (regs_ever_live[i]) ! 442: local_reg_n_refs[i] = 0; ! 443: ! 444: /* Allocate the space for the conflict and preference tables and ! 445: initialize them. */ ! 446: ! 447: hard_reg_conflicts ! 448: = (HARD_REG_SET *) alloca (max_allocno * sizeof (HARD_REG_SET)); ! 449: bzero (hard_reg_conflicts, max_allocno * sizeof (HARD_REG_SET)); ! 450: ! 451: hard_reg_preferences ! 452: = (HARD_REG_SET *) alloca (max_allocno * sizeof (HARD_REG_SET)); ! 453: bzero (hard_reg_preferences, max_allocno * sizeof (HARD_REG_SET)); ! 454: ! 455: hard_reg_copy_preferences ! 456: = (HARD_REG_SET *) alloca (max_allocno * sizeof (HARD_REG_SET)); ! 457: bzero (hard_reg_copy_preferences, max_allocno * sizeof (HARD_REG_SET)); ! 458: ! 459: hard_reg_full_preferences ! 460: = (HARD_REG_SET *) alloca (max_allocno * sizeof (HARD_REG_SET)); ! 461: bzero (hard_reg_full_preferences, max_allocno * sizeof (HARD_REG_SET)); ! 462: ! 463: regs_someone_prefers ! 464: = (HARD_REG_SET *) alloca (max_allocno * sizeof (HARD_REG_SET)); ! 465: bzero (regs_someone_prefers, max_allocno * sizeof (HARD_REG_SET)); ! 466: ! 467: allocno_row_words = (max_allocno + INT_BITS - 1) / INT_BITS; ! 468: ! 469: conflicts = (INT_TYPE *) alloca (max_allocno * allocno_row_words ! 470: * sizeof (INT_TYPE)); ! 471: bzero (conflicts, max_allocno * allocno_row_words ! 472: * sizeof (INT_TYPE)); ! 473: ! 474: allocnos_live = (INT_TYPE *) alloca (allocno_row_words * sizeof (INT_TYPE)); ! 475: ! 476: /* If there is work to be done (at least one reg to allocate), ! 477: perform global conflict analysis and allocate the regs. */ ! 478: ! 479: if (max_allocno > 0) ! 480: { ! 481: /* Scan all the insns and compute the conflicts among allocnos ! 482: and between allocnos and hard regs. */ ! 483: ! 484: global_conflicts (); ! 485: ! 486: /* Eliminate conflicts between pseudos and eliminable registers. If ! 487: the register is not eliminated, the pseudo won't really be able to ! 488: live in the eliminable register, so the conflict doesn't matter. ! 489: If we do eliminate the register, the conflict will no longer exist. ! 490: So in either case, we can ignore the conflict. Likewise for ! 491: preferences. */ ! 492: ! 493: for (i = 0; i < max_allocno; i++) ! 494: { ! 495: AND_COMPL_HARD_REG_SET (hard_reg_conflicts[i], eliminable_regset); ! 496: AND_COMPL_HARD_REG_SET (hard_reg_copy_preferences[i], ! 497: eliminable_regset); ! 498: AND_COMPL_HARD_REG_SET (hard_reg_preferences[i], eliminable_regset); ! 499: } ! 500: ! 501: /* Try to expand the preferences by merging them between allocnos. */ ! 502: ! 503: expand_preferences (); ! 504: ! 505: /* Determine the order to allocate the remaining pseudo registers. */ ! 506: ! 507: allocno_order = (int *) alloca (max_allocno * sizeof (int)); ! 508: for (i = 0; i < max_allocno; i++) ! 509: allocno_order[i] = i; ! 510: ! 511: /* Default the size to 1, since allocno_compare uses it to divide by. ! 512: Also convert allocno_live_length of zero to -1. A length of zero ! 513: can occur when all the registers for that allocno have reg_live_length ! 514: equal to -2. In this case, we want to make an allocno, but not ! 515: allocate it. So avoid the divide-by-zero and set it to a low ! 516: priority. */ ! 517: ! 518: for (i = 0; i < max_allocno; i++) ! 519: { ! 520: if (allocno_size[i] == 0) ! 521: allocno_size[i] = 1; ! 522: if (allocno_live_length[i] == 0) ! 523: allocno_live_length[i] = -1; ! 524: } ! 525: ! 526: qsort (allocno_order, max_allocno, sizeof (int), allocno_compare); ! 527: ! 528: prune_preferences (); ! 529: ! 530: if (file) ! 531: dump_conflicts (file); ! 532: ! 533: /* Try allocating them, one by one, in that order, ! 534: except for parameters marked with reg_live_length[regno] == -2. */ ! 535: ! 536: for (i = 0; i < max_allocno; i++) ! 537: if (reg_live_length[allocno_reg[allocno_order[i]]] >= 0) ! 538: { ! 539: /* If we have more than one register class, ! 540: first try allocating in the class that is cheapest ! 541: for this pseudo-reg. If that fails, try any reg. */ ! 542: if (N_REG_CLASSES > 1) ! 543: { ! 544: find_reg (allocno_order[i], HARD_CONST (0), 0, 0, 0); ! 545: if (reg_renumber[allocno_reg[allocno_order[i]]] >= 0) ! 546: continue; ! 547: } ! 548: if (reg_alternate_class (allocno_reg[allocno_order[i]]) != NO_REGS) ! 549: find_reg (allocno_order[i], HARD_CONST (0), 1, 0, 0); ! 550: } ! 551: } ! 552: ! 553: /* Do the reloads now while the allocno data still exist, so that we can ! 554: try to assign new hard regs to any pseudo regs that are spilled. */ ! 555: ! 556: #if 0 /* We need to eliminate regs even if there is no rtl code, ! 557: for the sake of debugging information. */ ! 558: if (n_basic_blocks > 0) ! 559: #endif ! 560: return reload (get_insns (), 1, file); ! 561: } ! 562: ! 563: /* Sort predicate for ordering the allocnos. ! 564: Returns -1 (1) if *v1 should be allocated before (after) *v2. */ ! 565: ! 566: static int ! 567: allocno_compare (v1, v2) ! 568: int *v1, *v2; ! 569: { ! 570: /* Note that the quotient will never be bigger than ! 571: the value of floor_log2 times the maximum number of ! 572: times a register can occur in one insn (surely less than 100). ! 573: Multiplying this by 10000 can't overflow. */ ! 574: register int pri1 ! 575: = (((double) (floor_log2 (allocno_n_refs[*v1]) * allocno_n_refs[*v1]) ! 576: / (allocno_live_length[*v1] * allocno_size[*v1])) ! 577: * 10000); ! 578: register int pri2 ! 579: = (((double) (floor_log2 (allocno_n_refs[*v2]) * allocno_n_refs[*v2]) ! 580: / (allocno_live_length[*v2] * allocno_size[*v2])) ! 581: * 10000); ! 582: if (pri2 - pri1) ! 583: return pri2 - pri1; ! 584: ! 585: /* If regs are equally good, sort by allocno, ! 586: so that the results of qsort leave nothing to chance. */ ! 587: return *v1 - *v2; ! 588: } ! 589: ! 590: /* Scan the rtl code and record all conflicts and register preferences in the ! 591: conflict matrices and preference tables. */ ! 592: ! 593: static void ! 594: global_conflicts () ! 595: { ! 596: register int b, i; ! 597: register rtx insn; ! 598: short *block_start_allocnos; ! 599: ! 600: /* Make a vector that mark_reg_{store,clobber} will store in. */ ! 601: regs_set = (rtx *) alloca (max_parallel * sizeof (rtx) * 2); ! 602: ! 603: block_start_allocnos = (short *) alloca (max_allocno * sizeof (short)); ! 604: ! 605: for (b = 0; b < n_basic_blocks; b++) ! 606: { ! 607: bzero (allocnos_live, allocno_row_words * sizeof (INT_TYPE)); ! 608: ! 609: /* Initialize table of registers currently live ! 610: to the state at the beginning of this basic block. ! 611: This also marks the conflicts among them. ! 612: ! 613: For pseudo-regs, there is only one bit for each one ! 614: no matter how many hard regs it occupies. ! 615: This is ok; we know the size from PSEUDO_REGNO_SIZE. ! 616: For explicit hard regs, we cannot know the size that way ! 617: since one hard reg can be used with various sizes. ! 618: Therefore, we must require that all the hard regs ! 619: implicitly live as part of a multi-word hard reg ! 620: are explicitly marked in basic_block_live_at_start. */ ! 621: ! 622: { ! 623: register int offset; ! 624: REGSET_ELT_TYPE bit; ! 625: register regset old = basic_block_live_at_start[b]; ! 626: int ax = 0; ! 627: ! 628: #ifdef HARD_REG_SET ! 629: hard_regs_live = old[0]; ! 630: #else ! 631: COPY_HARD_REG_SET (hard_regs_live, old); ! 632: #endif ! 633: for (offset = 0, i = 0; offset < regset_size; offset++) ! 634: if (old[offset] == 0) ! 635: i += REGSET_ELT_BITS; ! 636: else ! 637: for (bit = 1; bit; bit <<= 1, i++) ! 638: { ! 639: if (i >= max_regno) ! 640: break; ! 641: if (old[offset] & bit) ! 642: { ! 643: register int a = reg_allocno[i]; ! 644: if (a >= 0) ! 645: { ! 646: SET_ALLOCNO_LIVE (a); ! 647: block_start_allocnos[ax++] = a; ! 648: } ! 649: else if ((a = reg_renumber[i]) >= 0) ! 650: mark_reg_live_nc (a, PSEUDO_REGNO_MODE (i)); ! 651: } ! 652: } ! 653: ! 654: /* Record that each allocno now live conflicts with each other ! 655: allocno now live, and with each hard reg now live. */ ! 656: ! 657: record_conflicts (block_start_allocnos, ax); ! 658: } ! 659: ! 660: insn = basic_block_head[b]; ! 661: ! 662: /* Scan the code of this basic block, noting which allocnos ! 663: and hard regs are born or die. When one is born, ! 664: record a conflict with all others currently live. */ ! 665: ! 666: while (1) ! 667: { ! 668: register RTX_CODE code = GET_CODE (insn); ! 669: register rtx link; ! 670: ! 671: /* Make regs_set an empty set. */ ! 672: ! 673: n_regs_set = 0; ! 674: ! 675: if (code == INSN || code == CALL_INSN || code == JUMP_INSN) ! 676: { ! 677: int i = 0; ! 678: ! 679: #if 0 ! 680: for (link = REG_NOTES (insn); ! 681: link && i < NUM_NO_CONFLICT_PAIRS; ! 682: link = XEXP (link, 1)) ! 683: if (REG_NOTE_KIND (link) == REG_NO_CONFLICT) ! 684: { ! 685: no_conflict_pairs[i].allocno1 ! 686: = reg_allocno[REGNO (SET_DEST (PATTERN (insn)))]; ! 687: no_conflict_pairs[i].allocno2 ! 688: = reg_allocno[REGNO (XEXP (link, 0))]; ! 689: i++; ! 690: } ! 691: #endif /* 0 */ ! 692: ! 693: /* Mark any registers clobbered by INSN as live, ! 694: so they conflict with the inputs. */ ! 695: ! 696: note_stores (PATTERN (insn), mark_reg_clobber); ! 697: ! 698: /* Mark any registers dead after INSN as dead now. */ ! 699: ! 700: for (link = REG_NOTES (insn); link; link = XEXP (link, 1)) ! 701: if (REG_NOTE_KIND (link) == REG_DEAD) ! 702: mark_reg_death (XEXP (link, 0)); ! 703: ! 704: /* Mark any registers set in INSN as live, ! 705: and mark them as conflicting with all other live regs. ! 706: Clobbers are processed again, so they conflict with ! 707: the registers that are set. */ ! 708: ! 709: note_stores (PATTERN (insn), mark_reg_store); ! 710: ! 711: #ifdef AUTO_INC_DEC ! 712: for (link = REG_NOTES (insn); link; link = XEXP (link, 1)) ! 713: if (REG_NOTE_KIND (link) == REG_INC) ! 714: mark_reg_store (XEXP (link, 0), NULL_RTX); ! 715: #endif ! 716: ! 717: /* If INSN has multiple outputs, then any reg that dies here ! 718: and is used inside of an output ! 719: must conflict with the other outputs. */ ! 720: ! 721: if (GET_CODE (PATTERN (insn)) == PARALLEL && !single_set (insn)) ! 722: for (link = REG_NOTES (insn); link; link = XEXP (link, 1)) ! 723: if (REG_NOTE_KIND (link) == REG_DEAD) ! 724: { ! 725: int used_in_output = 0; ! 726: int i; ! 727: rtx reg = XEXP (link, 0); ! 728: ! 729: for (i = XVECLEN (PATTERN (insn), 0) - 1; i >= 0; i--) ! 730: { ! 731: rtx set = XVECEXP (PATTERN (insn), 0, i); ! 732: if (GET_CODE (set) == SET ! 733: && GET_CODE (SET_DEST (set)) != REG ! 734: && !rtx_equal_p (reg, SET_DEST (set)) ! 735: && reg_overlap_mentioned_p (reg, SET_DEST (set))) ! 736: used_in_output = 1; ! 737: } ! 738: if (used_in_output) ! 739: mark_reg_conflicts (reg); ! 740: } ! 741: ! 742: /* Mark any registers set in INSN and then never used. */ ! 743: ! 744: while (n_regs_set > 0) ! 745: if (find_regno_note (insn, REG_UNUSED, ! 746: REGNO (regs_set[--n_regs_set]))) ! 747: mark_reg_death (regs_set[n_regs_set]); ! 748: } ! 749: ! 750: if (insn == basic_block_end[b]) ! 751: break; ! 752: insn = NEXT_INSN (insn); ! 753: } ! 754: } ! 755: } ! 756: /* Expand the preference information by looking for cases where one allocno ! 757: dies in an insn that sets an allocno. If those two allocnos don't conflict, ! 758: merge any preferences between those allocnos. */ ! 759: ! 760: static void ! 761: expand_preferences () ! 762: { ! 763: rtx insn; ! 764: rtx link; ! 765: rtx set; ! 766: ! 767: /* We only try to handle the most common cases here. Most of the cases ! 768: where this wins are reg-reg copies. */ ! 769: ! 770: for (insn = get_insns (); insn; insn = NEXT_INSN (insn)) ! 771: if (GET_RTX_CLASS (GET_CODE (insn)) == 'i' ! 772: && (set = single_set (insn)) != 0 ! 773: && GET_CODE (SET_DEST (set)) == REG ! 774: && reg_allocno[REGNO (SET_DEST (set))] >= 0) ! 775: for (link = REG_NOTES (insn); link; link = XEXP (link, 1)) ! 776: if (REG_NOTE_KIND (link) == REG_DEAD ! 777: && GET_CODE (XEXP (link, 0)) == REG ! 778: && reg_allocno[REGNO (XEXP (link, 0))] >= 0 ! 779: && ! CONFLICTP (reg_allocno[REGNO (SET_DEST (set))], ! 780: reg_allocno[REGNO (XEXP (link, 0))]) ! 781: && ! CONFLICTP (reg_allocno[REGNO (XEXP (link, 0))], ! 782: reg_allocno[REGNO (SET_DEST (set))])) ! 783: { ! 784: int a1 = reg_allocno[REGNO (SET_DEST (set))]; ! 785: int a2 = reg_allocno[REGNO (XEXP (link, 0))]; ! 786: ! 787: if (XEXP (link, 0) == SET_SRC (set)) ! 788: { ! 789: IOR_HARD_REG_SET (hard_reg_copy_preferences[a1], ! 790: hard_reg_copy_preferences[a2]); ! 791: IOR_HARD_REG_SET (hard_reg_copy_preferences[a2], ! 792: hard_reg_copy_preferences[a1]); ! 793: } ! 794: ! 795: IOR_HARD_REG_SET (hard_reg_preferences[a1], ! 796: hard_reg_preferences[a2]); ! 797: IOR_HARD_REG_SET (hard_reg_preferences[a2], ! 798: hard_reg_preferences[a1]); ! 799: IOR_HARD_REG_SET (hard_reg_full_preferences[a1], ! 800: hard_reg_full_preferences[a2]); ! 801: IOR_HARD_REG_SET (hard_reg_full_preferences[a2], ! 802: hard_reg_full_preferences[a1]); ! 803: } ! 804: } ! 805: ! 806: /* Prune the preferences for global registers to exclude registers that cannot ! 807: be used. ! 808: ! 809: Compute `regs_someone_prefers', which is a bitmask of the hard registers ! 810: that are preferred by conflicting registers of lower priority. If possible, ! 811: we will avoid using these registers. */ ! 812: ! 813: static void ! 814: prune_preferences () ! 815: { ! 816: int i, j; ! 817: int allocno; ! 818: ! 819: /* Scan least most important to most important. ! 820: For each allocno, remove from preferences registers that cannot be used, ! 821: either because of conflicts or register type. Then compute all registers ! 822: preferred by each lower-priority register that conflicts. */ ! 823: ! 824: for (i = max_allocno - 1; i >= 0; i--) ! 825: { ! 826: HARD_REG_SET temp; ! 827: ! 828: allocno = allocno_order[i]; ! 829: COPY_HARD_REG_SET (temp, hard_reg_conflicts[allocno]); ! 830: ! 831: if (allocno_calls_crossed[allocno] == 0) ! 832: IOR_HARD_REG_SET (temp, fixed_reg_set); ! 833: else ! 834: IOR_HARD_REG_SET (temp, call_used_reg_set); ! 835: ! 836: IOR_COMPL_HARD_REG_SET ! 837: (temp, ! 838: reg_class_contents[(int) reg_preferred_class (allocno_reg[allocno])]); ! 839: ! 840: AND_COMPL_HARD_REG_SET (hard_reg_preferences[allocno], temp); ! 841: AND_COMPL_HARD_REG_SET (hard_reg_copy_preferences[allocno], temp); ! 842: AND_COMPL_HARD_REG_SET (hard_reg_full_preferences[allocno], temp); ! 843: ! 844: CLEAR_HARD_REG_SET (regs_someone_prefers[allocno]); ! 845: ! 846: /* Merge in the preferences of lower-priority registers (they have ! 847: already been pruned). If we also prefer some of those registers, ! 848: don't exclude them unless we are of a smaller size (in which case ! 849: we want to give the lower-priority allocno the first chance for ! 850: these registers). */ ! 851: for (j = i + 1; j < max_allocno; j++) ! 852: if (CONFLICTP (allocno, allocno_order[j])) ! 853: { ! 854: COPY_HARD_REG_SET (temp, ! 855: hard_reg_full_preferences[allocno_order[j]]); ! 856: if (allocno_size[allocno_order[j]] <= allocno_size[allocno]) ! 857: AND_COMPL_HARD_REG_SET (temp, ! 858: hard_reg_full_preferences[allocno]); ! 859: ! 860: IOR_HARD_REG_SET (regs_someone_prefers[allocno], temp); ! 861: } ! 862: } ! 863: } ! 864: ! 865: /* Assign a hard register to ALLOCNO; look for one that is the beginning ! 866: of a long enough stretch of hard regs none of which conflicts with ALLOCNO. ! 867: The registers marked in PREFREGS are tried first. ! 868: ! 869: LOSERS, if non-zero, is a HARD_REG_SET indicating registers that cannot ! 870: be used for this allocation. ! 871: ! 872: If ALT_REGS_P is zero, consider only the preferred class of ALLOCNO's reg. ! 873: Otherwise ignore that preferred class and use the alternate class. ! 874: ! 875: If ACCEPT_CALL_CLOBBERED is nonzero, accept a call-clobbered hard reg that ! 876: will have to be saved and restored at calls. ! 877: ! 878: RETRYING is nonzero if this is called from retry_global_alloc. ! 879: ! 880: If we find one, record it in reg_renumber. ! 881: If not, do nothing. */ ! 882: ! 883: static void ! 884: find_reg (allocno, losers, alt_regs_p, accept_call_clobbered, retrying) ! 885: int allocno; ! 886: HARD_REG_SET losers; ! 887: int alt_regs_p; ! 888: int accept_call_clobbered; ! 889: int retrying; ! 890: { ! 891: register int i, best_reg, pass; ! 892: #ifdef HARD_REG_SET ! 893: register /* Declare it register if it's a scalar. */ ! 894: #endif ! 895: HARD_REG_SET used, used1, used2; ! 896: ! 897: enum reg_class class = (alt_regs_p ! 898: ? reg_alternate_class (allocno_reg[allocno]) ! 899: : reg_preferred_class (allocno_reg[allocno])); ! 900: enum machine_mode mode = PSEUDO_REGNO_MODE (allocno_reg[allocno]); ! 901: ! 902: if (accept_call_clobbered) ! 903: COPY_HARD_REG_SET (used1, call_fixed_reg_set); ! 904: else if (allocno_calls_crossed[allocno] == 0) ! 905: COPY_HARD_REG_SET (used1, fixed_reg_set); ! 906: else ! 907: COPY_HARD_REG_SET (used1, call_used_reg_set); ! 908: ! 909: /* Some registers should not be allocated in global-alloc. */ ! 910: IOR_HARD_REG_SET (used1, no_global_alloc_regs); ! 911: if (losers) ! 912: IOR_HARD_REG_SET (used1, losers); ! 913: ! 914: IOR_COMPL_HARD_REG_SET (used1, reg_class_contents[(int) class]); ! 915: COPY_HARD_REG_SET (used2, used1); ! 916: ! 917: IOR_HARD_REG_SET (used1, hard_reg_conflicts[allocno]); ! 918: ! 919: /* Try each hard reg to see if it fits. Do this in two passes. ! 920: In the first pass, skip registers that are preferred by some other pseudo ! 921: to give it a better chance of getting one of those registers. Only if ! 922: we can't get a register when excluding those do we take one of them. ! 923: However, we never allocate a register for the first time in pass 0. */ ! 924: ! 925: COPY_HARD_REG_SET (used, used1); ! 926: IOR_COMPL_HARD_REG_SET (used, regs_used_so_far); ! 927: IOR_HARD_REG_SET (used, regs_someone_prefers[allocno]); ! 928: ! 929: best_reg = -1; ! 930: for (i = FIRST_PSEUDO_REGISTER, pass = 0; ! 931: pass <= 1 && i >= FIRST_PSEUDO_REGISTER; ! 932: pass++) ! 933: { ! 934: if (pass == 1) ! 935: COPY_HARD_REG_SET (used, used1); ! 936: for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) ! 937: { ! 938: #ifdef REG_ALLOC_ORDER ! 939: int regno = reg_alloc_order[i]; ! 940: #else ! 941: int regno = i; ! 942: #endif ! 943: if (! TEST_HARD_REG_BIT (used, regno) ! 944: && HARD_REGNO_MODE_OK (regno, mode)) ! 945: { ! 946: register int j; ! 947: register int lim = regno + HARD_REGNO_NREGS (regno, mode); ! 948: for (j = regno + 1; ! 949: (j < lim ! 950: && ! TEST_HARD_REG_BIT (used, j)); ! 951: j++); ! 952: if (j == lim) ! 953: { ! 954: best_reg = regno; ! 955: break; ! 956: } ! 957: #ifndef REG_ALLOC_ORDER ! 958: i = j; /* Skip starting points we know will lose */ ! 959: #endif ! 960: } ! 961: } ! 962: } ! 963: ! 964: /* See if there is a preferred register with the same class as the register ! 965: we allocated above. Making this restriction prevents register ! 966: preferencing from creating worse register allocation. ! 967: ! 968: Remove from the preferred registers and conflicting registers. Note that ! 969: additional conflicts may have been added after `prune_preferences' was ! 970: called. ! 971: ! 972: First do this for those register with copy preferences, then all ! 973: preferred registers. */ ! 974: ! 975: AND_COMPL_HARD_REG_SET (hard_reg_copy_preferences[allocno], used); ! 976: GO_IF_HARD_REG_SUBSET (hard_reg_copy_preferences[allocno], ! 977: reg_class_contents[(int) NO_REGS], no_copy_prefs); ! 978: ! 979: if (best_reg >= 0) ! 980: { ! 981: for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) ! 982: if (TEST_HARD_REG_BIT (hard_reg_copy_preferences[allocno], i) ! 983: && HARD_REGNO_MODE_OK (i, mode) ! 984: && (REGNO_REG_CLASS (i) == REGNO_REG_CLASS (best_reg) ! 985: || reg_class_subset_p (REGNO_REG_CLASS (i), ! 986: REGNO_REG_CLASS (best_reg)) ! 987: || reg_class_subset_p (REGNO_REG_CLASS (best_reg), ! 988: REGNO_REG_CLASS (i)))) ! 989: { ! 990: register int j; ! 991: register int lim = i + HARD_REGNO_NREGS (i, mode); ! 992: for (j = i + 1; ! 993: (j < lim ! 994: && ! TEST_HARD_REG_BIT (used, j) ! 995: && (REGNO_REG_CLASS (j) ! 996: == REGNO_REG_CLASS (best_reg + (j - i)) ! 997: || reg_class_subset_p (REGNO_REG_CLASS (j), ! 998: REGNO_REG_CLASS (best_reg + (j - i))) ! 999: || reg_class_subset_p (REGNO_REG_CLASS (best_reg + (j - i)), ! 1000: REGNO_REG_CLASS (j)))); ! 1001: j++); ! 1002: if (j == lim) ! 1003: { ! 1004: best_reg = i; ! 1005: goto no_prefs; ! 1006: } ! 1007: } ! 1008: } ! 1009: no_copy_prefs: ! 1010: ! 1011: AND_COMPL_HARD_REG_SET (hard_reg_preferences[allocno], used); ! 1012: GO_IF_HARD_REG_SUBSET (hard_reg_preferences[allocno], ! 1013: reg_class_contents[(int) NO_REGS], no_prefs); ! 1014: ! 1015: if (best_reg >= 0) ! 1016: { ! 1017: for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) ! 1018: if (TEST_HARD_REG_BIT (hard_reg_preferences[allocno], i) ! 1019: && HARD_REGNO_MODE_OK (i, mode) ! 1020: && (REGNO_REG_CLASS (i) == REGNO_REG_CLASS (best_reg) ! 1021: || reg_class_subset_p (REGNO_REG_CLASS (i), ! 1022: REGNO_REG_CLASS (best_reg)) ! 1023: || reg_class_subset_p (REGNO_REG_CLASS (best_reg), ! 1024: REGNO_REG_CLASS (i)))) ! 1025: { ! 1026: register int j; ! 1027: register int lim = i + HARD_REGNO_NREGS (i, mode); ! 1028: for (j = i + 1; ! 1029: (j < lim ! 1030: && ! TEST_HARD_REG_BIT (used, j) ! 1031: && (REGNO_REG_CLASS (j) ! 1032: == REGNO_REG_CLASS (best_reg + (j - i)) ! 1033: || reg_class_subset_p (REGNO_REG_CLASS (j), ! 1034: REGNO_REG_CLASS (best_reg + (j - i))) ! 1035: || reg_class_subset_p (REGNO_REG_CLASS (best_reg + (j - i)), ! 1036: REGNO_REG_CLASS (j)))); ! 1037: j++); ! 1038: if (j == lim) ! 1039: { ! 1040: best_reg = i; ! 1041: break; ! 1042: } ! 1043: } ! 1044: } ! 1045: no_prefs: ! 1046: ! 1047: /* If we haven't succeeded yet, try with caller-saves. ! 1048: We need not check to see if the current function has nonlocal ! 1049: labels because we don't put any pseudos that are live over calls in ! 1050: registers in that case. */ ! 1051: ! 1052: if (flag_caller_saves && best_reg < 0) ! 1053: { ! 1054: /* Did not find a register. If it would be profitable to ! 1055: allocate a call-clobbered register and save and restore it ! 1056: around calls, do that. */ ! 1057: if (! accept_call_clobbered ! 1058: && allocno_calls_crossed[allocno] != 0 ! 1059: && CALLER_SAVE_PROFITABLE (allocno_n_refs[allocno], ! 1060: allocno_calls_crossed[allocno])) ! 1061: { ! 1062: find_reg (allocno, losers, alt_regs_p, 1, retrying); ! 1063: if (reg_renumber[allocno_reg[allocno]] >= 0) ! 1064: { ! 1065: caller_save_needed = 1; ! 1066: return; ! 1067: } ! 1068: } ! 1069: } ! 1070: ! 1071: /* If we haven't succeeded yet, ! 1072: see if some hard reg that conflicts with us ! 1073: was utilized poorly by local-alloc. ! 1074: If so, kick out the regs that were put there by local-alloc ! 1075: so we can use it instead. */ ! 1076: if (best_reg < 0 && !retrying ! 1077: /* Let's not bother with multi-reg allocnos. */ ! 1078: && allocno_size[allocno] == 1) ! 1079: { ! 1080: /* Count from the end, to find the least-used ones first. */ ! 1081: for (i = FIRST_PSEUDO_REGISTER - 1; i >= 0; i--) ! 1082: if (local_reg_n_refs[i] != 0 ! 1083: /* Don't use a reg no good for this pseudo. */ ! 1084: && ! TEST_HARD_REG_BIT (used2, i) ! 1085: && HARD_REGNO_MODE_OK (i, mode) ! 1086: && ((double) local_reg_n_refs[i] / local_reg_live_length[i] ! 1087: < ((double) allocno_n_refs[allocno] ! 1088: / allocno_live_length[allocno]))) ! 1089: { ! 1090: /* Hard reg I was used less in total by local regs ! 1091: than it would be used by this one allocno! */ ! 1092: int k; ! 1093: for (k = 0; k < max_regno; k++) ! 1094: if (reg_renumber[k] >= 0) ! 1095: { ! 1096: int regno = reg_renumber[k]; ! 1097: int endregno ! 1098: = regno + HARD_REGNO_NREGS (regno, PSEUDO_REGNO_MODE (k)); ! 1099: ! 1100: if (i >= regno && i < endregno) ! 1101: reg_renumber[k] = -1; ! 1102: } ! 1103: ! 1104: best_reg = i; ! 1105: break; ! 1106: } ! 1107: } ! 1108: ! 1109: /* Did we find a register? */ ! 1110: ! 1111: if (best_reg >= 0) ! 1112: { ! 1113: register int lim, j; ! 1114: HARD_REG_SET this_reg; ! 1115: ! 1116: /* Yes. Record it as the hard register of this pseudo-reg. */ ! 1117: reg_renumber[allocno_reg[allocno]] = best_reg; ! 1118: /* Also of any pseudo-regs that share with it. */ ! 1119: if (reg_may_share[allocno_reg[allocno]]) ! 1120: for (j = FIRST_PSEUDO_REGISTER; j < max_regno; j++) ! 1121: if (reg_allocno[j] == allocno) ! 1122: reg_renumber[j] = best_reg; ! 1123: ! 1124: /* Make a set of the hard regs being allocated. */ ! 1125: CLEAR_HARD_REG_SET (this_reg); ! 1126: lim = best_reg + HARD_REGNO_NREGS (best_reg, mode); ! 1127: for (j = best_reg; j < lim; j++) ! 1128: { ! 1129: SET_HARD_REG_BIT (this_reg, j); ! 1130: SET_HARD_REG_BIT (regs_used_so_far, j); ! 1131: /* This is no longer a reg used just by local regs. */ ! 1132: local_reg_n_refs[j] = 0; ! 1133: } ! 1134: /* For each other pseudo-reg conflicting with this one, ! 1135: mark it as conflicting with the hard regs this one occupies. */ ! 1136: lim = allocno; ! 1137: for (j = 0; j < max_allocno; j++) ! 1138: if (CONFLICTP (lim, j) || CONFLICTP (j, lim)) ! 1139: { ! 1140: IOR_HARD_REG_SET (hard_reg_conflicts[j], this_reg); ! 1141: } ! 1142: } ! 1143: } ! 1144: ! 1145: /* Called from `reload' to look for a hard reg to put pseudo reg REGNO in. ! 1146: Perhaps it had previously seemed not worth a hard reg, ! 1147: or perhaps its old hard reg has been commandeered for reloads. ! 1148: FORBIDDEN_REGS indicates certain hard regs that may not be used, even if ! 1149: they do not appear to be allocated. ! 1150: If FORBIDDEN_REGS is zero, no regs are forbidden. */ ! 1151: ! 1152: void ! 1153: retry_global_alloc (regno, forbidden_regs) ! 1154: int regno; ! 1155: HARD_REG_SET forbidden_regs; ! 1156: { ! 1157: int allocno = reg_allocno[regno]; ! 1158: if (allocno >= 0) ! 1159: { ! 1160: /* If we have more than one register class, ! 1161: first try allocating in the class that is cheapest ! 1162: for this pseudo-reg. If that fails, try any reg. */ ! 1163: if (N_REG_CLASSES > 1) ! 1164: find_reg (allocno, forbidden_regs, 0, 0, 1); ! 1165: if (reg_renumber[regno] < 0 ! 1166: && reg_alternate_class (regno) != NO_REGS) ! 1167: find_reg (allocno, forbidden_regs, 1, 0, 1); ! 1168: ! 1169: /* If we found a register, modify the RTL for the register to ! 1170: show the hard register, and mark that register live. */ ! 1171: if (reg_renumber[regno] >= 0) ! 1172: { ! 1173: REGNO (regno_reg_rtx[regno]) = reg_renumber[regno]; ! 1174: mark_home_live (regno); ! 1175: } ! 1176: } ! 1177: } ! 1178: ! 1179: /* Record a conflict between register REGNO ! 1180: and everything currently live. ! 1181: REGNO must not be a pseudo reg that was allocated ! 1182: by local_alloc; such numbers must be translated through ! 1183: reg_renumber before calling here. */ ! 1184: ! 1185: static void ! 1186: record_one_conflict (regno) ! 1187: int regno; ! 1188: { ! 1189: register int j; ! 1190: ! 1191: if (regno < FIRST_PSEUDO_REGISTER) ! 1192: /* When a hard register becomes live, ! 1193: record conflicts with live pseudo regs. */ ! 1194: for (j = 0; j < max_allocno; j++) ! 1195: { ! 1196: if (ALLOCNO_LIVE_P (j)) ! 1197: SET_HARD_REG_BIT (hard_reg_conflicts[j], regno); ! 1198: } ! 1199: else ! 1200: /* When a pseudo-register becomes live, ! 1201: record conflicts first with hard regs, ! 1202: then with other pseudo regs. */ ! 1203: { ! 1204: register int ialloc = reg_allocno[regno]; ! 1205: register int ialloc_prod = ialloc * allocno_row_words; ! 1206: IOR_HARD_REG_SET (hard_reg_conflicts[ialloc], hard_regs_live); ! 1207: for (j = allocno_row_words - 1; j >= 0; j--) ! 1208: { ! 1209: #if 0 ! 1210: int k; ! 1211: for (k = 0; k < n_no_conflict_pairs; k++) ! 1212: if (! ((j == no_conflict_pairs[k].allocno1 ! 1213: && ialloc == no_conflict_pairs[k].allocno2) ! 1214: || ! 1215: (j == no_conflict_pairs[k].allocno2 ! 1216: && ialloc == no_conflict_pairs[k].allocno1))) ! 1217: #endif /* 0 */ ! 1218: conflicts[ialloc_prod + j] |= allocnos_live[j]; ! 1219: } ! 1220: } ! 1221: } ! 1222: ! 1223: /* Record all allocnos currently live as conflicting ! 1224: with each other and with all hard regs currently live. ! 1225: ALLOCNO_VEC is a vector of LEN allocnos, all allocnos that ! 1226: are currently live. Their bits are also flagged in allocnos_live. */ ! 1227: ! 1228: static void ! 1229: record_conflicts (allocno_vec, len) ! 1230: register short *allocno_vec; ! 1231: register int len; ! 1232: { ! 1233: register int allocno; ! 1234: register int j; ! 1235: register int ialloc_prod; ! 1236: ! 1237: while (--len >= 0) ! 1238: { ! 1239: allocno = allocno_vec[len]; ! 1240: ialloc_prod = allocno * allocno_row_words; ! 1241: IOR_HARD_REG_SET (hard_reg_conflicts[allocno], hard_regs_live); ! 1242: for (j = allocno_row_words - 1; j >= 0; j--) ! 1243: conflicts[ialloc_prod + j] |= allocnos_live[j]; ! 1244: } ! 1245: } ! 1246: ! 1247: /* Handle the case where REG is set by the insn being scanned, ! 1248: during the forward scan to accumulate conflicts. ! 1249: Store a 1 in regs_live or allocnos_live for this register, record how many ! 1250: consecutive hardware registers it actually needs, ! 1251: and record a conflict with all other registers already live. ! 1252: ! 1253: Note that even if REG does not remain alive after this insn, ! 1254: we must mark it here as live, to ensure a conflict between ! 1255: REG and any other regs set in this insn that really do live. ! 1256: This is because those other regs could be considered after this. ! 1257: ! 1258: REG might actually be something other than a register; ! 1259: if so, we do nothing. ! 1260: ! 1261: SETTER is 0 if this register was modified by an auto-increment (i.e., ! 1262: a REG_INC note was found for it). ! 1263: ! 1264: CLOBBERs are processed here by calling mark_reg_clobber. */ ! 1265: ! 1266: static void ! 1267: mark_reg_store (orig_reg, setter) ! 1268: rtx orig_reg, setter; ! 1269: { ! 1270: register int regno; ! 1271: register rtx reg = orig_reg; ! 1272: ! 1273: /* WORD is which word of a multi-register group is being stored. ! 1274: For the case where the store is actually into a SUBREG of REG. ! 1275: Except we don't use it; I believe the entire REG needs to be ! 1276: made live. */ ! 1277: int word = 0; ! 1278: ! 1279: if (GET_CODE (reg) == SUBREG) ! 1280: { ! 1281: word = SUBREG_WORD (reg); ! 1282: reg = SUBREG_REG (reg); ! 1283: } ! 1284: ! 1285: if (GET_CODE (reg) != REG) ! 1286: return; ! 1287: ! 1288: if (setter && GET_CODE (setter) == CLOBBER) ! 1289: { ! 1290: /* A clobber of a register should be processed here too. */ ! 1291: mark_reg_clobber (orig_reg, setter); ! 1292: return; ! 1293: } ! 1294: ! 1295: regs_set[n_regs_set++] = reg; ! 1296: ! 1297: if (setter) ! 1298: set_preference (reg, SET_SRC (setter)); ! 1299: ! 1300: regno = REGNO (reg); ! 1301: ! 1302: if (reg_renumber[regno] >= 0) ! 1303: regno = reg_renumber[regno] /* + word */; ! 1304: ! 1305: /* Either this is one of the max_allocno pseudo regs not allocated, ! 1306: or it is or has a hardware reg. First handle the pseudo-regs. */ ! 1307: if (regno >= FIRST_PSEUDO_REGISTER) ! 1308: { ! 1309: if (reg_allocno[regno] >= 0) ! 1310: { ! 1311: SET_ALLOCNO_LIVE (reg_allocno[regno]); ! 1312: record_one_conflict (regno); ! 1313: } ! 1314: } ! 1315: /* Handle hardware regs (and pseudos allocated to hard regs). */ ! 1316: else if (! fixed_regs[regno]) ! 1317: { ! 1318: register int last = regno + HARD_REGNO_NREGS (regno, GET_MODE (reg)); ! 1319: while (regno < last) ! 1320: { ! 1321: record_one_conflict (regno); ! 1322: SET_HARD_REG_BIT (hard_regs_live, regno); ! 1323: regno++; ! 1324: } ! 1325: } ! 1326: } ! 1327: ! 1328: /* Like mark_reg_set except notice just CLOBBERs; ignore SETs. */ ! 1329: ! 1330: static void ! 1331: mark_reg_clobber (reg, setter) ! 1332: rtx reg, setter; ! 1333: { ! 1334: register int regno; ! 1335: ! 1336: /* WORD is which word of a multi-register group is being stored. ! 1337: For the case where the store is actually into a SUBREG of REG. ! 1338: Except we don't use it; I believe the entire REG needs to be ! 1339: made live. */ ! 1340: int word = 0; ! 1341: ! 1342: if (GET_CODE (setter) != CLOBBER) ! 1343: return; ! 1344: ! 1345: if (GET_CODE (reg) == SUBREG) ! 1346: { ! 1347: word = SUBREG_WORD (reg); ! 1348: reg = SUBREG_REG (reg); ! 1349: } ! 1350: ! 1351: if (GET_CODE (reg) != REG) ! 1352: return; ! 1353: ! 1354: regs_set[n_regs_set++] = reg; ! 1355: ! 1356: regno = REGNO (reg); ! 1357: ! 1358: if (reg_renumber[regno] >= 0) ! 1359: regno = reg_renumber[regno] /* + word */; ! 1360: ! 1361: /* Either this is one of the max_allocno pseudo regs not allocated, ! 1362: or it is or has a hardware reg. First handle the pseudo-regs. */ ! 1363: if (regno >= FIRST_PSEUDO_REGISTER) ! 1364: { ! 1365: if (reg_allocno[regno] >= 0) ! 1366: { ! 1367: SET_ALLOCNO_LIVE (reg_allocno[regno]); ! 1368: record_one_conflict (regno); ! 1369: } ! 1370: } ! 1371: /* Handle hardware regs (and pseudos allocated to hard regs). */ ! 1372: else if (! fixed_regs[regno]) ! 1373: { ! 1374: register int last = regno + HARD_REGNO_NREGS (regno, GET_MODE (reg)); ! 1375: while (regno < last) ! 1376: { ! 1377: record_one_conflict (regno); ! 1378: SET_HARD_REG_BIT (hard_regs_live, regno); ! 1379: regno++; ! 1380: } ! 1381: } ! 1382: } ! 1383: ! 1384: /* Record that REG has conflicts with all the regs currently live. ! 1385: Do not mark REG itself as live. */ ! 1386: ! 1387: static void ! 1388: mark_reg_conflicts (reg) ! 1389: rtx reg; ! 1390: { ! 1391: register int regno; ! 1392: ! 1393: if (GET_CODE (reg) == SUBREG) ! 1394: reg = SUBREG_REG (reg); ! 1395: ! 1396: if (GET_CODE (reg) != REG) ! 1397: return; ! 1398: ! 1399: regno = REGNO (reg); ! 1400: ! 1401: if (reg_renumber[regno] >= 0) ! 1402: regno = reg_renumber[regno]; ! 1403: ! 1404: /* Either this is one of the max_allocno pseudo regs not allocated, ! 1405: or it is or has a hardware reg. First handle the pseudo-regs. */ ! 1406: if (regno >= FIRST_PSEUDO_REGISTER) ! 1407: { ! 1408: if (reg_allocno[regno] >= 0) ! 1409: record_one_conflict (regno); ! 1410: } ! 1411: /* Handle hardware regs (and pseudos allocated to hard regs). */ ! 1412: else if (! fixed_regs[regno]) ! 1413: { ! 1414: register int last = regno + HARD_REGNO_NREGS (regno, GET_MODE (reg)); ! 1415: while (regno < last) ! 1416: { ! 1417: record_one_conflict (regno); ! 1418: regno++; ! 1419: } ! 1420: } ! 1421: } ! 1422: ! 1423: /* Mark REG as being dead (following the insn being scanned now). ! 1424: Store a 0 in regs_live or allocnos_live for this register. */ ! 1425: ! 1426: static void ! 1427: mark_reg_death (reg) ! 1428: rtx reg; ! 1429: { ! 1430: register int regno = REGNO (reg); ! 1431: ! 1432: /* For pseudo reg, see if it has been assigned a hardware reg. */ ! 1433: if (reg_renumber[regno] >= 0) ! 1434: regno = reg_renumber[regno]; ! 1435: ! 1436: /* Either this is one of the max_allocno pseudo regs not allocated, ! 1437: or it is a hardware reg. First handle the pseudo-regs. */ ! 1438: if (regno >= FIRST_PSEUDO_REGISTER) ! 1439: { ! 1440: if (reg_allocno[regno] >= 0) ! 1441: CLEAR_ALLOCNO_LIVE (reg_allocno[regno]); ! 1442: } ! 1443: /* Handle hardware regs (and pseudos allocated to hard regs). */ ! 1444: else if (! fixed_regs[regno]) ! 1445: { ! 1446: /* Pseudo regs already assigned hardware regs are treated ! 1447: almost the same as explicit hardware regs. */ ! 1448: register int last = regno + HARD_REGNO_NREGS (regno, GET_MODE (reg)); ! 1449: while (regno < last) ! 1450: { ! 1451: CLEAR_HARD_REG_BIT (hard_regs_live, regno); ! 1452: regno++; ! 1453: } ! 1454: } ! 1455: } ! 1456: ! 1457: /* Mark hard reg REGNO as currently live, assuming machine mode MODE ! 1458: for the value stored in it. MODE determines how many consecutive ! 1459: registers are actually in use. Do not record conflicts; ! 1460: it is assumed that the caller will do that. */ ! 1461: ! 1462: static void ! 1463: mark_reg_live_nc (regno, mode) ! 1464: register int regno; ! 1465: enum machine_mode mode; ! 1466: { ! 1467: register int last = regno + HARD_REGNO_NREGS (regno, mode); ! 1468: while (regno < last) ! 1469: { ! 1470: SET_HARD_REG_BIT (hard_regs_live, regno); ! 1471: regno++; ! 1472: } ! 1473: } ! 1474: ! 1475: /* Try to set a preference for an allocno to a hard register. ! 1476: We are passed DEST and SRC which are the operands of a SET. It is known ! 1477: that SRC is a register. If SRC or the first operand of SRC is a register, ! 1478: try to set a preference. If one of the two is a hard register and the other ! 1479: is a pseudo-register, mark the preference. ! 1480: ! 1481: Note that we are not as aggressive as local-alloc in trying to tie a ! 1482: pseudo-register to a hard register. */ ! 1483: ! 1484: static void ! 1485: set_preference (dest, src) ! 1486: rtx dest, src; ! 1487: { ! 1488: int src_regno, dest_regno; ! 1489: /* Amount to add to the hard regno for SRC, or subtract from that for DEST, ! 1490: to compensate for subregs in SRC or DEST. */ ! 1491: int offset = 0; ! 1492: int i; ! 1493: int copy = 1; ! 1494: ! 1495: if (GET_RTX_FORMAT (GET_CODE (src))[0] == 'e') ! 1496: src = XEXP (src, 0), copy = 0; ! 1497: ! 1498: /* Get the reg number for both SRC and DEST. ! 1499: If neither is a reg, give up. */ ! 1500: ! 1501: if (GET_CODE (src) == REG) ! 1502: src_regno = REGNO (src); ! 1503: else if (GET_CODE (src) == SUBREG && GET_CODE (SUBREG_REG (src)) == REG) ! 1504: { ! 1505: src_regno = REGNO (SUBREG_REG (src)); ! 1506: offset += SUBREG_WORD (src); ! 1507: } ! 1508: else ! 1509: return; ! 1510: ! 1511: if (GET_CODE (dest) == REG) ! 1512: dest_regno = REGNO (dest); ! 1513: else if (GET_CODE (dest) == SUBREG && GET_CODE (SUBREG_REG (dest)) == REG) ! 1514: { ! 1515: dest_regno = REGNO (SUBREG_REG (dest)); ! 1516: offset -= SUBREG_WORD (dest); ! 1517: } ! 1518: else ! 1519: return; ! 1520: ! 1521: /* Convert either or both to hard reg numbers. */ ! 1522: ! 1523: if (reg_renumber[src_regno] >= 0) ! 1524: src_regno = reg_renumber[src_regno]; ! 1525: ! 1526: if (reg_renumber[dest_regno] >= 0) ! 1527: dest_regno = reg_renumber[dest_regno]; ! 1528: ! 1529: /* Now if one is a hard reg and the other is a global pseudo ! 1530: then give the other a preference. */ ! 1531: ! 1532: if (dest_regno < FIRST_PSEUDO_REGISTER && src_regno >= FIRST_PSEUDO_REGISTER ! 1533: && reg_allocno[src_regno] >= 0) ! 1534: { ! 1535: dest_regno -= offset; ! 1536: if (dest_regno >= 0 && dest_regno < FIRST_PSEUDO_REGISTER) ! 1537: { ! 1538: if (copy) ! 1539: SET_REGBIT (hard_reg_copy_preferences, ! 1540: reg_allocno[src_regno], dest_regno); ! 1541: ! 1542: SET_REGBIT (hard_reg_preferences, ! 1543: reg_allocno[src_regno], dest_regno); ! 1544: for (i = dest_regno; ! 1545: i < dest_regno + HARD_REGNO_NREGS (dest_regno, GET_MODE (dest)); ! 1546: i++) ! 1547: SET_REGBIT (hard_reg_full_preferences, reg_allocno[src_regno], i); ! 1548: } ! 1549: } ! 1550: ! 1551: if (src_regno < FIRST_PSEUDO_REGISTER && dest_regno >= FIRST_PSEUDO_REGISTER ! 1552: && reg_allocno[dest_regno] >= 0) ! 1553: { ! 1554: src_regno += offset; ! 1555: if (src_regno >= 0 && src_regno < FIRST_PSEUDO_REGISTER) ! 1556: { ! 1557: if (copy) ! 1558: SET_REGBIT (hard_reg_copy_preferences, ! 1559: reg_allocno[dest_regno], src_regno); ! 1560: ! 1561: SET_REGBIT (hard_reg_preferences, ! 1562: reg_allocno[dest_regno], src_regno); ! 1563: for (i = src_regno; ! 1564: i < src_regno + HARD_REGNO_NREGS (src_regno, GET_MODE (src)); ! 1565: i++) ! 1566: SET_REGBIT (hard_reg_full_preferences, reg_allocno[dest_regno], i); ! 1567: } ! 1568: } ! 1569: } ! 1570: ! 1571: /* Indicate that hard register number FROM was eliminated and replaced with ! 1572: an offset from hard register number TO. The status of hard registers live ! 1573: at the start of a basic block is updated by replacing a use of FROM with ! 1574: a use of TO. */ ! 1575: ! 1576: void ! 1577: mark_elimination (from, to) ! 1578: int from, to; ! 1579: { ! 1580: int i; ! 1581: ! 1582: for (i = 0; i < n_basic_blocks; i++) ! 1583: if ((basic_block_live_at_start[i][from / REGSET_ELT_BITS] ! 1584: & ((REGSET_ELT_TYPE) 1 << (from % REGSET_ELT_BITS))) != 0) ! 1585: { ! 1586: basic_block_live_at_start[i][from / REGSET_ELT_BITS] ! 1587: &= ~ ((REGSET_ELT_TYPE) 1 << (from % REGSET_ELT_BITS)); ! 1588: basic_block_live_at_start[i][to / REGSET_ELT_BITS] ! 1589: |= ((REGSET_ELT_TYPE) 1 << (to % REGSET_ELT_BITS)); ! 1590: } ! 1591: } ! 1592: ! 1593: /* Print debugging trace information if -greg switch is given, ! 1594: showing the information on which the allocation decisions are based. */ ! 1595: ! 1596: static void ! 1597: dump_conflicts (file) ! 1598: FILE *file; ! 1599: { ! 1600: register int i; ! 1601: register int has_preferences; ! 1602: fprintf (file, ";; %d regs to allocate:", max_allocno); ! 1603: for (i = 0; i < max_allocno; i++) ! 1604: { ! 1605: int j; ! 1606: fprintf (file, " %d", allocno_reg[allocno_order[i]]); ! 1607: for (j = 0; j < max_regno; j++) ! 1608: if (reg_allocno[j] == allocno_order[i] ! 1609: && j != allocno_reg[allocno_order[i]]) ! 1610: fprintf (file, "+%d", j); ! 1611: if (allocno_size[allocno_order[i]] != 1) ! 1612: fprintf (file, " (%d)", allocno_size[allocno_order[i]]); ! 1613: } ! 1614: fprintf (file, "\n"); ! 1615: ! 1616: for (i = 0; i < max_allocno; i++) ! 1617: { ! 1618: register int j; ! 1619: fprintf (file, ";; %d conflicts:", allocno_reg[i]); ! 1620: for (j = 0; j < max_allocno; j++) ! 1621: if (CONFLICTP (i, j) || CONFLICTP (j, i)) ! 1622: fprintf (file, " %d", allocno_reg[j]); ! 1623: for (j = 0; j < FIRST_PSEUDO_REGISTER; j++) ! 1624: if (TEST_HARD_REG_BIT (hard_reg_conflicts[i], j)) ! 1625: fprintf (file, " %d", j); ! 1626: fprintf (file, "\n"); ! 1627: ! 1628: has_preferences = 0; ! 1629: for (j = 0; j < FIRST_PSEUDO_REGISTER; j++) ! 1630: if (TEST_HARD_REG_BIT (hard_reg_preferences[i], j)) ! 1631: has_preferences = 1; ! 1632: ! 1633: if (! has_preferences) ! 1634: continue; ! 1635: fprintf (file, ";; %d preferences:", allocno_reg[i]); ! 1636: for (j = 0; j < FIRST_PSEUDO_REGISTER; j++) ! 1637: if (TEST_HARD_REG_BIT (hard_reg_preferences[i], j)) ! 1638: fprintf (file, " %d", j); ! 1639: fprintf (file, "\n"); ! 1640: } ! 1641: fprintf (file, "\n"); ! 1642: } ! 1643: ! 1644: void ! 1645: dump_global_regs (file) ! 1646: FILE *file; ! 1647: { ! 1648: register int i, j; ! 1649: ! 1650: fprintf (file, ";; Register dispositions:\n"); ! 1651: for (i = FIRST_PSEUDO_REGISTER, j = 0; i < max_regno; i++) ! 1652: if (reg_renumber[i] >= 0) ! 1653: { ! 1654: fprintf (file, "%d in %d ", i, reg_renumber[i]); ! 1655: if (++j % 6 == 0) ! 1656: fprintf (file, "\n"); ! 1657: } ! 1658: ! 1659: fprintf (file, "\n\n;; Hard regs used: "); ! 1660: for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) ! 1661: if (regs_ever_live[i]) ! 1662: fprintf (file, " %d", i); ! 1663: fprintf (file, "\n\n"); ! 1664: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.