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