|
|
1.1 ! root 1: /* Data flow analysis for GNU compiler. ! 2: Copyright (C) 1987, 1988, 1992 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 the data flow analysis pass of the compiler. ! 22: It computes data flow information ! 23: which tells combine_instructions which insns to consider combining ! 24: and controls register allocation. ! 25: ! 26: Additional data flow information that is too bulky to record ! 27: is generated during the analysis, and is used at that time to ! 28: create autoincrement and autodecrement addressing. ! 29: ! 30: The first step is dividing the function into basic blocks. ! 31: find_basic_blocks does this. Then life_analysis determines ! 32: where each register is live and where it is dead. ! 33: ! 34: ** find_basic_blocks ** ! 35: ! 36: find_basic_blocks divides the current function's rtl ! 37: into basic blocks. It records the beginnings and ends of the ! 38: basic blocks in the vectors basic_block_head and basic_block_end, ! 39: and the number of blocks in n_basic_blocks. ! 40: ! 41: find_basic_blocks also finds any unreachable loops ! 42: and deletes them. ! 43: ! 44: ** life_analysis ** ! 45: ! 46: life_analysis is called immediately after find_basic_blocks. ! 47: It uses the basic block information to determine where each ! 48: hard or pseudo register is live. ! 49: ! 50: ** live-register info ** ! 51: ! 52: The information about where each register is live is in two parts: ! 53: the REG_NOTES of insns, and the vector basic_block_live_at_start. ! 54: ! 55: basic_block_live_at_start has an element for each basic block, ! 56: and the element is a bit-vector with a bit for each hard or pseudo ! 57: register. The bit is 1 if the register is live at the beginning ! 58: of the basic block. ! 59: ! 60: Two types of elements can be added to an insn's REG_NOTES. ! 61: A REG_DEAD note is added to an insn's REG_NOTES for any register ! 62: that meets both of two conditions: The value in the register is not ! 63: needed in subsequent insns and the insn does not replace the value in ! 64: the register (in the case of multi-word hard registers, the value in ! 65: each register must be replaced by the insn to avoid a REG_DEAD note). ! 66: ! 67: In the vast majority of cases, an object in a REG_DEAD note will be ! 68: used somewhere in the insn. The (rare) exception to this is if an ! 69: insn uses a multi-word hard register and only some of the registers are ! 70: needed in subsequent insns. In that case, REG_DEAD notes will be ! 71: provided for those hard registers that are not subsequently needed. ! 72: Partial REG_DEAD notes of this type do not occur when an insn sets ! 73: only some of the hard registers used in such a multi-word operand; ! 74: omitting REG_DEAD notes for objects stored in an insn is optional and ! 75: the desire to do so does not justify the complexity of the partial ! 76: REG_DEAD notes. ! 77: ! 78: REG_UNUSED notes are added for each register that is set by the insn ! 79: but is unused subsequently (if every register set by the insn is unused ! 80: and the insn does not reference memory or have some other side-effect, ! 81: the insn is deleted instead). If only part of a multi-word hard ! 82: register is used in a subsequent insn, REG_UNUSED notes are made for ! 83: the parts that will not be used. ! 84: ! 85: To determine which registers are live after any insn, one can ! 86: start from the beginning of the basic block and scan insns, noting ! 87: which registers are set by each insn and which die there. ! 88: ! 89: ** Other actions of life_analysis ** ! 90: ! 91: life_analysis sets up the LOG_LINKS fields of insns because the ! 92: information needed to do so is readily available. ! 93: ! 94: life_analysis deletes insns whose only effect is to store a value ! 95: that is never used. ! 96: ! 97: life_analysis notices cases where a reference to a register as ! 98: a memory address can be combined with a preceding or following ! 99: incrementation or decrementation of the register. The separate ! 100: instruction to increment or decrement is deleted and the address ! 101: is changed to a POST_INC or similar rtx. ! 102: ! 103: Each time an incrementing or decrementing address is created, ! 104: a REG_INC element is added to the insn's REG_NOTES list. ! 105: ! 106: life_analysis fills in certain vectors containing information about ! 107: register usage: reg_n_refs, reg_n_deaths, reg_n_sets, reg_live_length, ! 108: reg_n_calls_crosses and reg_basic_block. */ ! 109: ! 110: #include <stdio.h> ! 111: #include "config.h" ! 112: #include "rtl.h" ! 113: #include "basic-block.h" ! 114: #include "insn-config.h" ! 115: #include "regs.h" ! 116: #include "hard-reg-set.h" ! 117: #include "flags.h" ! 118: #include "output.h" ! 119: ! 120: #include "obstack.h" ! 121: #define obstack_chunk_alloc xmalloc ! 122: #define obstack_chunk_free free ! 123: ! 124: extern int xmalloc (); ! 125: extern void free (); ! 126: ! 127: /* List of labels that must never be deleted. */ ! 128: extern rtx forced_labels; ! 129: ! 130: /* Get the basic block number of an insn. ! 131: This info should not be expected to remain available ! 132: after the end of life_analysis. */ ! 133: ! 134: /* This is the limit of the allocated space in the following two arrays. */ ! 135: ! 136: static int max_uid_for_flow; ! 137: ! 138: #define BLOCK_NUM(INSN) uid_block_number[INSN_UID (INSN)] ! 139: ! 140: /* This is where the BLOCK_NUM values are really stored. ! 141: This is set up by find_basic_blocks and used there and in life_analysis, ! 142: and then freed. */ ! 143: ! 144: static short *uid_block_number; ! 145: ! 146: /* INSN_VOLATILE (insn) is 1 if the insn refers to anything volatile. */ ! 147: ! 148: #define INSN_VOLATILE(INSN) uid_volatile[INSN_UID (INSN)] ! 149: static char *uid_volatile; ! 150: ! 151: /* Number of basic blocks in the current function. */ ! 152: ! 153: int n_basic_blocks; ! 154: ! 155: /* Maximum register number used in this function, plus one. */ ! 156: ! 157: int max_regno; ! 158: ! 159: /* Maximum number of SCRATCH rtx's used in any basic block of this function. */ ! 160: ! 161: int max_scratch; ! 162: ! 163: /* Number of SCRATCH rtx's in the current block. */ ! 164: ! 165: static int num_scratch; ! 166: ! 167: /* Indexed by n, gives number of basic block that (REG n) is used in. ! 168: If the value is REG_BLOCK_GLOBAL (-2), ! 169: it means (REG n) is used in more than one basic block. ! 170: REG_BLOCK_UNKNOWN (-1) means it hasn't been seen yet so we don't know. ! 171: This information remains valid for the rest of the compilation ! 172: of the current function; it is used to control register allocation. */ ! 173: ! 174: short *reg_basic_block; ! 175: ! 176: /* Indexed by n, gives number of times (REG n) is used or set, each ! 177: weighted by its loop-depth. ! 178: This information remains valid for the rest of the compilation ! 179: of the current function; it is used to control register allocation. */ ! 180: ! 181: int *reg_n_refs; ! 182: ! 183: /* Indexed by N, gives number of places register N dies. ! 184: This information remains valid for the rest of the compilation ! 185: of the current function; it is used to control register allocation. */ ! 186: ! 187: short *reg_n_deaths; ! 188: ! 189: /* Indexed by N, gives 1 if that reg is live across any CALL_INSNs. ! 190: This information remains valid for the rest of the compilation ! 191: of the current function; it is used to control register allocation. */ ! 192: ! 193: int *reg_n_calls_crossed; ! 194: ! 195: /* Total number of instructions at which (REG n) is live. ! 196: The larger this is, the less priority (REG n) gets for ! 197: allocation in a real register. ! 198: This information remains valid for the rest of the compilation ! 199: of the current function; it is used to control register allocation. ! 200: ! 201: local-alloc.c may alter this number to change the priority. ! 202: ! 203: Negative values are special. ! 204: -1 is used to mark a pseudo reg which has a constant or memory equivalent ! 205: and is used infrequently enough that it should not get a hard register. ! 206: -2 is used to mark a pseudo reg for a parameter, when a frame pointer ! 207: is not required. global-alloc.c makes an allocno for this but does ! 208: not try to assign a hard register to it. */ ! 209: ! 210: int *reg_live_length; ! 211: ! 212: /* Element N is the next insn that uses (hard or pseudo) register number N ! 213: within the current basic block; or zero, if there is no such insn. ! 214: This is valid only during the final backward scan in propagate_block. */ ! 215: ! 216: static rtx *reg_next_use; ! 217: ! 218: /* Size of a regset for the current function, ! 219: in (1) bytes and (2) elements. */ ! 220: ! 221: int regset_bytes; ! 222: int regset_size; ! 223: ! 224: /* Element N is first insn in basic block N. ! 225: This info lasts until we finish compiling the function. */ ! 226: ! 227: rtx *basic_block_head; ! 228: ! 229: /* Element N is last insn in basic block N. ! 230: This info lasts until we finish compiling the function. */ ! 231: ! 232: rtx *basic_block_end; ! 233: ! 234: /* Element N is a regset describing the registers live ! 235: at the start of basic block N. ! 236: This info lasts until we finish compiling the function. */ ! 237: ! 238: regset *basic_block_live_at_start; ! 239: ! 240: /* Regset of regs live when calls to `setjmp'-like functions happen. */ ! 241: ! 242: regset regs_live_at_setjmp; ! 243: ! 244: /* List made of EXPR_LIST rtx's which gives pairs of pseudo registers ! 245: that have to go in the same hard reg. ! 246: The first two regs in the list are a pair, and the next two ! 247: are another pair, etc. */ ! 248: rtx regs_may_share; ! 249: ! 250: /* Element N is nonzero if control can drop into basic block N ! 251: from the preceding basic block. Freed after life_analysis. */ ! 252: ! 253: static char *basic_block_drops_in; ! 254: ! 255: /* Element N is depth within loops of the last insn in basic block number N. ! 256: Freed after life_analysis. */ ! 257: ! 258: static short *basic_block_loop_depth; ! 259: ! 260: /* Element N nonzero if basic block N can actually be reached. ! 261: Vector exists only during find_basic_blocks. */ ! 262: ! 263: static char *block_live_static; ! 264: ! 265: /* Depth within loops of basic block being scanned for lifetime analysis, ! 266: plus one. This is the weight attached to references to registers. */ ! 267: ! 268: static int loop_depth; ! 269: ! 270: /* During propagate_block, this is non-zero if the value of CC0 is live. */ ! 271: ! 272: static int cc0_live; ! 273: ! 274: /* During propagate_block, this contains the last MEM stored into. It ! 275: is used to eliminate consecutive stores to the same location. */ ! 276: ! 277: static rtx last_mem_set; ! 278: ! 279: /* Set of registers that may be eliminable. These are handled specially ! 280: in updating regs_ever_live. */ ! 281: ! 282: static HARD_REG_SET elim_reg_set; ! 283: ! 284: /* Forward declarations */ ! 285: static void find_basic_blocks (); ! 286: static void life_analysis (); ! 287: static void mark_label_ref (); ! 288: void allocate_for_life_analysis (); /* Used also in stupid_life_analysis */ ! 289: static void init_regset_vector (); ! 290: static void propagate_block (); ! 291: static void mark_set_regs (); ! 292: static void mark_used_regs (); ! 293: static int insn_dead_p (); ! 294: static int libcall_dead_p (); ! 295: static int try_pre_increment (); ! 296: static int try_pre_increment_1 (); ! 297: static rtx find_use_as_address (); ! 298: void dump_flow_info (); ! 299: ! 300: /* Find basic blocks of the current function and perform data flow analysis. ! 301: F is the first insn of the function and NREGS the number of register numbers ! 302: in use. */ ! 303: ! 304: void ! 305: flow_analysis (f, nregs, file) ! 306: rtx f; ! 307: int nregs; ! 308: FILE *file; ! 309: { ! 310: register rtx insn; ! 311: register int i; ! 312: rtx nonlocal_label_list = nonlocal_label_rtx_list (); ! 313: ! 314: #ifdef ELIMINABLE_REGS ! 315: static struct {int from, to; } eliminables[] = ELIMINABLE_REGS; ! 316: #endif ! 317: ! 318: /* Record which registers will be eliminated. We use this in ! 319: mark_used_regs. */ ! 320: ! 321: CLEAR_HARD_REG_SET (elim_reg_set); ! 322: ! 323: #ifdef ELIMINABLE_REGS ! 324: for (i = 0; i < sizeof eliminables / sizeof eliminables[0]; i++) ! 325: SET_HARD_REG_BIT (elim_reg_set, eliminables[i].from); ! 326: #else ! 327: SET_HARD_REG_BIT (elim_reg_set, FRAME_POINTER_REGNUM); ! 328: #endif ! 329: ! 330: /* Count the basic blocks. Also find maximum insn uid value used. */ ! 331: ! 332: { ! 333: register RTX_CODE prev_code = JUMP_INSN; ! 334: register RTX_CODE code; ! 335: ! 336: max_uid_for_flow = 0; ! 337: ! 338: for (insn = f, i = 0; insn; insn = NEXT_INSN (insn)) ! 339: { ! 340: code = GET_CODE (insn); ! 341: if (INSN_UID (insn) > max_uid_for_flow) ! 342: max_uid_for_flow = INSN_UID (insn); ! 343: if (code == CODE_LABEL ! 344: || (GET_RTX_CLASS (code) == 'i' ! 345: && (prev_code == JUMP_INSN ! 346: || (prev_code == CALL_INSN ! 347: && nonlocal_label_list != 0) ! 348: || prev_code == BARRIER))) ! 349: i++; ! 350: if (code != NOTE) ! 351: prev_code = code; ! 352: } ! 353: } ! 354: ! 355: #ifdef AUTO_INC_DEC ! 356: /* Leave space for insns we make in some cases for auto-inc. These cases ! 357: are rare, so we don't need too much space. */ ! 358: max_uid_for_flow += max_uid_for_flow / 10; ! 359: #endif ! 360: ! 361: /* Allocate some tables that last till end of compiling this function ! 362: and some needed only in find_basic_blocks and life_analysis. */ ! 363: ! 364: n_basic_blocks = i; ! 365: basic_block_head = (rtx *) oballoc (n_basic_blocks * sizeof (rtx)); ! 366: basic_block_end = (rtx *) oballoc (n_basic_blocks * sizeof (rtx)); ! 367: basic_block_drops_in = (char *) alloca (n_basic_blocks); ! 368: basic_block_loop_depth = (short *) alloca (n_basic_blocks * sizeof (short)); ! 369: uid_block_number ! 370: = (short *) alloca ((max_uid_for_flow + 1) * sizeof (short)); ! 371: uid_volatile = (char *) alloca (max_uid_for_flow + 1); ! 372: bzero (uid_volatile, max_uid_for_flow + 1); ! 373: ! 374: find_basic_blocks (f, nonlocal_label_list); ! 375: life_analysis (f, nregs); ! 376: if (file) ! 377: dump_flow_info (file); ! 378: ! 379: basic_block_drops_in = 0; ! 380: uid_block_number = 0; ! 381: basic_block_loop_depth = 0; ! 382: } ! 383: ! 384: /* Find all basic blocks of the function whose first insn is F. ! 385: Store the correct data in the tables that describe the basic blocks, ! 386: set up the chains of references for each CODE_LABEL, and ! 387: delete any entire basic blocks that cannot be reached. ! 388: ! 389: NONLOCAL_LABEL_LIST is the same local variable from flow_analysis. */ ! 390: ! 391: static void ! 392: find_basic_blocks (f, nonlocal_label_list) ! 393: rtx f, nonlocal_label_list; ! 394: { ! 395: register rtx insn; ! 396: register int i; ! 397: register char *block_live = (char *) alloca (n_basic_blocks); ! 398: register char *block_marked = (char *) alloca (n_basic_blocks); ! 399: /* List of label_refs to all labels whose addresses are taken ! 400: and used as data. */ ! 401: rtx label_value_list = 0; ! 402: ! 403: block_live_static = block_live; ! 404: bzero (block_live, n_basic_blocks); ! 405: bzero (block_marked, n_basic_blocks); ! 406: ! 407: /* Initialize with just block 0 reachable and no blocks marked. */ ! 408: if (n_basic_blocks > 0) ! 409: block_live[0] = 1; ! 410: ! 411: /* Initialize the ref chain of each label to 0. */ ! 412: /* Record where all the blocks start and end and their depth in loops. */ ! 413: /* For each insn, record the block it is in. */ ! 414: /* Also mark as reachable any blocks headed by labels that ! 415: must not be deleted. */ ! 416: ! 417: { ! 418: register RTX_CODE prev_code = JUMP_INSN; ! 419: register RTX_CODE code; ! 420: int depth = 1; ! 421: ! 422: for (insn = f, i = -1; insn; insn = NEXT_INSN (insn)) ! 423: { ! 424: code = GET_CODE (insn); ! 425: if (code == NOTE) ! 426: { ! 427: if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_BEG) ! 428: depth++; ! 429: else if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_END) ! 430: depth--; ! 431: } ! 432: /* A basic block starts at label, or after something that can jump. */ ! 433: else if (code == CODE_LABEL ! 434: || (GET_RTX_CLASS (code) == 'i' ! 435: && (prev_code == JUMP_INSN ! 436: || (prev_code == CALL_INSN ! 437: && nonlocal_label_list != 0) ! 438: || prev_code == BARRIER))) ! 439: { ! 440: basic_block_head[++i] = insn; ! 441: basic_block_end[i] = insn; ! 442: basic_block_loop_depth[i] = depth; ! 443: if (code == CODE_LABEL) ! 444: { ! 445: LABEL_REFS (insn) = insn; ! 446: /* Any label that cannot be deleted ! 447: is considered to start a reachable block. */ ! 448: if (LABEL_PRESERVE_P (insn)) ! 449: block_live[i] = 1; ! 450: } ! 451: } ! 452: else if (GET_RTX_CLASS (code) == 'i') ! 453: { ! 454: basic_block_end[i] = insn; ! 455: basic_block_loop_depth[i] = depth; ! 456: } ! 457: ! 458: /* Make a list of all labels referred to other than by jumps. */ ! 459: if (code == INSN || code == CALL_INSN) ! 460: { ! 461: rtx note = find_reg_note (insn, REG_LABEL, 0); ! 462: if (note != 0) ! 463: label_value_list = gen_rtx (EXPR_LIST, VOIDmode, XEXP (note, 0), ! 464: label_value_list); ! 465: } ! 466: ! 467: BLOCK_NUM (insn) = i; ! 468: ! 469: /* Don't separare a CALL_INSN from following CLOBBER insns. This is ! 470: a kludge that will go away when each CALL_INSN records its ! 471: USE and CLOBBERs. */ ! 472: ! 473: if (code != NOTE ! 474: && ! (prev_code == CALL_INSN && code == INSN ! 475: && GET_CODE (PATTERN (insn)) == CLOBBER)) ! 476: prev_code = code; ! 477: } ! 478: if (i + 1 != n_basic_blocks) ! 479: abort (); ! 480: } ! 481: ! 482: /* Don't delete the labels that are referenced by non-jump instructions. */ ! 483: { ! 484: register rtx x; ! 485: for (x = label_value_list; x; x = XEXP (x, 1)) ! 486: block_live[BLOCK_NUM (XEXP (x, 0))] = 1; ! 487: } ! 488: ! 489: /* Record which basic blocks control can drop in to. */ ! 490: ! 491: { ! 492: register int i; ! 493: for (i = 0; i < n_basic_blocks; i++) ! 494: { ! 495: register rtx insn = PREV_INSN (basic_block_head[i]); ! 496: /* TEMP1 is used to avoid a bug in Sequent's compiler. */ ! 497: register int temp1; ! 498: while (insn && GET_CODE (insn) == NOTE) ! 499: insn = PREV_INSN (insn); ! 500: temp1 = insn && GET_CODE (insn) != BARRIER; ! 501: basic_block_drops_in[i] = temp1; ! 502: } ! 503: } ! 504: ! 505: /* Now find which basic blocks can actually be reached ! 506: and put all jump insns' LABEL_REFS onto the ref-chains ! 507: of their target labels. */ ! 508: ! 509: if (n_basic_blocks > 0) ! 510: { ! 511: int something_marked = 1; ! 512: ! 513: /* Find all indirect jump insns and mark them as possibly jumping ! 514: to all the labels whose addresses are explicitly used. ! 515: This is because, when there are computed gotos, ! 516: we can't tell which labels they jump to, of all the possibilities. */ ! 517: ! 518: for (insn = f; insn; insn = NEXT_INSN (insn)) ! 519: if (GET_CODE (insn) == JUMP_INSN ! 520: && GET_CODE (PATTERN (insn)) == SET ! 521: && SET_DEST (PATTERN (insn)) == pc_rtx ! 522: && GET_CODE (SET_SRC (PATTERN (insn))) == REG) ! 523: { ! 524: rtx x; ! 525: for (x = label_value_list; x; x = XEXP (x, 1)) ! 526: mark_label_ref (gen_rtx (LABEL_REF, VOIDmode, XEXP (x, 0)), ! 527: insn, 0); ! 528: for (x = forced_labels; x; x = XEXP (x, 1)) ! 529: mark_label_ref (gen_rtx (LABEL_REF, VOIDmode, XEXP (x, 0)), ! 530: insn, 0); ! 531: } ! 532: ! 533: /* Find all call insns and mark them as possibly jumping ! 534: to all the nonlocal goto handler labels. */ ! 535: ! 536: for (insn = f; insn; insn = NEXT_INSN (insn)) ! 537: if (GET_CODE (insn) == CALL_INSN) ! 538: { ! 539: rtx x; ! 540: for (x = nonlocal_label_list; x; x = XEXP (x, 1)) ! 541: mark_label_ref (gen_rtx (LABEL_REF, VOIDmode, XEXP (x, 0)), ! 542: insn, 0); ! 543: /* ??? This could be made smarter: ! 544: in some cases it's possible to tell that certain ! 545: calls will not do a nonlocal goto. ! 546: ! 547: For example, if the nested functions that do the ! 548: nonlocal gotos do not have their addresses taken, then ! 549: only calls to those functions or to other nested ! 550: functions that use them could possibly do nonlocal ! 551: gotos. */ ! 552: } ! 553: ! 554: /* Pass over all blocks, marking each block that is reachable ! 555: and has not yet been marked. ! 556: Keep doing this until, in one pass, no blocks have been marked. ! 557: Then blocks_live and blocks_marked are identical and correct. ! 558: In addition, all jumps actually reachable have been marked. */ ! 559: ! 560: while (something_marked) ! 561: { ! 562: something_marked = 0; ! 563: for (i = 0; i < n_basic_blocks; i++) ! 564: if (block_live[i] && !block_marked[i]) ! 565: { ! 566: block_marked[i] = 1; ! 567: something_marked = 1; ! 568: if (i + 1 < n_basic_blocks && basic_block_drops_in[i + 1]) ! 569: block_live[i + 1] = 1; ! 570: insn = basic_block_end[i]; ! 571: if (GET_CODE (insn) == JUMP_INSN) ! 572: mark_label_ref (PATTERN (insn), insn, 0); ! 573: } ! 574: } ! 575: ! 576: /* Now delete the code for any basic blocks that can't be reached. ! 577: They can occur because jump_optimize does not recognize ! 578: unreachable loops as unreachable. */ ! 579: ! 580: for (i = 0; i < n_basic_blocks; i++) ! 581: if (!block_live[i]) ! 582: { ! 583: insn = basic_block_head[i]; ! 584: while (1) ! 585: { ! 586: if (GET_CODE (insn) == BARRIER) ! 587: abort (); ! 588: if (GET_CODE (insn) != NOTE) ! 589: { ! 590: PUT_CODE (insn, NOTE); ! 591: NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED; ! 592: NOTE_SOURCE_FILE (insn) = 0; ! 593: } ! 594: if (insn == basic_block_end[i]) ! 595: { ! 596: /* BARRIERs are between basic blocks, not part of one. ! 597: Delete a BARRIER if the preceding jump is deleted. ! 598: We cannot alter a BARRIER into a NOTE ! 599: because it is too short; but we can really delete ! 600: it because it is not part of a basic block. */ ! 601: if (NEXT_INSN (insn) != 0 ! 602: && GET_CODE (NEXT_INSN (insn)) == BARRIER) ! 603: delete_insn (NEXT_INSN (insn)); ! 604: break; ! 605: } ! 606: insn = NEXT_INSN (insn); ! 607: } ! 608: /* Each time we delete some basic blocks, ! 609: see if there is a jump around them that is ! 610: being turned into a no-op. If so, delete it. */ ! 611: ! 612: if (block_live[i - 1]) ! 613: { ! 614: register int j; ! 615: for (j = i; j < n_basic_blocks; j++) ! 616: if (block_live[j]) ! 617: { ! 618: rtx label; ! 619: insn = basic_block_end[i - 1]; ! 620: if (GET_CODE (insn) == JUMP_INSN ! 621: /* An unconditional jump is the only possibility ! 622: we must check for, since a conditional one ! 623: would make these blocks live. */ ! 624: && simplejump_p (insn) ! 625: && (label = XEXP (SET_SRC (PATTERN (insn)), 0), 1) ! 626: && INSN_UID (label) != 0 ! 627: && BLOCK_NUM (label) == j) ! 628: { ! 629: PUT_CODE (insn, NOTE); ! 630: NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED; ! 631: NOTE_SOURCE_FILE (insn) = 0; ! 632: if (GET_CODE (NEXT_INSN (insn)) != BARRIER) ! 633: abort (); ! 634: delete_insn (NEXT_INSN (insn)); ! 635: } ! 636: break; ! 637: } ! 638: } ! 639: } ! 640: } ! 641: } ! 642: ! 643: /* Check expression X for label references; ! 644: if one is found, add INSN to the label's chain of references. ! 645: ! 646: CHECKDUP means check for and avoid creating duplicate references ! 647: from the same insn. Such duplicates do no serious harm but ! 648: can slow life analysis. CHECKDUP is set only when duplicates ! 649: are likely. */ ! 650: ! 651: static void ! 652: mark_label_ref (x, insn, checkdup) ! 653: rtx x, insn; ! 654: int checkdup; ! 655: { ! 656: register RTX_CODE code; ! 657: register int i; ! 658: register char *fmt; ! 659: ! 660: /* We can be called with NULL when scanning label_value_list. */ ! 661: if (x == 0) ! 662: return; ! 663: ! 664: code = GET_CODE (x); ! 665: if (code == LABEL_REF) ! 666: { ! 667: register rtx label = XEXP (x, 0); ! 668: register rtx y; ! 669: if (GET_CODE (label) != CODE_LABEL) ! 670: abort (); ! 671: /* If the label was never emitted, this insn is junk, ! 672: but avoid a crash trying to refer to BLOCK_NUM (label). ! 673: This can happen as a result of a syntax error ! 674: and a diagnostic has already been printed. */ ! 675: if (INSN_UID (label) == 0) ! 676: return; ! 677: CONTAINING_INSN (x) = insn; ! 678: /* if CHECKDUP is set, check for duplicate ref from same insn ! 679: and don't insert. */ ! 680: if (checkdup) ! 681: for (y = LABEL_REFS (label); y != label; y = LABEL_NEXTREF (y)) ! 682: if (CONTAINING_INSN (y) == insn) ! 683: return; ! 684: LABEL_NEXTREF (x) = LABEL_REFS (label); ! 685: LABEL_REFS (label) = x; ! 686: block_live_static[BLOCK_NUM (label)] = 1; ! 687: return; ! 688: } ! 689: ! 690: fmt = GET_RTX_FORMAT (code); ! 691: for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) ! 692: { ! 693: if (fmt[i] == 'e') ! 694: mark_label_ref (XEXP (x, i), insn, 0); ! 695: if (fmt[i] == 'E') ! 696: { ! 697: register int j; ! 698: for (j = 0; j < XVECLEN (x, i); j++) ! 699: mark_label_ref (XVECEXP (x, i, j), insn, 1); ! 700: } ! 701: } ! 702: } ! 703: ! 704: /* Determine which registers are live at the start of each ! 705: basic block of the function whose first insn is F. ! 706: NREGS is the number of registers used in F. ! 707: We allocate the vector basic_block_live_at_start ! 708: and the regsets that it points to, and fill them with the data. ! 709: regset_size and regset_bytes are also set here. */ ! 710: ! 711: static void ! 712: life_analysis (f, nregs) ! 713: rtx f; ! 714: int nregs; ! 715: { ! 716: register regset tem; ! 717: int first_pass; ! 718: int changed; ! 719: /* For each basic block, a bitmask of regs ! 720: live on exit from the block. */ ! 721: regset *basic_block_live_at_end; ! 722: /* For each basic block, a bitmask of regs ! 723: live on entry to a successor-block of this block. ! 724: If this does not match basic_block_live_at_end, ! 725: that must be updated, and the block must be rescanned. */ ! 726: regset *basic_block_new_live_at_end; ! 727: /* For each basic block, a bitmask of regs ! 728: whose liveness at the end of the basic block ! 729: can make a difference in which regs are live on entry to the block. ! 730: These are the regs that are set within the basic block, ! 731: possibly excluding those that are used after they are set. */ ! 732: regset *basic_block_significant; ! 733: register int i; ! 734: rtx insn; ! 735: ! 736: struct obstack flow_obstack; ! 737: ! 738: gcc_obstack_init (&flow_obstack); ! 739: ! 740: max_regno = nregs; ! 741: ! 742: bzero (regs_ever_live, sizeof regs_ever_live); ! 743: ! 744: /* Allocate and zero out many data structures ! 745: that will record the data from lifetime analysis. */ ! 746: ! 747: allocate_for_life_analysis (); ! 748: ! 749: reg_next_use = (rtx *) alloca (nregs * sizeof (rtx)); ! 750: bzero (reg_next_use, nregs * sizeof (rtx)); ! 751: ! 752: /* Set up several regset-vectors used internally within this function. ! 753: Their meanings are documented above, with their declarations. */ ! 754: ! 755: basic_block_live_at_end = (regset *) alloca (n_basic_blocks * sizeof (regset)); ! 756: /* Don't use alloca since that leads to a crash rather than an error message ! 757: if there isn't enough space. ! 758: Don't use oballoc since we may need to allocate other things during ! 759: this function on the temporary obstack. */ ! 760: tem = (regset) obstack_alloc (&flow_obstack, n_basic_blocks * regset_bytes); ! 761: bzero (tem, n_basic_blocks * regset_bytes); ! 762: init_regset_vector (basic_block_live_at_end, tem, n_basic_blocks, regset_bytes); ! 763: ! 764: basic_block_new_live_at_end = (regset *) alloca (n_basic_blocks * sizeof (regset)); ! 765: tem = (regset) obstack_alloc (&flow_obstack, n_basic_blocks * regset_bytes); ! 766: bzero (tem, n_basic_blocks * regset_bytes); ! 767: init_regset_vector (basic_block_new_live_at_end, tem, n_basic_blocks, regset_bytes); ! 768: ! 769: basic_block_significant = (regset *) alloca (n_basic_blocks * sizeof (regset)); ! 770: tem = (regset) obstack_alloc (&flow_obstack, n_basic_blocks * regset_bytes); ! 771: bzero (tem, n_basic_blocks * regset_bytes); ! 772: init_regset_vector (basic_block_significant, tem, n_basic_blocks, regset_bytes); ! 773: ! 774: /* Record which insns refer to any volatile memory ! 775: or for any reason can't be deleted just because they are dead stores. ! 776: Also, delete any insns that copy a register to itself. */ ! 777: ! 778: for (insn = f; insn; insn = NEXT_INSN (insn)) ! 779: { ! 780: enum rtx_code code1 = GET_CODE (insn); ! 781: if (code1 == CALL_INSN) ! 782: INSN_VOLATILE (insn) = 1; ! 783: else if (code1 == INSN || code1 == JUMP_INSN) ! 784: { ! 785: /* Delete (in effect) any obvious no-op moves. */ ! 786: if (GET_CODE (PATTERN (insn)) == SET ! 787: && GET_CODE (SET_DEST (PATTERN (insn))) == REG ! 788: && GET_CODE (SET_SRC (PATTERN (insn))) == REG ! 789: && REGNO (SET_DEST (PATTERN (insn))) == ! 790: REGNO (SET_SRC (PATTERN (insn))) ! 791: /* Insns carrying these notes are useful later on. */ ! 792: && ! find_reg_note (insn, REG_EQUAL, 0)) ! 793: { ! 794: PUT_CODE (insn, NOTE); ! 795: NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED; ! 796: NOTE_SOURCE_FILE (insn) = 0; ! 797: } ! 798: else if (GET_CODE (PATTERN (insn)) == PARALLEL) ! 799: { ! 800: /* If nothing but SETs of registers to themselves, ! 801: this insn can also be deleted. */ ! 802: for (i = 0; i < XVECLEN (PATTERN (insn), 0); i++) ! 803: { ! 804: rtx tem = XVECEXP (PATTERN (insn), 0, i); ! 805: ! 806: if (GET_CODE (tem) == USE ! 807: || GET_CODE (tem) == CLOBBER) ! 808: continue; ! 809: ! 810: if (GET_CODE (tem) != SET ! 811: || GET_CODE (SET_DEST (tem)) != REG ! 812: || GET_CODE (SET_SRC (tem)) != REG ! 813: || REGNO (SET_DEST (tem)) != REGNO (SET_SRC (tem))) ! 814: break; ! 815: } ! 816: ! 817: if (i == XVECLEN (PATTERN (insn), 0) ! 818: /* Insns carrying these notes are useful later on. */ ! 819: && ! find_reg_note (insn, REG_EQUAL, 0)) ! 820: { ! 821: PUT_CODE (insn, NOTE); ! 822: NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED; ! 823: NOTE_SOURCE_FILE (insn) = 0; ! 824: } ! 825: else ! 826: INSN_VOLATILE (insn) = volatile_refs_p (PATTERN (insn)); ! 827: } ! 828: else if (GET_CODE (PATTERN (insn)) != USE) ! 829: INSN_VOLATILE (insn) = volatile_refs_p (PATTERN (insn)); ! 830: /* A SET that makes space on the stack cannot be dead. ! 831: (Such SETs occur only for allocating variable-size data, ! 832: so they will always have a PLUS or MINUS according to the ! 833: direction of stack growth.) ! 834: Even if this function never uses this stack pointer value, ! 835: signal handlers do! */ ! 836: else if (code1 == INSN && GET_CODE (PATTERN (insn)) == SET ! 837: && SET_DEST (PATTERN (insn)) == stack_pointer_rtx ! 838: #ifdef STACK_GROWS_DOWNWARD ! 839: && GET_CODE (SET_SRC (PATTERN (insn))) == MINUS ! 840: #else ! 841: && GET_CODE (SET_SRC (PATTERN (insn))) == PLUS ! 842: #endif ! 843: && XEXP (SET_SRC (PATTERN (insn)), 0) == stack_pointer_rtx) ! 844: INSN_VOLATILE (insn) = 1; ! 845: } ! 846: } ! 847: ! 848: if (n_basic_blocks > 0) ! 849: #ifdef EXIT_IGNORE_STACK ! 850: if (! EXIT_IGNORE_STACK ! 851: || (! FRAME_POINTER_REQUIRED && flag_omit_frame_pointer)) ! 852: #endif ! 853: { ! 854: /* If exiting needs the right stack value, ! 855: consider the stack pointer live at the end of the function. */ ! 856: basic_block_live_at_end[n_basic_blocks - 1] ! 857: [STACK_POINTER_REGNUM / REGSET_ELT_BITS] ! 858: |= 1 << (STACK_POINTER_REGNUM % REGSET_ELT_BITS); ! 859: basic_block_new_live_at_end[n_basic_blocks - 1] ! 860: [STACK_POINTER_REGNUM / REGSET_ELT_BITS] ! 861: |= 1 << (STACK_POINTER_REGNUM % REGSET_ELT_BITS); ! 862: } ! 863: ! 864: /* Mark all global registers as being live at the end of the function ! 865: since they may be referenced by our caller. */ ! 866: ! 867: if (n_basic_blocks > 0) ! 868: for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) ! 869: if (global_regs[i]) ! 870: { ! 871: basic_block_live_at_end[n_basic_blocks - 1] ! 872: [i / REGSET_ELT_BITS] |= 1 << (i % REGSET_ELT_BITS); ! 873: basic_block_new_live_at_end[n_basic_blocks - 1] ! 874: [i / REGSET_ELT_BITS] |= 1 << (i % REGSET_ELT_BITS); ! 875: } ! 876: ! 877: /* Propagate life info through the basic blocks ! 878: around the graph of basic blocks. ! 879: ! 880: This is a relaxation process: each time a new register ! 881: is live at the end of the basic block, we must scan the block ! 882: to determine which registers are, as a consequence, live at the beginning ! 883: of that block. These registers must then be marked live at the ends ! 884: of all the blocks that can transfer control to that block. ! 885: The process continues until it reaches a fixed point. */ ! 886: ! 887: first_pass = 1; ! 888: changed = 1; ! 889: while (changed) ! 890: { ! 891: changed = 0; ! 892: for (i = n_basic_blocks - 1; i >= 0; i--) ! 893: { ! 894: int consider = first_pass; ! 895: int must_rescan = first_pass; ! 896: register int j; ! 897: ! 898: if (!first_pass) ! 899: { ! 900: /* Set CONSIDER if this block needs thinking about at all ! 901: (that is, if the regs live now at the end of it ! 902: are not the same as were live at the end of it when ! 903: we last thought about it). ! 904: Set must_rescan if it needs to be thought about ! 905: instruction by instruction (that is, if any additional ! 906: reg that is live at the end now but was not live there before ! 907: is one of the significant regs of this basic block). */ ! 908: ! 909: for (j = 0; j < regset_size; j++) ! 910: { ! 911: register int x = (basic_block_new_live_at_end[i][j] ! 912: & ~basic_block_live_at_end[i][j]); ! 913: if (x) ! 914: consider = 1; ! 915: if (x & basic_block_significant[i][j]) ! 916: { ! 917: must_rescan = 1; ! 918: consider = 1; ! 919: break; ! 920: } ! 921: } ! 922: ! 923: if (! consider) ! 924: continue; ! 925: } ! 926: ! 927: /* The live_at_start of this block may be changing, ! 928: so another pass will be required after this one. */ ! 929: changed = 1; ! 930: ! 931: if (! must_rescan) ! 932: { ! 933: /* No complete rescan needed; ! 934: just record those variables newly known live at end ! 935: as live at start as well. */ ! 936: for (j = 0; j < regset_size; j++) ! 937: { ! 938: register int x = basic_block_new_live_at_end[i][j] ! 939: & ~basic_block_live_at_end[i][j]; ! 940: basic_block_live_at_start[i][j] |= x; ! 941: basic_block_live_at_end[i][j] |= x; ! 942: } ! 943: } ! 944: else ! 945: { ! 946: /* Update the basic_block_live_at_start ! 947: by propagation backwards through the block. */ ! 948: bcopy (basic_block_new_live_at_end[i], ! 949: basic_block_live_at_end[i], regset_bytes); ! 950: bcopy (basic_block_live_at_end[i], ! 951: basic_block_live_at_start[i], regset_bytes); ! 952: propagate_block (basic_block_live_at_start[i], ! 953: basic_block_head[i], basic_block_end[i], 0, ! 954: first_pass ? basic_block_significant[i] : 0, ! 955: i); ! 956: } ! 957: ! 958: { ! 959: register rtx jump, head; ! 960: /* Update the basic_block_new_live_at_end's of the block ! 961: that falls through into this one (if any). */ ! 962: head = basic_block_head[i]; ! 963: jump = PREV_INSN (head); ! 964: if (basic_block_drops_in[i]) ! 965: { ! 966: register int from_block = BLOCK_NUM (jump); ! 967: register int j; ! 968: for (j = 0; j < regset_size; j++) ! 969: basic_block_new_live_at_end[from_block][j] ! 970: |= basic_block_live_at_start[i][j]; ! 971: } ! 972: /* Update the basic_block_new_live_at_end's of ! 973: all the blocks that jump to this one. */ ! 974: if (GET_CODE (head) == CODE_LABEL) ! 975: for (jump = LABEL_REFS (head); ! 976: jump != head; ! 977: jump = LABEL_NEXTREF (jump)) ! 978: { ! 979: register int from_block = BLOCK_NUM (CONTAINING_INSN (jump)); ! 980: register int j; ! 981: for (j = 0; j < regset_size; j++) ! 982: basic_block_new_live_at_end[from_block][j] ! 983: |= basic_block_live_at_start[i][j]; ! 984: } ! 985: } ! 986: #ifdef USE_C_ALLOCA ! 987: alloca (0); ! 988: #endif ! 989: } ! 990: first_pass = 0; ! 991: } ! 992: ! 993: /* The only pseudos that are live at the beginning of the function are ! 994: those that were not set anywhere in the function. local-alloc doesn't ! 995: know how to handle these correctly, so mark them as not local to any ! 996: one basic block. */ ! 997: ! 998: if (n_basic_blocks > 0) ! 999: for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++) ! 1000: if (basic_block_live_at_start[0][i / REGSET_ELT_BITS] ! 1001: & (1 << (i % REGSET_ELT_BITS))) ! 1002: reg_basic_block[i] = REG_BLOCK_GLOBAL; ! 1003: ! 1004: /* Now the life information is accurate. ! 1005: Make one more pass over each basic block ! 1006: to delete dead stores, create autoincrement addressing ! 1007: and record how many times each register is used, is set, or dies. ! 1008: ! 1009: To save time, we operate directly in basic_block_live_at_end[i], ! 1010: thus destroying it (in fact, converting it into a copy of ! 1011: basic_block_live_at_start[i]). This is ok now because ! 1012: basic_block_live_at_end[i] is no longer used past this point. */ ! 1013: ! 1014: max_scratch = 0; ! 1015: ! 1016: for (i = 0; i < n_basic_blocks; i++) ! 1017: { ! 1018: propagate_block (basic_block_live_at_end[i], ! 1019: basic_block_head[i], basic_block_end[i], 1, 0, i); ! 1020: #ifdef USE_C_ALLOCA ! 1021: alloca (0); ! 1022: #endif ! 1023: } ! 1024: ! 1025: #if 0 ! 1026: /* Something live during a setjmp should not be put in a register ! 1027: on certain machines which restore regs from stack frames ! 1028: rather than from the jmpbuf. ! 1029: But we don't need to do this for the user's variables, since ! 1030: ANSI says only volatile variables need this. */ ! 1031: #ifdef LONGJMP_RESTORE_FROM_STACK ! 1032: for (i = FIRST_PSEUDO_REGISTER; i < nregs; i++) ! 1033: if (regs_live_at_setjmp[i / REGSET_ELT_BITS] & (1 << (i % REGSET_ELT_BITS)) ! 1034: && regno_reg_rtx[i] != 0 && ! REG_USERVAR_P (regno_reg_rtx[i])) ! 1035: { ! 1036: reg_live_length[i] = -1; ! 1037: reg_basic_block[i] = -1; ! 1038: } ! 1039: #endif ! 1040: #endif ! 1041: ! 1042: /* We have a problem with any pseudoreg that ! 1043: lives across the setjmp. ANSI says that if a ! 1044: user variable does not change in value ! 1045: between the setjmp and the longjmp, then the longjmp preserves it. ! 1046: This includes longjmp from a place where the pseudo appears dead. ! 1047: (In principle, the value still exists if it is in scope.) ! 1048: If the pseudo goes in a hard reg, some other value may occupy ! 1049: that hard reg where this pseudo is dead, thus clobbering the pseudo. ! 1050: Conclusion: such a pseudo must not go in a hard reg. */ ! 1051: for (i = FIRST_PSEUDO_REGISTER; i < nregs; i++) ! 1052: if (regs_live_at_setjmp[i / REGSET_ELT_BITS] & (1 << (i % REGSET_ELT_BITS)) ! 1053: && regno_reg_rtx[i] != 0) ! 1054: { ! 1055: reg_live_length[i] = -1; ! 1056: reg_basic_block[i] = -1; ! 1057: } ! 1058: ! 1059: obstack_free (&flow_obstack, 0); ! 1060: } ! 1061: ! 1062: /* Subroutines of life analysis. */ ! 1063: ! 1064: /* Allocate the permanent data structures that represent the results ! 1065: of life analysis. Not static since used also for stupid life analysis. */ ! 1066: ! 1067: void ! 1068: allocate_for_life_analysis () ! 1069: { ! 1070: register int i; ! 1071: register regset tem; ! 1072: ! 1073: regset_size = ((max_regno + REGSET_ELT_BITS - 1) / REGSET_ELT_BITS); ! 1074: regset_bytes = regset_size * sizeof (*(regset)0); ! 1075: ! 1076: reg_n_refs = (int *) oballoc (max_regno * sizeof (int)); ! 1077: bzero (reg_n_refs, max_regno * sizeof (int)); ! 1078: ! 1079: reg_n_sets = (short *) oballoc (max_regno * sizeof (short)); ! 1080: bzero (reg_n_sets, max_regno * sizeof (short)); ! 1081: ! 1082: reg_n_deaths = (short *) oballoc (max_regno * sizeof (short)); ! 1083: bzero (reg_n_deaths, max_regno * sizeof (short)); ! 1084: ! 1085: reg_live_length = (int *) oballoc (max_regno * sizeof (int)); ! 1086: bzero (reg_live_length, max_regno * sizeof (int)); ! 1087: ! 1088: reg_n_calls_crossed = (int *) oballoc (max_regno * sizeof (int)); ! 1089: bzero (reg_n_calls_crossed, max_regno * sizeof (int)); ! 1090: ! 1091: reg_basic_block = (short *) oballoc (max_regno * sizeof (short)); ! 1092: for (i = 0; i < max_regno; i++) ! 1093: reg_basic_block[i] = REG_BLOCK_UNKNOWN; ! 1094: ! 1095: basic_block_live_at_start = (regset *) oballoc (n_basic_blocks * sizeof (regset)); ! 1096: tem = (regset) oballoc (n_basic_blocks * regset_bytes); ! 1097: bzero (tem, n_basic_blocks * regset_bytes); ! 1098: init_regset_vector (basic_block_live_at_start, tem, n_basic_blocks, regset_bytes); ! 1099: ! 1100: regs_live_at_setjmp = (regset) oballoc (regset_bytes); ! 1101: bzero (regs_live_at_setjmp, regset_bytes); ! 1102: } ! 1103: ! 1104: /* Make each element of VECTOR point at a regset, ! 1105: taking the space for all those regsets from SPACE. ! 1106: SPACE is of type regset, but it is really as long as NELTS regsets. ! 1107: BYTES_PER_ELT is the number of bytes in one regset. */ ! 1108: ! 1109: static void ! 1110: init_regset_vector (vector, space, nelts, bytes_per_elt) ! 1111: regset *vector; ! 1112: regset space; ! 1113: int nelts; ! 1114: int bytes_per_elt; ! 1115: { ! 1116: register int i; ! 1117: register regset p = space; ! 1118: ! 1119: for (i = 0; i < nelts; i++) ! 1120: { ! 1121: vector[i] = p; ! 1122: p += bytes_per_elt / sizeof (*p); ! 1123: } ! 1124: } ! 1125: ! 1126: /* Compute the registers live at the beginning of a basic block ! 1127: from those live at the end. ! 1128: ! 1129: When called, OLD contains those live at the end. ! 1130: On return, it contains those live at the beginning. ! 1131: FIRST and LAST are the first and last insns of the basic block. ! 1132: ! 1133: FINAL is nonzero if we are doing the final pass which is not ! 1134: for computing the life info (since that has already been done) ! 1135: but for acting on it. On this pass, we delete dead stores, ! 1136: set up the logical links and dead-variables lists of instructions, ! 1137: and merge instructions for autoincrement and autodecrement addresses. ! 1138: ! 1139: SIGNIFICANT is nonzero only the first time for each basic block. ! 1140: If it is nonzero, it points to a regset in which we store ! 1141: a 1 for each register that is set within the block. ! 1142: ! 1143: BNUM is the number of the basic block. */ ! 1144: ! 1145: static void ! 1146: propagate_block (old, first, last, final, significant, bnum) ! 1147: register regset old; ! 1148: rtx first; ! 1149: rtx last; ! 1150: int final; ! 1151: regset significant; ! 1152: int bnum; ! 1153: { ! 1154: register rtx insn; ! 1155: rtx prev; ! 1156: regset live; ! 1157: regset dead; ! 1158: ! 1159: /* The following variables are used only if FINAL is nonzero. */ ! 1160: /* This vector gets one element for each reg that has been live ! 1161: at any point in the basic block that has been scanned so far. ! 1162: SOMETIMES_MAX says how many elements are in use so far. ! 1163: In each element, OFFSET is the byte-number within a regset ! 1164: for the register described by the element, and BIT is a mask ! 1165: for that register's bit within the byte. */ ! 1166: register struct foo { short offset; short bit; } *regs_sometimes_live; ! 1167: int sometimes_max = 0; ! 1168: /* This regset has 1 for each reg that we have seen live so far. ! 1169: It and REGS_SOMETIMES_LIVE are updated together. */ ! 1170: regset maxlive; ! 1171: ! 1172: /* The loop depth may change in the middle of a basic block. Since we ! 1173: scan from end to beginning, we start with the depth at the end of the ! 1174: current basic block, and adjust as we pass ends and starts of loops. */ ! 1175: loop_depth = basic_block_loop_depth[bnum]; ! 1176: ! 1177: dead = (regset) alloca (regset_bytes); ! 1178: live = (regset) alloca (regset_bytes); ! 1179: ! 1180: cc0_live = 0; ! 1181: last_mem_set = 0; ! 1182: ! 1183: /* Include any notes at the end of the block in the scan. ! 1184: This is in case the block ends with a call to setjmp. */ ! 1185: ! 1186: while (NEXT_INSN (last) != 0 && GET_CODE (NEXT_INSN (last)) == NOTE) ! 1187: { ! 1188: /* Look for loop boundaries, we are going forward here. */ ! 1189: last = NEXT_INSN (last); ! 1190: if (NOTE_LINE_NUMBER (last) == NOTE_INSN_LOOP_BEG) ! 1191: loop_depth++; ! 1192: else if (NOTE_LINE_NUMBER (last) == NOTE_INSN_LOOP_END) ! 1193: loop_depth--; ! 1194: } ! 1195: ! 1196: if (final) ! 1197: { ! 1198: register int i, offset, bit; ! 1199: ! 1200: num_scratch = 0; ! 1201: maxlive = (regset) alloca (regset_bytes); ! 1202: bcopy (old, maxlive, regset_bytes); ! 1203: regs_sometimes_live ! 1204: = (struct foo *) alloca (max_regno * sizeof (struct foo)); ! 1205: ! 1206: /* Process the regs live at the end of the block. ! 1207: Enter them in MAXLIVE and REGS_SOMETIMES_LIVE. ! 1208: Also mark them as not local to any one basic block. */ ! 1209: ! 1210: for (offset = 0, i = 0; offset < regset_size; offset++) ! 1211: for (bit = 1; bit; bit <<= 1, i++) ! 1212: { ! 1213: if (i == max_regno) ! 1214: break; ! 1215: if (old[offset] & bit) ! 1216: { ! 1217: reg_basic_block[i] = REG_BLOCK_GLOBAL; ! 1218: regs_sometimes_live[sometimes_max].offset = offset; ! 1219: regs_sometimes_live[sometimes_max].bit = i % REGSET_ELT_BITS; ! 1220: sometimes_max++; ! 1221: } ! 1222: } ! 1223: } ! 1224: ! 1225: /* Scan the block an insn at a time from end to beginning. */ ! 1226: ! 1227: for (insn = last; ; insn = prev) ! 1228: { ! 1229: prev = PREV_INSN (insn); ! 1230: ! 1231: /* Look for loop boundaries, remembering that we are going backwards. */ ! 1232: if (GET_CODE (insn) == NOTE ! 1233: && NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_END) ! 1234: loop_depth++; ! 1235: else if (GET_CODE (insn) == NOTE ! 1236: && NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_BEG) ! 1237: loop_depth--; ! 1238: ! 1239: /* If we have LOOP_DEPTH == 0, there has been a bookkeeping error. ! 1240: Abort now rather than setting register status incorrectly. */ ! 1241: if (loop_depth == 0) ! 1242: abort (); ! 1243: ! 1244: /* If this is a call to `setjmp' et al, ! 1245: warn if any non-volatile datum is live. */ ! 1246: ! 1247: if (final && GET_CODE (insn) == NOTE ! 1248: && NOTE_LINE_NUMBER (insn) == NOTE_INSN_SETJMP) ! 1249: { ! 1250: int i; ! 1251: for (i = 0; i < regset_size; i++) ! 1252: regs_live_at_setjmp[i] |= old[i]; ! 1253: } ! 1254: ! 1255: /* Update the life-status of regs for this insn. ! 1256: First DEAD gets which regs are set in this insn ! 1257: then LIVE gets which regs are used in this insn. ! 1258: Then the regs live before the insn ! 1259: are those live after, with DEAD regs turned off, ! 1260: and then LIVE regs turned on. */ ! 1261: ! 1262: if (GET_RTX_CLASS (GET_CODE (insn)) == 'i') ! 1263: { ! 1264: register int i; ! 1265: rtx note = find_reg_note (insn, REG_RETVAL, 0); ! 1266: int insn_is_dead ! 1267: = (insn_dead_p (PATTERN (insn), old, 0) ! 1268: /* Don't delete something that refers to volatile storage! */ ! 1269: && ! INSN_VOLATILE (insn)); ! 1270: int libcall_is_dead ! 1271: = (insn_is_dead && note != 0 ! 1272: && libcall_dead_p (PATTERN (insn), old, note, insn)); ! 1273: ! 1274: /* If an instruction consists of just dead store(s) on final pass, ! 1275: "delete" it by turning it into a NOTE of type NOTE_INSN_DELETED. ! 1276: We could really delete it with delete_insn, but that ! 1277: can cause trouble for first or last insn in a basic block. */ ! 1278: if (final && insn_is_dead) ! 1279: { ! 1280: PUT_CODE (insn, NOTE); ! 1281: NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED; ! 1282: NOTE_SOURCE_FILE (insn) = 0; ! 1283: ! 1284: /* If this insn is copying the return value from a library call, ! 1285: delete the entire library call. */ ! 1286: if (libcall_is_dead) ! 1287: { ! 1288: rtx first = XEXP (note, 0); ! 1289: rtx p = insn; ! 1290: while (INSN_DELETED_P (first)) ! 1291: first = NEXT_INSN (first); ! 1292: while (p != first) ! 1293: { ! 1294: p = PREV_INSN (p); ! 1295: PUT_CODE (p, NOTE); ! 1296: NOTE_LINE_NUMBER (p) = NOTE_INSN_DELETED; ! 1297: NOTE_SOURCE_FILE (p) = 0; ! 1298: } ! 1299: } ! 1300: goto flushed; ! 1301: } ! 1302: ! 1303: for (i = 0; i < regset_size; i++) ! 1304: { ! 1305: dead[i] = 0; /* Faster than bzero here */ ! 1306: live[i] = 0; /* since regset_size is usually small */ ! 1307: } ! 1308: ! 1309: /* See if this is an increment or decrement that can be ! 1310: merged into a following memory address. */ ! 1311: #ifdef AUTO_INC_DEC ! 1312: { ! 1313: register rtx x = PATTERN (insn); ! 1314: /* Does this instruction increment or decrement a register? */ ! 1315: if (final && GET_CODE (x) == SET ! 1316: && GET_CODE (SET_DEST (x)) == REG ! 1317: && (GET_CODE (SET_SRC (x)) == PLUS ! 1318: || GET_CODE (SET_SRC (x)) == MINUS) ! 1319: && XEXP (SET_SRC (x), 0) == SET_DEST (x) ! 1320: && GET_CODE (XEXP (SET_SRC (x), 1)) == CONST_INT ! 1321: /* Ok, look for a following memory ref we can combine with. ! 1322: If one is found, change the memory ref to a PRE_INC ! 1323: or PRE_DEC, cancel this insn, and return 1. ! 1324: Return 0 if nothing has been done. */ ! 1325: && try_pre_increment_1 (insn)) ! 1326: goto flushed; ! 1327: } ! 1328: #endif /* AUTO_INC_DEC */ ! 1329: ! 1330: /* If this is not the final pass, and this insn is copying the ! 1331: value of a library call and it's dead, don't scan the ! 1332: insns that perform the library call, so that the call's ! 1333: arguments are not marked live. */ ! 1334: if (libcall_is_dead) ! 1335: { ! 1336: /* Mark the dest reg as `significant'. */ ! 1337: mark_set_regs (old, dead, PATTERN (insn), 0, significant); ! 1338: ! 1339: insn = XEXP (note, 0); ! 1340: prev = PREV_INSN (insn); ! 1341: } ! 1342: else if (GET_CODE (PATTERN (insn)) == SET ! 1343: && SET_DEST (PATTERN (insn)) == stack_pointer_rtx ! 1344: && GET_CODE (SET_SRC (PATTERN (insn))) == PLUS ! 1345: && XEXP (SET_SRC (PATTERN (insn)), 0) == stack_pointer_rtx ! 1346: && GET_CODE (XEXP (SET_SRC (PATTERN (insn)), 1)) == CONST_INT) ! 1347: /* We have an insn to pop a constant amount off the stack. ! 1348: (Such insns use PLUS regardless of the direction of the stack, ! 1349: and any insn to adjust the stack by a constant is always a pop.) ! 1350: These insns, if not dead stores, have no effect on life. */ ! 1351: ; ! 1352: else ! 1353: { ! 1354: /* LIVE gets the regs used in INSN; ! 1355: DEAD gets those set by it. Dead insns don't make anything ! 1356: live. */ ! 1357: ! 1358: mark_set_regs (old, dead, PATTERN (insn), final ? insn : 0, ! 1359: significant); ! 1360: ! 1361: /* If an insn doesn't use CC0, it becomes dead since we ! 1362: assume that every insn clobbers it. So show it dead here; ! 1363: mark_used_regs will set it live if it is referenced. */ ! 1364: cc0_live = 0; ! 1365: ! 1366: if (! insn_is_dead) ! 1367: mark_used_regs (old, live, PATTERN (insn), final, insn); ! 1368: ! 1369: /* Sometimes we may have inserted something before INSN (such as ! 1370: a move) when we make an auto-inc. So ensure we will scan ! 1371: those insns. */ ! 1372: #ifdef AUTO_INC_DEC ! 1373: prev = PREV_INSN (insn); ! 1374: #endif ! 1375: ! 1376: if (! insn_is_dead && GET_CODE (insn) == CALL_INSN) ! 1377: { ! 1378: register int i; ! 1379: ! 1380: /* Each call clobbers all call-clobbered regs that are not ! 1381: global. Note that the function-value reg is a ! 1382: call-clobbered reg, and mark_set_regs has already had ! 1383: a chance to handle it. */ ! 1384: ! 1385: for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) ! 1386: if (call_used_regs[i] && ! global_regs[i]) ! 1387: dead[i / REGSET_ELT_BITS] ! 1388: |= (1 << (i % REGSET_ELT_BITS)); ! 1389: ! 1390: /* The stack ptr is used (honorarily) by a CALL insn. */ ! 1391: live[STACK_POINTER_REGNUM / REGSET_ELT_BITS] ! 1392: |= (1 << (STACK_POINTER_REGNUM % REGSET_ELT_BITS)); ! 1393: ! 1394: /* Calls may also reference any of the global registers, ! 1395: so they are made live. */ ! 1396: ! 1397: for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) ! 1398: if (global_regs[i]) ! 1399: live[i / REGSET_ELT_BITS] ! 1400: |= (1 << (i % REGSET_ELT_BITS)); ! 1401: ! 1402: /* Calls also clobber memory. */ ! 1403: last_mem_set = 0; ! 1404: } ! 1405: ! 1406: /* Update OLD for the registers used or set. */ ! 1407: for (i = 0; i < regset_size; i++) ! 1408: { ! 1409: old[i] &= ~dead[i]; ! 1410: old[i] |= live[i]; ! 1411: } ! 1412: ! 1413: if (GET_CODE (insn) == CALL_INSN && final) ! 1414: { ! 1415: /* Any regs live at the time of a call instruction ! 1416: must not go in a register clobbered by calls. ! 1417: Find all regs now live and record this for them. */ ! 1418: ! 1419: register struct foo *p = regs_sometimes_live; ! 1420: ! 1421: for (i = 0; i < sometimes_max; i++, p++) ! 1422: if (old[p->offset] & (1 << p->bit)) ! 1423: reg_n_calls_crossed[p->offset * REGSET_ELT_BITS + p->bit]+= 1; ! 1424: } ! 1425: } ! 1426: ! 1427: /* On final pass, add any additional sometimes-live regs ! 1428: into MAXLIVE and REGS_SOMETIMES_LIVE. ! 1429: Also update counts of how many insns each reg is live at. */ ! 1430: ! 1431: if (final) ! 1432: { ! 1433: for (i = 0; i < regset_size; i++) ! 1434: { ! 1435: register int diff = live[i] & ~maxlive[i]; ! 1436: ! 1437: if (diff) ! 1438: { ! 1439: register int regno; ! 1440: maxlive[i] |= diff; ! 1441: for (regno = 0; diff && regno < REGSET_ELT_BITS; regno++) ! 1442: if (diff & (1 << regno)) ! 1443: { ! 1444: regs_sometimes_live[sometimes_max].offset = i; ! 1445: regs_sometimes_live[sometimes_max].bit = regno; ! 1446: diff &= ~ (1 << regno); ! 1447: sometimes_max++; ! 1448: } ! 1449: } ! 1450: } ! 1451: ! 1452: { ! 1453: register struct foo *p = regs_sometimes_live; ! 1454: for (i = 0; i < sometimes_max; i++, p++) ! 1455: { ! 1456: if (old[p->offset] & (1 << p->bit)) ! 1457: reg_live_length[p->offset * REGSET_ELT_BITS + p->bit]++; ! 1458: } ! 1459: } ! 1460: } ! 1461: } ! 1462: flushed: ; ! 1463: if (insn == first) ! 1464: break; ! 1465: } ! 1466: ! 1467: if (num_scratch > max_scratch) ! 1468: max_scratch = num_scratch; ! 1469: } ! 1470: ! 1471: /* Return 1 if X (the body of an insn, or part of it) is just dead stores ! 1472: (SET expressions whose destinations are registers dead after the insn). ! 1473: NEEDED is the regset that says which regs are alive after the insn. ! 1474: ! 1475: Unless CALL_OK is non-zero, an insn is needed if it contains a CALL. */ ! 1476: ! 1477: static int ! 1478: insn_dead_p (x, needed, call_ok) ! 1479: rtx x; ! 1480: regset needed; ! 1481: int call_ok; ! 1482: { ! 1483: register RTX_CODE code = GET_CODE (x); ! 1484: /* If setting something that's a reg or part of one, ! 1485: see if that register's altered value will be live. */ ! 1486: ! 1487: if (code == SET) ! 1488: { ! 1489: register rtx r = SET_DEST (x); ! 1490: /* A SET that is a subroutine call cannot be dead. */ ! 1491: if (! call_ok && GET_CODE (SET_SRC (x)) == CALL) ! 1492: return 0; ! 1493: ! 1494: #ifdef HAVE_cc0 ! 1495: if (GET_CODE (r) == CC0) ! 1496: return ! cc0_live; ! 1497: #endif ! 1498: ! 1499: if (GET_CODE (r) == MEM && last_mem_set && ! MEM_VOLATILE_P (r) ! 1500: && rtx_equal_p (r, last_mem_set)) ! 1501: return 1; ! 1502: ! 1503: while (GET_CODE (r) == SUBREG ! 1504: || GET_CODE (r) == STRICT_LOW_PART ! 1505: || GET_CODE (r) == ZERO_EXTRACT ! 1506: || GET_CODE (r) == SIGN_EXTRACT) ! 1507: r = SUBREG_REG (r); ! 1508: ! 1509: if (GET_CODE (r) == REG) ! 1510: { ! 1511: register int regno = REGNO (r); ! 1512: register int offset = regno / REGSET_ELT_BITS; ! 1513: register int bit = 1 << (regno % REGSET_ELT_BITS); ! 1514: ! 1515: if ((regno < FIRST_PSEUDO_REGISTER && global_regs[regno]) ! 1516: /* Make sure insns to set frame pointer aren't deleted. */ ! 1517: || regno == FRAME_POINTER_REGNUM ! 1518: #if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM ! 1519: /* Make sure insns to set arg pointer are never deleted ! 1520: (if the arg pointer isn't fixed, there will be a USE for ! 1521: it, so we can treat it normally). */ ! 1522: || (regno == ARG_POINTER_REGNUM && fixed_regs[regno]) ! 1523: #endif ! 1524: || (needed[offset] & bit) != 0) ! 1525: return 0; ! 1526: ! 1527: /* If this is a hard register, verify that subsequent words are ! 1528: not needed. */ ! 1529: if (regno < FIRST_PSEUDO_REGISTER) ! 1530: { ! 1531: int n = HARD_REGNO_NREGS (regno, GET_MODE (r)); ! 1532: ! 1533: while (--n > 0) ! 1534: if ((needed[(regno + n) / REGSET_ELT_BITS] ! 1535: & 1 << ((regno + n) % REGSET_ELT_BITS)) != 0) ! 1536: return 0; ! 1537: } ! 1538: ! 1539: return 1; ! 1540: } ! 1541: } ! 1542: /* If performing several activities, ! 1543: insn is dead if each activity is individually dead. ! 1544: Also, CLOBBERs and USEs can be ignored; a CLOBBER or USE ! 1545: that's inside a PARALLEL doesn't make the insn worth keeping. */ ! 1546: else if (code == PARALLEL) ! 1547: { ! 1548: register int i = XVECLEN (x, 0); ! 1549: for (i--; i >= 0; i--) ! 1550: { ! 1551: rtx elt = XVECEXP (x, 0, i); ! 1552: if (!insn_dead_p (elt, needed, call_ok) ! 1553: && GET_CODE (elt) != CLOBBER ! 1554: && GET_CODE (elt) != USE) ! 1555: return 0; ! 1556: } ! 1557: return 1; ! 1558: } ! 1559: /* We do not check CLOBBER or USE here. ! 1560: An insn consisting of just a CLOBBER or just a USE ! 1561: should not be deleted. */ ! 1562: return 0; ! 1563: } ! 1564: ! 1565: /* If X is the pattern of the last insn in a libcall, and assuming X is dead, ! 1566: return 1 if the entire library call is dead. ! 1567: This is true if X copies a register (hard or pseudo) ! 1568: and if the hard return reg of the call insn is dead. ! 1569: (The caller should have tested the destination of X already for death.) ! 1570: ! 1571: If this insn doesn't just copy a register, then we don't ! 1572: have an ordinary libcall. In that case, cse could not have ! 1573: managed to substitute the source for the dest later on, ! 1574: so we can assume the libcall is dead. ! 1575: ! 1576: NEEDED is the bit vector of pseudoregs live before this insn. ! 1577: NOTE is the REG_RETVAL note of the insn. INSN is the insn itself. */ ! 1578: ! 1579: static int ! 1580: libcall_dead_p (x, needed, note, insn) ! 1581: rtx x; ! 1582: regset needed; ! 1583: rtx note; ! 1584: rtx insn; ! 1585: { ! 1586: register RTX_CODE code = GET_CODE (x); ! 1587: ! 1588: if (code == SET) ! 1589: { ! 1590: register rtx r = SET_SRC (x); ! 1591: if (GET_CODE (r) == REG) ! 1592: { ! 1593: rtx call = XEXP (note, 0); ! 1594: register int i; ! 1595: ! 1596: /* Find the call insn. */ ! 1597: while (call != insn && GET_CODE (call) != CALL_INSN) ! 1598: call = NEXT_INSN (call); ! 1599: ! 1600: /* If there is none, do nothing special, ! 1601: since ordinary death handling can understand these insns. */ ! 1602: if (call == insn) ! 1603: return 0; ! 1604: ! 1605: /* See if the hard reg holding the value is dead. ! 1606: If this is a PARALLEL, find the call within it. */ ! 1607: call = PATTERN (call); ! 1608: if (GET_CODE (call) == PARALLEL) ! 1609: { ! 1610: for (i = XVECLEN (call, 0) - 1; i >= 0; i--) ! 1611: if (GET_CODE (XVECEXP (call, 0, i)) == SET ! 1612: && GET_CODE (SET_SRC (XVECEXP (call, 0, i))) == CALL) ! 1613: break; ! 1614: ! 1615: if (i < 0) ! 1616: abort (); ! 1617: ! 1618: call = XVECEXP (call, 0, i); ! 1619: } ! 1620: ! 1621: return insn_dead_p (call, needed, 1); ! 1622: } ! 1623: } ! 1624: return 1; ! 1625: } ! 1626: ! 1627: /* Return 1 if register REGNO was used before it was set. ! 1628: In other words, if it is live at function entry. */ ! 1629: ! 1630: int ! 1631: regno_uninitialized (regno) ! 1632: int regno; ! 1633: { ! 1634: if (n_basic_blocks == 0) ! 1635: return 0; ! 1636: ! 1637: return (basic_block_live_at_start[0][regno / REGSET_ELT_BITS] ! 1638: & (1 << (regno % REGSET_ELT_BITS))); ! 1639: } ! 1640: ! 1641: /* 1 if register REGNO was alive at a place where `setjmp' was called ! 1642: and was set more than once or is an argument. ! 1643: Such regs may be clobbered by `longjmp'. */ ! 1644: ! 1645: int ! 1646: regno_clobbered_at_setjmp (regno) ! 1647: int regno; ! 1648: { ! 1649: if (n_basic_blocks == 0) ! 1650: return 0; ! 1651: ! 1652: return ((reg_n_sets[regno] > 1 ! 1653: || (basic_block_live_at_start[0][regno / REGSET_ELT_BITS] ! 1654: & (1 << (regno % REGSET_ELT_BITS)))) ! 1655: && (regs_live_at_setjmp[regno / REGSET_ELT_BITS] ! 1656: & (1 << (regno % REGSET_ELT_BITS)))); ! 1657: } ! 1658: ! 1659: /* Process the registers that are set within X. ! 1660: Their bits are set to 1 in the regset DEAD, ! 1661: because they are dead prior to this insn. ! 1662: ! 1663: If INSN is nonzero, it is the insn being processed ! 1664: and the fact that it is nonzero implies this is the FINAL pass ! 1665: in propagate_block. In this case, various info about register ! 1666: usage is stored, LOG_LINKS fields of insns are set up. */ ! 1667: ! 1668: static void mark_set_1 (); ! 1669: ! 1670: static void ! 1671: mark_set_regs (needed, dead, x, insn, significant) ! 1672: regset needed; ! 1673: regset dead; ! 1674: rtx x; ! 1675: rtx insn; ! 1676: regset significant; ! 1677: { ! 1678: register RTX_CODE code = GET_CODE (x); ! 1679: ! 1680: if (code == SET || code == CLOBBER) ! 1681: mark_set_1 (needed, dead, x, insn, significant); ! 1682: else if (code == PARALLEL) ! 1683: { ! 1684: register int i; ! 1685: for (i = XVECLEN (x, 0) - 1; i >= 0; i--) ! 1686: { ! 1687: code = GET_CODE (XVECEXP (x, 0, i)); ! 1688: if (code == SET || code == CLOBBER) ! 1689: mark_set_1 (needed, dead, XVECEXP (x, 0, i), insn, significant); ! 1690: } ! 1691: } ! 1692: } ! 1693: ! 1694: /* Process a single SET rtx, X. */ ! 1695: ! 1696: static void ! 1697: mark_set_1 (needed, dead, x, insn, significant) ! 1698: regset needed; ! 1699: regset dead; ! 1700: rtx x; ! 1701: rtx insn; ! 1702: regset significant; ! 1703: { ! 1704: register int regno; ! 1705: register rtx reg = SET_DEST (x); ! 1706: ! 1707: /* Modifying just one hardware register of a multi-reg value ! 1708: or just a byte field of a register ! 1709: does not mean the value from before this insn is now dead. ! 1710: But it does mean liveness of that register at the end of the block ! 1711: is significant. ! 1712: ! 1713: Within mark_set_1, however, we treat it as if the register is ! 1714: indeed modified. mark_used_regs will, however, also treat this ! 1715: register as being used. Thus, we treat these insns as setting a ! 1716: new value for the register as a function of its old value. This ! 1717: cases LOG_LINKS to be made appropriately and this will help combine. */ ! 1718: ! 1719: while (GET_CODE (reg) == SUBREG || GET_CODE (reg) == ZERO_EXTRACT ! 1720: || GET_CODE (reg) == SIGN_EXTRACT ! 1721: || GET_CODE (reg) == STRICT_LOW_PART) ! 1722: reg = XEXP (reg, 0); ! 1723: ! 1724: /* If we are writing into memory or into a register mentioned in the ! 1725: address of the last thing stored into memory, show we don't know ! 1726: what the last store was. If we are writing memory, save the address ! 1727: unless it is volatile. */ ! 1728: if (GET_CODE (reg) == MEM ! 1729: || (GET_CODE (reg) == REG ! 1730: && last_mem_set != 0 && reg_overlap_mentioned_p (reg, last_mem_set))) ! 1731: last_mem_set = 0; ! 1732: ! 1733: if (GET_CODE (reg) == MEM && ! side_effects_p (reg) ! 1734: /* There are no REG_INC notes for SP, so we can't assume we'll see ! 1735: everything that invalidates it. To be safe, don't eliminate any ! 1736: stores though SP; none of them should be redundant anyway. */ ! 1737: && ! reg_mentioned_p (stack_pointer_rtx, reg)) ! 1738: last_mem_set = reg; ! 1739: ! 1740: if (GET_CODE (reg) == REG ! 1741: && (regno = REGNO (reg), regno != FRAME_POINTER_REGNUM) ! 1742: #if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM ! 1743: && ! (regno == ARG_POINTER_REGNUM && fixed_regs[regno]) ! 1744: #endif ! 1745: && ! (regno < FIRST_PSEUDO_REGISTER && global_regs[regno])) ! 1746: /* && regno != STACK_POINTER_REGNUM) -- let's try without this. */ ! 1747: { ! 1748: register int offset = regno / REGSET_ELT_BITS; ! 1749: register int bit = 1 << (regno % REGSET_ELT_BITS); ! 1750: int all_needed = (needed[offset] & bit) != 0; ! 1751: int some_needed = (needed[offset] & bit) != 0; ! 1752: ! 1753: /* Mark it as a significant register for this basic block. */ ! 1754: if (significant) ! 1755: significant[offset] |= bit; ! 1756: ! 1757: /* Mark it as as dead before this insn. */ ! 1758: dead[offset] |= bit; ! 1759: ! 1760: /* A hard reg in a wide mode may really be multiple registers. ! 1761: If so, mark all of them just like the first. */ ! 1762: if (regno < FIRST_PSEUDO_REGISTER) ! 1763: { ! 1764: int n; ! 1765: ! 1766: /* Nothing below is needed for the stack pointer; get out asap. ! 1767: Eg, log links aren't needed, since combine won't use them. */ ! 1768: if (regno == STACK_POINTER_REGNUM) ! 1769: return; ! 1770: ! 1771: n = HARD_REGNO_NREGS (regno, GET_MODE (reg)); ! 1772: while (--n > 0) ! 1773: { ! 1774: if (significant) ! 1775: significant[(regno + n) / REGSET_ELT_BITS] ! 1776: |= 1 << ((regno + n) % REGSET_ELT_BITS); ! 1777: dead[(regno + n) / REGSET_ELT_BITS] ! 1778: |= 1 << ((regno + n) % REGSET_ELT_BITS); ! 1779: some_needed |= (needed[(regno + n) / REGSET_ELT_BITS] ! 1780: & 1 << ((regno + n) % REGSET_ELT_BITS)); ! 1781: all_needed &= (needed[(regno + n) / REGSET_ELT_BITS] ! 1782: & 1 << ((regno + n) % REGSET_ELT_BITS)); ! 1783: } ! 1784: } ! 1785: /* Additional data to record if this is the final pass. */ ! 1786: if (insn) ! 1787: { ! 1788: register rtx y = reg_next_use[regno]; ! 1789: register int blocknum = BLOCK_NUM (insn); ! 1790: ! 1791: /* If this is a hard reg, record this function uses the reg. */ ! 1792: ! 1793: if (regno < FIRST_PSEUDO_REGISTER) ! 1794: { ! 1795: register int i; ! 1796: int endregno = regno + HARD_REGNO_NREGS (regno, GET_MODE (reg)); ! 1797: ! 1798: for (i = regno; i < endregno; i++) ! 1799: { ! 1800: regs_ever_live[i] = 1; ! 1801: reg_n_sets[i]++; ! 1802: } ! 1803: } ! 1804: else ! 1805: { ! 1806: /* Keep track of which basic blocks each reg appears in. */ ! 1807: ! 1808: if (reg_basic_block[regno] == REG_BLOCK_UNKNOWN) ! 1809: reg_basic_block[regno] = blocknum; ! 1810: else if (reg_basic_block[regno] != blocknum) ! 1811: reg_basic_block[regno] = REG_BLOCK_GLOBAL; ! 1812: ! 1813: /* Count (weighted) references, stores, etc. This counts a ! 1814: register twice if it is modified, but that is correct. */ ! 1815: reg_n_sets[regno]++; ! 1816: ! 1817: reg_n_refs[regno] += loop_depth; ! 1818: ! 1819: /* The insns where a reg is live are normally counted ! 1820: elsewhere, but we want the count to include the insn ! 1821: where the reg is set, and the normal counting mechanism ! 1822: would not count it. */ ! 1823: reg_live_length[regno]++; ! 1824: } ! 1825: ! 1826: /* The next use is no longer "next", since a store intervenes. */ ! 1827: reg_next_use[regno] = 0; ! 1828: ! 1829: if (all_needed) ! 1830: { ! 1831: /* Make a logical link from the next following insn ! 1832: that uses this register, back to this insn. ! 1833: The following insns have already been processed. ! 1834: ! 1835: We don't build a LOG_LINK for hard registers containing ! 1836: in ASM_OPERANDs. If these registers get replaced, ! 1837: we might wind up changing the semantics of the insn, ! 1838: even if reload can make what appear to be valid assignments ! 1839: later. */ ! 1840: if (y && (BLOCK_NUM (y) == blocknum) ! 1841: && (regno >= FIRST_PSEUDO_REGISTER ! 1842: || asm_noperands (PATTERN (y)) < 0)) ! 1843: LOG_LINKS (y) ! 1844: = gen_rtx (INSN_LIST, VOIDmode, insn, LOG_LINKS (y)); ! 1845: } ! 1846: else if (! some_needed) ! 1847: { ! 1848: /* Note that dead stores have already been deleted when possible ! 1849: If we get here, we have found a dead store that cannot ! 1850: be eliminated (because the same insn does something useful). ! 1851: Indicate this by marking the reg being set as dying here. */ ! 1852: REG_NOTES (insn) ! 1853: = gen_rtx (EXPR_LIST, REG_UNUSED, reg, REG_NOTES (insn)); ! 1854: reg_n_deaths[REGNO (reg)]++; ! 1855: } ! 1856: else ! 1857: { ! 1858: /* This is a case where we have a multi-word hard register ! 1859: and some, but not all, of the words of the register are ! 1860: needed in subsequent insns. Write REG_UNUSED notes ! 1861: for those parts that were not needed. This case should ! 1862: be rare. */ ! 1863: ! 1864: int i; ! 1865: ! 1866: for (i = HARD_REGNO_NREGS (regno, GET_MODE (reg)) - 1; ! 1867: i >= 0; i--) ! 1868: if ((needed[(regno + i) / REGSET_ELT_BITS] ! 1869: & 1 << ((regno + i) % REGSET_ELT_BITS)) == 0) ! 1870: REG_NOTES (insn) ! 1871: = gen_rtx (EXPR_LIST, REG_UNUSED, ! 1872: gen_rtx (REG, word_mode, regno + i), ! 1873: REG_NOTES (insn)); ! 1874: } ! 1875: } ! 1876: } ! 1877: ! 1878: /* If this is the last pass and this is a SCRATCH, show it will be dying ! 1879: here and count it. */ ! 1880: else if (GET_CODE (reg) == SCRATCH && insn != 0) ! 1881: { ! 1882: REG_NOTES (insn) ! 1883: = gen_rtx (EXPR_LIST, REG_UNUSED, reg, REG_NOTES (insn)); ! 1884: num_scratch++; ! 1885: } ! 1886: } ! 1887: ! 1888: #ifdef AUTO_INC_DEC ! 1889: ! 1890: /* X is a MEM found in INSN. See if we can convert it into an auto-increment ! 1891: reference. */ ! 1892: ! 1893: static void ! 1894: find_auto_inc (needed, x, insn) ! 1895: regset needed; ! 1896: rtx x; ! 1897: rtx insn; ! 1898: { ! 1899: rtx addr = XEXP (x, 0); ! 1900: int offset = 0; ! 1901: ! 1902: /* Here we detect use of an index register which might be good for ! 1903: postincrement, postdecrement, preincrement, or predecrement. */ ! 1904: ! 1905: if (GET_CODE (addr) == PLUS && GET_CODE (XEXP (addr, 1)) == CONST_INT) ! 1906: offset = INTVAL (XEXP (addr, 1)), addr = XEXP (addr, 0); ! 1907: ! 1908: if (GET_CODE (addr) == REG) ! 1909: { ! 1910: register rtx y; ! 1911: register int size = GET_MODE_SIZE (GET_MODE (x)); ! 1912: rtx use; ! 1913: rtx incr; ! 1914: int regno = REGNO (addr); ! 1915: ! 1916: /* Is the next use an increment that might make auto-increment? */ ! 1917: incr = reg_next_use[regno]; ! 1918: if (incr && GET_CODE (PATTERN (incr)) == SET ! 1919: && BLOCK_NUM (incr) == BLOCK_NUM (insn) ! 1920: /* Can't add side effects to jumps; if reg is spilled and ! 1921: reloaded, there's no way to store back the altered value. */ ! 1922: && GET_CODE (insn) != JUMP_INSN ! 1923: && (y = SET_SRC (PATTERN (incr)), GET_CODE (y) == PLUS) ! 1924: && XEXP (y, 0) == addr ! 1925: && GET_CODE (XEXP (y, 1)) == CONST_INT ! 1926: && (0 ! 1927: #ifdef HAVE_POST_INCREMENT ! 1928: || (INTVAL (XEXP (y, 1)) == size && offset == 0) ! 1929: #endif ! 1930: #ifdef HAVE_POST_DECREMENT ! 1931: || (INTVAL (XEXP (y, 1)) == - size && offset == 0) ! 1932: #endif ! 1933: #ifdef HAVE_PRE_INCREMENT ! 1934: || (INTVAL (XEXP (y, 1)) == size && offset == size) ! 1935: #endif ! 1936: #ifdef HAVE_PRE_DECREMENT ! 1937: || (INTVAL (XEXP (y, 1)) == - size && offset == - size) ! 1938: #endif ! 1939: ) ! 1940: /* Make sure this reg appears only once in this insn. */ ! 1941: && (use = find_use_as_address (PATTERN (insn), addr, offset), ! 1942: use != 0 && use != (rtx) 1)) ! 1943: { ! 1944: int win = 0; ! 1945: rtx q = SET_DEST (PATTERN (incr)); ! 1946: ! 1947: if (dead_or_set_p (incr, addr)) ! 1948: win = 1; ! 1949: else if (GET_CODE (q) == REG && ! reg_used_between_p (q, insn, incr)) ! 1950: { ! 1951: /* We have *p followed by q = p+size. ! 1952: Both p and q must be live afterward, ! 1953: and q must be dead before. ! 1954: Change it to q = p, ...*q..., q = q+size. ! 1955: Then fall into the usual case. */ ! 1956: rtx insns, temp; ! 1957: ! 1958: start_sequence (); ! 1959: emit_move_insn (q, addr); ! 1960: insns = get_insns (); ! 1961: end_sequence (); ! 1962: ! 1963: /* If anything in INSNS have UID's that don't fit within the ! 1964: extra space we allocate earlier, we can't make this auto-inc. ! 1965: This should never happen. */ ! 1966: for (temp = insns; temp; temp = NEXT_INSN (temp)) ! 1967: { ! 1968: if (INSN_UID (temp) > max_uid_for_flow) ! 1969: return; ! 1970: BLOCK_NUM (temp) = BLOCK_NUM (insn); ! 1971: } ! 1972: ! 1973: emit_insns_before (insns, insn); ! 1974: ! 1975: if (basic_block_head[BLOCK_NUM (insn)] == insn) ! 1976: basic_block_head[BLOCK_NUM (insn)] = insns; ! 1977: ! 1978: XEXP (x, 0) = q; ! 1979: XEXP (y, 0) = q; ! 1980: ! 1981: /* INCR will become a NOTE and INSN won't contain a ! 1982: use of ADDR. If a use of ADDR was just placed in ! 1983: the insn before INSN, make that the next use. ! 1984: Otherwise, invalidate it. */ ! 1985: if (GET_CODE (PREV_INSN (insn)) == INSN ! 1986: && GET_CODE (PATTERN (PREV_INSN (insn))) == SET ! 1987: && SET_SRC (PATTERN (PREV_INSN (insn))) == addr) ! 1988: reg_next_use[regno] = PREV_INSN (insn); ! 1989: else ! 1990: reg_next_use[regno] = 0; ! 1991: ! 1992: addr = q; ! 1993: regno = REGNO (q); ! 1994: win = 1; ! 1995: ! 1996: /* REGNO is now used in INCR which is below INSN, but ! 1997: it previously wasn't live here. If we don't mark ! 1998: it as needed, we'll put a REG_DEAD note for it ! 1999: on this insn, which is incorrect. */ ! 2000: needed[regno / REGSET_ELT_BITS] ! 2001: |= 1 << (regno % REGSET_ELT_BITS); ! 2002: ! 2003: /* If there are any calls between INSN and INCR, show ! 2004: that REGNO now crosses them. */ ! 2005: for (temp = insn; temp != incr; temp = NEXT_INSN (temp)) ! 2006: if (GET_CODE (temp) == CALL_INSN) ! 2007: reg_n_calls_crossed[regno]++; ! 2008: } ! 2009: ! 2010: if (win) ! 2011: { ! 2012: /* We have found a suitable auto-increment: do POST_INC around ! 2013: the register here, and patch out the increment instruction ! 2014: that follows. */ ! 2015: XEXP (x, 0) = gen_rtx ((INTVAL (XEXP (y, 1)) == size ! 2016: ? (offset ? PRE_INC : POST_INC) ! 2017: : (offset ? PRE_DEC : POST_DEC)), ! 2018: Pmode, addr); ! 2019: ! 2020: /* Record that this insn has an implicit side effect. */ ! 2021: REG_NOTES (insn) ! 2022: = gen_rtx (EXPR_LIST, REG_INC, addr, REG_NOTES (insn)); ! 2023: ! 2024: /* Modify the old increment-insn to simply copy ! 2025: the already-incremented value of our register. */ ! 2026: SET_SRC (PATTERN (incr)) = addr; ! 2027: /* Indicate insn must be re-recognized. */ ! 2028: INSN_CODE (incr) = -1; ! 2029: ! 2030: /* If that makes it a no-op (copying the register into itself) ! 2031: then delete it so it won't appear to be a "use" and a "set" ! 2032: of this register. */ ! 2033: if (SET_DEST (PATTERN (incr)) == addr) ! 2034: { ! 2035: PUT_CODE (incr, NOTE); ! 2036: NOTE_LINE_NUMBER (incr) = NOTE_INSN_DELETED; ! 2037: NOTE_SOURCE_FILE (incr) = 0; ! 2038: } ! 2039: ! 2040: if (regno >= FIRST_PSEUDO_REGISTER) ! 2041: { ! 2042: /* Count an extra reference to the reg. When a reg is ! 2043: incremented, spilling it is worse, so we want to make ! 2044: that less likely. */ ! 2045: reg_n_refs[regno] += loop_depth; ! 2046: /* Count the increment as a setting of the register, ! 2047: even though it isn't a SET in rtl. */ ! 2048: reg_n_sets[regno]++; ! 2049: } ! 2050: } ! 2051: } ! 2052: } ! 2053: } ! 2054: #endif /* AUTO_INC_DEC */ ! 2055: ! 2056: /* Scan expression X and store a 1-bit in LIVE for each reg it uses. ! 2057: This is done assuming the registers needed from X ! 2058: are those that have 1-bits in NEEDED. ! 2059: ! 2060: On the final pass, FINAL is 1. This means try for autoincrement ! 2061: and count the uses and deaths of each pseudo-reg. ! 2062: ! 2063: INSN is the containing instruction. If INSN is dead, this function is not ! 2064: called. */ ! 2065: ! 2066: static void ! 2067: mark_used_regs (needed, live, x, final, insn) ! 2068: regset needed; ! 2069: regset live; ! 2070: rtx x; ! 2071: rtx insn; ! 2072: int final; ! 2073: { ! 2074: register RTX_CODE code; ! 2075: register int regno; ! 2076: int i; ! 2077: ! 2078: retry: ! 2079: code = GET_CODE (x); ! 2080: switch (code) ! 2081: { ! 2082: case LABEL_REF: ! 2083: case SYMBOL_REF: ! 2084: case CONST_INT: ! 2085: case CONST: ! 2086: case CONST_DOUBLE: ! 2087: case PC: ! 2088: case CLOBBER: ! 2089: case ADDR_VEC: ! 2090: case ADDR_DIFF_VEC: ! 2091: case ASM_INPUT: ! 2092: return; ! 2093: ! 2094: #ifdef HAVE_cc0 ! 2095: case CC0: ! 2096: cc0_live = 1; ! 2097: return; ! 2098: #endif ! 2099: ! 2100: case MEM: ! 2101: /* Invalidate the data for the last MEM stored. We could do this only ! 2102: if the addresses conflict, but this doesn't seem worthwhile. */ ! 2103: last_mem_set = 0; ! 2104: ! 2105: #ifdef AUTO_INC_DEC ! 2106: if (final) ! 2107: find_auto_inc (needed, x, insn); ! 2108: #endif ! 2109: break; ! 2110: ! 2111: case REG: ! 2112: /* See a register other than being set ! 2113: => mark it as needed. */ ! 2114: ! 2115: regno = REGNO (x); ! 2116: { ! 2117: register int offset = regno / REGSET_ELT_BITS; ! 2118: register int bit = 1 << (regno % REGSET_ELT_BITS); ! 2119: int all_needed = (needed[offset] & bit) != 0; ! 2120: int some_needed = (needed[offset] & bit) != 0; ! 2121: ! 2122: live[offset] |= bit; ! 2123: /* A hard reg in a wide mode may really be multiple registers. ! 2124: If so, mark all of them just like the first. */ ! 2125: if (regno < FIRST_PSEUDO_REGISTER) ! 2126: { ! 2127: int n; ! 2128: ! 2129: /* For stack ptr or fixed arg pointer, ! 2130: nothing below can be necessary, so waste no more time. */ ! 2131: if (regno == STACK_POINTER_REGNUM ! 2132: #if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM ! 2133: || (regno == ARG_POINTER_REGNUM && fixed_regs[regno]) ! 2134: #endif ! 2135: || regno == FRAME_POINTER_REGNUM) ! 2136: { ! 2137: /* If this is a register we are going to try to eliminate, ! 2138: don't mark it live here. If we are successful in ! 2139: eliminating it, it need not be live unless it is used for ! 2140: pseudos, in which case it will have been set live when ! 2141: it was allocated to the pseudos. If the register will not ! 2142: be eliminated, reload will set it live at that point. */ ! 2143: ! 2144: if (! TEST_HARD_REG_BIT (elim_reg_set, regno)) ! 2145: regs_ever_live[regno] = 1; ! 2146: return; ! 2147: } ! 2148: /* No death notes for global register variables; ! 2149: their values are live after this function exits. */ ! 2150: if (global_regs[regno]) ! 2151: return; ! 2152: ! 2153: n = HARD_REGNO_NREGS (regno, GET_MODE (x)); ! 2154: while (--n > 0) ! 2155: { ! 2156: live[(regno + n) / REGSET_ELT_BITS] ! 2157: |= 1 << ((regno + n) % REGSET_ELT_BITS); ! 2158: some_needed |= (needed[(regno + n) / REGSET_ELT_BITS] ! 2159: & 1 << ((regno + n) % REGSET_ELT_BITS)); ! 2160: all_needed &= (needed[(regno + n) / REGSET_ELT_BITS] ! 2161: & 1 << ((regno + n) % REGSET_ELT_BITS)); ! 2162: } ! 2163: } ! 2164: if (final) ! 2165: { ! 2166: /* Record where each reg is used, so when the reg ! 2167: is set we know the next insn that uses it. */ ! 2168: ! 2169: reg_next_use[regno] = insn; ! 2170: ! 2171: if (regno < FIRST_PSEUDO_REGISTER) ! 2172: { ! 2173: /* If a hard reg is being used, ! 2174: record that this function does use it. */ ! 2175: ! 2176: i = HARD_REGNO_NREGS (regno, GET_MODE (x)); ! 2177: if (i == 0) ! 2178: i = 1; ! 2179: do ! 2180: regs_ever_live[regno + --i] = 1; ! 2181: while (i > 0); ! 2182: } ! 2183: else ! 2184: { ! 2185: /* Keep track of which basic block each reg appears in. */ ! 2186: ! 2187: register int blocknum = BLOCK_NUM (insn); ! 2188: ! 2189: if (reg_basic_block[regno] == REG_BLOCK_UNKNOWN) ! 2190: reg_basic_block[regno] = blocknum; ! 2191: else if (reg_basic_block[regno] != blocknum) ! 2192: reg_basic_block[regno] = REG_BLOCK_GLOBAL; ! 2193: ! 2194: /* Count (weighted) number of uses of each reg. */ ! 2195: ! 2196: reg_n_refs[regno] += loop_depth; ! 2197: } ! 2198: ! 2199: /* Record and count the insns in which a reg dies. ! 2200: If it is used in this insn and was dead below the insn ! 2201: then it dies in this insn. If it was set in this insn, ! 2202: we do not make a REG_DEAD note; likewise if we already ! 2203: made such a note. */ ! 2204: ! 2205: if (! all_needed ! 2206: && ! dead_or_set_p (insn, x) ! 2207: #if 0 ! 2208: && (regno >= FIRST_PSEUDO_REGISTER || ! fixed_regs[regno]) ! 2209: #endif ! 2210: ) ! 2211: { ! 2212: /* If none of the words in X is needed, make a REG_DEAD ! 2213: note. Otherwise, we must make partial REG_DEAD notes. */ ! 2214: if (! some_needed) ! 2215: { ! 2216: REG_NOTES (insn) ! 2217: = gen_rtx (EXPR_LIST, REG_DEAD, x, REG_NOTES (insn)); ! 2218: reg_n_deaths[regno]++; ! 2219: } ! 2220: else ! 2221: { ! 2222: int i; ! 2223: ! 2224: /* Don't make a REG_DEAD note for a part of a register ! 2225: that is set in the insn. */ ! 2226: ! 2227: for (i = HARD_REGNO_NREGS (regno, GET_MODE (x)) - 1; ! 2228: i >= 0; i--) ! 2229: if ((needed[(regno + i) / REGSET_ELT_BITS] ! 2230: & 1 << ((regno + i) % REGSET_ELT_BITS)) == 0 ! 2231: && ! dead_or_set_regno_p (insn, regno + i)) ! 2232: REG_NOTES (insn) ! 2233: = gen_rtx (EXPR_LIST, REG_DEAD, ! 2234: gen_rtx (REG, word_mode, regno + i), ! 2235: REG_NOTES (insn)); ! 2236: } ! 2237: } ! 2238: } ! 2239: } ! 2240: return; ! 2241: ! 2242: case SET: ! 2243: { ! 2244: register rtx testreg = SET_DEST (x); ! 2245: int mark_dest = 0; ! 2246: ! 2247: /* If storing into MEM, don't show it as being used. But do ! 2248: show the address as being used. */ ! 2249: if (GET_CODE (testreg) == MEM) ! 2250: { ! 2251: #ifdef AUTO_INC_DEC ! 2252: if (final) ! 2253: find_auto_inc (needed, testreg, insn); ! 2254: #endif ! 2255: mark_used_regs (needed, live, XEXP (testreg, 0), final, insn); ! 2256: mark_used_regs (needed, live, SET_SRC (x), final, insn); ! 2257: return; ! 2258: } ! 2259: ! 2260: /* Storing in STRICT_LOW_PART is like storing in a reg ! 2261: in that this SET might be dead, so ignore it in TESTREG. ! 2262: but in some other ways it is like using the reg. ! 2263: ! 2264: Storing in a SUBREG or a bit field is like storing the entire ! 2265: register in that if the register's value is not used ! 2266: then this SET is not needed. */ ! 2267: while (GET_CODE (testreg) == STRICT_LOW_PART ! 2268: || GET_CODE (testreg) == ZERO_EXTRACT ! 2269: || GET_CODE (testreg) == SIGN_EXTRACT ! 2270: || GET_CODE (testreg) == SUBREG) ! 2271: { ! 2272: /* Modifying a single register in an alternate mode ! 2273: does not use any of the old value. But these other ! 2274: ways of storing in a register do use the old value. */ ! 2275: if (GET_CODE (testreg) == SUBREG ! 2276: && !(REG_SIZE (SUBREG_REG (testreg)) > REG_SIZE (testreg))) ! 2277: ; ! 2278: else ! 2279: mark_dest = 1; ! 2280: ! 2281: testreg = XEXP (testreg, 0); ! 2282: } ! 2283: ! 2284: /* If this is a store into a register, ! 2285: recursively scan the value being stored. */ ! 2286: ! 2287: if (GET_CODE (testreg) == REG ! 2288: && (regno = REGNO (testreg), regno != FRAME_POINTER_REGNUM) ! 2289: #if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM ! 2290: && ! (regno == ARG_POINTER_REGNUM && fixed_regs[regno]) ! 2291: #endif ! 2292: && ! (regno < FIRST_PSEUDO_REGISTER && global_regs[regno])) ! 2293: { ! 2294: mark_used_regs (needed, live, SET_SRC (x), final, insn); ! 2295: if (mark_dest) ! 2296: mark_used_regs (needed, live, SET_DEST (x), final, insn); ! 2297: return; ! 2298: } ! 2299: } ! 2300: break; ! 2301: ! 2302: case RETURN: ! 2303: /* If exiting needs the right stack value, consider this insn as ! 2304: using the stack pointer. In any event, consider it as using ! 2305: all global registers. */ ! 2306: ! 2307: #ifdef EXIT_IGNORE_STACK ! 2308: if (! EXIT_IGNORE_STACK ! 2309: || (! FRAME_POINTER_REQUIRED && flag_omit_frame_pointer)) ! 2310: #endif ! 2311: live[STACK_POINTER_REGNUM / REGSET_ELT_BITS] ! 2312: |= 1 << (STACK_POINTER_REGNUM % REGSET_ELT_BITS); ! 2313: ! 2314: for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) ! 2315: if (global_regs[i]) ! 2316: live[i / REGSET_ELT_BITS] |= 1 << (i % REGSET_ELT_BITS); ! 2317: break; ! 2318: } ! 2319: ! 2320: /* Recursively scan the operands of this expression. */ ! 2321: ! 2322: { ! 2323: register char *fmt = GET_RTX_FORMAT (code); ! 2324: register int i; ! 2325: ! 2326: for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) ! 2327: { ! 2328: if (fmt[i] == 'e') ! 2329: { ! 2330: /* Tail recursive case: save a function call level. */ ! 2331: if (i == 0) ! 2332: { ! 2333: x = XEXP (x, 0); ! 2334: goto retry; ! 2335: } ! 2336: mark_used_regs (needed, live, XEXP (x, i), final, insn); ! 2337: } ! 2338: else if (fmt[i] == 'E') ! 2339: { ! 2340: register int j; ! 2341: for (j = 0; j < XVECLEN (x, i); j++) ! 2342: mark_used_regs (needed, live, XVECEXP (x, i, j), final, insn); ! 2343: } ! 2344: } ! 2345: } ! 2346: } ! 2347: ! 2348: #ifdef AUTO_INC_DEC ! 2349: ! 2350: static int ! 2351: try_pre_increment_1 (insn) ! 2352: rtx insn; ! 2353: { ! 2354: /* Find the next use of this reg. If in same basic block, ! 2355: make it do pre-increment or pre-decrement if appropriate. */ ! 2356: rtx x = PATTERN (insn); ! 2357: int amount = ((GET_CODE (SET_SRC (x)) == PLUS ? 1 : -1) ! 2358: * INTVAL (XEXP (SET_SRC (x), 1))); ! 2359: int regno = REGNO (SET_DEST (x)); ! 2360: rtx y = reg_next_use[regno]; ! 2361: if (y != 0 ! 2362: && BLOCK_NUM (y) == BLOCK_NUM (insn) ! 2363: && try_pre_increment (y, SET_DEST (PATTERN (insn)), ! 2364: amount)) ! 2365: { ! 2366: /* We have found a suitable auto-increment ! 2367: and already changed insn Y to do it. ! 2368: So flush this increment-instruction. */ ! 2369: PUT_CODE (insn, NOTE); ! 2370: NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED; ! 2371: NOTE_SOURCE_FILE (insn) = 0; ! 2372: /* Count a reference to this reg for the increment ! 2373: insn we are deleting. When a reg is incremented. ! 2374: spilling it is worse, so we want to make that ! 2375: less likely. */ ! 2376: if (regno >= FIRST_PSEUDO_REGISTER) ! 2377: { ! 2378: reg_n_refs[regno] += loop_depth; ! 2379: reg_n_sets[regno]++; ! 2380: } ! 2381: return 1; ! 2382: } ! 2383: return 0; ! 2384: } ! 2385: ! 2386: /* Try to change INSN so that it does pre-increment or pre-decrement ! 2387: addressing on register REG in order to add AMOUNT to REG. ! 2388: AMOUNT is negative for pre-decrement. ! 2389: Returns 1 if the change could be made. ! 2390: This checks all about the validity of the result of modifying INSN. */ ! 2391: ! 2392: static int ! 2393: try_pre_increment (insn, reg, amount) ! 2394: rtx insn, reg; ! 2395: int amount; ! 2396: { ! 2397: register rtx use; ! 2398: ! 2399: /* Nonzero if we can try to make a pre-increment or pre-decrement. ! 2400: For example, addl $4,r1; movl (r1),... can become movl +(r1),... */ ! 2401: int pre_ok = 0; ! 2402: /* Nonzero if we can try to make a post-increment or post-decrement. ! 2403: For example, addl $4,r1; movl -4(r1),... can become movl (r1)+,... ! 2404: It is possible for both PRE_OK and POST_OK to be nonzero if the machine ! 2405: supports both pre-inc and post-inc, or both pre-dec and post-dec. */ ! 2406: int post_ok = 0; ! 2407: ! 2408: /* Nonzero if the opportunity actually requires post-inc or post-dec. */ ! 2409: int do_post = 0; ! 2410: ! 2411: /* From the sign of increment, see which possibilities are conceivable ! 2412: on this target machine. */ ! 2413: #ifdef HAVE_PRE_INCREMENT ! 2414: if (amount > 0) ! 2415: pre_ok = 1; ! 2416: #endif ! 2417: #ifdef HAVE_POST_INCREMENT ! 2418: if (amount > 0) ! 2419: post_ok = 1; ! 2420: #endif ! 2421: ! 2422: #ifdef HAVE_PRE_DECREMENT ! 2423: if (amount < 0) ! 2424: pre_ok = 1; ! 2425: #endif ! 2426: #ifdef HAVE_POST_DECREMENT ! 2427: if (amount < 0) ! 2428: post_ok = 1; ! 2429: #endif ! 2430: ! 2431: if (! (pre_ok || post_ok)) ! 2432: return 0; ! 2433: ! 2434: /* It is not safe to add a side effect to a jump insn ! 2435: because if the incremented register is spilled and must be reloaded ! 2436: there would be no way to store the incremented value back in memory. */ ! 2437: ! 2438: if (GET_CODE (insn) == JUMP_INSN) ! 2439: return 0; ! 2440: ! 2441: use = 0; ! 2442: if (pre_ok) ! 2443: use = find_use_as_address (PATTERN (insn), reg, 0); ! 2444: if (post_ok && (use == 0 || use == (rtx) 1)) ! 2445: { ! 2446: use = find_use_as_address (PATTERN (insn), reg, -amount); ! 2447: do_post = 1; ! 2448: } ! 2449: ! 2450: if (use == 0 || use == (rtx) 1) ! 2451: return 0; ! 2452: ! 2453: if (GET_MODE_SIZE (GET_MODE (use)) != (amount > 0 ? amount : - amount)) ! 2454: return 0; ! 2455: ! 2456: XEXP (use, 0) = gen_rtx (amount > 0 ! 2457: ? (do_post ? POST_INC : PRE_INC) ! 2458: : (do_post ? POST_DEC : PRE_DEC), ! 2459: Pmode, reg); ! 2460: ! 2461: /* Record that this insn now has an implicit side effect on X. */ ! 2462: REG_NOTES (insn) = gen_rtx (EXPR_LIST, REG_INC, reg, REG_NOTES (insn)); ! 2463: return 1; ! 2464: } ! 2465: ! 2466: #endif /* AUTO_INC_DEC */ ! 2467: ! 2468: /* Find the place in the rtx X where REG is used as a memory address. ! 2469: Return the MEM rtx that so uses it. ! 2470: If PLUSCONST is nonzero, search instead for a memory address equivalent to ! 2471: (plus REG (const_int PLUSCONST)). ! 2472: ! 2473: If such an address does not appear, return 0. ! 2474: If REG appears more than once, or is used other than in such an address, ! 2475: return (rtx)1. */ ! 2476: ! 2477: static rtx ! 2478: find_use_as_address (x, reg, plusconst) ! 2479: register rtx x; ! 2480: rtx reg; ! 2481: int plusconst; ! 2482: { ! 2483: enum rtx_code code = GET_CODE (x); ! 2484: char *fmt = GET_RTX_FORMAT (code); ! 2485: register int i; ! 2486: register rtx value = 0; ! 2487: register rtx tem; ! 2488: ! 2489: if (code == MEM && XEXP (x, 0) == reg && plusconst == 0) ! 2490: return x; ! 2491: ! 2492: if (code == MEM && GET_CODE (XEXP (x, 0)) == PLUS ! 2493: && XEXP (XEXP (x, 0), 0) == reg ! 2494: && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT ! 2495: && INTVAL (XEXP (XEXP (x, 0), 1)) == plusconst) ! 2496: return x; ! 2497: ! 2498: if (code == SIGN_EXTRACT || code == ZERO_EXTRACT) ! 2499: { ! 2500: /* If REG occurs inside a MEM used in a bit-field reference, ! 2501: that is unacceptable. */ ! 2502: if (find_use_as_address (XEXP (x, 0), reg, 0) != 0) ! 2503: return (rtx) 1; ! 2504: } ! 2505: ! 2506: if (x == reg) ! 2507: return (rtx) 1; ! 2508: ! 2509: for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) ! 2510: { ! 2511: if (fmt[i] == 'e') ! 2512: { ! 2513: tem = find_use_as_address (XEXP (x, i), reg, plusconst); ! 2514: if (value == 0) ! 2515: value = tem; ! 2516: else if (tem != 0) ! 2517: return (rtx) 1; ! 2518: } ! 2519: if (fmt[i] == 'E') ! 2520: { ! 2521: register int j; ! 2522: for (j = XVECLEN (x, i) - 1; j >= 0; j--) ! 2523: { ! 2524: tem = find_use_as_address (XVECEXP (x, i, j), reg, plusconst); ! 2525: if (value == 0) ! 2526: value = tem; ! 2527: else if (tem != 0) ! 2528: return (rtx) 1; ! 2529: } ! 2530: } ! 2531: } ! 2532: ! 2533: return value; ! 2534: } ! 2535: ! 2536: /* Write information about registers and basic blocks into FILE. ! 2537: This is part of making a debugging dump. */ ! 2538: ! 2539: void ! 2540: dump_flow_info (file) ! 2541: FILE *file; ! 2542: { ! 2543: register int i; ! 2544: static char *reg_class_names[] = REG_CLASS_NAMES; ! 2545: ! 2546: fprintf (file, "%d registers.\n", max_regno); ! 2547: ! 2548: for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++) ! 2549: if (reg_n_refs[i]) ! 2550: { ! 2551: enum reg_class class; ! 2552: fprintf (file, "\nRegister %d used %d times across %d insns", ! 2553: i, reg_n_refs[i], reg_live_length[i]); ! 2554: if (reg_basic_block[i] >= 0) ! 2555: fprintf (file, " in block %d", reg_basic_block[i]); ! 2556: if (reg_n_deaths[i] != 1) ! 2557: fprintf (file, "; dies in %d places", reg_n_deaths[i]); ! 2558: if (reg_n_calls_crossed[i] == 1) ! 2559: fprintf (file, "; crosses 1 call"); ! 2560: else if (reg_n_calls_crossed[i]) ! 2561: fprintf (file, "; crosses %d calls", reg_n_calls_crossed[i]); ! 2562: if (PSEUDO_REGNO_BYTES (i) != UNITS_PER_WORD) ! 2563: fprintf (file, "; %d bytes", PSEUDO_REGNO_BYTES (i)); ! 2564: class = reg_preferred_class (i); ! 2565: if (class != GENERAL_REGS) ! 2566: { ! 2567: if (reg_preferred_or_nothing (i)) ! 2568: fprintf (file, "; %s or none", reg_class_names[(int) class]); ! 2569: else ! 2570: fprintf (file, "; pref %s", reg_class_names[(int) class]); ! 2571: } ! 2572: if (REGNO_POINTER_FLAG (i)) ! 2573: fprintf (file, "; pointer"); ! 2574: fprintf (file, ".\n"); ! 2575: } ! 2576: fprintf (file, "\n%d basic blocks.\n", n_basic_blocks); ! 2577: for (i = 0; i < n_basic_blocks; i++) ! 2578: { ! 2579: register rtx head, jump; ! 2580: register int regno; ! 2581: fprintf (file, "\nBasic block %d: first insn %d, last %d.\n", ! 2582: i, ! 2583: INSN_UID (basic_block_head[i]), ! 2584: INSN_UID (basic_block_end[i])); ! 2585: /* The control flow graph's storage is freed ! 2586: now when flow_analysis returns. ! 2587: Don't try to print it if it is gone. */ ! 2588: if (basic_block_drops_in) ! 2589: { ! 2590: fprintf (file, "Reached from blocks: "); ! 2591: head = basic_block_head[i]; ! 2592: if (GET_CODE (head) == CODE_LABEL) ! 2593: for (jump = LABEL_REFS (head); ! 2594: jump != head; ! 2595: jump = LABEL_NEXTREF (jump)) ! 2596: { ! 2597: register int from_block = BLOCK_NUM (CONTAINING_INSN (jump)); ! 2598: fprintf (file, " %d", from_block); ! 2599: } ! 2600: if (basic_block_drops_in[i]) ! 2601: fprintf (file, " previous"); ! 2602: } ! 2603: fprintf (file, "\nRegisters live at start:"); ! 2604: for (regno = 0; regno < max_regno; regno++) ! 2605: { ! 2606: register int offset = regno / REGSET_ELT_BITS; ! 2607: register int bit = 1 << (regno % REGSET_ELT_BITS); ! 2608: if (basic_block_live_at_start[i][offset] & bit) ! 2609: fprintf (file, " %d", regno); ! 2610: } ! 2611: fprintf (file, "\n"); ! 2612: } ! 2613: fprintf (file, "\n"); ! 2614: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.