|
|
1.1 ! root 1: /* Data flow analysis for GNU compiler. ! 2: Copyright (C) 1987, 1988 Free Software Foundation, Inc. ! 3: ! 4: This file is part of GNU CC. ! 5: ! 6: GNU CC is distributed in the hope that it will be useful, ! 7: but WITHOUT ANY WARRANTY. No author or distributor ! 8: accepts responsibility to anyone for the consequences of using it ! 9: or for whether it serves any particular purpose or works at all, ! 10: unless he says so in writing. Refer to the GNU CC General Public ! 11: License for full details. ! 12: ! 13: Everyone is granted permission to copy, modify and redistribute ! 14: GNU CC, but only under the conditions described in the ! 15: GNU CC General Public License. A copy of this license is ! 16: supposed to have been given to you along with GNU CC so you ! 17: can know your rights and responsibilities. It should be in a ! 18: file named COPYING. Among other things, the copyright notice ! 19: and this notice must be preserved on all copies. */ ! 20: ! 21: ! 22: /* This file contains the data flow analysis pass of the compiler. ! 23: It computes data flow information ! 24: which tells combine_instructions which insns to consider combining ! 25: and controls register allocation. ! 26: ! 27: Additional data flow information that is too bulky to record ! 28: is generated during the analysis, and is used at that time to ! 29: create autoincrement and autodecrement addressing. ! 30: ! 31: The first step is dividing the function into basic blocks. ! 32: find_basic_blocks does this. Then life_analysis determines ! 33: where each register is live and where it is dead. ! 34: ! 35: ** find_basic_blocks ** ! 36: ! 37: find_basic_blocks divides the current function's rtl ! 38: into basic blocks. It records the beginnings and ends of the ! 39: basic blocks in the vectors basic_block_head and basic_block_end, ! 40: and the number of blocks in n_basic_blocks. ! 41: ! 42: find_basic_blocks also finds any unreachable loops ! 43: and deletes them. ! 44: ! 45: ** life_analysis ** ! 46: ! 47: life_analysis is called immediately after find_basic_blocks. ! 48: It uses the basic block information to determine where each ! 49: hard or pseudo register is live. ! 50: ! 51: ** live-register info ** ! 52: ! 53: The information about where each register is live is in two parts: ! 54: the REG_NOTES of insns, and the vector basic_block_live_at_start. ! 55: ! 56: basic_block_live_at_start has an element for each basic block, ! 57: and the element is a bit-vector with a bit for each hard or pseudo ! 58: register. The bit is 1 if the register is live at the beginning ! 59: of the basic block. ! 60: ! 61: To each insn's REG_NOTES is added an element for each register ! 62: that is live before the insn or set by the insn, but is dead ! 63: after the insn. ! 64: ! 65: To determine which registers are live after any insn, one can ! 66: start from the beginning of the basic block and scan insns, noting ! 67: which registers are set by each insn and which die there. ! 68: ! 69: ** Other actions of life_analysis ** ! 70: ! 71: life_analysis sets up the LOG_LINKS fields of insns because the ! 72: information needed to do so is readily available. ! 73: ! 74: life_analysis deletes insns whose only effect is to store a value ! 75: that is never used. ! 76: ! 77: life_analysis notices cases where a reference to a register as ! 78: a memory address can be combined with a preceding or following ! 79: incrementation or decrementation of the register. The separate ! 80: instruction to increment or decrement is deleted and the address ! 81: is changed to a POST_INC or similar rtx. ! 82: ! 83: Each time an incrementing or decrementing address is created, ! 84: a REG_INC element is added to the insn's REG_NOTES list. ! 85: ! 86: life_analysis fills in certain vectors containing information about ! 87: register usage: reg_n_refs, reg_n_deaths, reg_n_sets, ! 88: reg_live_length, reg_crosses_call and reg_basic_block. */ ! 89: ! 90: #include <stdio.h> ! 91: #include "config.h" ! 92: #include "rtl.h" ! 93: #include "basic-block.h" ! 94: #include "regs.h" ! 95: #include "hard-reg-set.h" ! 96: #include "flags.h" ! 97: ! 98: /* Get the basic block number of an insn. ! 99: This info should not be expected to remain available ! 100: after the end of life_analysis. */ ! 101: ! 102: #define BLOCK_NUM(INSN) uid_block_number[INSN_UID (INSN)] ! 103: ! 104: /* This is where the BLOCK_NUM values are really stored. ! 105: This is set up by find_basic_blocks and used there and in life_analysis, ! 106: and then freed. */ ! 107: ! 108: static short *uid_block_number; ! 109: ! 110: /* INSN_VOLATILE (insn) is 1 if the insn refers to anything volatile. */ ! 111: ! 112: #define INSN_VOLATILE(INSN) uid_volatile[INSN_UID (INSN)] ! 113: static char *uid_volatile; ! 114: ! 115: /* Number of basic blocks in the current function. */ ! 116: ! 117: int n_basic_blocks; ! 118: ! 119: /* Maximum register number used in this function, plus one. */ ! 120: ! 121: int max_regno; ! 122: ! 123: /* Indexed by n, gives number of basic block that (REG n) is used in. ! 124: Or gives -2 if (REG n) is used in more than one basic block. ! 125: Or -1 if it has not yet been seen so no basic block is known. ! 126: This information remains valid for the rest of the compilation ! 127: of the current function; it is used to control register allocation. */ ! 128: ! 129: short *reg_basic_block; ! 130: ! 131: /* Indexed by n, gives number of times (REG n) is used or set, each ! 132: weighted by its loop-depth. ! 133: This information remains valid for the rest of the compilation ! 134: of the current function; it is used to control register allocation. */ ! 135: ! 136: short *reg_n_refs; ! 137: ! 138: /* Indexed by n, gives number of times (REG n) is set. ! 139: This information remains valid for the rest of the compilation ! 140: of the current function; it is used to control register allocation. */ ! 141: ! 142: short *reg_n_sets; ! 143: ! 144: /* Indexed by N, gives number of places register N dies. ! 145: This information remains valid for the rest of the compilation ! 146: of the current function; it is used to control register allocation. */ ! 147: ! 148: short *reg_n_deaths; ! 149: ! 150: /* Indexed by N, gives 1 if that reg is live across any CALL_INSNs. ! 151: This information remains valid for the rest of the compilation ! 152: of the current function; it is used to control register allocation. */ ! 153: ! 154: char *reg_crosses_call; ! 155: ! 156: /* Total number of instructions at which (REG n) is live. ! 157: The larger this is, the less priority (REG n) gets for ! 158: allocation in a real register. ! 159: This information remains valid for the rest of the compilation ! 160: of the current function; it is used to control register allocation. ! 161: ! 162: local-alloc.c may alter this number to change the priority. ! 163: ! 164: Negative values are special. ! 165: -1 is used to mark a pseudo reg which has a constant or memory equivalent ! 166: and is used infrequently enough that it should not get a hard register. ! 167: -2 is used to mark a pseudo reg for a parameter, when a frame pointer ! 168: is not required. global-alloc.c makes an allocno for this but does ! 169: not try to assign a hard register to it. */ ! 170: ! 171: int *reg_live_length; ! 172: ! 173: /* Element N is the next insn that uses (hard or pseudo) register number N ! 174: within the current basic block; or zero, if there is no such insn. ! 175: This is valid only during the final backward scan in propagate_block. */ ! 176: ! 177: static rtx *reg_next_use; ! 178: ! 179: /* Size of a regset for the current function, ! 180: in (1) bytes and (2) elements. */ ! 181: ! 182: int regset_bytes; ! 183: int regset_size; ! 184: ! 185: /* Element N is first insn in basic block N. ! 186: This info lasts until we finish compiling the function. */ ! 187: ! 188: rtx *basic_block_head; ! 189: ! 190: /* Element N is last insn in basic block N. ! 191: This info lasts until we finish compiling the function. */ ! 192: ! 193: rtx *basic_block_end; ! 194: ! 195: /* Element N is a regset describing the registers live ! 196: at the start of basic block N. ! 197: This info lasts until we finish compiling the function. */ ! 198: ! 199: regset *basic_block_live_at_start; ! 200: ! 201: /* Regset of regs live when calls to `setjmp'-like functions happen. */ ! 202: ! 203: regset regs_live_at_setjmp; ! 204: ! 205: /* Element N is nonzero if control can drop into basic block N ! 206: from the preceding basic block. Freed after life_analysis. */ ! 207: ! 208: static char *basic_block_drops_in; ! 209: ! 210: /* Element N is depth within loops of basic block number N. ! 211: Freed after life_analysis. */ ! 212: ! 213: static short *basic_block_loop_depth; ! 214: ! 215: /* Element N nonzero if basic block N can actually be reached. ! 216: Vector exists only during find_basic_blocks. */ ! 217: ! 218: static char *block_live_static; ! 219: ! 220: /* Depth within loops of basic block being scanned for lifetime analysis, ! 221: plus one. This is the weight attached to references to registers. */ ! 222: ! 223: static int loop_depth; ! 224: ! 225: /* Define AUTO_INC_DEC if machine has any kind of incrementing ! 226: or decrementing addressing. */ ! 227: ! 228: #ifdef HAVE_PRE_DECREMENT ! 229: #define AUTO_INC_DEC ! 230: #endif ! 231: ! 232: #ifdef HAVE_PRE_INCREMENT ! 233: #define AUTO_INC_DEC ! 234: #endif ! 235: ! 236: #ifdef HAVE_POST_DECREMENT ! 237: #define AUTO_INC_DEC ! 238: #endif ! 239: ! 240: #ifdef HAVE_POST_INCREMENT ! 241: #define AUTO_INC_DEC ! 242: #endif ! 243: ! 244: /* Forward declarations */ ! 245: static void find_basic_blocks (); ! 246: static void life_analysis (); ! 247: static void mark_label_ref (); ! 248: void allocate_for_life_analysis (); /* Used also in stupid_life_analysis */ ! 249: static void init_regset_vector (); ! 250: static void propagate_block (); ! 251: static void mark_set_regs (); ! 252: static void mark_used_regs (); ! 253: static int insn_dead_p (); ! 254: static int try_pre_increment (); ! 255: static int try_pre_increment_1 (); ! 256: static rtx find_use_as_address (); ! 257: static int volatile_refs_p (); ! 258: void dump_flow_info (); ! 259: ! 260: /* Find basic blocks of the current function and perform data flow analysis. ! 261: F is the first insn of the function and NREGS the number of register numbers ! 262: in use. */ ! 263: ! 264: void ! 265: flow_analysis (f, nregs, file) ! 266: rtx f; ! 267: int nregs; ! 268: FILE *file; ! 269: { ! 270: register rtx insn; ! 271: register int i; ! 272: register int max_uid = 0; ! 273: ! 274: /* Count the basic blocks. Also find maximum insn uid value used. */ ! 275: ! 276: { ! 277: register RTX_CODE prev_code = JUMP_INSN; ! 278: register RTX_CODE code; ! 279: ! 280: for (insn = f, i = 0; insn; insn = NEXT_INSN (insn)) ! 281: { ! 282: code = GET_CODE (insn); ! 283: if (INSN_UID (insn) > max_uid) ! 284: max_uid = INSN_UID (insn); ! 285: if (code == CODE_LABEL ! 286: || (prev_code != INSN && prev_code != CALL_INSN ! 287: && prev_code != CODE_LABEL ! 288: && (code == INSN || code == CALL_INSN || code == JUMP_INSN))) ! 289: i++; ! 290: if (code != NOTE) ! 291: prev_code = code; ! 292: } ! 293: } ! 294: ! 295: /* Allocate some tables that last till end of compiling this function ! 296: and some needed only in find_basic_blocks and life_analysis. */ ! 297: ! 298: n_basic_blocks = i; ! 299: basic_block_head = (rtx *) oballoc (n_basic_blocks * sizeof (rtx)); ! 300: basic_block_end = (rtx *) oballoc (n_basic_blocks * sizeof (rtx)); ! 301: basic_block_drops_in = (char *) alloca (n_basic_blocks); ! 302: basic_block_loop_depth = (short *) alloca (n_basic_blocks * sizeof (short)); ! 303: uid_block_number = (short *) alloca ((max_uid + 1) * sizeof (short)); ! 304: uid_volatile = (char *) alloca (max_uid + 1); ! 305: bzero (uid_volatile, max_uid + 1); ! 306: ! 307: find_basic_blocks (f); ! 308: life_analysis (f, nregs); ! 309: if (file) ! 310: dump_flow_info (file); ! 311: ! 312: basic_block_drops_in = 0; ! 313: uid_block_number = 0; ! 314: basic_block_loop_depth = 0; ! 315: } ! 316: ! 317: /* Find all basic blocks of the function whose first insn is F. ! 318: Store the correct data in the tables that describe the basic blocks, ! 319: set up the chains of references for each CODE_LABEL, and ! 320: delete any entire basic blocks that cannot be reached. */ ! 321: ! 322: static void ! 323: find_basic_blocks (f) ! 324: rtx f; ! 325: { ! 326: register rtx insn; ! 327: register int i; ! 328: ! 329: /* Initialize the ref chain of each label to 0. */ ! 330: /* Record where all the blocks start and end and their depth in loops. */ ! 331: /* For each insn, record the block it is in. */ ! 332: ! 333: { ! 334: register RTX_CODE prev_code = JUMP_INSN; ! 335: register RTX_CODE code; ! 336: int depth = 1; ! 337: ! 338: for (insn = f, i = -1; insn; insn = NEXT_INSN (insn)) ! 339: { ! 340: code = GET_CODE (insn); ! 341: if (code == NOTE) ! 342: { ! 343: if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_BEG) ! 344: depth++; ! 345: else if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_END) ! 346: depth--; ! 347: } ! 348: else if (code == CODE_LABEL ! 349: || (prev_code != INSN && prev_code != CALL_INSN ! 350: && prev_code != CODE_LABEL ! 351: && (code == INSN || code == CALL_INSN || code == JUMP_INSN))) ! 352: { ! 353: basic_block_head[++i] = insn; ! 354: basic_block_end[i] = insn; ! 355: basic_block_loop_depth[i] = depth; ! 356: if (code == CODE_LABEL) ! 357: LABEL_REFS (insn) = insn; ! 358: } ! 359: else if (code == INSN || code == CALL_INSN || code == JUMP_INSN) ! 360: basic_block_end[i] = insn; ! 361: BLOCK_NUM (insn) = i; ! 362: if (code != NOTE) ! 363: prev_code = code; ! 364: } ! 365: } ! 366: ! 367: /* Record which basic blocks control can drop in to. */ ! 368: ! 369: { ! 370: register int i; ! 371: for (i = 0; i < n_basic_blocks; i++) ! 372: { ! 373: register rtx insn = PREV_INSN (basic_block_head[i]); ! 374: /* TEMP1 is used to avoid a bug in Sequent's compiler. */ ! 375: register int temp1; ! 376: while (insn && GET_CODE (insn) == NOTE) ! 377: insn = PREV_INSN (insn); ! 378: temp1 = insn && GET_CODE (insn) != BARRIER; ! 379: basic_block_drops_in[i] = temp1; ! 380: } ! 381: } ! 382: ! 383: /* Now find which basic blocks can actually be reached ! 384: and put all jump insns' LABEL_REFS onto the ref-chains ! 385: of their target labels. */ ! 386: ! 387: if (n_basic_blocks > 0) ! 388: { ! 389: register char *block_live = (char *) alloca (n_basic_blocks); ! 390: register char *block_marked = (char *) alloca (n_basic_blocks); ! 391: int something_marked = 1; ! 392: ! 393: /* Initialize with just block 0 reachable and no blocks marked. */ ! 394: ! 395: bzero (block_live, n_basic_blocks); ! 396: bzero (block_marked, n_basic_blocks); ! 397: block_live[0] = 1; ! 398: block_live_static = block_live; ! 399: ! 400: /* Pass over all blocks, marking each block that is reachable ! 401: and has not yet been marked. ! 402: Keep doing this until, in one pass, no blocks have been marked. ! 403: Then blocks_live and blocks_marked are identical and correct. ! 404: In addition, all jumps actually reachable have been marked. */ ! 405: ! 406: while (something_marked) ! 407: { ! 408: something_marked = 0; ! 409: for (i = 0; i < n_basic_blocks; i++) ! 410: if (block_live[i] && !block_marked[i]) ! 411: { ! 412: block_marked[i] = 1; ! 413: something_marked = 1; ! 414: if (i + 1 < n_basic_blocks && basic_block_drops_in[i + 1]) ! 415: block_live[i + 1] = 1; ! 416: insn = basic_block_end[i]; ! 417: if (GET_CODE (insn) == JUMP_INSN) ! 418: mark_label_ref (PATTERN (insn), insn, 0); ! 419: } ! 420: } ! 421: ! 422: /* Now delete the code for any basic blocks that can't be reached. ! 423: They can occur because jump_optimize does not recognize ! 424: unreachable loops as unreachable. */ ! 425: ! 426: for (i = 0; i < n_basic_blocks; i++) ! 427: if (!block_live[i]) ! 428: { ! 429: insn = basic_block_head[i]; ! 430: while (1) ! 431: { ! 432: if (GET_CODE (insn) == BARRIER) ! 433: abort (); ! 434: if (GET_CODE (insn) != NOTE) ! 435: { ! 436: PUT_CODE (insn, NOTE); ! 437: NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED; ! 438: NOTE_SOURCE_FILE (insn) = 0; ! 439: } ! 440: if (insn == basic_block_end[i]) ! 441: { ! 442: /* BARRIERs are between basic blocks, not part of one. ! 443: Delete a BARRIER if the preceding jump is deleted. ! 444: We cannot alter a BARRIER into a NOTE ! 445: because it is too short; but we can really delete ! 446: it because it is not part of a basic block. */ ! 447: if (NEXT_INSN (insn) != 0 ! 448: && GET_CODE (NEXT_INSN (insn)) == BARRIER) ! 449: delete_insn (NEXT_INSN (insn)); ! 450: break; ! 451: } ! 452: insn = NEXT_INSN (insn); ! 453: } ! 454: /* Each time we delete some basic blocks, ! 455: see if there is a jump around them that is ! 456: being turned into a no-op. If so, delete it. */ ! 457: ! 458: if (block_live[i - 1]) ! 459: { ! 460: register int j; ! 461: for (j = i; j < n_basic_blocks; j++) ! 462: if (block_live[j]) ! 463: { ! 464: insn = basic_block_end[i - 1]; ! 465: if (GET_CODE (insn) == JUMP_INSN ! 466: && JUMP_LABEL (insn) != 0 ! 467: && INSN_UID (JUMP_LABEL (insn)) != 0 ! 468: && BLOCK_NUM (JUMP_LABEL (insn)) == j) ! 469: { ! 470: PUT_CODE (insn, NOTE); ! 471: NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED; ! 472: NOTE_SOURCE_FILE (insn) = 0; ! 473: if (GET_CODE (NEXT_INSN (insn)) != BARRIER) ! 474: abort (); ! 475: delete_insn (NEXT_INSN (insn)); ! 476: } ! 477: break; ! 478: } ! 479: } ! 480: } ! 481: } ! 482: } ! 483: ! 484: /* Check expression X for label references; ! 485: if one is found, add INSN to the label's chain of references. ! 486: ! 487: CHECKDUP means check for and avoid creating duplicate references ! 488: from the same insn. Such duplicates do no serious harm but ! 489: can slow life analysis. CHECKDUP is set only when duplicates ! 490: are likely. */ ! 491: ! 492: static void ! 493: mark_label_ref (x, insn, checkdup) ! 494: rtx x, insn; ! 495: int checkdup; ! 496: { ! 497: register RTX_CODE code = GET_CODE (x); ! 498: register int i; ! 499: register char *fmt; ! 500: ! 501: if (code == LABEL_REF) ! 502: { ! 503: register rtx label = XEXP (x, 0); ! 504: register rtx y; ! 505: if (GET_CODE (label) != CODE_LABEL) ! 506: return; ! 507: /* If the label was never emitted, this insn is junk, ! 508: but avoid a crash trying to refer to BLOCK_NUM (label). ! 509: This can happen as a result of a syntax error ! 510: and a diagnostic has already been printed. */ ! 511: if (INSN_UID (label) == 0) ! 512: return; ! 513: CONTAINING_INSN (x) = insn; ! 514: /* if CHECKDUP is set, check for duplicate ref from same insn ! 515: and don't insert. */ ! 516: if (checkdup) ! 517: for (y = LABEL_REFS (label); y != label; y = LABEL_NEXTREF (y)) ! 518: if (CONTAINING_INSN (y) == insn) ! 519: return; ! 520: LABEL_NEXTREF (x) = LABEL_REFS (label); ! 521: LABEL_REFS (label) = x; ! 522: block_live_static[BLOCK_NUM (label)] = 1; ! 523: return; ! 524: } ! 525: ! 526: fmt = GET_RTX_FORMAT (code); ! 527: for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) ! 528: { ! 529: if (fmt[i] == 'e') ! 530: mark_label_ref (XEXP (x, i), insn, 0); ! 531: if (fmt[i] == 'E') ! 532: { ! 533: register int j; ! 534: for (j = 0; j < XVECLEN (x, i); j++) ! 535: mark_label_ref (XVECEXP (x, i, j), insn, 1); ! 536: } ! 537: } ! 538: } ! 539: ! 540: /* Determine the which registers are live at the start of each ! 541: basic block of the function whose first insn is F. ! 542: NREGS is the number of registers used in F. ! 543: We allocate the vector basic_block_live_at_start ! 544: and the regsets that it points to, and fill them with the data. ! 545: regset_size and regset_bytes are also set here. */ ! 546: ! 547: static void ! 548: life_analysis (f, nregs) ! 549: rtx f; ! 550: int nregs; ! 551: { ! 552: register regset tem; ! 553: int first_pass; ! 554: int changed; ! 555: /* For each basic block, a bitmask of regs ! 556: live on exit from the block. */ ! 557: regset *basic_block_live_at_end; ! 558: /* For each basic block, a bitmask of regs ! 559: live on entry to a successor-block of this block. ! 560: If this does not match basic_block_live_at_end, ! 561: that must be updated, and the block must be rescanned. */ ! 562: regset *basic_block_new_live_at_end; ! 563: /* For each basic block, a bitmask of regs ! 564: whose liveness at the end of the basic block ! 565: can make a difference in which regs are live on entry to the block. ! 566: These are the regs that are set within the basic block, ! 567: possibly excluding those that are used after they are set. */ ! 568: regset *basic_block_significant; ! 569: register int i; ! 570: rtx insn; ! 571: ! 572: max_regno = nregs; ! 573: ! 574: bzero (regs_ever_live, sizeof regs_ever_live); ! 575: ! 576: /* Allocate and zero out many data structures ! 577: that will record the data from lifetime analysis. */ ! 578: ! 579: allocate_for_life_analysis (); ! 580: ! 581: reg_next_use = (rtx *) alloca (nregs * sizeof (rtx)); ! 582: bzero (reg_next_use, nregs * sizeof (rtx)); ! 583: ! 584: /* Set up several regset-vectors used internally within this function. ! 585: Their meanings are documented above, with their declarations. */ ! 586: ! 587: basic_block_live_at_end = (regset *) alloca (n_basic_blocks * sizeof (regset)); ! 588: tem = (regset) alloca (n_basic_blocks * regset_bytes); ! 589: bzero (tem, n_basic_blocks * regset_bytes); ! 590: init_regset_vector (basic_block_live_at_end, tem, n_basic_blocks, regset_bytes); ! 591: ! 592: basic_block_new_live_at_end = (regset *) alloca (n_basic_blocks * sizeof (regset)); ! 593: tem = (regset) alloca (n_basic_blocks * regset_bytes); ! 594: bzero (tem, n_basic_blocks * regset_bytes); ! 595: init_regset_vector (basic_block_new_live_at_end, tem, n_basic_blocks, regset_bytes); ! 596: ! 597: basic_block_significant = (regset *) alloca (n_basic_blocks * sizeof (regset)); ! 598: tem = (regset) alloca (n_basic_blocks * regset_bytes); ! 599: bzero (tem, n_basic_blocks * regset_bytes); ! 600: init_regset_vector (basic_block_significant, tem, n_basic_blocks, regset_bytes); ! 601: ! 602: /* Record which insns refer to any volatile memory. */ ! 603: ! 604: for (insn = f; insn; insn = NEXT_INSN (insn)) ! 605: if (GET_CODE (insn) == INSN || GET_CODE (insn) == JUMP_INSN ! 606: || GET_CODE (insn) == CALL_INSN) ! 607: INSN_VOLATILE (insn) = volatile_refs_p (PATTERN (insn)); ! 608: ! 609: if (n_basic_blocks > 0) ! 610: #ifdef EXIT_IGNORE_STACK ! 611: if (! (EXIT_IGNORE_STACK) || ! frame_pointer_needed) ! 612: #endif ! 613: { ! 614: /* If exiting needs the right stack value, ! 615: consider the stack pointer live at the end of the function. */ ! 616: basic_block_live_at_end[n_basic_blocks - 1] ! 617: [STACK_POINTER_REGNUM / REGSET_ELT_BITS] ! 618: |= 1 << (STACK_POINTER_REGNUM % REGSET_ELT_BITS); ! 619: basic_block_new_live_at_end[n_basic_blocks - 1] ! 620: [STACK_POINTER_REGNUM / REGSET_ELT_BITS] ! 621: |= 1 << (STACK_POINTER_REGNUM % REGSET_ELT_BITS); ! 622: } ! 623: ! 624: /* Propagate life info through the basic blocks ! 625: around the graph of basic blocks. ! 626: ! 627: This is a relaxation process: each time a new register ! 628: is live at the end of the basic block, we must scan the block ! 629: to determine which registers are, as a consequence, live at the beginning ! 630: of that block. These registers must then be marked live at the ends ! 631: of all the blocks that can transfer control to that block. ! 632: The process continues until it reaches a fixed point. */ ! 633: ! 634: first_pass = 1; ! 635: changed = 1; ! 636: while (changed) ! 637: { ! 638: changed = 0; ! 639: for (i = n_basic_blocks - 1; i >= 0; i--) ! 640: { ! 641: int consider = first_pass; ! 642: int must_rescan = first_pass; ! 643: register int j; ! 644: ! 645: /* Set CONSIDER if this block needs thinking about at all ! 646: (that is, if the regs live now at the end of it ! 647: are not the same as were live at the end of it when ! 648: we last thought about it). ! 649: Set must_rescan if it needs to be thought about ! 650: instruction by instruction (that is, if any additional ! 651: reg that is live at the end now but was not live there before ! 652: is one of the significant regs of this basic block). */ ! 653: ! 654: for (j = 0; j < regset_size; j++) ! 655: { ! 656: register int x = basic_block_new_live_at_end[i][j] ! 657: & ~basic_block_live_at_end[i][j]; ! 658: if (x) ! 659: consider = 1; ! 660: if (x & basic_block_significant[i][j]) ! 661: { ! 662: must_rescan = 1; ! 663: consider = 1; ! 664: break; ! 665: } ! 666: } ! 667: ! 668: if (! consider) ! 669: continue; ! 670: ! 671: /* The live_at_start of this block may be changing, ! 672: so another pass will be required after this one. */ ! 673: changed = 1; ! 674: ! 675: if (! must_rescan) ! 676: { ! 677: /* No complete rescan needed; ! 678: just record those variables newly known live at end ! 679: as live at start as well. */ ! 680: for (j = 0; j < regset_size; j++) ! 681: { ! 682: register int x = basic_block_new_live_at_end[i][j] ! 683: & ~basic_block_live_at_end[i][j]; ! 684: basic_block_live_at_start[i][j] |= x; ! 685: basic_block_live_at_end[i][j] |= x; ! 686: } ! 687: } ! 688: else ! 689: { ! 690: /* Update the basic_block_live_at_start ! 691: by propagation backwards through the block. */ ! 692: bcopy (basic_block_new_live_at_end[i], ! 693: basic_block_live_at_end[i], regset_bytes); ! 694: bcopy (basic_block_live_at_end[i], ! 695: basic_block_live_at_start[i], regset_bytes); ! 696: propagate_block (basic_block_live_at_start[i], ! 697: basic_block_head[i], basic_block_end[i], 0, ! 698: first_pass ? basic_block_significant[i] : 0, ! 699: i); ! 700: } ! 701: ! 702: { ! 703: register rtx jump, head; ! 704: /* Update the basic_block_new_live_at_end's of the block ! 705: that falls through into this one (if any). */ ! 706: head = basic_block_head[i]; ! 707: jump = PREV_INSN (head); ! 708: if (basic_block_drops_in[i]) ! 709: { ! 710: register from_block = BLOCK_NUM (jump); ! 711: register int j; ! 712: for (j = 0; j < regset_size; j++) ! 713: basic_block_new_live_at_end[from_block][j] ! 714: |= basic_block_live_at_start[i][j]; ! 715: } ! 716: /* Update the basic_block_new_live_at_end's of ! 717: all the blocks that jump to this one. */ ! 718: if (GET_CODE (head) == CODE_LABEL) ! 719: for (jump = LABEL_REFS (head); ! 720: jump != head; ! 721: jump = LABEL_NEXTREF (jump)) ! 722: { ! 723: register from_block = BLOCK_NUM (CONTAINING_INSN (jump)); ! 724: register int j; ! 725: for (j = 0; j < regset_size; j++) ! 726: basic_block_new_live_at_end[from_block][j] ! 727: |= basic_block_live_at_start[i][j]; ! 728: } ! 729: } ! 730: } ! 731: first_pass = 0; ! 732: } ! 733: ! 734: /* Process the regs live at the beginning of the function. ! 735: Mark them as not local to any one basic block. */ ! 736: ! 737: if (n_basic_blocks > 0) ! 738: for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++) ! 739: if (basic_block_live_at_start[0][i / REGSET_ELT_BITS] ! 740: & (1 << (i % REGSET_ELT_BITS))) ! 741: reg_basic_block[i] = -2; ! 742: ! 743: /* Now the life information is accurate. ! 744: Make one more pass over each basic block ! 745: to delete dead stores, create autoincrement addressing ! 746: and record how many times each register is used, is set, or dies. ! 747: ! 748: To save time, we operate directly in basic_block_live_at_end[i], ! 749: thus destroying it (in fact, converting it into a copy of ! 750: basic_block_live_at_start[i]). This is ok now because ! 751: basic_block_live_at_end[i] is no longer used past this point. */ ! 752: ! 753: for (i = 0; i < n_basic_blocks; i++) ! 754: { ! 755: propagate_block (basic_block_live_at_end[i], ! 756: basic_block_head[i], basic_block_end[i], 1, 0, i); ! 757: } ! 758: } ! 759: ! 760: /* Subroutines of life analysis. */ ! 761: ! 762: /* Allocate the permanent data structures that represent the results ! 763: of life analysis. Not static since used also for stupid life analysis. */ ! 764: ! 765: void ! 766: allocate_for_life_analysis () ! 767: { ! 768: register int i; ! 769: register regset tem; ! 770: ! 771: regset_size = ((max_regno + REGSET_ELT_BITS - 1) / REGSET_ELT_BITS); ! 772: regset_bytes = regset_size * sizeof (*(regset)0); ! 773: ! 774: reg_n_refs = (short *) oballoc (max_regno * sizeof (short)); ! 775: bzero (reg_n_refs, max_regno * sizeof (short)); ! 776: ! 777: reg_n_sets = (short *) oballoc (max_regno * sizeof (short)); ! 778: bzero (reg_n_sets, max_regno * sizeof (short)); ! 779: ! 780: reg_n_deaths = (short *) oballoc (max_regno * sizeof (short)); ! 781: bzero (reg_n_deaths, max_regno * sizeof (short)); ! 782: ! 783: reg_live_length = (int *) oballoc (max_regno * sizeof (int)); ! 784: bzero (reg_live_length, max_regno * sizeof (int)); ! 785: ! 786: reg_crosses_call = (char *) oballoc (max_regno); ! 787: bzero (reg_crosses_call, max_regno); ! 788: ! 789: reg_basic_block = (short *) oballoc (max_regno * sizeof (short)); ! 790: for (i = 0; i < max_regno; i++) ! 791: reg_basic_block[i] = -1; ! 792: ! 793: basic_block_live_at_start = (regset *) oballoc (n_basic_blocks * sizeof (regset)); ! 794: tem = (regset) oballoc (n_basic_blocks * regset_bytes); ! 795: bzero (tem, n_basic_blocks * regset_bytes); ! 796: init_regset_vector (basic_block_live_at_start, tem, n_basic_blocks, regset_bytes); ! 797: ! 798: regs_live_at_setjmp = (regset) oballoc (regset_bytes); ! 799: bzero (regs_live_at_setjmp, regset_bytes); ! 800: } ! 801: ! 802: /* Make each element of VECTOR point at a regset, ! 803: taking the space for all those regsets from SPACE. ! 804: SPACE is of type regset, but it is really as long as NELTS regsets. ! 805: BYTES_PER_ELT is the number of bytes in one regset. */ ! 806: ! 807: static void ! 808: init_regset_vector (vector, space, nelts, bytes_per_elt) ! 809: regset *vector; ! 810: regset space; ! 811: int nelts; ! 812: int bytes_per_elt; ! 813: { ! 814: register int i; ! 815: register regset p = space; ! 816: ! 817: for (i = 0; i < nelts; i++) ! 818: { ! 819: vector[i] = p; ! 820: p += bytes_per_elt / sizeof (*p); ! 821: } ! 822: } ! 823: ! 824: /* Compute the registers live at the beginning of a basic block ! 825: from those live at the end. ! 826: ! 827: When called, OLD contains those live at the end. ! 828: On return, it contains those live at the beginning. ! 829: FIRST and LAST are the first and last insns of the basic block. ! 830: ! 831: FINAL is nonzero if we are doing the final pass which is not ! 832: for computing the life info (since that has already been done) ! 833: but for acting on it. On this pass, we delete dead stores, ! 834: set up the logical links and dead-variables lists of instructions, ! 835: and merge instructions for autoincrement and autodecrement addresses. ! 836: ! 837: SIGNIFICANT is nonzero only the first time for each basic block. ! 838: If it is nonzero, it points to a regset in which we store ! 839: a 1 for each register that is set within the block. ! 840: ! 841: BNUM is the number of the basic block. */ ! 842: ! 843: static void ! 844: propagate_block (old, first, last, final, significant, bnum) ! 845: register regset old; ! 846: rtx first; ! 847: rtx last; ! 848: int final; ! 849: regset significant; ! 850: int bnum; ! 851: { ! 852: register rtx insn; ! 853: rtx prev; ! 854: regset live; ! 855: regset dead; ! 856: ! 857: /* The following variables are used only if FINAL is nonzero. */ ! 858: /* This vector gets one element for each reg that has been live ! 859: at any point in the basic block that has been scanned so far. ! 860: SOMETIMES_MAX says how many elements are in use so far. ! 861: In each element, OFFSET is the byte-number within a regset ! 862: for the register described by the element, and BIT is a mask ! 863: for that register's bit within the byte. */ ! 864: register struct foo { short offset; short bit; } *regs_sometimes_live; ! 865: int sometimes_max = 0; ! 866: /* This regset has 1 for each reg that we have seen live so far. ! 867: It and REGS_SOMETIMES_LIVE are updated together. */ ! 868: regset maxlive; ! 869: ! 870: loop_depth = basic_block_loop_depth[bnum]; ! 871: ! 872: dead = (regset) alloca (regset_bytes); ! 873: live = (regset) alloca (regset_bytes); ! 874: ! 875: if (final) ! 876: { ! 877: register int i, offset, bit; ! 878: ! 879: maxlive = (regset) alloca (regset_bytes); ! 880: bcopy (old, maxlive, regset_bytes); ! 881: regs_sometimes_live ! 882: = (struct foo *) alloca (max_regno * sizeof (struct foo)); ! 883: ! 884: /* Process the regs live at the end of the block. ! 885: Enter them in MAXLIVE and REGS_SOMETIMES_LIVE. ! 886: Also mark them as not local to any one basic block. */ ! 887: ! 888: for (offset = 0, i = 0; offset < regset_size; offset++) ! 889: for (bit = 1; bit; bit <<= 1, i++) ! 890: { ! 891: if (i == max_regno) ! 892: break; ! 893: if (old[offset] & bit) ! 894: { ! 895: reg_basic_block[i] = -2; ! 896: regs_sometimes_live[sometimes_max].offset = offset; ! 897: regs_sometimes_live[sometimes_max].bit = i % REGSET_ELT_BITS; ! 898: sometimes_max++; ! 899: } ! 900: } ! 901: } ! 902: ! 903: /* Scan the block an insn at a time from end to beginning. */ ! 904: ! 905: for (insn = last; ; insn = prev) ! 906: { ! 907: prev = PREV_INSN (insn); ! 908: ! 909: /* If this is a call to `setjmp' et al, ! 910: warn if any non-volatile datum is live. */ ! 911: ! 912: if (final && GET_CODE (insn) == NOTE ! 913: && NOTE_LINE_NUMBER (insn) == NOTE_INSN_SETJMP) ! 914: { ! 915: int i; ! 916: for (i = 0; i < regset_size; i++) ! 917: regs_live_at_setjmp[i] |= old[i]; ! 918: } ! 919: ! 920: /* Update the life-status of regs for this insn. ! 921: First DEAD gets which regs are set in this insn ! 922: then LIVE gets which regs are used in this insn. ! 923: Then the regs live before the insn ! 924: are those live after, with DEAD regs turned off, ! 925: and then LIVE regs turned on. */ ! 926: ! 927: if (GET_CODE (insn) == INSN ! 928: || GET_CODE (insn) == JUMP_INSN ! 929: || GET_CODE (insn) == CALL_INSN) ! 930: { ! 931: register int i; ! 932: rtx note = find_reg_note (insn, REG_RETVAL, 0); ! 933: ! 934: /* If an instruction consists of just dead store(s) on final pass, ! 935: "delete" it by turning it into a NOTE of type NOTE_INSN_DELETED. ! 936: We could really delete it with delete_insn, but that ! 937: can cause trouble for first or last insn in a basic block. */ ! 938: if (final && insn_dead_p (PATTERN (insn), old, 1) ! 939: /* Don't delete something that refers to volatile storage! */ ! 940: && ! INSN_VOLATILE (insn)) ! 941: { ! 942: PUT_CODE (insn, NOTE); ! 943: NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED; ! 944: NOTE_SOURCE_FILE (insn) = 0; ! 945: /* If this insn is copying the return value from a library call, ! 946: delete the entire library call. */ ! 947: if (note) ! 948: { ! 949: rtx first = XEXP (note, 0); ! 950: rtx prev = insn; ! 951: while (first->volatil) ! 952: first = NEXT_INSN (first); ! 953: while (prev != first) ! 954: { ! 955: prev = PREV_INSN (prev); ! 956: PUT_CODE (prev, NOTE); ! 957: NOTE_LINE_NUMBER (prev) = NOTE_INSN_DELETED; ! 958: NOTE_SOURCE_FILE (prev) = 0; ! 959: } ! 960: } ! 961: goto flushed; ! 962: } ! 963: ! 964: for (i = 0; i < regset_size; i++) ! 965: { ! 966: dead[i] = 0; /* Faster than bzero here */ ! 967: live[i] = 0; /* since regset_size is usually small */ ! 968: } ! 969: ! 970: /* See if this is an increment or decrement that can be ! 971: merged into a following memory address. */ ! 972: #ifdef AUTO_INC_DEC ! 973: { ! 974: register rtx x = PATTERN (insn); ! 975: /* Does this instruction increment or decrement a register? */ ! 976: if (final && GET_CODE (x) == SET ! 977: && GET_CODE (SET_DEST (x)) == REG ! 978: && (GET_CODE (SET_SRC (x)) == PLUS ! 979: || GET_CODE (SET_SRC (x)) == MINUS) ! 980: && XEXP (SET_SRC (x), 0) == SET_DEST (x) ! 981: && GET_CODE (XEXP (SET_SRC (x), 1)) == CONST_INT ! 982: /* Ok, look for a following memory ref we can combine with. ! 983: If one is found, change the memory ref to a PRE_INC ! 984: or PRE_DEC, cancel this insn, and return 1. ! 985: Return 0 if nothing has been done. */ ! 986: && try_pre_increment_1 (insn)) ! 987: goto flushed; ! 988: } ! 989: #endif /* AUTO_INC_DEC */ ! 990: ! 991: /* If this is not the final pass, and this insn is copying the ! 992: value of a library call and it's dead, don't scan the ! 993: insns that perform the library call, so that the call's ! 994: arguments are not marked live. */ ! 995: if (note && insn_dead_p (PATTERN (insn), old, 1)) ! 996: { ! 997: insn = XEXP (note, 0); ! 998: prev = PREV_INSN (insn); ! 999: } ! 1000: else ! 1001: { ! 1002: /* LIVE gets the regs used in INSN; DEAD gets those set by it. */ ! 1003: mark_set_regs (old, dead, PATTERN (insn), final ? insn : 0, ! 1004: significant); ! 1005: mark_used_regs (old, live, PATTERN (insn), final, insn); ! 1006: ! 1007: /* Update OLD for the registers used or set. */ ! 1008: for (i = 0; i < regset_size; i++) ! 1009: { ! 1010: old[i] &= ~dead[i]; ! 1011: old[i] |= live[i]; ! 1012: } ! 1013: ! 1014: if (GET_CODE (insn) == CALL_INSN) ! 1015: { ! 1016: register int i; ! 1017: ! 1018: /* Each call clobbers all call-clobbered regs. ! 1019: Note that the function-value reg is one of these, and ! 1020: mark_set_regs has already had a chance to handle it. */ ! 1021: for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) ! 1022: if (call_used_regs[i]) ! 1023: old[i / REGSET_ELT_BITS] ! 1024: &= ~(1 << (i % REGSET_ELT_BITS)); ! 1025: ! 1026: /* The stack ptr is used (honorarily) by a CALL insn. */ ! 1027: old[STACK_POINTER_REGNUM / REGSET_ELT_BITS] ! 1028: |= (1 << (STACK_POINTER_REGNUM % REGSET_ELT_BITS)); ! 1029: ! 1030: if (final) ! 1031: { ! 1032: /* Any regs live at the time of a call instruction ! 1033: must not go in a register clobbered by calls. ! 1034: Find all regs now live and record this for them. */ ! 1035: ! 1036: register struct foo *p = regs_sometimes_live; ! 1037: ! 1038: for (i = 0; i < sometimes_max; i++, p++) ! 1039: { ! 1040: if (old[p->offset] ! 1041: & (1 << p->bit)) ! 1042: reg_crosses_call[p->offset * REGSET_ELT_BITS + p->bit] = 1; ! 1043: } ! 1044: } ! 1045: } ! 1046: } ! 1047: ! 1048: /* On final pass, add any additional sometimes-live regs ! 1049: into MAXLIVE and REGS_SOMETIMES_LIVE. ! 1050: Also update counts of how many insns each reg is live at. */ ! 1051: ! 1052: if (final) ! 1053: { ! 1054: for (i = 0; i < regset_size; i++) ! 1055: { ! 1056: register int diff = live[i] & ~maxlive[i]; ! 1057: ! 1058: if (diff) ! 1059: { ! 1060: register int regno; ! 1061: maxlive[i] |= diff; ! 1062: for (regno = 0; diff && regno < REGSET_ELT_BITS; regno++) ! 1063: if (diff & (1 << regno)) ! 1064: { ! 1065: regs_sometimes_live[sometimes_max].offset = i; ! 1066: regs_sometimes_live[sometimes_max].bit = regno; ! 1067: diff &= ~ (1 << regno); ! 1068: sometimes_max++; ! 1069: } ! 1070: } ! 1071: } ! 1072: ! 1073: { ! 1074: register struct foo *p = regs_sometimes_live; ! 1075: for (i = 0; i < sometimes_max; i++, p++) ! 1076: { ! 1077: if (old[p->offset] & (1 << p->bit)) ! 1078: reg_live_length[p->offset * REGSET_ELT_BITS + p->bit]++; ! 1079: } ! 1080: } ! 1081: } ! 1082: } ! 1083: flushed: ; ! 1084: if (insn == first) ! 1085: break; ! 1086: } ! 1087: } ! 1088: ! 1089: /* Return 1 if X (the body of an insn, or part of it) is just dead stores ! 1090: (SET expressions whose destinations are registers dead after the insn). ! 1091: NEEDED is the regset that says which regs are alive after the insn. */ ! 1092: ! 1093: static int ! 1094: insn_dead_p (x, needed, strict_low_ok) ! 1095: rtx x; ! 1096: regset needed; ! 1097: int strict_low_ok; ! 1098: { ! 1099: register RTX_CODE code = GET_CODE (x); ! 1100: #if 0 ! 1101: /* Make sure insns to set the stack pointer are never deleted. */ ! 1102: needed[STACK_POINTER_REGNUM / REGSET_ELT_BITS] ! 1103: |= 1 << (STACK_POINTER_REGNUM % REGSET_ELT_BITS); ! 1104: #endif ! 1105: ! 1106: /* If setting something that's a reg or part of one, ! 1107: see if that register's altered value will be live. */ ! 1108: ! 1109: if (code == SET) ! 1110: { ! 1111: register rtx r = SET_DEST (x); ! 1112: /* A SET that is a subroutine call cannot be dead. */ ! 1113: if (GET_CODE (SET_SRC (x)) == CALL) ! 1114: return 0; ! 1115: while (GET_CODE (r) == SUBREG ! 1116: || (strict_low_ok && GET_CODE (r) == STRICT_LOW_PART) ! 1117: || GET_CODE (r) == ZERO_EXTRACT ! 1118: || GET_CODE (r) == SIGN_EXTRACT) ! 1119: r = SUBREG_REG (r); ! 1120: if (GET_CODE (r) == REG) ! 1121: { ! 1122: register int regno = REGNO (r); ! 1123: register int offset = regno / REGSET_ELT_BITS; ! 1124: register int bit = 1 << (regno % REGSET_ELT_BITS); ! 1125: return (needed[offset] & bit) == 0; ! 1126: } ! 1127: } ! 1128: /* If performing several activities, ! 1129: insn is dead if each activity is individually dead. ! 1130: Also, CLOBBERs and USEs can be ignored; a CLOBBER or USE ! 1131: that's inside a PARALLEL doesn't make the insn worth keeping. */ ! 1132: else if (code == PARALLEL) ! 1133: { ! 1134: register int i = XVECLEN (x, 0); ! 1135: for (i--; i >= 0; i--) ! 1136: { ! 1137: rtx elt = XVECEXP (x, 0, i); ! 1138: if (!insn_dead_p (elt, needed, strict_low_ok) ! 1139: && GET_CODE (elt) != CLOBBER ! 1140: && GET_CODE (elt) != USE) ! 1141: return 0; ! 1142: } ! 1143: return 1; ! 1144: } ! 1145: /* We do not check CLOBBER or USE here. ! 1146: An insn consisting of just a CLOBBER or just a USE ! 1147: should not be deleted. */ ! 1148: return 0; ! 1149: } ! 1150: ! 1151: /* Return 1 if register REGNO was used before it was set. ! 1152: In other words, if it is live at function entry. */ ! 1153: ! 1154: int ! 1155: regno_uninitialized (regno) ! 1156: int regno; ! 1157: { ! 1158: return (basic_block_live_at_start[0][regno / REGSET_ELT_BITS] ! 1159: & (1 << (regno % REGSET_ELT_BITS))); ! 1160: } ! 1161: ! 1162: /* 1 if register REGNO was alive at a place where `setjmp' was called ! 1163: and was set more than once. Such regs may be clobbered by `longjmp'. */ ! 1164: ! 1165: int ! 1166: regno_clobbered_at_setjmp (regno) ! 1167: int regno; ! 1168: { ! 1169: return (reg_n_sets[regno] > 1 ! 1170: && (regs_live_at_setjmp[regno / REGSET_ELT_BITS] ! 1171: & (1 << (regno % REGSET_ELT_BITS)))); ! 1172: } ! 1173: ! 1174: /* Process the registers that are set within X. ! 1175: Their bits are set to 1 in the regset DEAD, ! 1176: because they are dead prior to this insn. ! 1177: ! 1178: If INSN is nonzero, it is the insn being processed ! 1179: and the fact that it is nonzero implies this is the FINAL pass ! 1180: in propagate_block. In this case, various info about register ! 1181: usage is stored, LOG_LINKS fields of insns are set up. */ ! 1182: ! 1183: static void mark_set_1 (); ! 1184: ! 1185: static void ! 1186: mark_set_regs (needed, dead, x, insn, significant) ! 1187: regset needed; ! 1188: regset dead; ! 1189: rtx x; ! 1190: rtx insn; ! 1191: regset significant; ! 1192: { ! 1193: register RTX_CODE code = GET_CODE (x); ! 1194: ! 1195: if (code == SET || code == CLOBBER) ! 1196: mark_set_1 (needed, dead, x, insn, significant); ! 1197: else if (code == PARALLEL) ! 1198: { ! 1199: register int i; ! 1200: for (i = XVECLEN (x, 0) - 1; i >= 0; i--) ! 1201: { ! 1202: code = GET_CODE (XVECEXP (x, 0, i)); ! 1203: if (code == SET || code == CLOBBER) ! 1204: mark_set_1 (needed, dead, XVECEXP (x, 0, i), insn, significant); ! 1205: } ! 1206: } ! 1207: } ! 1208: ! 1209: /* Process a single SET rtx, X. */ ! 1210: ! 1211: static void ! 1212: mark_set_1 (needed, dead, x, insn, significant) ! 1213: regset needed; ! 1214: regset dead; ! 1215: rtx x; ! 1216: rtx insn; ! 1217: regset significant; ! 1218: { ! 1219: register int regno; ! 1220: register rtx reg = SET_DEST (x); ! 1221: ! 1222: if (reg == 0) ! 1223: return; ! 1224: ! 1225: if (GET_CODE (reg) == SUBREG) ! 1226: { ! 1227: /* Modifying just one hardware register ! 1228: of a multi-register value does not count as "setting" ! 1229: for live-dead analysis. Parts of the previous value ! 1230: might still be significant below this insn. */ ! 1231: if (REG_SIZE (SUBREG_REG (reg)) > REG_SIZE (reg)) ! 1232: return; ! 1233: ! 1234: reg = SUBREG_REG (reg); ! 1235: } ! 1236: ! 1237: if (GET_CODE (reg) == REG ! 1238: && (regno = REGNO (reg), regno != FRAME_POINTER_REGNUM) ! 1239: && regno != ARG_POINTER_REGNUM) ! 1240: /* && regno != STACK_POINTER_REGNUM) -- let's try without this. */ ! 1241: { ! 1242: register int offset = regno / REGSET_ELT_BITS; ! 1243: register int bit = 1 << (regno % REGSET_ELT_BITS); ! 1244: int is_needed = 0; ! 1245: ! 1246: /* Mark the reg being set as dead before this insn. */ ! 1247: dead[offset] |= bit; ! 1248: /* Mark it as a significant register for this basic block. */ ! 1249: if (significant) ! 1250: significant[offset] |= bit; ! 1251: /* A hard reg in a wide mode may really be multiple registers. ! 1252: If so, mark all of them just like the first. */ ! 1253: if (regno < FIRST_PSEUDO_REGISTER) ! 1254: { ! 1255: int n = HARD_REGNO_NREGS (regno, GET_MODE (reg)); ! 1256: while (--n > 0) ! 1257: { ! 1258: dead[(regno + n) / REGSET_ELT_BITS] ! 1259: |= 1 << ((regno + n) % REGSET_ELT_BITS); ! 1260: if (significant) ! 1261: significant[(regno + n) / REGSET_ELT_BITS] ! 1262: |= 1 << ((regno + n) % REGSET_ELT_BITS); ! 1263: is_needed |= (needed[(regno + n) / REGSET_ELT_BITS] ! 1264: & 1 << ((regno + n) % REGSET_ELT_BITS)); ! 1265: } ! 1266: } ! 1267: /* Additional data to record if this is the final pass. */ ! 1268: if (insn) ! 1269: { ! 1270: register rtx y = reg_next_use[regno]; ! 1271: register int blocknum = BLOCK_NUM (insn); ! 1272: ! 1273: /* If this is a hard reg, record this function uses the reg. */ ! 1274: ! 1275: if (regno < FIRST_PSEUDO_REGISTER) ! 1276: { ! 1277: register int i; ! 1278: i = HARD_REGNO_NREGS (regno, GET_MODE (reg)); ! 1279: do ! 1280: regs_ever_live[regno + --i] = 1; ! 1281: while (i > 0); ! 1282: } ! 1283: ! 1284: /* Keep track of which basic blocks each reg appears in. */ ! 1285: ! 1286: if (reg_basic_block[regno] == -1) ! 1287: reg_basic_block[regno] = blocknum; ! 1288: else if (reg_basic_block[regno] != blocknum) ! 1289: reg_basic_block[regno] = -2; ! 1290: ! 1291: /* Count (weighted) references, stores, etc. */ ! 1292: reg_n_refs[regno] += loop_depth; ! 1293: reg_n_sets[regno]++; ! 1294: /* The next use is no longer "next", since a store intervenes. */ ! 1295: reg_next_use[regno] = 0; ! 1296: /* The insns where a reg is live are normally counted elsewhere, ! 1297: but we want the count to include the insn where the reg is set, ! 1298: and the normal counting mechanism would not count it. */ ! 1299: reg_live_length[regno]++; ! 1300: if ((needed[offset] & bit) || is_needed) ! 1301: { ! 1302: /* Make a logical link from the next following insn ! 1303: that uses this register, back to this insn. ! 1304: The following insns have already been processed. */ ! 1305: if (y && (BLOCK_NUM (y) == blocknum)) ! 1306: LOG_LINKS (y) ! 1307: = gen_rtx (INSN_LIST, VOIDmode, insn, LOG_LINKS (y)); ! 1308: } ! 1309: else ! 1310: { ! 1311: /* Note that dead stores have already been deleted when possible ! 1312: If we get here, we have found a dead store that cannot ! 1313: be eliminated (because the same insn does something useful). ! 1314: Indicate this by marking the reg being set as dying here. */ ! 1315: REG_NOTES (insn) ! 1316: = gen_rtx (EXPR_LIST, REG_DEAD, ! 1317: reg, REG_NOTES (insn)); ! 1318: reg_n_deaths[REGNO (reg)]++; ! 1319: } ! 1320: } ! 1321: } ! 1322: } ! 1323: ! 1324: /* Scan expression X and store a 1-bit in LIVE for each reg it uses. ! 1325: This is done assuming the registers needed from X ! 1326: are those that have 1-bits in NEEDED. ! 1327: ! 1328: On the final pass, FINAL is 1. This means try for autoincrement ! 1329: and count the uses and deaths of each pseudo-reg. ! 1330: ! 1331: INSN is the containing instruction. */ ! 1332: ! 1333: static void ! 1334: mark_used_regs (needed, live, x, final, insn) ! 1335: regset needed; ! 1336: regset live; ! 1337: rtx x; ! 1338: rtx insn; ! 1339: int final; ! 1340: { ! 1341: register RTX_CODE code; ! 1342: register int regno; ! 1343: ! 1344: retry: ! 1345: code = GET_CODE (x); ! 1346: switch (code) ! 1347: { ! 1348: case LABEL_REF: ! 1349: case SYMBOL_REF: ! 1350: case CONST_INT: ! 1351: case CONST: ! 1352: case CC0: ! 1353: case PC: ! 1354: case CLOBBER: ! 1355: return; ! 1356: ! 1357: #if defined (HAVE_POST_INCREMENT) || defined (HAVE_POST_DECREMENT) ! 1358: case MEM: ! 1359: /* Here we detect use of an index register which might ! 1360: be good for postincrement or postdecrement. */ ! 1361: if (final) ! 1362: { ! 1363: rtx addr = XEXP (x, 0); ! 1364: register int size = GET_MODE_SIZE (GET_MODE (x)); ! 1365: ! 1366: if (GET_CODE (addr) == REG) ! 1367: { ! 1368: register rtx y; ! 1369: regno = REGNO (addr); ! 1370: /* Is the next use an increment that might make auto-increment? */ ! 1371: y = reg_next_use[regno]; ! 1372: if (y && GET_CODE (PATTERN (y)) == SET ! 1373: && BLOCK_NUM (y) == BLOCK_NUM (insn) ! 1374: /* Can't add side effects to jumps; if reg is spilled and ! 1375: reloaded, there's no way to store back the altered value. */ ! 1376: && GET_CODE (insn) != JUMP_INSN ! 1377: && (y = SET_SRC (PATTERN (y)), ! 1378: (0 ! 1379: #ifdef HAVE_POST_INCREMENT ! 1380: || GET_CODE (y) == PLUS ! 1381: #endif ! 1382: #ifdef HAVE_POST_DECREMENT ! 1383: || GET_CODE (y) == MINUS ! 1384: #endif ! 1385: ) ! 1386: && XEXP (y, 0) == addr ! 1387: && GET_CODE (XEXP (y, 1)) == CONST_INT ! 1388: && INTVAL (XEXP (y, 1)) == size) ! 1389: && dead_or_set_p (reg_next_use[regno], addr)) ! 1390: { ! 1391: rtx use = find_use_as_address (PATTERN (insn), addr, 0); ! 1392: ! 1393: /* Make sure this register appears only once in this insn. */ ! 1394: if (use != 0 && use != (rtx) 1) ! 1395: { ! 1396: /* We have found a suitable auto-increment: ! 1397: do POST_INC around the register here, ! 1398: and patch out the increment instruction that follows. */ ! 1399: XEXP (x, 0) ! 1400: = gen_rtx (GET_CODE (y) == PLUS ? POST_INC : POST_DEC, ! 1401: Pmode, addr); ! 1402: /* Record that this insn has an implicit side effect. */ ! 1403: REG_NOTES (insn) ! 1404: = gen_rtx (EXPR_LIST, REG_INC, addr, REG_NOTES (insn)); ! 1405: ! 1406: /* Modify the old increment-insn to simply copy ! 1407: the already-incremented value of our register. */ ! 1408: y = reg_next_use[regno]; ! 1409: SET_SRC (PATTERN (y)) = addr; ! 1410: ! 1411: /* If that makes it a no-op (copying the register ! 1412: into itself) then change it to a simpler no-op ! 1413: so it won't appear to be a "use" and a "set" ! 1414: of this register. */ ! 1415: if (SET_DEST (PATTERN (y)) == addr) ! 1416: PATTERN (y) = gen_rtx (USE, VOIDmode, const0_rtx); ! 1417: ! 1418: /* Count an extra reference to the reg for the increment. ! 1419: When a reg is incremented. ! 1420: spilling it is worse, so we want to make that ! 1421: less likely. */ ! 1422: reg_n_refs[regno] += loop_depth; ! 1423: /* Count the increment as a setting of the register, ! 1424: even though it isn't a SET in rtl. */ ! 1425: reg_n_sets[regno]++; ! 1426: } ! 1427: } ! 1428: } ! 1429: } ! 1430: break; ! 1431: #endif /* HAVE_POST_INCREMENT or HAVE_POST_DECREMENT */ ! 1432: ! 1433: case REG: ! 1434: /* See a register other than being set ! 1435: => mark it as needed. */ ! 1436: ! 1437: regno = REGNO (x); ! 1438: if (regno != FRAME_POINTER_REGNUM ! 1439: && regno != ARG_POINTER_REGNUM) ! 1440: /* && regno != STACK_POINTER_REGNUM) -- let's try without this. */ ! 1441: { ! 1442: register int offset = regno / REGSET_ELT_BITS; ! 1443: register int bit = 1 << (regno % REGSET_ELT_BITS); ! 1444: int is_needed = 0; ! 1445: ! 1446: live[offset] |= bit; ! 1447: /* A hard reg in a wide mode may really be multiple registers. ! 1448: If so, mark all of them just like the first. */ ! 1449: if (regno < FIRST_PSEUDO_REGISTER) ! 1450: { ! 1451: int n = HARD_REGNO_NREGS (regno, GET_MODE (x)); ! 1452: while (--n > 0) ! 1453: { ! 1454: live[(regno + n) / REGSET_ELT_BITS] ! 1455: |= 1 << ((regno + n) % REGSET_ELT_BITS); ! 1456: is_needed |= (needed[(regno + n) / REGSET_ELT_BITS] ! 1457: & 1 << ((regno + n) % REGSET_ELT_BITS)); ! 1458: } ! 1459: } ! 1460: if (final) ! 1461: { ! 1462: register int blocknum = BLOCK_NUM (insn); ! 1463: ! 1464: /* If a hard reg is being used, ! 1465: record that this function does use it. */ ! 1466: ! 1467: if (regno < FIRST_PSEUDO_REGISTER) ! 1468: { ! 1469: register int i; ! 1470: i = HARD_REGNO_NREGS (regno, GET_MODE (x)); ! 1471: do ! 1472: regs_ever_live[regno + --i] = 1; ! 1473: while (i > 0); ! 1474: } ! 1475: ! 1476: /* Keep track of which basic block each reg appears in. */ ! 1477: ! 1478: if (reg_basic_block[regno] == -1) ! 1479: reg_basic_block[regno] = blocknum; ! 1480: else if (reg_basic_block[regno] != blocknum) ! 1481: reg_basic_block[regno] = -2; ! 1482: ! 1483: /* Record where each reg is used ! 1484: so when the reg is set we know the next insn that uses it. */ ! 1485: ! 1486: reg_next_use[regno] = insn; ! 1487: ! 1488: /* Count (weighted) number of uses of each reg. */ ! 1489: ! 1490: reg_n_refs[regno] += loop_depth; ! 1491: ! 1492: /* Record and count the insns in which a reg dies. ! 1493: If it is used in this insn and was dead below the insn ! 1494: then it dies in this insn. */ ! 1495: ! 1496: if (!(needed[offset] & bit) && !is_needed ! 1497: && ! find_regno_note (insn, REG_DEAD, regno)) ! 1498: { ! 1499: REG_NOTES (insn) ! 1500: = gen_rtx (EXPR_LIST, REG_DEAD, x, REG_NOTES (insn)); ! 1501: reg_n_deaths[regno]++; ! 1502: } ! 1503: } ! 1504: } ! 1505: return; ! 1506: ! 1507: case SET: ! 1508: { ! 1509: register rtx testreg = SET_DEST (x); ! 1510: int mark_dest = 0; ! 1511: ! 1512: /* Storing in STRICT_LOW_PART is like storing in a reg ! 1513: in that this SET might be dead, so ignore it in TESTREG. ! 1514: but in some other ways it is like using the reg. */ ! 1515: /* Storing in a SUBREG or a bit field is like storing the entire ! 1516: register in that if the register's value is not used ! 1517: then this SET is not needed. */ ! 1518: while (GET_CODE (testreg) == STRICT_LOW_PART ! 1519: || GET_CODE (testreg) == ZERO_EXTRACT ! 1520: || GET_CODE (testreg) == SIGN_EXTRACT ! 1521: || GET_CODE (testreg) == SUBREG) ! 1522: { ! 1523: /* Modifying a single register in an alternate mode ! 1524: does not use any of the old value. But these other ! 1525: ways of storing in a register do use the old value. */ ! 1526: if (GET_CODE (testreg) == SUBREG ! 1527: && !(REG_SIZE (SUBREG_REG (testreg)) > REG_SIZE (testreg))) ! 1528: ; ! 1529: else ! 1530: mark_dest = 1; ! 1531: ! 1532: testreg = XEXP (testreg, 0); ! 1533: } ! 1534: ! 1535: /* If this is a store into a register, ! 1536: recursively scan the only value being stored, ! 1537: and only if the register's value is live after this insn. ! 1538: If the value being computed here would never be used ! 1539: then the values it uses don't need to be computed either. */ ! 1540: ! 1541: if (GET_CODE (testreg) == REG ! 1542: && (regno = REGNO (testreg), regno != FRAME_POINTER_REGNUM) ! 1543: && regno != ARG_POINTER_REGNUM) ! 1544: /* && regno != STACK_POINTER_REGNUM) -- let's try without this. */ ! 1545: { ! 1546: register int offset = regno / REGSET_ELT_BITS; ! 1547: register int bit = 1 << (regno % REGSET_ELT_BITS); ! 1548: if ((needed[offset] & bit) ! 1549: /* If insn refers to volatile, we mustn't delete it, ! 1550: so its inputs are all needed. */ ! 1551: || INSN_VOLATILE (insn)) ! 1552: { ! 1553: mark_used_regs (needed, live, SET_SRC (x), final, insn); ! 1554: if (mark_dest) ! 1555: mark_used_regs (needed, live, SET_DEST (x), final, insn); ! 1556: } ! 1557: return; ! 1558: } ! 1559: } ! 1560: break; ! 1561: } ! 1562: ! 1563: /* Recursively scan the operands of this expression. */ ! 1564: ! 1565: { ! 1566: register char *fmt = GET_RTX_FORMAT (code); ! 1567: register int i; ! 1568: ! 1569: for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) ! 1570: { ! 1571: if (fmt[i] == 'e') ! 1572: { ! 1573: /* Tail recursive case: save a function call level. */ ! 1574: if (i == 0) ! 1575: { ! 1576: x = XEXP (x, 0); ! 1577: goto retry; ! 1578: } ! 1579: mark_used_regs (needed, live, XEXP (x, i), final, insn); ! 1580: } ! 1581: if (fmt[i] == 'E') ! 1582: { ! 1583: register int j; ! 1584: for (j = 0; j < XVECLEN (x, i); j++) ! 1585: mark_used_regs (needed, live, XVECEXP (x, i, j), final, insn); ! 1586: } ! 1587: } ! 1588: } ! 1589: } ! 1590: ! 1591: /* Nonzero if X contains any volatile memory references ! 1592: or volatile ASM_OPERANDS expressions. */ ! 1593: ! 1594: static int ! 1595: volatile_refs_p (x) ! 1596: rtx x; ! 1597: { ! 1598: register RTX_CODE code; ! 1599: ! 1600: code = GET_CODE (x); ! 1601: switch (code) ! 1602: { ! 1603: case LABEL_REF: ! 1604: case SYMBOL_REF: ! 1605: case CONST_INT: ! 1606: case CONST: ! 1607: case CC0: ! 1608: case PC: ! 1609: case CLOBBER: ! 1610: case REG: ! 1611: return 0; ! 1612: ! 1613: case CALL: ! 1614: return 1; ! 1615: ! 1616: case MEM: ! 1617: case ASM_OPERANDS: ! 1618: if (x->volatil) ! 1619: return 1; ! 1620: } ! 1621: ! 1622: /* Recursively scan the operands of this expression. */ ! 1623: ! 1624: { ! 1625: register char *fmt = GET_RTX_FORMAT (code); ! 1626: register int i; ! 1627: ! 1628: for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) ! 1629: { ! 1630: if (fmt[i] == 'e') ! 1631: { ! 1632: if (volatile_refs_p (XEXP (x, i))) ! 1633: return 1; ! 1634: } ! 1635: if (fmt[i] == 'E') ! 1636: { ! 1637: register int j; ! 1638: for (j = 0; j < XVECLEN (x, i); j++) ! 1639: if (volatile_refs_p (XVECEXP (x, i, j))) ! 1640: return 1; ! 1641: } ! 1642: } ! 1643: } ! 1644: return 0; ! 1645: } ! 1646: ! 1647: #ifdef AUTO_INC_DEC ! 1648: ! 1649: static int ! 1650: try_pre_increment_1 (insn) ! 1651: rtx insn; ! 1652: { ! 1653: /* Find the next use of this reg. If in same basic block, ! 1654: make it do pre-increment or pre-decrement if appropriate. */ ! 1655: rtx x = PATTERN (insn); ! 1656: int amount = ((GET_CODE (SET_SRC (x)) == PLUS ? 1 : -1) ! 1657: * INTVAL (XEXP (SET_SRC (x), 1))); ! 1658: int regno = REGNO (SET_DEST (x)); ! 1659: rtx y = reg_next_use[regno]; ! 1660: if (y != 0 ! 1661: && BLOCK_NUM (y) == BLOCK_NUM (insn) ! 1662: && try_pre_increment (y, SET_DEST (PATTERN (insn)), ! 1663: amount)) ! 1664: { ! 1665: /* We have found a suitable auto-increment ! 1666: and already changed insn Y to do it. ! 1667: So flush this increment-instruction. */ ! 1668: PUT_CODE (insn, NOTE); ! 1669: NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED; ! 1670: NOTE_SOURCE_FILE (insn) = 0; ! 1671: /* Count a reference to this reg for the increment ! 1672: insn we are deleting. When a reg is incremented. ! 1673: spilling it is worse, so we want to make that ! 1674: less likely. */ ! 1675: reg_n_refs[regno] += loop_depth; ! 1676: reg_n_sets[regno]++; ! 1677: return 1; ! 1678: } ! 1679: return 0; ! 1680: } ! 1681: ! 1682: /* Try to change INSN so that it does pre-increment or pre-decrement ! 1683: addressing on register REG in order to add AMOUNT to REG. ! 1684: AMOUNT is negative for pre-decrement. ! 1685: Returns 1 if the change could be made. ! 1686: This checks all about the validity of the result of modifying INSN. */ ! 1687: ! 1688: static int ! 1689: try_pre_increment (insn, reg, amount) ! 1690: rtx insn, reg; ! 1691: int amount; ! 1692: { ! 1693: register rtx use; ! 1694: ! 1695: /* Nonzero if we can try to make a pre-increment or pre-decrement. ! 1696: For example, addl $4,r1; movl (r1),... can become movl +(r1),... */ ! 1697: int pre_ok = 0; ! 1698: /* Nonzero if we can try to make a post-increment or post-decrement. ! 1699: For example, addl $4,r1; movl -4(r1),... can become movl (r1)+,... ! 1700: It is possible for both PRE_OK and POST_OK to be nonzero if the machine ! 1701: supports both pre-inc and post-inc, or both pre-dec and post-dec. */ ! 1702: int post_ok = 0; ! 1703: ! 1704: /* Nonzero if the opportunity actually requires post-inc or post-dec. */ ! 1705: int do_post = 0; ! 1706: ! 1707: /* From the sign of increment, see which possibilities are conceivable ! 1708: on this target machine. */ ! 1709: #ifdef HAVE_PRE_INCREMENT ! 1710: if (amount > 0) ! 1711: pre_ok = 1; ! 1712: #endif ! 1713: #ifdef HAVE_POST_INCREMENT ! 1714: if (amount > 0) ! 1715: post_ok = 1; ! 1716: #endif ! 1717: ! 1718: #ifdef HAVE_PRE_DECREMENT ! 1719: if (amount < 0) ! 1720: pre_ok = 1; ! 1721: #endif ! 1722: #ifdef HAVE_POST_DECREMENT ! 1723: if (amount < 0) ! 1724: post_ok = 1; ! 1725: #endif ! 1726: ! 1727: if (! (pre_ok || post_ok)) ! 1728: return 0; ! 1729: ! 1730: /* It is not safe to add a side effect to a jump insn ! 1731: because if the incremented register is spilled and must be reloaded ! 1732: there would be no way to store the incremented value back in memory. */ ! 1733: ! 1734: if (GET_CODE (insn) == JUMP_INSN) ! 1735: return 0; ! 1736: ! 1737: use = 0; ! 1738: if (pre_ok) ! 1739: use = find_use_as_address (PATTERN (insn), reg, 0); ! 1740: if (post_ok && (use == 0 || use == (rtx) 1)) ! 1741: { ! 1742: use = find_use_as_address (PATTERN (insn), reg, -amount); ! 1743: do_post = 1; ! 1744: } ! 1745: ! 1746: if (use == 0 || use == (rtx) 1) ! 1747: return 0; ! 1748: ! 1749: if (GET_MODE_SIZE (GET_MODE (use)) != (amount > 0 ? amount : - amount)) ! 1750: return 0; ! 1751: ! 1752: XEXP (use, 0) = gen_rtx (amount > 0 ! 1753: ? (do_post ? POST_INC : PRE_INC) ! 1754: : (do_post ? POST_DEC : PRE_DEC), ! 1755: Pmode, reg); ! 1756: ! 1757: /* Record that this insn now has an implicit side effect on X. */ ! 1758: REG_NOTES (insn) = gen_rtx (EXPR_LIST, REG_INC, reg, REG_NOTES (insn)); ! 1759: return 1; ! 1760: } ! 1761: ! 1762: #endif /* AUTO_INC_DEC */ ! 1763: ! 1764: /* Find the place in the rtx X where REG is used as a memory address. ! 1765: Return the MEM rtx that so uses it. ! 1766: If PLUSCONST is nonzero, search instead for a memory address equivalent to ! 1767: (plus REG (const_int PLUSCONST)). ! 1768: ! 1769: If such an address does not appear, return 0. ! 1770: If REG appears more than once, or is used other than in such an address, ! 1771: return (rtx)1. */ ! 1772: ! 1773: static rtx ! 1774: find_use_as_address (x, reg, plusconst) ! 1775: register rtx x; ! 1776: rtx reg; ! 1777: int plusconst; ! 1778: { ! 1779: enum rtx_code code = GET_CODE (x); ! 1780: char *fmt = GET_RTX_FORMAT (code); ! 1781: register int i; ! 1782: register rtx value = 0; ! 1783: register rtx tem; ! 1784: ! 1785: if (code == MEM && XEXP (x, 0) == reg && plusconst == 0) ! 1786: return x; ! 1787: ! 1788: if (code == MEM && GET_CODE (XEXP (x, 0)) == PLUS ! 1789: && XEXP (XEXP (x, 0), 0) == reg ! 1790: && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT ! 1791: && INTVAL (XEXP (XEXP (x, 0), 1)) == plusconst) ! 1792: return x; ! 1793: ! 1794: if (code == SIGN_EXTRACT || code == ZERO_EXTRACT) ! 1795: { ! 1796: /* If REG occurs inside a MEM used in a bit-field reference, ! 1797: that is unacceptable. */ ! 1798: if (find_use_as_address (XEXP (x, 0), reg, 0) != 0) ! 1799: return (rtx) 1; ! 1800: } ! 1801: ! 1802: if (x == reg) ! 1803: return (rtx) 1; ! 1804: ! 1805: for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) ! 1806: { ! 1807: if (fmt[i] == 'e') ! 1808: { ! 1809: tem = find_use_as_address (XEXP (x, i), reg, plusconst); ! 1810: if (value == 0) ! 1811: value = tem; ! 1812: else if (tem != 0) ! 1813: return (rtx) 1; ! 1814: } ! 1815: if (fmt[i] == 'E') ! 1816: { ! 1817: register int j; ! 1818: for (j = XVECLEN (x, i) - 1; j >= 0; j--) ! 1819: { ! 1820: tem = find_use_as_address (XVECEXP (x, i, j), reg, plusconst); ! 1821: if (value == 0) ! 1822: value = tem; ! 1823: else if (tem != 0) ! 1824: return (rtx) 1; ! 1825: } ! 1826: } ! 1827: } ! 1828: ! 1829: return value; ! 1830: } ! 1831: ! 1832: /* Write information about registers and basic blocks into FILE. ! 1833: This is part of making a debugging dump. */ ! 1834: ! 1835: void ! 1836: dump_flow_info (file) ! 1837: FILE *file; ! 1838: { ! 1839: register int i; ! 1840: static char *reg_class_names[] = REG_CLASS_NAMES; ! 1841: ! 1842: fprintf (file, "%d registers.\n", max_regno); ! 1843: ! 1844: for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++) ! 1845: if (reg_n_refs[i]) ! 1846: { ! 1847: enum reg_class class; ! 1848: fprintf (file, "\nRegister %d used %d times across %d insns", ! 1849: i, reg_n_refs[i], reg_live_length[i]); ! 1850: if (reg_basic_block[i] >= 0) ! 1851: fprintf (file, " in block %d", reg_basic_block[i]); ! 1852: if (reg_n_deaths[i] != 1) ! 1853: fprintf (file, "; dies in %d places", reg_n_deaths[i]); ! 1854: if (reg_crosses_call[i]) ! 1855: fprintf (file, "; crosses calls"); ! 1856: if (PSEUDO_REGNO_BYTES (i) != UNITS_PER_WORD) ! 1857: fprintf (file, "; %d bytes", PSEUDO_REGNO_BYTES (i)); ! 1858: class = reg_preferred_class (i); ! 1859: if (class != GENERAL_REGS) ! 1860: { ! 1861: if (reg_preferred_or_nothing (i)) ! 1862: fprintf (file, "; %s or none", reg_class_names[(int) class]); ! 1863: else ! 1864: fprintf (file, "; pref %s", reg_class_names[(int) class]); ! 1865: } ! 1866: if (REGNO_POINTER_FLAG (i)) ! 1867: fprintf (file, "; pointer"); ! 1868: fprintf (file, ".\n"); ! 1869: } ! 1870: fprintf (file, "\n%d basic blocks.\n", n_basic_blocks); ! 1871: for (i = 0; i < n_basic_blocks; i++) ! 1872: { ! 1873: register rtx head, jump; ! 1874: register int regno; ! 1875: fprintf (file, "\nBasic block %d: first insn %d, last %d.\n", ! 1876: i, ! 1877: INSN_UID (basic_block_head[i]), ! 1878: INSN_UID (basic_block_end[i])); ! 1879: /* The control flow graph's storage is freed ! 1880: now when flow_analysis returns. ! 1881: Don't try to print it if it is gone. */ ! 1882: if (basic_block_drops_in) ! 1883: { ! 1884: fprintf (file, "Reached from blocks: "); ! 1885: head = basic_block_head[i]; ! 1886: if (GET_CODE (head) == CODE_LABEL) ! 1887: for (jump = LABEL_REFS (head); ! 1888: jump != head; ! 1889: jump = LABEL_NEXTREF (jump)) ! 1890: { ! 1891: register from_block = BLOCK_NUM (CONTAINING_INSN (jump)); ! 1892: fprintf (file, " %d", from_block); ! 1893: } ! 1894: if (basic_block_drops_in[i]) ! 1895: fprintf (file, " previous"); ! 1896: } ! 1897: fprintf (file, "\nRegisters live at start:"); ! 1898: for (regno = 0; regno < max_regno; regno++) ! 1899: { ! 1900: register int offset = regno / REGSET_ELT_BITS; ! 1901: register int bit = 1 << (regno % REGSET_ELT_BITS); ! 1902: if (basic_block_live_at_start[i][offset] & bit) ! 1903: fprintf (file, " %d", regno); ! 1904: } ! 1905: fprintf (file, "\n"); ! 1906: } ! 1907: fprintf (file, "\n"); ! 1908: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.