|
|
1.1 ! root 1: /* Compute register class preferences for pseudo-registers. ! 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: /* This file contains two passes of the compiler: reg_scan and reg_class. ! 22: It also defines some tables of information about the hardware registers ! 23: and a function init_reg_sets to initialize the tables. */ ! 24: ! 25: #include "config.h" ! 26: #include "rtl.h" ! 27: #include "hard-reg-set.h" ! 28: #include "flags.h" ! 29: #include "basic-block.h" ! 30: #include "regs.h" ! 31: #include "insn-config.h" ! 32: #include "recog.h" ! 33: ! 34: #ifndef REGISTER_MOVE_COST ! 35: #define REGISTER_MOVE_COST(x, y) 2 ! 36: #endif ! 37: ! 38: #ifndef MEMORY_MOVE_COST ! 39: #define MEMORY_MOVE_COST(x) 2 ! 40: #endif ! 41: ! 42: /* Register tables used by many passes. */ ! 43: ! 44: /* Indexed by hard register number, contains 1 for registers ! 45: that are fixed use (stack pointer, pc, frame pointer, etc.). ! 46: These are the registers that cannot be used to allocate ! 47: a pseudo reg whose life does not cross calls. */ ! 48: ! 49: char fixed_regs[FIRST_PSEUDO_REGISTER]; ! 50: ! 51: /* Same info as a HARD_REG_SET. */ ! 52: ! 53: HARD_REG_SET fixed_reg_set; ! 54: ! 55: /* Data for initializing the above. */ ! 56: ! 57: static char initial_fixed_regs[] = FIXED_REGISTERS; ! 58: ! 59: /* Indexed by hard register number, contains 1 for registers ! 60: that are fixed use or are clobbered by function calls. ! 61: These are the registers that cannot be used to allocate ! 62: a pseudo reg whose life crosses calls. */ ! 63: ! 64: char call_used_regs[FIRST_PSEUDO_REGISTER]; ! 65: ! 66: /* Same info as a HARD_REG_SET. */ ! 67: ! 68: HARD_REG_SET call_used_reg_set; ! 69: ! 70: /* Data for initializing the above. */ ! 71: ! 72: static char initial_call_used_regs[] = CALL_USED_REGISTERS; ! 73: ! 74: /* Indexed by hard register number, contains 1 for registers that are ! 75: fixed use -- i.e. in fixed_regs -- or a function value return register ! 76: or STRUCT_VALUE_REGNUM or STATIC_CHAIN_REGNUM. These are the ! 77: registers that cannot hold quantities across calls even if we are ! 78: willing to save and restore them. */ ! 79: ! 80: char call_fixed_regs[FIRST_PSEUDO_REGISTER]; ! 81: ! 82: /* The same info as a HARD_REG_SET. */ ! 83: ! 84: HARD_REG_SET call_fixed_reg_set; ! 85: ! 86: /* Number of non-fixed registers. */ ! 87: ! 88: int n_non_fixed_regs; ! 89: ! 90: /* Indexed by hard register number, contains 1 for registers ! 91: that are being used for global register decls. ! 92: These must be exempt from ordinary flow analysis ! 93: and are also considered fixed. */ ! 94: ! 95: char global_regs[FIRST_PSEUDO_REGISTER]; ! 96: ! 97: /* Table of register numbers in the order in which to try to use them. */ ! 98: #ifdef REG_ALLOC_ORDER ! 99: int reg_alloc_order[FIRST_PSEUDO_REGISTER] = REG_ALLOC_ORDER; ! 100: #endif ! 101: ! 102: /* For each reg class, a HARD_REG_SET saying which registers are in it. */ ! 103: ! 104: HARD_REG_SET reg_class_contents[] = REG_CLASS_CONTENTS; ! 105: ! 106: /* For each reg class, number of regs it contains. */ ! 107: ! 108: int reg_class_size[N_REG_CLASSES]; ! 109: ! 110: /* For each reg class, table listing all the containing classes. */ ! 111: ! 112: enum reg_class reg_class_superclasses[N_REG_CLASSES][N_REG_CLASSES]; ! 113: ! 114: /* For each reg class, table listing all the classes contained in it. */ ! 115: ! 116: enum reg_class reg_class_subclasses[N_REG_CLASSES][N_REG_CLASSES]; ! 117: ! 118: /* For each pair of reg classes, ! 119: a largest reg class contained in their union. */ ! 120: ! 121: enum reg_class reg_class_subunion[N_REG_CLASSES][N_REG_CLASSES]; ! 122: ! 123: /* For each pair of reg classes, ! 124: the smallest reg class containing their union. */ ! 125: ! 126: enum reg_class reg_class_superunion[N_REG_CLASSES][N_REG_CLASSES]; ! 127: ! 128: /* Array containing all of the register names */ ! 129: ! 130: char *reg_names[] = REGISTER_NAMES; ! 131: ! 132: ! 133: /* Indexed by n, gives number of times (REG n) is set or clobbered. ! 134: This information remains valid for the rest of the compilation ! 135: of the current function; it is used to control register allocation. ! 136: ! 137: This information applies to both hard registers and pseudo registers, ! 138: unlike much of the information above. */ ! 139: ! 140: short *reg_n_sets; ! 141: ! 142: /* Function called only once to initialize the above data on reg usage. ! 143: Once this is done, various switches may override. */ ! 144: ! 145: void ! 146: init_reg_sets () ! 147: { ! 148: register int i, j; ! 149: ! 150: bcopy (initial_fixed_regs, fixed_regs, sizeof fixed_regs); ! 151: bcopy (initial_call_used_regs, call_used_regs, sizeof call_used_regs); ! 152: bzero (global_regs, sizeof global_regs); ! 153: ! 154: /* Compute number of hard regs in each class. */ ! 155: ! 156: bzero (reg_class_size, sizeof reg_class_size); ! 157: for (i = 0; i < N_REG_CLASSES; i++) ! 158: for (j = 0; j < FIRST_PSEUDO_REGISTER; j++) ! 159: if (TEST_HARD_REG_BIT (reg_class_contents[i], j)) ! 160: reg_class_size[i]++; ! 161: ! 162: /* Initialize the table of subunions. ! 163: reg_class_subunion[I][J] gets the largest-numbered reg-class ! 164: that is contained in the union of classes I and J. */ ! 165: ! 166: for (i = 0; i < N_REG_CLASSES; i++) ! 167: { ! 168: for (j = 0; j < N_REG_CLASSES; j++) ! 169: { ! 170: #ifdef HARD_REG_SET ! 171: register /* Declare it register if it's a scalar. */ ! 172: #endif ! 173: HARD_REG_SET c; ! 174: register int k; ! 175: ! 176: COPY_HARD_REG_SET (c, reg_class_contents[i]); ! 177: IOR_HARD_REG_SET (c, reg_class_contents[j]); ! 178: for (k = 0; k < N_REG_CLASSES; k++) ! 179: { ! 180: GO_IF_HARD_REG_SUBSET (reg_class_contents[k], c, ! 181: subclass1); ! 182: continue; ! 183: ! 184: subclass1: ! 185: /* keep the largest subclass */ /* SPEE 900308 */ ! 186: GO_IF_HARD_REG_SUBSET (reg_class_contents[k], ! 187: reg_class_contents[(int) reg_class_subunion[i][j]], ! 188: subclass2); ! 189: reg_class_subunion[i][j] = (enum reg_class) k; ! 190: subclass2: ! 191: ; ! 192: } ! 193: } ! 194: } ! 195: ! 196: /* Initialize the table of superunions. ! 197: reg_class_superunion[I][J] gets the smallest-numbered reg-class ! 198: containing the union of classes I and J. */ ! 199: ! 200: for (i = 0; i < N_REG_CLASSES; i++) ! 201: { ! 202: for (j = 0; j < N_REG_CLASSES; j++) ! 203: { ! 204: #ifdef HARD_REG_SET ! 205: register /* Declare it register if it's a scalar. */ ! 206: #endif ! 207: HARD_REG_SET c; ! 208: register int k; ! 209: ! 210: COPY_HARD_REG_SET (c, reg_class_contents[i]); ! 211: IOR_HARD_REG_SET (c, reg_class_contents[j]); ! 212: for (k = 0; k < N_REG_CLASSES; k++) ! 213: GO_IF_HARD_REG_SUBSET (c, reg_class_contents[k], superclass); ! 214: ! 215: superclass: ! 216: reg_class_superunion[i][j] = (enum reg_class) k; ! 217: } ! 218: } ! 219: ! 220: /* Initialize the tables of subclasses and superclasses of each reg class. ! 221: First clear the whole table, then add the elements as they are found. */ ! 222: ! 223: for (i = 0; i < N_REG_CLASSES; i++) ! 224: { ! 225: for (j = 0; j < N_REG_CLASSES; j++) ! 226: { ! 227: reg_class_superclasses[i][j] = LIM_REG_CLASSES; ! 228: reg_class_subclasses[i][j] = LIM_REG_CLASSES; ! 229: } ! 230: } ! 231: ! 232: for (i = 0; i < N_REG_CLASSES; i++) ! 233: { ! 234: if (i == (int) NO_REGS) ! 235: continue; ! 236: ! 237: for (j = i + 1; j < N_REG_CLASSES; j++) ! 238: { ! 239: enum reg_class *p; ! 240: ! 241: GO_IF_HARD_REG_SUBSET (reg_class_contents[i], reg_class_contents[j], ! 242: subclass); ! 243: continue; ! 244: subclass: ! 245: /* Reg class I is a subclass of J. ! 246: Add J to the table of superclasses of I. */ ! 247: p = ®_class_superclasses[i][0]; ! 248: while (*p != LIM_REG_CLASSES) p++; ! 249: *p = (enum reg_class) j; ! 250: /* Add I to the table of superclasses of J. */ ! 251: p = ®_class_subclasses[j][0]; ! 252: while (*p != LIM_REG_CLASSES) p++; ! 253: *p = (enum reg_class) i; ! 254: } ! 255: } ! 256: } ! 257: ! 258: /* After switches have been processed, which perhaps alter ! 259: `fixed_regs' and `call_used_regs', convert them to HARD_REG_SETs. */ ! 260: ! 261: void ! 262: init_reg_sets_1 () ! 263: { ! 264: register int i; ! 265: ! 266: /* This macro allows the fixed or call-used registers ! 267: to depend on target flags. */ ! 268: ! 269: #ifdef CONDITIONAL_REGISTER_USAGE ! 270: CONDITIONAL_REGISTER_USAGE; ! 271: #endif ! 272: ! 273: for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) ! 274: if (global_regs[i]) ! 275: { ! 276: if (call_used_regs[i] && ! fixed_regs[i]) ! 277: warning ("call-clobbered register used for global register variable"); ! 278: fixed_regs[i] = 1; ! 279: /* Prevent saving/restoring of this reg. */ ! 280: call_used_regs[i] = 1; ! 281: } ! 282: ! 283: /* Initialize "constant" tables. */ ! 284: ! 285: CLEAR_HARD_REG_SET (fixed_reg_set); ! 286: CLEAR_HARD_REG_SET (call_used_reg_set); ! 287: CLEAR_HARD_REG_SET (call_fixed_reg_set); ! 288: ! 289: bcopy (fixed_regs, call_fixed_regs, sizeof call_fixed_regs); ! 290: #ifdef STRUCT_VALUE_REGNUM ! 291: call_fixed_regs[STRUCT_VALUE_REGNUM] = 1; ! 292: #endif ! 293: #ifdef STATIC_CHAIN_REGNUM ! 294: call_fixed_regs[STATIC_CHAIN_REGNUM] = 1; ! 295: #endif ! 296: ! 297: n_non_fixed_regs = 0; ! 298: ! 299: for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) ! 300: { ! 301: if (FUNCTION_VALUE_REGNO_P (i)) ! 302: call_fixed_regs[i] = 1; ! 303: if (fixed_regs[i]) ! 304: SET_HARD_REG_BIT (fixed_reg_set, i); ! 305: else ! 306: n_non_fixed_regs++; ! 307: ! 308: if (call_used_regs[i]) ! 309: SET_HARD_REG_BIT (call_used_reg_set, i); ! 310: if (call_fixed_regs[i]) ! 311: SET_HARD_REG_BIT (call_fixed_reg_set, i); ! 312: } ! 313: } ! 314: ! 315: /* Specify the usage characteristics of the register named NAME. ! 316: It should be a fixed register if FIXED and a ! 317: call-used register if CALL_USED. */ ! 318: ! 319: void ! 320: fix_register (name, fixed, call_used) ! 321: char *name; ! 322: int fixed, call_used; ! 323: { ! 324: int i; ! 325: ! 326: /* Decode the name and update the primary form of ! 327: the register info. */ ! 328: ! 329: for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) ! 330: if (reg_names[i][0] && ! strcmp (reg_names[i], name)) ! 331: { ! 332: fixed_regs[i] = fixed; ! 333: call_used_regs[i] = call_used; ! 334: break; ! 335: } ! 336: ! 337: if (i == FIRST_PSEUDO_REGISTER) ! 338: { ! 339: warning ("unknown register name: %s", name); ! 340: return; ! 341: } ! 342: } ! 343: ! 344: /* Now the data and code for the `regclass' pass, which happens ! 345: just before local-alloc. */ ! 346: ! 347: /* savings[R].savings[CL] is twice the amount saved by putting register R ! 348: in class CL. This data is used within `regclass' and freed ! 349: when it is finished. */ ! 350: ! 351: struct savings ! 352: { ! 353: short savings[N_REG_CLASSES]; ! 354: short memcost; ! 355: short nrefs; ! 356: }; ! 357: ! 358: static struct savings *savings; ! 359: ! 360: /* (enum reg_class) prefclass[R] is the preferred class for pseudo number R. ! 361: This is available after `regclass' is run. */ ! 362: ! 363: static char *prefclass; ! 364: ! 365: /* preferred_or_nothing[R] is nonzero if we should put pseudo number R ! 366: in memory if we can't get its perferred class. ! 367: This is available after `regclass' is run. */ ! 368: ! 369: static char *preferred_or_nothing; ! 370: ! 371: /* Record the depth of loops that we are in, 1 for no loops. */ ! 372: ! 373: static int loop_depth; ! 374: ! 375: void reg_class_record (); ! 376: void record_address_regs (); ! 377: ! 378: ! 379: /* Return the reg_class in which pseudo reg number REGNO is best allocated. ! 380: This function is sometimes called before the info has been computed. ! 381: When that happens, just return GENERAL_REGS, which is innocuous. */ ! 382: ! 383: enum reg_class ! 384: reg_preferred_class (regno) ! 385: int regno; ! 386: { ! 387: if (prefclass == 0) ! 388: return GENERAL_REGS; ! 389: return (enum reg_class) prefclass[regno]; ! 390: } ! 391: ! 392: int ! 393: reg_preferred_or_nothing (regno) ! 394: { ! 395: if (prefclass == 0) ! 396: return 0; ! 397: return preferred_or_nothing[regno]; ! 398: } ! 399: ! 400: /* This prevents dump_flow_info from losing if called ! 401: before regclass is run. */ ! 402: ! 403: void ! 404: regclass_init () ! 405: { ! 406: prefclass = 0; ! 407: } ! 408: ! 409: /* This is a pass of the compiler that scans all instructions ! 410: and calculates the preferred class for each pseudo-register. ! 411: This information can be accessed later by calling `reg_preferred_class'. ! 412: This pass comes just before local register allocation. */ ! 413: ! 414: void ! 415: regclass (f, nregs) ! 416: rtx f; ! 417: int nregs; ! 418: { ! 419: #ifdef REGISTER_CONSTRAINTS ! 420: register rtx insn; ! 421: register int i; ! 422: ! 423: init_recog (); ! 424: ! 425: /* Zero out our accumulation of the cost of each class for each reg. */ ! 426: ! 427: savings = (struct savings *) alloca (nregs * sizeof (struct savings)); ! 428: bzero (savings, nregs * sizeof (struct savings)); ! 429: ! 430: loop_depth = 1; ! 431: ! 432: /* Scan the instructions and record each time it would ! 433: save code to put a certain register in a certain class. */ ! 434: ! 435: for (insn = f; insn; insn = NEXT_INSN (insn)) ! 436: { ! 437: if (GET_CODE (insn) == NOTE ! 438: && NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_BEG) ! 439: loop_depth++; ! 440: else if (GET_CODE (insn) == NOTE ! 441: && NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_END) ! 442: loop_depth--; ! 443: else if ((GET_CODE (insn) == INSN ! 444: && GET_CODE (PATTERN (insn)) != USE ! 445: && GET_CODE (PATTERN (insn)) != CLOBBER ! 446: && GET_CODE (PATTERN (insn)) != ASM_INPUT) ! 447: || (GET_CODE (insn) == JUMP_INSN ! 448: && GET_CODE (PATTERN (insn)) != ADDR_VEC ! 449: && GET_CODE (PATTERN (insn)) != ADDR_DIFF_VEC) ! 450: || GET_CODE (insn) == CALL_INSN) ! 451: { ! 452: if (GET_CODE (insn) == INSN && asm_noperands (PATTERN (insn)) >= 0) ! 453: { ! 454: int noperands = asm_noperands (PATTERN (insn)); ! 455: /* We don't use alloca because alloca would not free ! 456: any of the space until this function returns. */ ! 457: rtx *operands = (rtx *) oballoc (noperands * sizeof (rtx)); ! 458: char **constraints ! 459: = (char **) oballoc (noperands * sizeof (char *)); ! 460: ! 461: decode_asm_operands (PATTERN (insn), operands, 0, constraints, 0); ! 462: ! 463: for (i = noperands - 1; i >= 0; i--) ! 464: reg_class_record (operands[i], i, constraints); ! 465: ! 466: obfree (operands); ! 467: } ! 468: else ! 469: { ! 470: int insn_code_number = recog_memoized (insn); ! 471: rtx set = single_set (insn); ! 472: ! 473: insn_extract (insn); ! 474: ! 475: for (i = insn_n_operands[insn_code_number] - 1; i >= 0; i--) ! 476: reg_class_record (recog_operand[i], i, ! 477: insn_operand_constraint[insn_code_number]); ! 478: ! 479: /* If this insn loads a parameter from its stack slot, ! 480: then it represents a savings, rather than a cost, ! 481: if the parameter is stored in memory. Record this fact. */ ! 482: if (set != 0 && GET_CODE (SET_DEST (set)) == REG ! 483: && GET_CODE (SET_SRC (set)) == MEM) ! 484: { ! 485: rtx note = find_reg_note (insn, REG_EQUIV, 0); ! 486: if (note != 0 && GET_CODE (XEXP (note, 0)) == MEM) ! 487: savings[REGNO (SET_DEST (set))].memcost ! 488: -= (MEMORY_MOVE_COST (GET_MODE (SET_DEST (set))) ! 489: * loop_depth); ! 490: } ! 491: ! 492: /* Improve handling of two-address insns such as ! 493: (set X (ashift CONST Y)) where CONST must be made to match X. ! 494: Change it into two insns: (set X CONST) (set X (ashift X Y)). ! 495: If we left this for reloading, it would probably get three ! 496: insns because X and Y might go in the same place. ! 497: This prevents X and Y from receiving the same hard reg. ! 498: ! 499: We can only do this if the modes of operands 0 and 1 (which ! 500: might not be the same) are tieable. */ ! 501: ! 502: if (optimize ! 503: && insn_n_operands[insn_code_number] >= 3 ! 504: && insn_operand_constraint[insn_code_number][1][0] == '0' ! 505: && insn_operand_constraint[insn_code_number][1][1] == 0 ! 506: && CONSTANT_P (recog_operand[1]) ! 507: && ! rtx_equal_p (recog_operand[0], recog_operand[1]) ! 508: && ! rtx_equal_p (recog_operand[0], recog_operand[2]) ! 509: && GET_CODE (recog_operand[0]) == REG ! 510: && MODES_TIEABLE_P (GET_MODE (recog_operand[0]), ! 511: insn_operand_mode[insn_code_number][1])) ! 512: { ! 513: rtx previnsn = prev_real_insn (insn); ! 514: rtx dest ! 515: = gen_lowpart (insn_operand_mode[insn_code_number][1], ! 516: recog_operand[0]); ! 517: rtx newinsn ! 518: = emit_insn_before (gen_move_insn (dest, recog_operand[1]), ! 519: insn); ! 520: ! 521: /* If this insn was the start of a basic block, ! 522: include the new insn in that block. */ ! 523: if (previnsn == 0 || GET_CODE (previnsn) == JUMP_INSN) ! 524: { ! 525: int b; ! 526: for (b = 0; b < n_basic_blocks; b++) ! 527: if (insn == basic_block_head[b]) ! 528: basic_block_head[b] = newinsn; ! 529: } ! 530: ! 531: /* This makes one more setting of new insns's destination. */ ! 532: reg_n_sets[REGNO (recog_operand[0])]++; ! 533: ! 534: *recog_operand_loc[1] = recog_operand[0]; ! 535: for (i = insn_n_dups[insn_code_number] - 1; i >= 0; i--) ! 536: if (recog_dup_num[i] == 1) ! 537: *recog_dup_loc[i] = recog_operand[0]; ! 538: } ! 539: } ! 540: } ! 541: } ! 542: ! 543: /* Now for each register look at how desirable each class is ! 544: and find which class is preferred. Store that in `prefclass[REGNO]'. */ ! 545: ! 546: prefclass = (char *) oballoc (nregs); ! 547: ! 548: preferred_or_nothing = (char *) oballoc (nregs); ! 549: ! 550: for (i = FIRST_PSEUDO_REGISTER; i < nregs; i++) ! 551: { ! 552: register int best_savings = 0; ! 553: enum reg_class best = ALL_REGS; ! 554: ! 555: /* This is an enum reg_class, but we call it an int ! 556: to save lots of casts. */ ! 557: register int class; ! 558: register struct savings *p = &savings[i]; ! 559: ! 560: for (class = (int) ALL_REGS - 1; class > 0; class--) ! 561: { ! 562: if (p->savings[class] > best_savings) ! 563: { ! 564: best_savings = p->savings[class]; ! 565: best = (enum reg_class) class; ! 566: } ! 567: else if (p->savings[class] == best_savings) ! 568: { ! 569: best = reg_class_subunion[(int)best][class]; ! 570: } ! 571: } ! 572: ! 573: #if 0 ! 574: /* Note that best_savings is twice number of places something ! 575: is saved. */ ! 576: if ((best_savings - p->savings[(int) GENERAL_REGS]) * 5 < reg_n_refs[i]) ! 577: prefclass[i] = (int) GENERAL_REGS; ! 578: else ! 579: prefclass[i] = (int) best; ! 580: #else ! 581: /* We cast to (int) because (char) hits bugs in some compilers. */ ! 582: prefclass[i] = (int) best; ! 583: #endif ! 584: ! 585: /* reg_n_refs + p->memcost measures the cost of putting in memory. ! 586: If a GENERAL_REG is no better, don't even try for one. ! 587: Since savings and memcost are 2 * number of refs, ! 588: this effectively counts each memory operand not needing reloading ! 589: as costing 1/2 of a reload insn. */ ! 590: if (reg_n_refs != 0) ! 591: preferred_or_nothing[i] ! 592: = ((best_savings - p->savings[(int) GENERAL_REGS]) ! 593: >= p->nrefs + p->memcost); ! 594: } ! 595: #endif /* REGISTER_CONSTRAINTS */ ! 596: } ! 597: ! 598: #ifdef REGISTER_CONSTRAINTS ! 599: ! 600: /* Scan an operand OP for register class preferences. ! 601: OPNO is the operand number, and CONSTRAINTS is the constraint ! 602: vector for the insn. ! 603: ! 604: Record the preferred register classes from the constraint for OP ! 605: if OP is a register. If OP is a memory reference, record suitable ! 606: preferences for registers used in the address. */ ! 607: ! 608: void ! 609: reg_class_record (op, opno, constraints) ! 610: rtx op; ! 611: int opno; ! 612: char **constraints; ! 613: { ! 614: char *constraint = constraints[opno]; ! 615: register char *p; ! 616: register enum reg_class class = NO_REGS; ! 617: char *next = 0; ! 618: int memok = 0; ! 619: int double_cost = 0; ! 620: ! 621: if (op == 0) ! 622: return; ! 623: ! 624: while (1) ! 625: { ! 626: if (GET_CODE (op) == SUBREG) ! 627: op = SUBREG_REG (op); ! 628: else break; ! 629: } ! 630: ! 631: /* Memory reference: scan the address. */ ! 632: ! 633: if (GET_CODE (op) == MEM) ! 634: record_address_regs (XEXP (op, 0), 2, 0); ! 635: ! 636: if (GET_CODE (op) != REG) ! 637: { ! 638: /* If the constraint says the operand is supposed to BE an address, ! 639: scan it as one. */ ! 640: ! 641: if (constraint != 0 && constraint[0] == 'p') ! 642: record_address_regs (op, 2, 0); ! 643: return; ! 644: } ! 645: ! 646: /* Operand is a register: examine the constraint for specified classes. */ ! 647: ! 648: for (p = constraint; *p || next; p++) ! 649: { ! 650: enum reg_class new_class = NO_REGS; ! 651: ! 652: if (*p == 0) ! 653: { ! 654: p = next; ! 655: next = 0; ! 656: } ! 657: switch (*p) ! 658: { ! 659: case '=': ! 660: case '?': ! 661: case '#': ! 662: case '&': ! 663: case '!': ! 664: case '%': ! 665: case 'E': ! 666: case 'F': ! 667: case 'G': ! 668: case 'H': ! 669: case 'i': ! 670: case 'n': ! 671: case 's': ! 672: case 'p': ! 673: case ',': ! 674: case 'I': ! 675: case 'J': ! 676: case 'K': ! 677: case 'L': ! 678: case 'M': ! 679: case 'N': ! 680: case 'O': ! 681: case 'P': ! 682: #ifdef EXTRA_CONSTRAINT ! 683: case 'Q': ! 684: case 'R': ! 685: case 'S': ! 686: case 'T': ! 687: case 'U': ! 688: #endif ! 689: case 'V': ! 690: case 'X': ! 691: break; ! 692: ! 693: case '+': ! 694: /* An input-output operand is twice as costly if it loses. */ ! 695: double_cost = 1; ! 696: break; ! 697: ! 698: case 'm': ! 699: case 'o': ! 700: memok = 1; ! 701: break; ! 702: ! 703: /* * means ignore following letter ! 704: when choosing register preferences. */ ! 705: case '*': ! 706: p++; ! 707: break; ! 708: ! 709: case 'g': ! 710: case 'r': ! 711: new_class = GENERAL_REGS; ! 712: break; ! 713: ! 714: case '0': ! 715: case '1': ! 716: case '2': ! 717: case '3': ! 718: case '4': ! 719: /* If constraint says "match another operand", ! 720: use that operand's constraint to choose preferences. */ ! 721: if (*p - '0' < opno) ! 722: { ! 723: opno = *p - '0'; ! 724: next = constraints[opno]; ! 725: } ! 726: break; ! 727: ! 728: default: ! 729: new_class = REG_CLASS_FROM_LETTER (*p); ! 730: break; ! 731: } ! 732: ! 733: /* If this object can fit into the class requested, compute the subunion ! 734: of the requested class and classes found so far. */ ! 735: if (CLASS_MAX_NREGS (new_class, GET_MODE (op)) ! 736: <= reg_class_size[(int) new_class]) ! 737: class = reg_class_subunion[(int) class][(int) new_class]; ! 738: } ! 739: ! 740: { ! 741: register int i; ! 742: register struct savings *pp; ! 743: register enum reg_class class1; ! 744: int cost = 2 * (1 + double_cost) * loop_depth; ! 745: pp = &savings[REGNO (op)]; ! 746: ! 747: /* Increment the savings for this reg ! 748: for each class contained in the one the constraint asks for. */ ! 749: ! 750: if (class != NO_REGS && class != ALL_REGS) ! 751: { ! 752: int extracost; ! 753: ! 754: pp->savings[(int) class] += cost; ! 755: for (i = 0; ; i++) ! 756: { ! 757: class1 = reg_class_subclasses[(int)class][i]; ! 758: if (class1 == LIM_REG_CLASSES) ! 759: break; ! 760: pp->savings[(int) class1] += cost; ! 761: } ! 762: /* If it's slow to move data between this class and GENERAL_REGS, ! 763: record that fact. */ ! 764: extracost = (REGISTER_MOVE_COST (class, GENERAL_REGS) - 2) * loop_depth; ! 765: if (extracost > 0) ! 766: { ! 767: /* Check that this class and GENERAL_REGS don't overlap. ! 768: REGISTER_MOVE_COST is meaningless if there is overlap. */ ! 769: HARD_REG_SET temp; ! 770: COMPL_HARD_REG_SET (temp, reg_class_contents[(int) class]); ! 771: GO_IF_HARD_REG_SUBSET (reg_class_contents[(int) GENERAL_REGS], ! 772: temp, label1); ! 773: /* Overlap. */ ! 774: goto label2; ! 775: ! 776: label1: /* No overlap. */ ! 777: /* Charge this extra cost to GENERAL_REGS ! 778: and all its subclasses (none of which overlap this class). */ ! 779: extracost = extracost * cost / (2 * loop_depth); ! 780: pp->savings[(int) GENERAL_REGS] -= extracost; ! 781: for (i = 0; ; i++) ! 782: { ! 783: class1 = reg_class_subclasses[(int)GENERAL_REGS][i]; ! 784: if (class1 == LIM_REG_CLASSES) ! 785: break; ! 786: pp->savings[(int) class1] -= extracost; ! 787: } ! 788: ! 789: label2: ; ! 790: } ! 791: } ! 792: ! 793: if (! memok) ! 794: pp->memcost += (MEMORY_MOVE_COST (GET_MODE (op)) * (1 + double_cost) ! 795: - 1) * loop_depth; ! 796: pp->nrefs += loop_depth; ! 797: } ! 798: } ! 799: ! 800: /* Record the pseudo registers we must reload into hard registers ! 801: in a subexpression of a memory address, X. ! 802: BCOST is the cost if X is a register and it fails to be in BASE_REG_CLASS. ! 803: ICOST is the cost if it fails to be in INDEX_REG_CLASS. */ ! 804: ! 805: void ! 806: record_address_regs (x, bcost, icost) ! 807: rtx x; ! 808: int bcost, icost; ! 809: { ! 810: register enum rtx_code code = GET_CODE (x); ! 811: ! 812: switch (code) ! 813: { ! 814: case CONST_INT: ! 815: case CONST: ! 816: case CC0: ! 817: case PC: ! 818: case SYMBOL_REF: ! 819: case LABEL_REF: ! 820: return; ! 821: ! 822: case PLUS: ! 823: /* When we have an address that is a sum, ! 824: we must determine whether registers are "base" or "index" regs. ! 825: If there is a sum of two registers, we must choose one to be ! 826: the "base". Luckily, we can use the REGNO_POINTER_FLAG ! 827: to make a good choice most of the time. */ ! 828: { ! 829: rtx arg0 = XEXP (x, 0); ! 830: rtx arg1 = XEXP (x, 1); ! 831: register enum rtx_code code0 = GET_CODE (arg0); ! 832: register enum rtx_code code1 = GET_CODE (arg1); ! 833: int icost0 = 0; ! 834: int icost1 = 0; ! 835: int suppress1 = 0; ! 836: int suppress0 = 0; ! 837: ! 838: /* Look inside subregs. */ ! 839: while (code0 == SUBREG) ! 840: arg0 = SUBREG_REG (arg0), code0 = GET_CODE (arg0); ! 841: while (code1 == SUBREG) ! 842: arg1 = SUBREG_REG (arg1), code1 = GET_CODE (arg1); ! 843: ! 844: if (code0 == MULT || code1 == MEM) ! 845: icost0 = 2; ! 846: else if (code1 == MULT || code0 == MEM) ! 847: icost1 = 2; ! 848: else if (code0 == CONST_INT) ! 849: suppress0 = 1; ! 850: else if (code1 == CONST_INT) ! 851: suppress1 = 1; ! 852: else if (code0 == REG && code1 == REG) ! 853: { ! 854: if (REGNO_POINTER_FLAG (REGNO (arg0))) ! 855: icost1 = 2; ! 856: else if (REGNO_POINTER_FLAG (REGNO (arg1))) ! 857: icost0 = 2; ! 858: else ! 859: icost0 = icost1 = 1; ! 860: } ! 861: else if (code0 == REG) ! 862: { ! 863: if (code1 == PLUS ! 864: && ! REGNO_POINTER_FLAG (REGNO (arg0))) ! 865: icost0 = 2; ! 866: else ! 867: REGNO_POINTER_FLAG (REGNO (arg0)) = 1; ! 868: } ! 869: else if (code1 == REG) ! 870: { ! 871: if (code0 == PLUS ! 872: && ! REGNO_POINTER_FLAG (REGNO (arg1))) ! 873: icost1 = 2; ! 874: else ! 875: REGNO_POINTER_FLAG (REGNO (arg1)) = 1; ! 876: } ! 877: ! 878: /* ICOST0 determines whether we are treating operand 0 ! 879: as a base register or as an index register. ! 880: SUPPRESS0 nonzero means it isn't a register at all. ! 881: ICOST1 and SUPPRESS1 are likewise for operand 1. */ ! 882: ! 883: if (! suppress0) ! 884: record_address_regs (arg0, 2 - icost0, icost0); ! 885: if (! suppress1) ! 886: record_address_regs (arg1, 2 - icost1, icost1); ! 887: } ! 888: break; ! 889: ! 890: case POST_INC: ! 891: case PRE_INC: ! 892: case POST_DEC: ! 893: case PRE_DEC: ! 894: /* Double the importance of a pseudo register that is incremented ! 895: or decremented, since it would take two extra insns ! 896: if it ends up in the wrong place. */ ! 897: record_address_regs (XEXP (x, 0), 2 * bcost, 2 * icost); ! 898: break; ! 899: ! 900: case REG: ! 901: { ! 902: register struct savings *pp; ! 903: register enum reg_class class, class1; ! 904: pp = &savings[REGNO (x)]; ! 905: pp->nrefs += loop_depth; ! 906: ! 907: /* We have an address (or part of one) that is just one register. */ ! 908: ! 909: /* Record BCOST worth of savings for classes contained ! 910: in BASE_REG_CLASS. */ ! 911: ! 912: class = BASE_REG_CLASS; ! 913: if (class != NO_REGS && class != ALL_REGS) ! 914: { ! 915: register int i; ! 916: pp->savings[(int) class] += bcost * loop_depth; ! 917: for (i = 0; ; i++) ! 918: { ! 919: class1 = reg_class_subclasses[(int)class][i]; ! 920: if (class1 == LIM_REG_CLASSES) ! 921: break; ! 922: pp->savings[(int) class1] += bcost * loop_depth; ! 923: } ! 924: } ! 925: ! 926: /* Record ICOST worth of savings for classes contained ! 927: in INDEX_REG_CLASS. */ ! 928: ! 929: class = INDEX_REG_CLASS; ! 930: if (icost != 0 && class != NO_REGS && class != ALL_REGS) ! 931: { ! 932: register int i; ! 933: pp->savings[(int) class] += icost * loop_depth; ! 934: for (i = 0; ; i++) ! 935: { ! 936: class1 = reg_class_subclasses[(int)class][i]; ! 937: if (class1 == LIM_REG_CLASSES) ! 938: break; ! 939: pp->savings[(int) class1] += icost * loop_depth; ! 940: } ! 941: } ! 942: } ! 943: break; ! 944: ! 945: default: ! 946: { ! 947: register char *fmt = GET_RTX_FORMAT (code); ! 948: register int i; ! 949: for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) ! 950: if (fmt[i] == 'e') ! 951: record_address_regs (XEXP (x, i), bcost, icost); ! 952: } ! 953: } ! 954: } ! 955: #endif /* REGISTER_CONSTRAINTS */ ! 956: ! 957: /* This is the `regscan' pass of the compiler, run just before cse ! 958: and again just before loop. ! 959: ! 960: It finds the first and last use of each pseudo-register ! 961: and records them in the vectors regno_first_uid, regno_last_uid ! 962: and counts the number of sets in the vector reg_n_sets. ! 963: ! 964: REPEAT is nonzero the second time this is called. */ ! 965: ! 966: /* Indexed by pseudo register number, gives uid of first insn using the reg ! 967: (as of the time reg_scan is called). */ ! 968: ! 969: short *regno_first_uid; ! 970: ! 971: /* Indexed by pseudo register number, gives uid of last insn using the reg ! 972: (as of the time reg_scan is called). */ ! 973: ! 974: short *regno_last_uid; ! 975: ! 976: /* Record the number of registers we used when we allocated the above two ! 977: tables. If we are called again with more than this, we must re-allocate ! 978: the tables. */ ! 979: ! 980: static int highest_regno_in_uid_map; ! 981: ! 982: /* Maximum number of parallel sets and clobbers in any insn in this fn. ! 983: Always at least 3, since the combiner could put that many togetherm ! 984: and we want this to remain correct for all the remaining passes. */ ! 985: ! 986: int max_parallel; ! 987: ! 988: void reg_scan_mark_refs (); ! 989: ! 990: void ! 991: reg_scan (f, nregs, repeat) ! 992: rtx f; ! 993: int nregs; ! 994: int repeat; ! 995: { ! 996: register rtx insn; ! 997: ! 998: if (!repeat || nregs > highest_regno_in_uid_map) ! 999: { ! 1000: /* Leave some spare space in case more regs are allocated. */ ! 1001: highest_regno_in_uid_map = nregs + nregs / 20; ! 1002: regno_first_uid ! 1003: = (short *) oballoc (highest_regno_in_uid_map * sizeof (short)); ! 1004: regno_last_uid ! 1005: = (short *) oballoc (highest_regno_in_uid_map * sizeof (short)); ! 1006: reg_n_sets ! 1007: = (short *) oballoc (highest_regno_in_uid_map * sizeof (short)); ! 1008: } ! 1009: ! 1010: bzero (regno_first_uid, highest_regno_in_uid_map * sizeof (short)); ! 1011: bzero (regno_last_uid, highest_regno_in_uid_map * sizeof (short)); ! 1012: bzero (reg_n_sets, highest_regno_in_uid_map * sizeof (short)); ! 1013: ! 1014: max_parallel = 3; ! 1015: ! 1016: for (insn = f; insn; insn = NEXT_INSN (insn)) ! 1017: if (GET_CODE (insn) == INSN ! 1018: || GET_CODE (insn) == CALL_INSN ! 1019: || GET_CODE (insn) == JUMP_INSN) ! 1020: { ! 1021: if (GET_CODE (PATTERN (insn)) == PARALLEL ! 1022: && XVECLEN (PATTERN (insn), 0) > max_parallel) ! 1023: max_parallel = XVECLEN (PATTERN (insn), 0); ! 1024: reg_scan_mark_refs (PATTERN (insn), INSN_UID (insn)); ! 1025: } ! 1026: } ! 1027: ! 1028: void ! 1029: reg_scan_mark_refs (x, uid) ! 1030: rtx x; ! 1031: int uid; ! 1032: { ! 1033: register enum rtx_code code = GET_CODE (x); ! 1034: register rtx dest; ! 1035: ! 1036: switch (code) ! 1037: { ! 1038: case CONST_INT: ! 1039: case CONST: ! 1040: case CONST_DOUBLE: ! 1041: case CC0: ! 1042: case PC: ! 1043: case SYMBOL_REF: ! 1044: case LABEL_REF: ! 1045: case ADDR_VEC: ! 1046: case ADDR_DIFF_VEC: ! 1047: return; ! 1048: ! 1049: case REG: ! 1050: { ! 1051: register int regno = REGNO (x); ! 1052: ! 1053: regno_last_uid[regno] = uid; ! 1054: if (regno_first_uid[regno] == 0) ! 1055: regno_first_uid[regno] = uid; ! 1056: } ! 1057: break; ! 1058: ! 1059: case SET: ! 1060: /* Count a set of the destination if it is a register. */ ! 1061: for (dest = SET_DEST (x); ! 1062: GET_CODE (dest) == SUBREG || GET_CODE (dest) == STRICT_LOW_PART ! 1063: || GET_CODE (dest) == ZERO_EXTEND; ! 1064: dest = XEXP (dest, 0)) ! 1065: ; ! 1066: ! 1067: if (GET_CODE (dest) == REG) ! 1068: reg_n_sets[REGNO (dest)]++; ! 1069: ! 1070: /* ... fall through ... */ ! 1071: ! 1072: default: ! 1073: { ! 1074: register char *fmt = GET_RTX_FORMAT (code); ! 1075: register int i; ! 1076: for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) ! 1077: { ! 1078: if (fmt[i] == 'e') ! 1079: reg_scan_mark_refs (XEXP (x, i), uid); ! 1080: else if (fmt[i] == 'E' && XVEC (x, i) != 0) ! 1081: { ! 1082: register int j; ! 1083: for (j = XVECLEN (x, i) - 1; j >= 0; j--) ! 1084: reg_scan_mark_refs (XVECEXP (x, i, j), uid); ! 1085: } ! 1086: } ! 1087: } ! 1088: } ! 1089: } ! 1090: ! 1091: /* Return nonzero if C1 is a subset of C2, i.e., if every register in C1 ! 1092: is also in C2. */ ! 1093: ! 1094: int ! 1095: reg_class_subset_p (c1, c2) ! 1096: register enum reg_class c1; ! 1097: register enum reg_class c2; ! 1098: { ! 1099: if (c1 == c2) return 1; ! 1100: ! 1101: if (c2 == ALL_REGS) ! 1102: win: ! 1103: return 1; ! 1104: GO_IF_HARD_REG_SUBSET (reg_class_contents[(int)c1], ! 1105: reg_class_contents[(int)c2], ! 1106: win); ! 1107: return 0; ! 1108: } ! 1109: ! 1110: /* Return nonzero if there is a register that is in both C1 and C2. */ ! 1111: ! 1112: int ! 1113: reg_classes_intersect_p (c1, c2) ! 1114: register enum reg_class c1; ! 1115: register enum reg_class c2; ! 1116: { ! 1117: #ifdef HARD_REG_SET ! 1118: register ! 1119: #endif ! 1120: HARD_REG_SET c; ! 1121: ! 1122: if (c1 == c2) return 1; ! 1123: ! 1124: if (c1 == ALL_REGS || c2 == ALL_REGS) ! 1125: return 1; ! 1126: ! 1127: COPY_HARD_REG_SET (c, reg_class_contents[(int) c1]); ! 1128: AND_HARD_REG_SET (c, reg_class_contents[(int) c2]); ! 1129: ! 1130: GO_IF_HARD_REG_SUBSET (c, reg_class_contents[(int) NO_REGS], lose); ! 1131: return 1; ! 1132: ! 1133: lose: ! 1134: return 0; ! 1135: } ! 1136:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.