|
|
1.1 root 1: /* Try to unroll loops, and split induction variables. 1.1.1.7 ! root 2: Copyright (C) 1992, 1993, 1994 Free Software Foundation, Inc. 1.1 root 3: Contributed by James E. Wilson, Cygnus Support/UC Berkeley. 4: 5: This file is part of GNU CC. 6: 7: GNU CC is free software; you can redistribute it and/or modify 8: it under the terms of the GNU General Public License as published by 9: the Free Software Foundation; either version 2, or (at your option) 10: any later version. 11: 12: GNU CC is distributed in the hope that it will be useful, 13: but WITHOUT ANY WARRANTY; without even the implied warranty of 14: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15: GNU General Public License for more details. 16: 17: You should have received a copy of the GNU General Public License 18: along with GNU CC; see the file COPYING. If not, write to 19: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ 20: 21: /* Try to unroll a loop, and split induction variables. 22: 23: Loops for which the number of iterations can be calculated exactly are 24: handled specially. If the number of iterations times the insn_count is 25: less than MAX_UNROLLED_INSNS, then the loop is unrolled completely. 26: Otherwise, we try to unroll the loop a number of times modulo the number 27: of iterations, so that only one exit test will be needed. It is unrolled 28: a number of times approximately equal to MAX_UNROLLED_INSNS divided by 29: the insn count. 30: 31: Otherwise, if the number of iterations can be calculated exactly at 32: run time, and the loop is always entered at the top, then we try to 33: precondition the loop. That is, at run time, calculate how many times 34: the loop will execute, and then execute the loop body a few times so 35: that the remaining iterations will be some multiple of 4 (or 2 if the 36: loop is large). Then fall through to a loop unrolled 4 (or 2) times, 37: with only one exit test needed at the end of the loop. 38: 39: Otherwise, if the number of iterations can not be calculated exactly, 40: not even at run time, then we still unroll the loop a number of times 41: approximately equal to MAX_UNROLLED_INSNS divided by the insn count, 42: but there must be an exit test after each copy of the loop body. 43: 44: For each induction variable, which is dead outside the loop (replaceable) 45: or for which we can easily calculate the final value, if we can easily 46: calculate its value at each place where it is set as a function of the 47: current loop unroll count and the variable's value at loop entry, then 48: the induction variable is split into `N' different variables, one for 49: each copy of the loop body. One variable is live across the backward 50: branch, and the others are all calculated as a function of this variable. 51: This helps eliminate data dependencies, and leads to further opportunities 52: for cse. */ 53: 54: /* Possible improvements follow: */ 55: 56: /* ??? Add an extra pass somewhere to determine whether unrolling will 57: give any benefit. E.g. after generating all unrolled insns, compute the 58: cost of all insns and compare against cost of insns in rolled loop. 59: 60: - On traditional architectures, unrolling a non-constant bound loop 61: is a win if there is a giv whose only use is in memory addresses, the 1.1.1.3 root 62: memory addresses can be split, and hence giv increments can be 1.1 root 63: eliminated. 64: - It is also a win if the loop is executed many times, and preconditioning 65: can be performed for the loop. 66: Add code to check for these and similar cases. */ 67: 68: /* ??? Improve control of which loops get unrolled. Could use profiling 69: info to only unroll the most commonly executed loops. Perhaps have 70: a user specifyable option to control the amount of code expansion, 71: or the percent of loops to consider for unrolling. Etc. */ 72: 73: /* ??? Look at the register copies inside the loop to see if they form a 74: simple permutation. If so, iterate the permutation until it gets back to 75: the start state. This is how many times we should unroll the loop, for 76: best results, because then all register copies can be eliminated. 77: For example, the lisp nreverse function should be unrolled 3 times 78: while (this) 79: { 80: next = this->cdr; 81: this->cdr = prev; 82: prev = this; 83: this = next; 84: } 85: 86: ??? The number of times to unroll the loop may also be based on data 87: references in the loop. For example, if we have a loop that references 88: x[i-1], x[i], and x[i+1], we should unroll it a multiple of 3 times. */ 89: 90: /* ??? Add some simple linear equation solving capability so that we can 91: determine the number of loop iterations for more complex loops. 92: For example, consider this loop from gdb 93: #define SWAP_TARGET_AND_HOST(buffer,len) 94: { 95: char tmp; 96: char *p = (char *) buffer; 97: char *q = ((char *) buffer) + len - 1; 98: int iterations = (len + 1) >> 1; 99: int i; 100: for (p; p < q; p++, q--;) 101: { 102: tmp = *q; 103: *q = *p; 104: *p = tmp; 105: } 106: } 107: Note that: 108: start value = p = &buffer + current_iteration 109: end value = q = &buffer + len - 1 - current_iteration 110: Given the loop exit test of "p < q", then there must be "q - p" iterations, 111: set equal to zero and solve for number of iterations: 112: q - p = len - 1 - 2*current_iteration = 0 113: current_iteration = (len - 1) / 2 114: Hence, there are (len - 1) / 2 (rounded up to the nearest integer) 115: iterations of this loop. */ 116: 117: /* ??? Currently, no labels are marked as loop invariant when doing loop 118: unrolling. This is because an insn inside the loop, that loads the address 119: of a label inside the loop into a register, could be moved outside the loop 120: by the invariant code motion pass if labels were invariant. If the loop 121: is subsequently unrolled, the code will be wrong because each unrolled 122: body of the loop will use the same address, whereas each actually needs a 123: different address. A case where this happens is when a loop containing 124: a switch statement is unrolled. 125: 126: It would be better to let labels be considered invariant. When we 127: unroll loops here, check to see if any insns using a label local to the 128: loop were moved before the loop. If so, then correct the problem, by 129: moving the insn back into the loop, or perhaps replicate the insn before 130: the loop, one copy for each time the loop is unrolled. */ 131: 132: /* The prime factors looked for when trying to unroll a loop by some 133: number which is modulo the total number of iterations. Just checking 134: for these 4 prime factors will find at least one factor for 75% of 135: all numbers theoretically. Practically speaking, this will succeed 136: almost all of the time since loops are generally a multiple of 2 137: and/or 5. */ 138: 139: #define NUM_FACTORS 4 140: 141: struct _factor { int factor, count; } factors[NUM_FACTORS] 142: = { {2, 0}, {3, 0}, {5, 0}, {7, 0}}; 143: 144: /* Describes the different types of loop unrolling performed. */ 145: 146: enum unroll_types { UNROLL_COMPLETELY, UNROLL_MODULO, UNROLL_NAIVE }; 147: 148: #include "config.h" 149: #include "rtl.h" 150: #include "insn-config.h" 151: #include "integrate.h" 152: #include "regs.h" 153: #include "flags.h" 154: #include "expr.h" 155: #include <stdio.h> 156: #include "loop.h" 157: 158: /* This controls which loops are unrolled, and by how much we unroll 159: them. */ 160: 161: #ifndef MAX_UNROLLED_INSNS 162: #define MAX_UNROLLED_INSNS 100 163: #endif 164: 165: /* Indexed by register number, if non-zero, then it contains a pointer 166: to a struct induction for a DEST_REG giv which has been combined with 167: one of more address givs. This is needed because whenever such a DEST_REG 168: giv is modified, we must modify the value of all split address givs 169: that were combined with this DEST_REG giv. */ 170: 171: static struct induction **addr_combined_regs; 172: 173: /* Indexed by register number, if this is a splittable induction variable, 174: then this will hold the current value of the register, which depends on the 175: iteration number. */ 176: 177: static rtx *splittable_regs; 178: 179: /* Indexed by register number, if this is a splittable induction variable, 180: then this will hold the number of instructions in the loop that modify 181: the induction variable. Used to ensure that only the last insn modifying 182: a split iv will update the original iv of the dest. */ 183: 184: static int *splittable_regs_updates; 185: 186: /* Values describing the current loop's iteration variable. These are set up 187: by loop_iterations, and used by precondition_loop_p. */ 188: 189: static rtx loop_iteration_var; 190: static rtx loop_initial_value; 191: static rtx loop_increment; 192: static rtx loop_final_value; 193: 194: /* Forward declarations. */ 195: 196: static void init_reg_map (); 197: static int precondition_loop_p (); 198: static void copy_loop_body (); 199: static void iteration_info (); 200: static rtx approx_final_value (); 201: static int find_splittable_regs (); 202: static int find_splittable_givs (); 203: static rtx fold_rtx_mult_add (); 1.1.1.7 ! root 204: static rtx remap_split_bivs (); 1.1 root 205: 206: /* Try to unroll one loop and split induction variables in the loop. 207: 208: The loop is described by the arguments LOOP_END, INSN_COUNT, and 1.1.1.3 root 209: LOOP_START. END_INSERT_BEFORE indicates where insns should be added 1.1 root 210: which need to be executed when the loop falls through. STRENGTH_REDUCTION_P 211: indicates whether information generated in the strength reduction pass 212: is available. 213: 214: This function is intended to be called from within `strength_reduce' 215: in loop.c. */ 216: 217: void 218: unroll_loop (loop_end, insn_count, loop_start, end_insert_before, 219: strength_reduce_p) 220: rtx loop_end; 221: int insn_count; 222: rtx loop_start; 223: rtx end_insert_before; 224: int strength_reduce_p; 225: { 226: int i, j, temp; 227: int unroll_number = 1; 228: rtx copy_start, copy_end; 229: rtx insn, copy, sequence, pattern, tem; 230: int max_labelno, max_insnno; 231: rtx insert_before; 232: struct inline_remap *map; 233: char *local_label; 234: int maxregnum; 235: int new_maxregnum; 236: rtx exit_label = 0; 237: rtx start_label; 238: struct iv_class *bl; 239: int splitting_not_safe = 0; 240: enum unroll_types unroll_type; 241: int loop_preconditioned = 0; 242: rtx safety_label; 243: /* This points to the last real insn in the loop, which should be either 244: a JUMP_INSN (for conditional jumps) or a BARRIER (for unconditional 245: jumps). */ 246: rtx last_loop_insn; 247: 248: /* Don't bother unrolling huge loops. Since the minimum factor is 249: two, loops greater than one half of MAX_UNROLLED_INSNS will never 250: be unrolled. */ 251: if (insn_count > MAX_UNROLLED_INSNS / 2) 252: { 253: if (loop_dump_stream) 254: fprintf (loop_dump_stream, "Unrolling failure: Loop too big.\n"); 255: return; 256: } 257: 258: /* When emitting debugger info, we can't unroll loops with unequal numbers 259: of block_beg and block_end notes, because that would unbalance the block 260: structure of the function. This can happen as a result of the 261: "if (foo) bar; else break;" optimization in jump.c. */ 262: 263: if (write_symbols != NO_DEBUG) 264: { 265: int block_begins = 0; 266: int block_ends = 0; 267: 268: for (insn = loop_start; insn != loop_end; insn = NEXT_INSN (insn)) 269: { 270: if (GET_CODE (insn) == NOTE) 271: { 272: if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_BLOCK_BEG) 273: block_begins++; 274: else if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_BLOCK_END) 275: block_ends++; 276: } 277: } 278: 279: if (block_begins != block_ends) 280: { 281: if (loop_dump_stream) 282: fprintf (loop_dump_stream, 283: "Unrolling failure: Unbalanced block notes.\n"); 284: return; 285: } 286: } 287: 288: /* Determine type of unroll to perform. Depends on the number of iterations 289: and the size of the loop. */ 290: 291: /* If there is no strength reduce info, then set loop_n_iterations to zero. 292: This can happen if strength_reduce can't find any bivs in the loop. 293: A value of zero indicates that the number of iterations could not be 294: calculated. */ 295: 296: if (! strength_reduce_p) 297: loop_n_iterations = 0; 298: 299: if (loop_dump_stream && loop_n_iterations > 0) 300: fprintf (loop_dump_stream, 301: "Loop unrolling: %d iterations.\n", loop_n_iterations); 302: 303: /* Find and save a pointer to the last nonnote insn in the loop. */ 304: 305: last_loop_insn = prev_nonnote_insn (loop_end); 306: 307: /* Calculate how many times to unroll the loop. Indicate whether or 308: not the loop is being completely unrolled. */ 309: 310: if (loop_n_iterations == 1) 311: { 312: /* If number of iterations is exactly 1, then eliminate the compare and 313: branch at the end of the loop since they will never be taken. 314: Then return, since no other action is needed here. */ 315: 316: /* If the last instruction is not a BARRIER or a JUMP_INSN, then 317: don't do anything. */ 318: 319: if (GET_CODE (last_loop_insn) == BARRIER) 320: { 321: /* Delete the jump insn. This will delete the barrier also. */ 322: delete_insn (PREV_INSN (last_loop_insn)); 323: } 324: else if (GET_CODE (last_loop_insn) == JUMP_INSN) 325: { 326: #ifdef HAVE_cc0 1.1.1.2 root 327: /* The immediately preceding insn is a compare which must be 1.1 root 328: deleted. */ 329: delete_insn (last_loop_insn); 330: delete_insn (PREV_INSN (last_loop_insn)); 331: #else 1.1.1.2 root 332: /* The immediately preceding insn may not be the compare, so don't 1.1 root 333: delete it. */ 334: delete_insn (last_loop_insn); 335: #endif 336: } 337: return; 338: } 339: else if (loop_n_iterations > 0 340: && loop_n_iterations * insn_count < MAX_UNROLLED_INSNS) 341: { 342: unroll_number = loop_n_iterations; 343: unroll_type = UNROLL_COMPLETELY; 344: } 345: else if (loop_n_iterations > 0) 346: { 347: /* Try to factor the number of iterations. Don't bother with the 348: general case, only using 2, 3, 5, and 7 will get 75% of all 349: numbers theoretically, and almost all in practice. */ 350: 351: for (i = 0; i < NUM_FACTORS; i++) 352: factors[i].count = 0; 353: 354: temp = loop_n_iterations; 355: for (i = NUM_FACTORS - 1; i >= 0; i--) 356: while (temp % factors[i].factor == 0) 357: { 358: factors[i].count++; 359: temp = temp / factors[i].factor; 360: } 361: 362: /* Start with the larger factors first so that we generally 363: get lots of unrolling. */ 364: 365: unroll_number = 1; 366: temp = insn_count; 367: for (i = 3; i >= 0; i--) 368: while (factors[i].count--) 369: { 370: if (temp * factors[i].factor < MAX_UNROLLED_INSNS) 371: { 372: unroll_number *= factors[i].factor; 373: temp *= factors[i].factor; 374: } 375: else 376: break; 377: } 378: 379: /* If we couldn't find any factors, then unroll as in the normal 380: case. */ 381: if (unroll_number == 1) 382: { 383: if (loop_dump_stream) 384: fprintf (loop_dump_stream, 385: "Loop unrolling: No factors found.\n"); 386: } 387: else 388: unroll_type = UNROLL_MODULO; 389: } 390: 391: 392: /* Default case, calculate number of times to unroll loop based on its 393: size. */ 394: if (unroll_number == 1) 395: { 396: if (8 * insn_count < MAX_UNROLLED_INSNS) 397: unroll_number = 8; 398: else if (4 * insn_count < MAX_UNROLLED_INSNS) 399: unroll_number = 4; 400: else 401: unroll_number = 2; 402: 403: unroll_type = UNROLL_NAIVE; 404: } 405: 406: /* Now we know how many times to unroll the loop. */ 407: 408: if (loop_dump_stream) 409: fprintf (loop_dump_stream, 410: "Unrolling loop %d times.\n", unroll_number); 411: 412: 413: if (unroll_type == UNROLL_COMPLETELY || unroll_type == UNROLL_MODULO) 414: { 415: /* Loops of these types should never start with a jump down to 416: the exit condition test. For now, check for this case just to 417: be sure. UNROLL_NAIVE loops can be of this form, this case is 418: handled below. */ 419: insn = loop_start; 420: while (GET_CODE (insn) != CODE_LABEL && GET_CODE (insn) != JUMP_INSN) 421: insn = NEXT_INSN (insn); 422: if (GET_CODE (insn) == JUMP_INSN) 423: abort (); 424: } 425: 426: if (unroll_type == UNROLL_COMPLETELY) 427: { 428: /* Completely unrolling the loop: Delete the compare and branch at 429: the end (the last two instructions). This delete must done at the 430: very end of loop unrolling, to avoid problems with calls to 431: back_branch_in_range_p, which is called by find_splittable_regs. 432: All increments of splittable bivs/givs are changed to load constant 433: instructions. */ 434: 435: copy_start = loop_start; 436: 437: /* Set insert_before to the instruction immediately after the JUMP_INSN 438: (or BARRIER), so that any NOTEs between the JUMP_INSN and the end of 439: the loop will be correctly handled by copy_loop_body. */ 440: insert_before = NEXT_INSN (last_loop_insn); 441: 442: /* Set copy_end to the insn before the jump at the end of the loop. */ 443: if (GET_CODE (last_loop_insn) == BARRIER) 444: copy_end = PREV_INSN (PREV_INSN (last_loop_insn)); 445: else if (GET_CODE (last_loop_insn) == JUMP_INSN) 446: { 447: #ifdef HAVE_cc0 448: /* The instruction immediately before the JUMP_INSN is a compare 449: instruction which we do not want to copy. */ 450: copy_end = PREV_INSN (PREV_INSN (last_loop_insn)); 451: #else 452: /* The instruction immediately before the JUMP_INSN may not be the 453: compare, so we must copy it. */ 454: copy_end = PREV_INSN (last_loop_insn); 455: #endif 456: } 457: else 458: { 459: /* We currently can't unroll a loop if it doesn't end with a 460: JUMP_INSN. There would need to be a mechanism that recognizes 461: this case, and then inserts a jump after each loop body, which 462: jumps to after the last loop body. */ 463: if (loop_dump_stream) 464: fprintf (loop_dump_stream, 465: "Unrolling failure: loop does not end with a JUMP_INSN.\n"); 466: return; 467: } 468: } 469: else if (unroll_type == UNROLL_MODULO) 470: { 471: /* Partially unrolling the loop: The compare and branch at the end 472: (the last two instructions) must remain. Don't copy the compare 473: and branch instructions at the end of the loop. Insert the unrolled 474: code immediately before the compare/branch at the end so that the 475: code will fall through to them as before. */ 476: 477: copy_start = loop_start; 478: 479: /* Set insert_before to the jump insn at the end of the loop. 480: Set copy_end to before the jump insn at the end of the loop. */ 481: if (GET_CODE (last_loop_insn) == BARRIER) 482: { 483: insert_before = PREV_INSN (last_loop_insn); 484: copy_end = PREV_INSN (insert_before); 485: } 486: else if (GET_CODE (last_loop_insn) == JUMP_INSN) 487: { 488: #ifdef HAVE_cc0 489: /* The instruction immediately before the JUMP_INSN is a compare 490: instruction which we do not want to copy or delete. */ 491: insert_before = PREV_INSN (last_loop_insn); 492: copy_end = PREV_INSN (insert_before); 493: #else 494: /* The instruction immediately before the JUMP_INSN may not be the 495: compare, so we must copy it. */ 496: insert_before = last_loop_insn; 497: copy_end = PREV_INSN (last_loop_insn); 498: #endif 499: } 500: else 501: { 502: /* We currently can't unroll a loop if it doesn't end with a 503: JUMP_INSN. There would need to be a mechanism that recognizes 504: this case, and then inserts a jump after each loop body, which 505: jumps to after the last loop body. */ 506: if (loop_dump_stream) 507: fprintf (loop_dump_stream, 508: "Unrolling failure: loop does not end with a JUMP_INSN.\n"); 509: return; 510: } 511: } 512: else 513: { 514: /* Normal case: Must copy the compare and branch instructions at the 515: end of the loop. */ 516: 517: if (GET_CODE (last_loop_insn) == BARRIER) 518: { 519: /* Loop ends with an unconditional jump and a barrier. 520: Handle this like above, don't copy jump and barrier. 521: This is not strictly necessary, but doing so prevents generating 522: unconditional jumps to an immediately following label. 523: 524: This will be corrected below if the target of this jump is 525: not the start_label. */ 526: 527: insert_before = PREV_INSN (last_loop_insn); 528: copy_end = PREV_INSN (insert_before); 529: } 530: else if (GET_CODE (last_loop_insn) == JUMP_INSN) 531: { 532: /* Set insert_before to immediately after the JUMP_INSN, so that 533: NOTEs at the end of the loop will be correctly handled by 534: copy_loop_body. */ 535: insert_before = NEXT_INSN (last_loop_insn); 536: copy_end = last_loop_insn; 537: } 538: else 539: { 540: /* We currently can't unroll a loop if it doesn't end with a 541: JUMP_INSN. There would need to be a mechanism that recognizes 542: this case, and then inserts a jump after each loop body, which 543: jumps to after the last loop body. */ 544: if (loop_dump_stream) 545: fprintf (loop_dump_stream, 546: "Unrolling failure: loop does not end with a JUMP_INSN.\n"); 547: return; 548: } 549: 550: /* If copying exit test branches because they can not be eliminated, 551: then must convert the fall through case of the branch to a jump past 552: the end of the loop. Create a label to emit after the loop and save 553: it for later use. Do not use the label after the loop, if any, since 554: it might be used by insns outside the loop, or there might be insns 555: added before it later by final_[bg]iv_value which must be after 556: the real exit label. */ 557: exit_label = gen_label_rtx (); 558: 559: insn = loop_start; 560: while (GET_CODE (insn) != CODE_LABEL && GET_CODE (insn) != JUMP_INSN) 561: insn = NEXT_INSN (insn); 562: 563: if (GET_CODE (insn) == JUMP_INSN) 564: { 565: /* The loop starts with a jump down to the exit condition test. 566: Start copying the loop after the barrier following this 567: jump insn. */ 568: copy_start = NEXT_INSN (insn); 569: 570: /* Splitting induction variables doesn't work when the loop is 571: entered via a jump to the bottom, because then we end up doing 572: a comparison against a new register for a split variable, but 573: we did not execute the set insn for the new register because 574: it was skipped over. */ 575: splitting_not_safe = 1; 576: if (loop_dump_stream) 577: fprintf (loop_dump_stream, 578: "Splitting not safe, because loop not entered at top.\n"); 579: } 580: else 581: copy_start = loop_start; 582: } 583: 584: /* This should always be the first label in the loop. */ 585: start_label = NEXT_INSN (copy_start); 586: /* There may be a line number note and/or a loop continue note here. */ 587: while (GET_CODE (start_label) == NOTE) 588: start_label = NEXT_INSN (start_label); 589: if (GET_CODE (start_label) != CODE_LABEL) 590: { 591: /* This can happen as a result of jump threading. If the first insns in 592: the loop test the same condition as the loop's backward jump, or the 593: opposite condition, then the backward jump will be modified to point 594: to elsewhere, and the loop's start label is deleted. 595: 596: This case currently can not be handled by the loop unrolling code. */ 597: 598: if (loop_dump_stream) 599: fprintf (loop_dump_stream, 600: "Unrolling failure: unknown insns between BEG note and loop label.\n"); 601: return; 602: } 1.1.1.6 root 603: if (LABEL_NAME (start_label)) 604: { 605: /* The jump optimization pass must have combined the original start label 606: with a named label for a goto. We can't unroll this case because 607: jumps which go to the named label must be handled differently than 608: jumps to the loop start, and it is impossible to differentiate them 609: in this case. */ 610: if (loop_dump_stream) 611: fprintf (loop_dump_stream, 612: "Unrolling failure: loop start label is gone\n"); 613: return; 614: } 1.1 root 615: 616: if (unroll_type == UNROLL_NAIVE 617: && GET_CODE (last_loop_insn) == BARRIER 618: && start_label != JUMP_LABEL (PREV_INSN (last_loop_insn))) 619: { 620: /* In this case, we must copy the jump and barrier, because they will 621: not be converted to jumps to an immediately following label. */ 622: 623: insert_before = NEXT_INSN (last_loop_insn); 624: copy_end = last_loop_insn; 625: } 626: 627: /* Allocate a translation table for the labels and insn numbers. 628: They will be filled in as we copy the insns in the loop. */ 629: 630: max_labelno = max_label_num (); 631: max_insnno = get_max_uid (); 632: 633: map = (struct inline_remap *) alloca (sizeof (struct inline_remap)); 634: 1.1.1.5 root 635: map->integrating = 0; 636: 1.1 root 637: /* Allocate the label map. */ 638: 639: if (max_labelno > 0) 640: { 641: map->label_map = (rtx *) alloca (max_labelno * sizeof (rtx)); 642: 643: local_label = (char *) alloca (max_labelno); 644: bzero (local_label, max_labelno); 645: } 646: else 647: map->label_map = 0; 648: 649: /* Search the loop and mark all local labels, i.e. the ones which have to 650: be distinct labels when copied. For all labels which might be 651: non-local, set their label_map entries to point to themselves. 652: If they happen to be local their label_map entries will be overwritten 653: before the loop body is copied. The label_map entries for local labels 654: will be set to a different value each time the loop body is copied. */ 655: 656: for (insn = copy_start; insn != loop_end; insn = NEXT_INSN (insn)) 657: { 658: if (GET_CODE (insn) == CODE_LABEL) 659: local_label[CODE_LABEL_NUMBER (insn)] = 1; 660: else if (GET_CODE (insn) == JUMP_INSN) 661: { 662: if (JUMP_LABEL (insn)) 663: map->label_map[CODE_LABEL_NUMBER (JUMP_LABEL (insn))] 664: = JUMP_LABEL (insn); 665: else if (GET_CODE (PATTERN (insn)) == ADDR_VEC 666: || GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC) 667: { 668: rtx pat = PATTERN (insn); 669: int diff_vec_p = GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC; 670: int len = XVECLEN (pat, diff_vec_p); 671: rtx label; 672: 673: for (i = 0; i < len; i++) 674: { 675: label = XEXP (XVECEXP (pat, diff_vec_p, i), 0); 676: map->label_map[CODE_LABEL_NUMBER (label)] = label; 677: } 678: } 679: } 680: } 681: 682: /* Allocate space for the insn map. */ 683: 684: map->insn_map = (rtx *) alloca (max_insnno * sizeof (rtx)); 685: 686: /* Set this to zero, to indicate that we are doing loop unrolling, 687: not function inlining. */ 688: map->inline_target = 0; 689: 690: /* The register and constant maps depend on the number of registers 691: present, so the final maps can't be created until after 692: find_splittable_regs is called. However, they are needed for 693: preconditioning, so we create temporary maps when preconditioning 694: is performed. */ 695: 696: /* The preconditioning code may allocate two new pseudo registers. */ 697: maxregnum = max_reg_num (); 698: 699: /* Allocate and zero out the splittable_regs and addr_combined_regs 700: arrays. These must be zeroed here because they will be used if 701: loop preconditioning is performed, and must be zero for that case. 702: 703: It is safe to do this here, since the extra registers created by the 704: preconditioning code and find_splittable_regs will never be used 1.1.1.3 root 705: to access the splittable_regs[] and addr_combined_regs[] arrays. */ 1.1 root 706: 707: splittable_regs = (rtx *) alloca (maxregnum * sizeof (rtx)); 1.1.1.7 ! root 708: bzero ((char *) splittable_regs, maxregnum * sizeof (rtx)); 1.1 root 709: splittable_regs_updates = (int *) alloca (maxregnum * sizeof (int)); 1.1.1.7 ! root 710: bzero ((char *) splittable_regs_updates, maxregnum * sizeof (int)); 1.1 root 711: addr_combined_regs 712: = (struct induction **) alloca (maxregnum * sizeof (struct induction *)); 1.1.1.7 ! root 713: bzero ((char *) addr_combined_regs, maxregnum * sizeof (struct induction *)); 1.1 root 714: 715: /* If this loop requires exit tests when unrolled, check to see if we 716: can precondition the loop so as to make the exit tests unnecessary. 717: Just like variable splitting, this is not safe if the loop is entered 718: via a jump to the bottom. Also, can not do this if no strength 719: reduce info, because precondition_loop_p uses this info. */ 720: 721: /* Must copy the loop body for preconditioning before the following 722: find_splittable_regs call since that will emit insns which need to 723: be after the preconditioned loop copies, but immediately before the 724: unrolled loop copies. */ 725: 726: /* Also, it is not safe to split induction variables for the preconditioned 727: copies of the loop body. If we split induction variables, then the code 728: assumes that each induction variable can be represented as a function 729: of its initial value and the loop iteration number. This is not true 730: in this case, because the last preconditioned copy of the loop body 731: could be any iteration from the first up to the `unroll_number-1'th, 732: depending on the initial value of the iteration variable. Therefore 733: we can not split induction variables here, because we can not calculate 734: their value. Hence, this code must occur before find_splittable_regs 735: is called. */ 736: 737: if (unroll_type == UNROLL_NAIVE && ! splitting_not_safe && strength_reduce_p) 738: { 739: rtx initial_value, final_value, increment; 740: 741: if (precondition_loop_p (&initial_value, &final_value, &increment, 742: loop_start, loop_end)) 743: { 744: register rtx diff, temp; 745: enum machine_mode mode; 746: rtx *labels; 747: int abs_inc, neg_inc; 748: 749: map->reg_map = (rtx *) alloca (maxregnum * sizeof (rtx)); 750: 751: map->const_equiv_map = (rtx *) alloca (maxregnum * sizeof (rtx)); 752: map->const_age_map = (unsigned *) alloca (maxregnum 753: * sizeof (unsigned)); 754: map->const_equiv_map_size = maxregnum; 755: global_const_equiv_map = map->const_equiv_map; 1.1.1.6 root 756: global_const_equiv_map_size = maxregnum; 1.1 root 757: 758: init_reg_map (map, maxregnum); 759: 760: /* Limit loop unrolling to 4, since this will make 7 copies of 761: the loop body. */ 762: if (unroll_number > 4) 763: unroll_number = 4; 764: 765: /* Save the absolute value of the increment, and also whether or 766: not it is negative. */ 767: neg_inc = 0; 768: abs_inc = INTVAL (increment); 769: if (abs_inc < 0) 770: { 771: abs_inc = - abs_inc; 772: neg_inc = 1; 773: } 774: 775: start_sequence (); 776: 777: /* Decide what mode to do these calculations in. Choose the larger 778: of final_value's mode and initial_value's mode, or a full-word if 779: both are constants. */ 780: mode = GET_MODE (final_value); 781: if (mode == VOIDmode) 782: { 783: mode = GET_MODE (initial_value); 784: if (mode == VOIDmode) 785: mode = word_mode; 786: } 787: else if (mode != GET_MODE (initial_value) 788: && (GET_MODE_SIZE (mode) 789: < GET_MODE_SIZE (GET_MODE (initial_value)))) 790: mode = GET_MODE (initial_value); 791: 792: /* Calculate the difference between the final and initial values. 793: Final value may be a (plus (reg x) (const_int 1)) rtx. 794: Let the following cse pass simplify this if initial value is 795: a constant. 796: 797: We must copy the final and initial values here to avoid 798: improperly shared rtl. */ 799: 800: diff = expand_binop (mode, sub_optab, copy_rtx (final_value), 1.1.1.4 root 801: copy_rtx (initial_value), NULL_RTX, 0, 1.1 root 802: OPTAB_LIB_WIDEN); 803: 804: /* Now calculate (diff % (unroll * abs (increment))) by using an 805: and instruction. */ 806: diff = expand_binop (GET_MODE (diff), and_optab, diff, 1.1.1.4 root 807: GEN_INT (unroll_number * abs_inc - 1), 808: NULL_RTX, 0, OPTAB_LIB_WIDEN); 1.1 root 809: 810: /* Now emit a sequence of branches to jump to the proper precond 811: loop entry point. */ 812: 813: labels = (rtx *) alloca (sizeof (rtx) * unroll_number); 814: for (i = 0; i < unroll_number; i++) 815: labels[i] = gen_label_rtx (); 816: 817: /* Assuming the unroll_number is 4, and the increment is 2, then 818: for a negative increment: for a positive increment: 819: diff = 0,1 precond 0 diff = 0,7 precond 0 820: diff = 2,3 precond 3 diff = 1,2 precond 1 821: diff = 4,5 precond 2 diff = 3,4 precond 2 822: diff = 6,7 precond 1 diff = 5,6 precond 3 */ 823: 824: /* We only need to emit (unroll_number - 1) branches here, the 825: last case just falls through to the following code. */ 826: 827: /* ??? This would give better code if we emitted a tree of branches 828: instead of the current linear list of branches. */ 829: 830: for (i = 0; i < unroll_number - 1; i++) 831: { 832: int cmp_const; 833: 834: /* For negative increments, must invert the constant compared 835: against, except when comparing against zero. */ 836: if (i == 0) 837: cmp_const = 0; 838: else if (neg_inc) 839: cmp_const = unroll_number - i; 840: else 841: cmp_const = i; 842: 1.1.1.4 root 843: emit_cmp_insn (diff, GEN_INT (abs_inc * cmp_const), 844: EQ, NULL_RTX, mode, 0, 0); 1.1 root 845: 846: if (i == 0) 847: emit_jump_insn (gen_beq (labels[i])); 848: else if (neg_inc) 849: emit_jump_insn (gen_bge (labels[i])); 850: else 851: emit_jump_insn (gen_ble (labels[i])); 852: JUMP_LABEL (get_last_insn ()) = labels[i]; 853: LABEL_NUSES (labels[i])++; 854: } 855: 856: /* If the increment is greater than one, then we need another branch, 857: to handle other cases equivalent to 0. */ 858: 859: /* ??? This should be merged into the code above somehow to help 860: simplify the code here, and reduce the number of branches emitted. 861: For the negative increment case, the branch here could easily 862: be merged with the `0' case branch above. For the positive 863: increment case, it is not clear how this can be simplified. */ 864: 865: if (abs_inc != 1) 866: { 867: int cmp_const; 868: 869: if (neg_inc) 870: cmp_const = abs_inc - 1; 871: else 872: cmp_const = abs_inc * (unroll_number - 1) + 1; 873: 1.1.1.4 root 874: emit_cmp_insn (diff, GEN_INT (cmp_const), EQ, NULL_RTX, 875: mode, 0, 0); 1.1 root 876: 877: if (neg_inc) 878: emit_jump_insn (gen_ble (labels[0])); 879: else 880: emit_jump_insn (gen_bge (labels[0])); 881: JUMP_LABEL (get_last_insn ()) = labels[0]; 882: LABEL_NUSES (labels[0])++; 883: } 884: 885: sequence = gen_sequence (); 886: end_sequence (); 887: emit_insn_before (sequence, loop_start); 888: 889: /* Only the last copy of the loop body here needs the exit 890: test, so set copy_end to exclude the compare/branch here, 891: and then reset it inside the loop when get to the last 892: copy. */ 893: 894: if (GET_CODE (last_loop_insn) == BARRIER) 895: copy_end = PREV_INSN (PREV_INSN (last_loop_insn)); 896: else if (GET_CODE (last_loop_insn) == JUMP_INSN) 897: { 898: #ifdef HAVE_cc0 1.1.1.2 root 899: /* The immediately preceding insn is a compare which we do not 1.1 root 900: want to copy. */ 901: copy_end = PREV_INSN (PREV_INSN (last_loop_insn)); 902: #else 1.1.1.2 root 903: /* The immediately preceding insn may not be a compare, so we 1.1 root 904: must copy it. */ 905: copy_end = PREV_INSN (last_loop_insn); 906: #endif 907: } 908: else 909: abort (); 910: 911: for (i = 1; i < unroll_number; i++) 912: { 913: emit_label_after (labels[unroll_number - i], 914: PREV_INSN (loop_start)); 915: 1.1.1.7 ! root 916: bzero ((char *) map->insn_map, max_insnno * sizeof (rtx)); ! 917: bzero ((char *) map->const_equiv_map, maxregnum * sizeof (rtx)); ! 918: bzero ((char *) map->const_age_map, ! 919: maxregnum * sizeof (unsigned)); 1.1 root 920: map->const_age = 0; 921: 922: for (j = 0; j < max_labelno; j++) 923: if (local_label[j]) 924: map->label_map[j] = gen_label_rtx (); 925: 926: /* The last copy needs the compare/branch insns at the end, 927: so reset copy_end here if the loop ends with a conditional 928: branch. */ 929: 930: if (i == unroll_number - 1) 931: { 932: if (GET_CODE (last_loop_insn) == BARRIER) 933: copy_end = PREV_INSN (PREV_INSN (last_loop_insn)); 934: else 935: copy_end = last_loop_insn; 936: } 937: 938: /* None of the copies are the `last_iteration', so just 939: pass zero for that parameter. */ 940: copy_loop_body (copy_start, copy_end, map, exit_label, 0, 941: unroll_type, start_label, loop_end, 942: loop_start, copy_end); 943: } 944: emit_label_after (labels[0], PREV_INSN (loop_start)); 945: 946: if (GET_CODE (last_loop_insn) == BARRIER) 947: { 948: insert_before = PREV_INSN (last_loop_insn); 949: copy_end = PREV_INSN (insert_before); 950: } 951: else 952: { 953: #ifdef HAVE_cc0 1.1.1.2 root 954: /* The immediately preceding insn is a compare which we do not 1.1 root 955: want to copy. */ 956: insert_before = PREV_INSN (last_loop_insn); 957: copy_end = PREV_INSN (insert_before); 958: #else 1.1.1.2 root 959: /* The immediately preceding insn may not be a compare, so we 1.1 root 960: must copy it. */ 961: insert_before = last_loop_insn; 962: copy_end = PREV_INSN (last_loop_insn); 963: #endif 964: } 965: 966: /* Set unroll type to MODULO now. */ 967: unroll_type = UNROLL_MODULO; 968: loop_preconditioned = 1; 969: } 970: } 971: 972: /* If reach here, and the loop type is UNROLL_NAIVE, then don't unroll 973: the loop unless all loops are being unrolled. */ 974: if (unroll_type == UNROLL_NAIVE && ! flag_unroll_all_loops) 975: { 976: if (loop_dump_stream) 977: fprintf (loop_dump_stream, "Unrolling failure: Naive unrolling not being done.\n"); 978: return; 979: } 980: 981: /* At this point, we are guaranteed to unroll the loop. */ 982: 983: /* For each biv and giv, determine whether it can be safely split into 984: a different variable for each unrolled copy of the loop body. 985: We precalculate and save this info here, since computing it is 986: expensive. 987: 988: Do this before deleting any instructions from the loop, so that 989: back_branch_in_range_p will work correctly. */ 990: 991: if (splitting_not_safe) 992: temp = 0; 993: else 994: temp = find_splittable_regs (unroll_type, loop_start, loop_end, 995: end_insert_before, unroll_number); 996: 997: /* find_splittable_regs may have created some new registers, so must 998: reallocate the reg_map with the new larger size, and must realloc 999: the constant maps also. */ 1000: 1001: maxregnum = max_reg_num (); 1002: map->reg_map = (rtx *) alloca (maxregnum * sizeof (rtx)); 1003: 1004: init_reg_map (map, maxregnum); 1005: 1006: /* Space is needed in some of the map for new registers, so new_maxregnum 1007: is an (over)estimate of how many registers will exist at the end. */ 1008: new_maxregnum = maxregnum + (temp * unroll_number * 2); 1009: 1010: /* Must realloc space for the constant maps, because the number of registers 1011: may have changed. */ 1012: 1013: map->const_equiv_map = (rtx *) alloca (new_maxregnum * sizeof (rtx)); 1014: map->const_age_map = (unsigned *) alloca (new_maxregnum * sizeof (unsigned)); 1015: 1.1.1.6 root 1016: map->const_equiv_map_size = new_maxregnum; 1.1 root 1017: global_const_equiv_map = map->const_equiv_map; 1.1.1.6 root 1018: global_const_equiv_map_size = new_maxregnum; 1.1 root 1019: 1020: /* Search the list of bivs and givs to find ones which need to be remapped 1021: when split, and set their reg_map entry appropriately. */ 1022: 1023: for (bl = loop_iv_list; bl; bl = bl->next) 1024: { 1025: if (REGNO (bl->biv->src_reg) != bl->regno) 1026: map->reg_map[bl->regno] = bl->biv->src_reg; 1027: #if 0 1028: /* Currently, non-reduced/final-value givs are never split. */ 1029: for (v = bl->giv; v; v = v->next_iv) 1030: if (REGNO (v->src_reg) != bl->regno) 1031: map->reg_map[REGNO (v->dest_reg)] = v->src_reg; 1032: #endif 1033: } 1034: 1035: /* If the loop is being partially unrolled, and the iteration variables 1036: are being split, and are being renamed for the split, then must fix up 1.1.1.7 ! root 1037: the compare/jump instruction at the end of the loop to refer to the new 1.1 root 1038: registers. This compare isn't copied, so the registers used in it 1039: will never be replaced if it isn't done here. */ 1040: 1041: if (unroll_type == UNROLL_MODULO) 1042: { 1043: insn = NEXT_INSN (copy_end); 1.1.1.7 ! root 1044: if (GET_CODE (insn) == INSN || GET_CODE (insn) == JUMP_INSN) ! 1045: PATTERN (insn) = remap_split_bivs (PATTERN (insn)); 1.1 root 1046: } 1047: 1048: /* For unroll_number - 1 times, make a copy of each instruction 1049: between copy_start and copy_end, and insert these new instructions 1050: before the end of the loop. */ 1051: 1052: for (i = 0; i < unroll_number; i++) 1053: { 1.1.1.7 ! root 1054: bzero ((char *) map->insn_map, max_insnno * sizeof (rtx)); ! 1055: bzero ((char *) map->const_equiv_map, new_maxregnum * sizeof (rtx)); ! 1056: bzero ((char *) map->const_age_map, new_maxregnum * sizeof (unsigned)); 1.1 root 1057: map->const_age = 0; 1058: 1059: for (j = 0; j < max_labelno; j++) 1060: if (local_label[j]) 1061: map->label_map[j] = gen_label_rtx (); 1062: 1063: /* If loop starts with a branch to the test, then fix it so that 1064: it points to the test of the first unrolled copy of the loop. */ 1065: if (i == 0 && loop_start != copy_start) 1066: { 1067: insn = PREV_INSN (copy_start); 1068: pattern = PATTERN (insn); 1069: 1070: tem = map->label_map[CODE_LABEL_NUMBER 1071: (XEXP (SET_SRC (pattern), 0))]; 1072: SET_SRC (pattern) = gen_rtx (LABEL_REF, VOIDmode, tem); 1073: 1074: /* Set the jump label so that it can be used by later loop unrolling 1075: passes. */ 1076: JUMP_LABEL (insn) = tem; 1077: LABEL_NUSES (tem)++; 1078: } 1079: 1080: copy_loop_body (copy_start, copy_end, map, exit_label, 1081: i == unroll_number - 1, unroll_type, start_label, 1082: loop_end, insert_before, insert_before); 1083: } 1084: 1085: /* Before deleting any insns, emit a CODE_LABEL immediately after the last 1086: insn to be deleted. This prevents any runaway delete_insn call from 1087: more insns that it should, as it always stops at a CODE_LABEL. */ 1088: 1089: /* Delete the compare and branch at the end of the loop if completely 1090: unrolling the loop. Deleting the backward branch at the end also 1091: deletes the code label at the start of the loop. This is done at 1092: the very end to avoid problems with back_branch_in_range_p. */ 1093: 1094: if (unroll_type == UNROLL_COMPLETELY) 1095: safety_label = emit_label_after (gen_label_rtx (), last_loop_insn); 1096: else 1097: safety_label = emit_label_after (gen_label_rtx (), copy_end); 1098: 1099: /* Delete all of the original loop instructions. Don't delete the 1100: LOOP_BEG note, or the first code label in the loop. */ 1101: 1102: insn = NEXT_INSN (copy_start); 1103: while (insn != safety_label) 1104: { 1105: if (insn != start_label) 1106: insn = delete_insn (insn); 1107: else 1108: insn = NEXT_INSN (insn); 1109: } 1110: 1111: /* Can now delete the 'safety' label emitted to protect us from runaway 1112: delete_insn calls. */ 1113: if (INSN_DELETED_P (safety_label)) 1114: abort (); 1115: delete_insn (safety_label); 1116: 1117: /* If exit_label exists, emit it after the loop. Doing the emit here 1118: forces it to have a higher INSN_UID than any insn in the unrolled loop. 1119: This is needed so that mostly_true_jump in reorg.c will treat jumps 1120: to this loop end label correctly, i.e. predict that they are usually 1121: not taken. */ 1122: if (exit_label) 1123: emit_label_after (exit_label, loop_end); 1124: } 1125: 1126: /* Return true if the loop can be safely, and profitably, preconditioned 1127: so that the unrolled copies of the loop body don't need exit tests. 1128: 1129: This only works if final_value, initial_value and increment can be 1130: determined, and if increment is a constant power of 2. 1131: If increment is not a power of 2, then the preconditioning modulo 1132: operation would require a real modulo instead of a boolean AND, and this 1133: is not considered `profitable'. */ 1134: 1135: /* ??? If the loop is known to be executed very many times, or the machine 1136: has a very cheap divide instruction, then preconditioning is a win even 1137: when the increment is not a power of 2. Use RTX_COST to compute 1138: whether divide is cheap. */ 1139: 1140: static int 1141: precondition_loop_p (initial_value, final_value, increment, loop_start, 1142: loop_end) 1143: rtx *initial_value, *final_value, *increment; 1144: rtx loop_start, loop_end; 1145: { 1146: 1147: if (loop_n_iterations > 0) 1148: { 1149: *initial_value = const0_rtx; 1150: *increment = const1_rtx; 1.1.1.4 root 1151: *final_value = GEN_INT (loop_n_iterations); 1.1 root 1152: 1153: if (loop_dump_stream) 1154: fprintf (loop_dump_stream, 1155: "Preconditioning: Success, number of iterations known, %d.\n", 1156: loop_n_iterations); 1157: return 1; 1158: } 1159: 1160: if (loop_initial_value == 0) 1161: { 1162: if (loop_dump_stream) 1163: fprintf (loop_dump_stream, 1164: "Preconditioning: Could not find initial value.\n"); 1165: return 0; 1166: } 1167: else if (loop_increment == 0) 1168: { 1169: if (loop_dump_stream) 1170: fprintf (loop_dump_stream, 1171: "Preconditioning: Could not find increment value.\n"); 1172: return 0; 1173: } 1174: else if (GET_CODE (loop_increment) != CONST_INT) 1175: { 1176: if (loop_dump_stream) 1177: fprintf (loop_dump_stream, 1178: "Preconditioning: Increment not a constant.\n"); 1179: return 0; 1180: } 1181: else if ((exact_log2 (INTVAL (loop_increment)) < 0) 1182: && (exact_log2 (- INTVAL (loop_increment)) < 0)) 1183: { 1184: if (loop_dump_stream) 1185: fprintf (loop_dump_stream, 1186: "Preconditioning: Increment not a constant power of 2.\n"); 1187: return 0; 1188: } 1189: 1190: /* Unsigned_compare and compare_dir can be ignored here, since they do 1191: not matter for preconditioning. */ 1192: 1193: if (loop_final_value == 0) 1194: { 1195: if (loop_dump_stream) 1196: fprintf (loop_dump_stream, 1197: "Preconditioning: EQ comparison loop.\n"); 1198: return 0; 1199: } 1200: 1201: /* Must ensure that final_value is invariant, so call invariant_p to 1202: check. Before doing so, must check regno against max_reg_before_loop 1.1.1.3 root 1203: to make sure that the register is in the range covered by invariant_p. 1.1 root 1204: If it isn't, then it is most likely a biv/giv which by definition are 1205: not invariant. */ 1206: if ((GET_CODE (loop_final_value) == REG 1207: && REGNO (loop_final_value) >= max_reg_before_loop) 1208: || (GET_CODE (loop_final_value) == PLUS 1209: && REGNO (XEXP (loop_final_value, 0)) >= max_reg_before_loop) 1210: || ! invariant_p (loop_final_value)) 1211: { 1212: if (loop_dump_stream) 1213: fprintf (loop_dump_stream, 1214: "Preconditioning: Final value not invariant.\n"); 1215: return 0; 1216: } 1217: 1218: /* Fail for floating point values, since the caller of this function 1219: does not have code to deal with them. */ 1220: if (GET_MODE_CLASS (GET_MODE (loop_final_value)) == MODE_FLOAT 1.1.1.2 root 1221: || GET_MODE_CLASS (GET_MODE (loop_initial_value)) == MODE_FLOAT) 1.1 root 1222: { 1223: if (loop_dump_stream) 1224: fprintf (loop_dump_stream, 1225: "Preconditioning: Floating point final or initial value.\n"); 1226: return 0; 1227: } 1228: 1229: /* Now set initial_value to be the iteration_var, since that may be a 1230: simpler expression, and is guaranteed to be correct if all of the 1231: above tests succeed. 1232: 1233: We can not use the initial_value as calculated, because it will be 1234: one too small for loops of the form "while (i-- > 0)". We can not 1235: emit code before the loop_skip_over insns to fix this problem as this 1236: will then give a number one too large for loops of the form 1237: "while (--i > 0)". 1238: 1239: Note that all loops that reach here are entered at the top, because 1240: this function is not called if the loop starts with a jump. */ 1241: 1242: /* Fail if loop_iteration_var is not live before loop_start, since we need 1243: to test its value in the preconditioning code. */ 1244: 1245: if (uid_luid[regno_first_uid[REGNO (loop_iteration_var)]] 1246: > INSN_LUID (loop_start)) 1247: { 1248: if (loop_dump_stream) 1249: fprintf (loop_dump_stream, 1250: "Preconditioning: Iteration var not live before loop start.\n"); 1251: return 0; 1252: } 1253: 1254: *initial_value = loop_iteration_var; 1255: *increment = loop_increment; 1256: *final_value = loop_final_value; 1257: 1258: /* Success! */ 1259: if (loop_dump_stream) 1260: fprintf (loop_dump_stream, "Preconditioning: Successful.\n"); 1261: return 1; 1262: } 1263: 1264: 1265: /* All pseudo-registers must be mapped to themselves. Two hard registers 1266: must be mapped, VIRTUAL_STACK_VARS_REGNUM and VIRTUAL_INCOMING_ARGS_ 1267: REGNUM, to avoid function-inlining specific conversions of these 1268: registers. All other hard regs can not be mapped because they may be 1269: used with different 1270: modes. */ 1271: 1272: static void 1273: init_reg_map (map, maxregnum) 1274: struct inline_remap *map; 1275: int maxregnum; 1276: { 1277: int i; 1278: 1279: for (i = maxregnum - 1; i > LAST_VIRTUAL_REGISTER; i--) 1280: map->reg_map[i] = regno_reg_rtx[i]; 1281: /* Just clear the rest of the entries. */ 1282: for (i = LAST_VIRTUAL_REGISTER; i >= 0; i--) 1283: map->reg_map[i] = 0; 1284: 1285: map->reg_map[VIRTUAL_STACK_VARS_REGNUM] 1286: = regno_reg_rtx[VIRTUAL_STACK_VARS_REGNUM]; 1287: map->reg_map[VIRTUAL_INCOMING_ARGS_REGNUM] 1288: = regno_reg_rtx[VIRTUAL_INCOMING_ARGS_REGNUM]; 1289: } 1290: 1291: /* Strength-reduction will often emit code for optimized biv/givs which 1292: calculates their value in a temporary register, and then copies the result 1293: to the iv. This procedure reconstructs the pattern computing the iv; 1294: verifying that all operands are of the proper form. 1295: 1296: The return value is the amount that the giv is incremented by. */ 1297: 1298: static rtx 1299: calculate_giv_inc (pattern, src_insn, regno) 1300: rtx pattern, src_insn; 1301: int regno; 1302: { 1303: rtx increment; 1.1.1.5 root 1304: rtx increment_total = 0; 1305: int tries = 0; 1.1 root 1306: 1.1.1.5 root 1307: retry: 1.1 root 1308: /* Verify that we have an increment insn here. First check for a plus 1309: as the set source. */ 1310: if (GET_CODE (SET_SRC (pattern)) != PLUS) 1311: { 1312: /* SR sometimes computes the new giv value in a temp, then copies it 1313: to the new_reg. */ 1314: src_insn = PREV_INSN (src_insn); 1315: pattern = PATTERN (src_insn); 1316: if (GET_CODE (SET_SRC (pattern)) != PLUS) 1317: abort (); 1318: 1319: /* The last insn emitted is not needed, so delete it to avoid confusing 1320: the second cse pass. This insn sets the giv unnecessarily. */ 1321: delete_insn (get_last_insn ()); 1322: } 1323: 1324: /* Verify that we have a constant as the second operand of the plus. */ 1325: increment = XEXP (SET_SRC (pattern), 1); 1326: if (GET_CODE (increment) != CONST_INT) 1327: { 1328: /* SR sometimes puts the constant in a register, especially if it is 1329: too big to be an add immed operand. */ 1.1.1.5 root 1330: src_insn = PREV_INSN (src_insn); 1331: increment = SET_SRC (PATTERN (src_insn)); 1.1 root 1332: 1333: /* SR may have used LO_SUM to compute the constant if it is too large 1334: for a load immed operand. In this case, the constant is in operand 1335: one of the LO_SUM rtx. */ 1336: if (GET_CODE (increment) == LO_SUM) 1337: increment = XEXP (increment, 1); 1.1.1.7 ! root 1338: else if (GET_CODE (increment) == IOR) ! 1339: { ! 1340: /* The rs6000 port loads some constants with IOR. */ ! 1341: rtx second_part = XEXP (increment, 1); ! 1342: ! 1343: src_insn = PREV_INSN (src_insn); ! 1344: increment = SET_SRC (PATTERN (src_insn)); ! 1345: /* Don't need the last insn anymore. */ ! 1346: delete_insn (get_last_insn ()); ! 1347: ! 1348: if (GET_CODE (second_part) != CONST_INT ! 1349: || GET_CODE (increment) != CONST_INT) ! 1350: abort (); ! 1351: ! 1352: increment = GEN_INT (INTVAL (increment) | INTVAL (second_part)); ! 1353: } 1.1 root 1354: 1355: if (GET_CODE (increment) != CONST_INT) 1356: abort (); 1357: 1.1.1.7 ! root 1358: /* The insn loading the constant into a register is no longer needed, 1.1 root 1359: so delete it. */ 1360: delete_insn (get_last_insn ()); 1361: } 1362: 1.1.1.5 root 1363: if (increment_total) 1364: increment_total = GEN_INT (INTVAL (increment_total) + INTVAL (increment)); 1365: else 1366: increment_total = increment; 1367: 1368: /* Check that the source register is the same as the register we expected 1369: to see as the source. If not, something is seriously wrong. */ 1.1 root 1370: if (GET_CODE (XEXP (SET_SRC (pattern), 0)) != REG 1371: || REGNO (XEXP (SET_SRC (pattern), 0)) != regno) 1.1.1.5 root 1372: { 1373: /* Some machines (e.g. the romp), may emit two add instructions for 1374: certain constants, so lets try looking for another add immediately 1375: before this one if we have only seen one add insn so far. */ 1376: 1377: if (tries == 0) 1378: { 1379: tries++; 1380: 1381: src_insn = PREV_INSN (src_insn); 1382: pattern = PATTERN (src_insn); 1383: 1384: delete_insn (get_last_insn ()); 1385: 1386: goto retry; 1387: } 1388: 1389: abort (); 1390: } 1391: 1392: return increment_total; 1393: } 1394: 1395: /* Copy REG_NOTES, except for insn references, because not all insn_map 1396: entries are valid yet. We do need to copy registers now though, because 1397: the reg_map entries can change during copying. */ 1398: 1399: static rtx 1400: initial_reg_note_copy (notes, map) 1401: rtx notes; 1402: struct inline_remap *map; 1403: { 1404: rtx copy; 1405: 1406: if (notes == 0) 1407: return 0; 1408: 1409: copy = rtx_alloc (GET_CODE (notes)); 1410: PUT_MODE (copy, GET_MODE (notes)); 1411: 1412: if (GET_CODE (notes) == EXPR_LIST) 1413: XEXP (copy, 0) = copy_rtx_and_substitute (XEXP (notes, 0), map); 1414: else if (GET_CODE (notes) == INSN_LIST) 1415: /* Don't substitute for these yet. */ 1416: XEXP (copy, 0) = XEXP (notes, 0); 1417: else 1.1 root 1418: abort (); 1419: 1.1.1.5 root 1420: XEXP (copy, 1) = initial_reg_note_copy (XEXP (notes, 1), map); 1421: 1422: return copy; 1.1 root 1423: } 1424: 1.1.1.5 root 1425: /* Fixup insn references in copied REG_NOTES. */ 1426: 1427: static void 1428: final_reg_note_copy (notes, map) 1429: rtx notes; 1430: struct inline_remap *map; 1431: { 1432: rtx note; 1433: 1434: for (note = notes; note; note = XEXP (note, 1)) 1435: if (GET_CODE (note) == INSN_LIST) 1436: XEXP (note, 0) = map->insn_map[INSN_UID (XEXP (note, 0))]; 1437: } 1.1 root 1438: 1439: /* Copy each instruction in the loop, substituting from map as appropriate. 1440: This is very similar to a loop in expand_inline_function. */ 1441: 1442: static void 1443: copy_loop_body (copy_start, copy_end, map, exit_label, last_iteration, 1444: unroll_type, start_label, loop_end, insert_before, 1445: copy_notes_from) 1446: rtx copy_start, copy_end; 1447: struct inline_remap *map; 1.1.1.4 root 1448: rtx exit_label; 1.1 root 1449: int last_iteration; 1450: enum unroll_types unroll_type; 1451: rtx start_label, loop_end, insert_before, copy_notes_from; 1452: { 1453: rtx insn, pattern; 1454: rtx tem, copy; 1455: int dest_reg_was_split, i; 1456: rtx cc0_insn = 0; 1457: rtx final_label = 0; 1458: rtx giv_inc, giv_dest_reg, giv_src_reg; 1459: 1460: /* If this isn't the last iteration, then map any references to the 1461: start_label to final_label. Final label will then be emitted immediately 1462: after the end of this loop body if it was ever used. 1463: 1464: If this is the last iteration, then map references to the start_label 1465: to itself. */ 1466: if (! last_iteration) 1467: { 1468: final_label = gen_label_rtx (); 1469: map->label_map[CODE_LABEL_NUMBER (start_label)] = final_label; 1470: } 1471: else 1472: map->label_map[CODE_LABEL_NUMBER (start_label)] = start_label; 1473: 1474: start_sequence (); 1475: 1476: insn = copy_start; 1477: do 1478: { 1479: insn = NEXT_INSN (insn); 1480: 1481: map->orig_asm_operands_vector = 0; 1482: 1483: switch (GET_CODE (insn)) 1484: { 1485: case INSN: 1486: pattern = PATTERN (insn); 1487: copy = 0; 1488: giv_inc = 0; 1489: 1490: /* Check to see if this is a giv that has been combined with 1491: some split address givs. (Combined in the sense that 1492: `combine_givs' in loop.c has put two givs in the same register.) 1493: In this case, we must search all givs based on the same biv to 1494: find the address givs. Then split the address givs. 1495: Do this before splitting the giv, since that may map the 1496: SET_DEST to a new register. */ 1497: 1498: if (GET_CODE (pattern) == SET 1499: && GET_CODE (SET_DEST (pattern)) == REG 1500: && addr_combined_regs[REGNO (SET_DEST (pattern))]) 1501: { 1502: struct iv_class *bl; 1503: struct induction *v, *tv; 1504: int regno = REGNO (SET_DEST (pattern)); 1505: 1506: v = addr_combined_regs[REGNO (SET_DEST (pattern))]; 1507: bl = reg_biv_class[REGNO (v->src_reg)]; 1508: 1509: /* Although the giv_inc amount is not needed here, we must call 1510: calculate_giv_inc here since it might try to delete the 1511: last insn emitted. If we wait until later to call it, 1512: we might accidentally delete insns generated immediately 1513: below by emit_unrolled_add. */ 1514: 1515: giv_inc = calculate_giv_inc (pattern, insn, regno); 1516: 1517: /* Now find all address giv's that were combined with this 1518: giv 'v'. */ 1519: for (tv = bl->giv; tv; tv = tv->next_iv) 1520: if (tv->giv_type == DEST_ADDR && tv->same == v) 1521: { 1.1.1.3 root 1522: int this_giv_inc = INTVAL (giv_inc); 1523: 1524: /* Scale this_giv_inc if the multiplicative factors of 1525: the two givs are different. */ 1526: if (tv->mult_val != v->mult_val) 1527: this_giv_inc = (this_giv_inc / INTVAL (v->mult_val) 1528: * INTVAL (tv->mult_val)); 1529: 1530: tv->dest_reg = plus_constant (tv->dest_reg, this_giv_inc); 1.1 root 1531: *tv->location = tv->dest_reg; 1532: 1533: if (last_iteration && unroll_type != UNROLL_COMPLETELY) 1534: { 1535: /* Must emit an insn to increment the split address 1536: giv. Add in the const_adjust field in case there 1537: was a constant eliminated from the address. */ 1538: rtx value, dest_reg; 1539: 1540: /* tv->dest_reg will be either a bare register, 1541: or else a register plus a constant. */ 1542: if (GET_CODE (tv->dest_reg) == REG) 1543: dest_reg = tv->dest_reg; 1544: else 1545: dest_reg = XEXP (tv->dest_reg, 0); 1546: 1.1.1.7 ! root 1547: /* Check for shared address givs, and avoid ! 1548: incrementing the shared psuedo reg more than ! 1549: once. */ ! 1550: if (! (tv != v && tv->insn == v->insn ! 1551: && tv->new_reg == v->new_reg)) ! 1552: { ! 1553: /* tv->dest_reg may actually be a (PLUS (REG) ! 1554: (CONST)) here, so we must call plus_constant ! 1555: to add the const_adjust amount before calling ! 1556: emit_unrolled_add below. */ ! 1557: value = plus_constant (tv->dest_reg, ! 1558: tv->const_adjust); ! 1559: ! 1560: /* The constant could be too large for an add ! 1561: immediate, so can't directly emit an insn ! 1562: here. */ ! 1563: emit_unrolled_add (dest_reg, XEXP (value, 0), ! 1564: XEXP (value, 1)); ! 1565: } 1.1 root 1566: 1567: /* Reset the giv to be just the register again, in case 1.1.1.2 root 1568: it is used after the set we have just emitted. 1569: We must subtract the const_adjust factor added in 1570: above. */ 1571: tv->dest_reg = plus_constant (dest_reg, 1572: - tv->const_adjust); 1.1 root 1573: *tv->location = tv->dest_reg; 1574: } 1575: } 1576: } 1577: 1578: /* If this is a setting of a splittable variable, then determine 1579: how to split the variable, create a new set based on this split, 1580: and set up the reg_map so that later uses of the variable will 1581: use the new split variable. */ 1582: 1583: dest_reg_was_split = 0; 1584: 1585: if (GET_CODE (pattern) == SET 1586: && GET_CODE (SET_DEST (pattern)) == REG 1587: && splittable_regs[REGNO (SET_DEST (pattern))]) 1588: { 1589: int regno = REGNO (SET_DEST (pattern)); 1590: 1591: dest_reg_was_split = 1; 1592: 1593: /* Compute the increment value for the giv, if it wasn't 1594: already computed above. */ 1595: 1596: if (giv_inc == 0) 1597: giv_inc = calculate_giv_inc (pattern, insn, regno); 1598: giv_dest_reg = SET_DEST (pattern); 1599: giv_src_reg = SET_DEST (pattern); 1600: 1601: if (unroll_type == UNROLL_COMPLETELY) 1602: { 1603: /* Completely unrolling the loop. Set the induction 1604: variable to a known constant value. */ 1605: 1606: /* The value in splittable_regs may be an invariant 1607: value, so we must use plus_constant here. */ 1608: splittable_regs[regno] 1609: = plus_constant (splittable_regs[regno], INTVAL (giv_inc)); 1610: 1611: if (GET_CODE (splittable_regs[regno]) == PLUS) 1612: { 1613: giv_src_reg = XEXP (splittable_regs[regno], 0); 1614: giv_inc = XEXP (splittable_regs[regno], 1); 1615: } 1616: else 1617: { 1618: /* The splittable_regs value must be a REG or a 1619: CONST_INT, so put the entire value in the giv_src_reg 1620: variable. */ 1621: giv_src_reg = splittable_regs[regno]; 1622: giv_inc = const0_rtx; 1623: } 1624: } 1625: else 1626: { 1627: /* Partially unrolling loop. Create a new pseudo 1628: register for the iteration variable, and set it to 1629: be a constant plus the original register. Except 1630: on the last iteration, when the result has to 1631: go back into the original iteration var register. */ 1632: 1633: /* Handle bivs which must be mapped to a new register 1634: when split. This happens for bivs which need their 1635: final value set before loop entry. The new register 1636: for the biv was stored in the biv's first struct 1637: induction entry by find_splittable_regs. */ 1638: 1639: if (regno < max_reg_before_loop 1640: && reg_iv_type[regno] == BASIC_INDUCT) 1641: { 1642: giv_src_reg = reg_biv_class[regno]->biv->src_reg; 1643: giv_dest_reg = giv_src_reg; 1644: } 1645: 1646: #if 0 1647: /* If non-reduced/final-value givs were split, then 1648: this would have to remap those givs also. See 1649: find_splittable_regs. */ 1650: #endif 1651: 1652: splittable_regs[regno] 1.1.1.4 root 1653: = GEN_INT (INTVAL (giv_inc) 1.1 root 1654: + INTVAL (splittable_regs[regno])); 1655: giv_inc = splittable_regs[regno]; 1656: 1657: /* Now split the induction variable by changing the dest 1658: of this insn to a new register, and setting its 1659: reg_map entry to point to this new register. 1660: 1661: If this is the last iteration, and this is the last insn 1662: that will update the iv, then reuse the original dest, 1663: to ensure that the iv will have the proper value when 1664: the loop exits or repeats. 1665: 1666: Using splittable_regs_updates here like this is safe, 1667: because it can only be greater than one if all 1668: instructions modifying the iv are always executed in 1669: order. */ 1670: 1671: if (! last_iteration 1672: || (splittable_regs_updates[regno]-- != 1)) 1673: { 1674: tem = gen_reg_rtx (GET_MODE (giv_src_reg)); 1675: giv_dest_reg = tem; 1676: map->reg_map[regno] = tem; 1677: } 1678: else 1679: map->reg_map[regno] = giv_src_reg; 1680: } 1681: 1682: /* The constant being added could be too large for an add 1683: immediate, so can't directly emit an insn here. */ 1684: emit_unrolled_add (giv_dest_reg, giv_src_reg, giv_inc); 1685: copy = get_last_insn (); 1686: pattern = PATTERN (copy); 1687: } 1688: else 1689: { 1690: pattern = copy_rtx_and_substitute (pattern, map); 1691: copy = emit_insn (pattern); 1692: } 1.1.1.5 root 1693: REG_NOTES (copy) = initial_reg_note_copy (REG_NOTES (insn), map); 1.1 root 1694: 1695: #ifdef HAVE_cc0 1696: /* If this insn is setting CC0, it may need to look at 1697: the insn that uses CC0 to see what type of insn it is. 1698: In that case, the call to recog via validate_change will 1699: fail. So don't substitute constants here. Instead, 1700: do it when we emit the following insn. 1701: 1702: For example, see the pyr.md file. That machine has signed and 1703: unsigned compares. The compare patterns must check the 1704: following branch insn to see which what kind of compare to 1705: emit. 1706: 1707: If the previous insn set CC0, substitute constants on it as 1708: well. */ 1709: if (sets_cc0_p (copy) != 0) 1710: cc0_insn = copy; 1711: else 1712: { 1713: if (cc0_insn) 1714: try_constants (cc0_insn, map); 1715: cc0_insn = 0; 1716: try_constants (copy, map); 1717: } 1718: #else 1719: try_constants (copy, map); 1720: #endif 1721: 1722: /* Make split induction variable constants `permanent' since we 1723: know there are no backward branches across iteration variable 1724: settings which would invalidate this. */ 1725: if (dest_reg_was_split) 1726: { 1727: int regno = REGNO (SET_DEST (pattern)); 1728: 1.1.1.6 root 1729: if (regno < map->const_equiv_map_size 1730: && map->const_age_map[regno] == map->const_age) 1.1 root 1731: map->const_age_map[regno] = -1; 1732: } 1733: break; 1734: 1735: case JUMP_INSN: 1.1.1.5 root 1736: pattern = copy_rtx_and_substitute (PATTERN (insn), map); 1737: copy = emit_jump_insn (pattern); 1738: REG_NOTES (copy) = initial_reg_note_copy (REG_NOTES (insn), map); 1739: 1.1 root 1740: if (JUMP_LABEL (insn) == start_label && insn == copy_end 1741: && ! last_iteration) 1742: { 1743: /* This is a branch to the beginning of the loop; this is the 1744: last insn being copied; and this is not the last iteration. 1745: In this case, we want to change the original fall through 1746: case to be a branch past the end of the loop, and the 1747: original jump label case to fall_through. */ 1748: 1.1.1.7 ! root 1749: if (invert_exp (pattern, copy)) ! 1750: { ! 1751: if (! redirect_exp (&pattern, ! 1752: map->label_map[CODE_LABEL_NUMBER ! 1753: (JUMP_LABEL (insn))], ! 1754: exit_label, copy)) ! 1755: abort (); ! 1756: } ! 1757: else ! 1758: { ! 1759: rtx jmp; ! 1760: rtx lab = gen_label_rtx (); ! 1761: /* Can't do it by reversing the jump (probably becasue we ! 1762: couln't reverse the conditions), so emit a new ! 1763: jump_insn after COPY, and redirect the jump around ! 1764: that. */ ! 1765: jmp = emit_jump_insn_after (gen_jump (exit_label), copy); ! 1766: jmp = emit_barrier_after (jmp); ! 1767: emit_label_after (lab, jmp); ! 1768: LABEL_NUSES (lab) = 0; ! 1769: if (! redirect_exp (&pattern, ! 1770: map->label_map[CODE_LABEL_NUMBER ! 1771: (JUMP_LABEL (insn))], ! 1772: lab, copy)) ! 1773: abort (); ! 1774: } 1.1 root 1775: } 1776: 1777: #ifdef HAVE_cc0 1778: if (cc0_insn) 1779: try_constants (cc0_insn, map); 1780: cc0_insn = 0; 1781: #endif 1782: try_constants (copy, map); 1783: 1784: /* Set the jump label of COPY correctly to avoid problems with 1785: later passes of unroll_loop, if INSN had jump label set. */ 1786: if (JUMP_LABEL (insn)) 1787: { 1.1.1.4 root 1788: rtx label = 0; 1789: 1.1 root 1790: /* Can't use the label_map for every insn, since this may be 1791: the backward branch, and hence the label was not mapped. */ 1792: if (GET_CODE (pattern) == SET) 1793: { 1794: tem = SET_SRC (pattern); 1795: if (GET_CODE (tem) == LABEL_REF) 1.1.1.4 root 1796: label = XEXP (tem, 0); 1.1 root 1797: else if (GET_CODE (tem) == IF_THEN_ELSE) 1798: { 1799: if (XEXP (tem, 1) != pc_rtx) 1.1.1.4 root 1800: label = XEXP (XEXP (tem, 1), 0); 1.1 root 1801: else 1.1.1.4 root 1802: label = XEXP (XEXP (tem, 2), 0); 1.1 root 1803: } 1804: } 1.1.1.4 root 1805: 1806: if (label && GET_CODE (label) == CODE_LABEL) 1807: JUMP_LABEL (copy) = label; 1.1 root 1808: else 1809: { 1810: /* An unrecognizable jump insn, probably the entry jump 1811: for a switch statement. This label must have been mapped, 1812: so just use the label_map to get the new jump label. */ 1813: JUMP_LABEL (copy) = map->label_map[CODE_LABEL_NUMBER 1814: (JUMP_LABEL (insn))]; 1815: } 1816: 1817: /* If this is a non-local jump, then must increase the label 1818: use count so that the label will not be deleted when the 1819: original jump is deleted. */ 1820: LABEL_NUSES (JUMP_LABEL (copy))++; 1821: } 1822: else if (GET_CODE (PATTERN (copy)) == ADDR_VEC 1823: || GET_CODE (PATTERN (copy)) == ADDR_DIFF_VEC) 1824: { 1825: rtx pat = PATTERN (copy); 1826: int diff_vec_p = GET_CODE (pat) == ADDR_DIFF_VEC; 1827: int len = XVECLEN (pat, diff_vec_p); 1828: int i; 1829: 1830: for (i = 0; i < len; i++) 1831: LABEL_NUSES (XEXP (XVECEXP (pat, diff_vec_p, i), 0))++; 1832: } 1833: 1834: /* If this used to be a conditional jump insn but whose branch 1835: direction is now known, we must do something special. */ 1836: if (condjump_p (insn) && !simplejump_p (insn) && map->last_pc_value) 1837: { 1838: #ifdef HAVE_cc0 1839: /* The previous insn set cc0 for us. So delete it. */ 1840: delete_insn (PREV_INSN (copy)); 1841: #endif 1842: 1843: /* If this is now a no-op, delete it. */ 1844: if (map->last_pc_value == pc_rtx) 1845: { 1.1.1.7 ! root 1846: /* Don't let delete_insn delete the label referenced here, ! 1847: because we might possibly need it later for some other ! 1848: instruction in the loop. */ ! 1849: if (JUMP_LABEL (copy)) ! 1850: LABEL_NUSES (JUMP_LABEL (copy))++; 1.1 root 1851: delete_insn (copy); 1.1.1.7 ! root 1852: if (JUMP_LABEL (copy)) ! 1853: LABEL_NUSES (JUMP_LABEL (copy))--; 1.1 root 1854: copy = 0; 1855: } 1856: else 1857: /* Otherwise, this is unconditional jump so we must put a 1858: BARRIER after it. We could do some dead code elimination 1859: here, but jump.c will do it just as well. */ 1860: emit_barrier (); 1861: } 1862: break; 1863: 1864: case CALL_INSN: 1865: pattern = copy_rtx_and_substitute (PATTERN (insn), map); 1866: copy = emit_call_insn (pattern); 1.1.1.5 root 1867: REG_NOTES (copy) = initial_reg_note_copy (REG_NOTES (insn), map); 1.1 root 1868: 1.1.1.7 ! root 1869: /* Because the USAGE information potentially contains objects other ! 1870: than hard registers, we need to copy it. */ ! 1871: CALL_INSN_FUNCTION_USAGE (copy) = ! 1872: copy_rtx_and_substitute (CALL_INSN_FUNCTION_USAGE (insn), map); ! 1873: 1.1 root 1874: #ifdef HAVE_cc0 1875: if (cc0_insn) 1876: try_constants (cc0_insn, map); 1877: cc0_insn = 0; 1878: #endif 1879: try_constants (copy, map); 1880: 1881: /* Be lazy and assume CALL_INSNs clobber all hard registers. */ 1882: for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) 1883: map->const_equiv_map[i] = 0; 1884: break; 1885: 1886: case CODE_LABEL: 1887: /* If this is the loop start label, then we don't need to emit a 1888: copy of this label since no one will use it. */ 1889: 1890: if (insn != start_label) 1891: { 1892: copy = emit_label (map->label_map[CODE_LABEL_NUMBER (insn)]); 1893: map->const_age++; 1894: } 1895: break; 1896: 1897: case BARRIER: 1898: copy = emit_barrier (); 1899: break; 1900: 1901: case NOTE: 1.1.1.4 root 1902: /* VTOP notes are valid only before the loop exit test. If placed 1903: anywhere else, loop may generate bad code. */ 1904: 1905: if (NOTE_LINE_NUMBER (insn) != NOTE_INSN_DELETED 1906: && (NOTE_LINE_NUMBER (insn) != NOTE_INSN_LOOP_VTOP 1907: || (last_iteration && unroll_type != UNROLL_COMPLETELY))) 1.1 root 1908: copy = emit_note (NOTE_SOURCE_FILE (insn), 1909: NOTE_LINE_NUMBER (insn)); 1910: else 1911: copy = 0; 1912: break; 1913: 1914: default: 1915: abort (); 1916: break; 1917: } 1918: 1919: map->insn_map[INSN_UID (insn)] = copy; 1920: } 1921: while (insn != copy_end); 1922: 1.1.1.5 root 1923: /* Now finish coping the REG_NOTES. */ 1.1 root 1924: insn = copy_start; 1925: do 1926: { 1927: insn = NEXT_INSN (insn); 1928: if ((GET_CODE (insn) == INSN || GET_CODE (insn) == JUMP_INSN 1929: || GET_CODE (insn) == CALL_INSN) 1930: && map->insn_map[INSN_UID (insn)]) 1.1.1.5 root 1931: final_reg_note_copy (REG_NOTES (map->insn_map[INSN_UID (insn)]), map); 1.1 root 1932: } 1933: while (insn != copy_end); 1934: 1935: /* There may be notes between copy_notes_from and loop_end. Emit a copy of 1936: each of these notes here, since there may be some important ones, such as 1937: NOTE_INSN_BLOCK_END notes, in this group. We don't do this on the last 1938: iteration, because the original notes won't be deleted. 1939: 1940: We can't use insert_before here, because when from preconditioning, 1941: insert_before points before the loop. We can't use copy_end, because 1942: there may be insns already inserted after it (which we don't want to 1943: copy) when not from preconditioning code. */ 1944: 1945: if (! last_iteration) 1946: { 1947: for (insn = copy_notes_from; insn != loop_end; insn = NEXT_INSN (insn)) 1948: { 1949: if (GET_CODE (insn) == NOTE 1950: && NOTE_LINE_NUMBER (insn) != NOTE_INSN_DELETED) 1951: emit_note (NOTE_SOURCE_FILE (insn), NOTE_LINE_NUMBER (insn)); 1952: } 1953: } 1954: 1955: if (final_label && LABEL_NUSES (final_label) > 0) 1956: emit_label (final_label); 1957: 1958: tem = gen_sequence (); 1959: end_sequence (); 1960: emit_insn_before (tem, insert_before); 1961: } 1962: 1963: /* Emit an insn, using the expand_binop to ensure that a valid insn is 1964: emitted. This will correctly handle the case where the increment value 1965: won't fit in the immediate field of a PLUS insns. */ 1966: 1967: void 1968: emit_unrolled_add (dest_reg, src_reg, increment) 1969: rtx dest_reg, src_reg, increment; 1970: { 1971: rtx result; 1972: 1973: result = expand_binop (GET_MODE (dest_reg), add_optab, src_reg, increment, 1974: dest_reg, 0, OPTAB_LIB_WIDEN); 1975: 1976: if (dest_reg != result) 1977: emit_move_insn (dest_reg, result); 1978: } 1979: 1980: /* Searches the insns between INSN and LOOP_END. Returns 1 if there 1981: is a backward branch in that range that branches to somewhere between 1982: LOOP_START and INSN. Returns 0 otherwise. */ 1983: 1.1.1.3 root 1984: /* ??? This is quadratic algorithm. Could be rewritten to be linear. 1.1 root 1985: In practice, this is not a problem, because this function is seldom called, 1986: and uses a negligible amount of CPU time on average. */ 1987: 1988: static int 1989: back_branch_in_range_p (insn, loop_start, loop_end) 1990: rtx insn; 1991: rtx loop_start, loop_end; 1992: { 1993: rtx p, q, target_insn; 1994: 1995: /* Stop before we get to the backward branch at the end of the loop. */ 1996: loop_end = prev_nonnote_insn (loop_end); 1997: if (GET_CODE (loop_end) == BARRIER) 1998: loop_end = PREV_INSN (loop_end); 1999: 2000: /* Check in case insn has been deleted, search forward for first non 2001: deleted insn following it. */ 2002: while (INSN_DELETED_P (insn)) 2003: insn = NEXT_INSN (insn); 2004: 2005: /* Check for the case where insn is the last insn in the loop. */ 2006: if (insn == loop_end) 2007: return 0; 2008: 2009: for (p = NEXT_INSN (insn); p != loop_end; p = NEXT_INSN (p)) 2010: { 2011: if (GET_CODE (p) == JUMP_INSN) 2012: { 2013: target_insn = JUMP_LABEL (p); 2014: 2015: /* Search from loop_start to insn, to see if one of them is 2016: the target_insn. We can't use INSN_LUID comparisons here, 2017: since insn may not have an LUID entry. */ 2018: for (q = loop_start; q != insn; q = NEXT_INSN (q)) 2019: if (q == target_insn) 2020: return 1; 2021: } 2022: } 2023: 2024: return 0; 2025: } 2026: 2027: /* Try to generate the simplest rtx for the expression 2028: (PLUS (MULT mult1 mult2) add1). This is used to calculate the initial 2029: value of giv's. */ 2030: 2031: static rtx 2032: fold_rtx_mult_add (mult1, mult2, add1, mode) 2033: rtx mult1, mult2, add1; 2034: enum machine_mode mode; 2035: { 2036: rtx temp, mult_res; 2037: rtx result; 2038: 2039: /* The modes must all be the same. This should always be true. For now, 2040: check to make sure. */ 2041: if ((GET_MODE (mult1) != mode && GET_MODE (mult1) != VOIDmode) 2042: || (GET_MODE (mult2) != mode && GET_MODE (mult2) != VOIDmode) 2043: || (GET_MODE (add1) != mode && GET_MODE (add1) != VOIDmode)) 2044: abort (); 2045: 2046: /* Ensure that if at least one of mult1/mult2 are constant, then mult2 2047: will be a constant. */ 2048: if (GET_CODE (mult1) == CONST_INT) 2049: { 2050: temp = mult2; 2051: mult2 = mult1; 2052: mult1 = temp; 2053: } 2054: 2055: mult_res = simplify_binary_operation (MULT, mode, mult1, mult2); 2056: if (! mult_res) 2057: mult_res = gen_rtx (MULT, mode, mult1, mult2); 2058: 2059: /* Again, put the constant second. */ 2060: if (GET_CODE (add1) == CONST_INT) 2061: { 2062: temp = add1; 2063: add1 = mult_res; 2064: mult_res = temp; 2065: } 2066: 2067: result = simplify_binary_operation (PLUS, mode, add1, mult_res); 2068: if (! result) 2069: result = gen_rtx (PLUS, mode, add1, mult_res); 2070: 2071: return result; 2072: } 2073: 2074: /* Searches the list of induction struct's for the biv BL, to try to calculate 2075: the total increment value for one iteration of the loop as a constant. 2076: 2077: Returns the increment value as an rtx, simplified as much as possible, 2078: if it can be calculated. Otherwise, returns 0. */ 2079: 2080: rtx 2081: biv_total_increment (bl, loop_start, loop_end) 2082: struct iv_class *bl; 2083: rtx loop_start, loop_end; 2084: { 2085: struct induction *v; 2086: rtx result; 2087: 2088: /* For increment, must check every instruction that sets it. Each 2089: instruction must be executed only once each time through the loop. 2090: To verify this, we check that the the insn is always executed, and that 2091: there are no backward branches after the insn that branch to before it. 2092: Also, the insn must have a mult_val of one (to make sure it really is 2093: an increment). */ 2094: 2095: result = const0_rtx; 2096: for (v = bl->biv; v; v = v->next_iv) 2097: { 2098: if (v->always_computable && v->mult_val == const1_rtx 2099: && ! back_branch_in_range_p (v->insn, loop_start, loop_end)) 2100: result = fold_rtx_mult_add (result, const1_rtx, v->add_val, v->mode); 2101: else 2102: return 0; 2103: } 2104: 2105: return result; 2106: } 2107: 2108: /* Determine the initial value of the iteration variable, and the amount 2109: that it is incremented each loop. Use the tables constructed by 2110: the strength reduction pass to calculate these values. 2111: 2112: Initial_value and/or increment are set to zero if their values could not 2113: be calculated. */ 2114: 2115: static void 2116: iteration_info (iteration_var, initial_value, increment, loop_start, loop_end) 2117: rtx iteration_var, *initial_value, *increment; 2118: rtx loop_start, loop_end; 2119: { 2120: struct iv_class *bl; 2121: struct induction *v, *b; 2122: 2123: /* Clear the result values, in case no answer can be found. */ 2124: *initial_value = 0; 2125: *increment = 0; 2126: 2127: /* The iteration variable can be either a giv or a biv. Check to see 2128: which it is, and compute the variable's initial value, and increment 2129: value if possible. */ 2130: 2131: /* If this is a new register, can't handle it since we don't have any 2132: reg_iv_type entry for it. */ 2133: if (REGNO (iteration_var) >= max_reg_before_loop) 2134: { 2135: if (loop_dump_stream) 2136: fprintf (loop_dump_stream, 2137: "Loop unrolling: No reg_iv_type entry for iteration var.\n"); 2138: return; 2139: } 2140: /* Reject iteration variables larger than the host long size, since they 2141: could result in a number of iterations greater than the range of our 2142: `unsigned long' variable loop_n_iterations. */ 2143: else if (GET_MODE_BITSIZE (GET_MODE (iteration_var)) > HOST_BITS_PER_LONG) 2144: { 2145: if (loop_dump_stream) 2146: fprintf (loop_dump_stream, 2147: "Loop unrolling: Iteration var rejected because mode larger than host long.\n"); 2148: return; 2149: } 2150: else if (GET_MODE_CLASS (GET_MODE (iteration_var)) != MODE_INT) 2151: { 2152: if (loop_dump_stream) 2153: fprintf (loop_dump_stream, 1.1.1.2 root 2154: "Loop unrolling: Iteration var not an integer.\n"); 1.1 root 2155: return; 2156: } 2157: else if (reg_iv_type[REGNO (iteration_var)] == BASIC_INDUCT) 2158: { 2159: /* Grab initial value, only useful if it is a constant. */ 2160: bl = reg_biv_class[REGNO (iteration_var)]; 2161: *initial_value = bl->initial_value; 2162: 2163: *increment = biv_total_increment (bl, loop_start, loop_end); 2164: } 2165: else if (reg_iv_type[REGNO (iteration_var)] == GENERAL_INDUCT) 2166: { 2167: #if 1 2168: /* ??? The code below does not work because the incorrect number of 2169: iterations is calculated when the biv is incremented after the giv 2170: is set (which is the usual case). This can probably be accounted 2171: for by biasing the initial_value by subtracting the amount of the 2172: increment that occurs between the giv set and the giv test. However, 2173: a giv as an iterator is very rare, so it does not seem worthwhile 2174: to handle this. */ 2175: /* ??? An example failure is: i = 6; do {;} while (i++ < 9). */ 2176: if (loop_dump_stream) 2177: fprintf (loop_dump_stream, 2178: "Loop unrolling: Giv iterators are not handled.\n"); 2179: return; 2180: #else 2181: /* Initial value is mult_val times the biv's initial value plus 2182: add_val. Only useful if it is a constant. */ 2183: v = reg_iv_info[REGNO (iteration_var)]; 2184: bl = reg_biv_class[REGNO (v->src_reg)]; 2185: *initial_value = fold_rtx_mult_add (v->mult_val, bl->initial_value, 2186: v->add_val, v->mode); 2187: 2188: /* Increment value is mult_val times the increment value of the biv. */ 2189: 2190: *increment = biv_total_increment (bl, loop_start, loop_end); 2191: if (*increment) 2192: *increment = fold_rtx_mult_add (v->mult_val, *increment, const0_rtx, 2193: v->mode); 2194: #endif 2195: } 2196: else 2197: { 2198: if (loop_dump_stream) 2199: fprintf (loop_dump_stream, 2200: "Loop unrolling: Not basic or general induction var.\n"); 2201: return; 2202: } 2203: } 2204: 2205: /* Calculate the approximate final value of the iteration variable 2206: which has an loop exit test with code COMPARISON_CODE and comparison value 2207: of COMPARISON_VALUE. Also returns an indication of whether the comparison 2208: was signed or unsigned, and the direction of the comparison. This info is 2209: needed to calculate the number of loop iterations. */ 2210: 2211: static rtx 2212: approx_final_value (comparison_code, comparison_value, unsigned_p, compare_dir) 2213: enum rtx_code comparison_code; 2214: rtx comparison_value; 2215: int *unsigned_p; 2216: int *compare_dir; 2217: { 2218: /* Calculate the final value of the induction variable. 2219: The exact final value depends on the branch operator, and increment sign. 2220: This is only an approximate value. It will be wrong if the iteration 2221: variable is not incremented by one each time through the loop, and 2222: approx final value - start value % increment != 0. */ 2223: 2224: *unsigned_p = 0; 2225: switch (comparison_code) 2226: { 2227: case LEU: 2228: *unsigned_p = 1; 2229: case LE: 2230: *compare_dir = 1; 2231: return plus_constant (comparison_value, 1); 2232: case GEU: 2233: *unsigned_p = 1; 2234: case GE: 2235: *compare_dir = -1; 2236: return plus_constant (comparison_value, -1); 2237: case EQ: 2238: /* Can not calculate a final value for this case. */ 2239: *compare_dir = 0; 2240: return 0; 2241: case LTU: 2242: *unsigned_p = 1; 2243: case LT: 2244: *compare_dir = 1; 2245: return comparison_value; 2246: break; 2247: case GTU: 2248: *unsigned_p = 1; 2249: case GT: 2250: *compare_dir = -1; 2251: return comparison_value; 2252: case NE: 2253: *compare_dir = 0; 2254: return comparison_value; 2255: default: 2256: abort (); 2257: } 2258: } 2259: 2260: /* For each biv and giv, determine whether it can be safely split into 2261: a different variable for each unrolled copy of the loop body. If it 2262: is safe to split, then indicate that by saving some useful info 2263: in the splittable_regs array. 2264: 2265: If the loop is being completely unrolled, then splittable_regs will hold 2266: the current value of the induction variable while the loop is unrolled. 2267: It must be set to the initial value of the induction variable here. 2268: Otherwise, splittable_regs will hold the difference between the current 2269: value of the induction variable and the value the induction variable had 1.1.1.6 root 2270: at the top of the loop. It must be set to the value 0 here. 2271: 2272: Returns the total number of instructions that set registers that are 2273: splittable. */ 1.1 root 2274: 2275: /* ?? If the loop is only unrolled twice, then most of the restrictions to 2276: constant values are unnecessary, since we can easily calculate increment 2277: values in this case even if nothing is constant. The increment value 2278: should not involve a multiply however. */ 2279: 2280: /* ?? Even if the biv/giv increment values aren't constant, it may still 2281: be beneficial to split the variable if the loop is only unrolled a few 2282: times, since multiplies by small integers (1,2,3,4) are very cheap. */ 2283: 2284: static int 2285: find_splittable_regs (unroll_type, loop_start, loop_end, end_insert_before, 2286: unroll_number) 2287: enum unroll_types unroll_type; 2288: rtx loop_start, loop_end; 2289: rtx end_insert_before; 2290: int unroll_number; 2291: { 2292: struct iv_class *bl; 1.1.1.4 root 2293: struct induction *v; 1.1 root 2294: rtx increment, tem; 2295: rtx biv_final_value; 2296: int biv_splittable; 2297: int result = 0; 2298: 2299: for (bl = loop_iv_list; bl; bl = bl->next) 2300: { 2301: /* Biv_total_increment must return a constant value, 2302: otherwise we can not calculate the split values. */ 2303: 2304: increment = biv_total_increment (bl, loop_start, loop_end); 2305: if (! increment || GET_CODE (increment) != CONST_INT) 2306: continue; 2307: 2308: /* The loop must be unrolled completely, or else have a known number 2309: of iterations and only one exit, or else the biv must be dead 2310: outside the loop, or else the final value must be known. Otherwise, 2311: it is unsafe to split the biv since it may not have the proper 2312: value on loop exit. */ 2313: 2314: /* loop_number_exit_labels is non-zero if the loop has an exit other than 2315: a fall through at the end. */ 2316: 2317: biv_splittable = 1; 2318: biv_final_value = 0; 2319: if (unroll_type != UNROLL_COMPLETELY 2320: && (loop_number_exit_labels[uid_loop_num[INSN_UID (loop_start)]] 2321: || unroll_type == UNROLL_NAIVE) 2322: && (uid_luid[regno_last_uid[bl->regno]] >= INSN_LUID (loop_end) 2323: || ! bl->init_insn 2324: || INSN_UID (bl->init_insn) >= max_uid_for_loop 2325: || (uid_luid[regno_first_uid[bl->regno]] 2326: < INSN_LUID (bl->init_insn)) 2327: || reg_mentioned_p (bl->biv->dest_reg, SET_SRC (bl->init_set))) 2328: && ! (biv_final_value = final_biv_value (bl, loop_start, loop_end))) 2329: biv_splittable = 0; 2330: 1.1.1.4 root 2331: /* If any of the insns setting the BIV don't do so with a simple 2332: PLUS, we don't know how to split it. */ 2333: for (v = bl->biv; biv_splittable && v; v = v->next_iv) 2334: if ((tem = single_set (v->insn)) == 0 2335: || GET_CODE (SET_DEST (tem)) != REG 2336: || REGNO (SET_DEST (tem)) != bl->regno 2337: || GET_CODE (SET_SRC (tem)) != PLUS) 2338: biv_splittable = 0; 2339: 1.1 root 2340: /* If final value is non-zero, then must emit an instruction which sets 2341: the value of the biv to the proper value. This is done after 2342: handling all of the givs, since some of them may need to use the 2343: biv's value in their initialization code. */ 2344: 2345: /* This biv is splittable. If completely unrolling the loop, save 2346: the biv's initial value. Otherwise, save the constant zero. */ 2347: 2348: if (biv_splittable == 1) 2349: { 2350: if (unroll_type == UNROLL_COMPLETELY) 2351: { 2352: /* If the initial value of the biv is itself (i.e. it is too 2353: complicated for strength_reduce to compute), or is a hard 1.1.1.2 root 2354: register, then we must create a new pseudo reg to hold the 1.1 root 2355: initial value of the biv. */ 2356: 2357: if (GET_CODE (bl->initial_value) == REG 2358: && (REGNO (bl->initial_value) == bl->regno 2359: || REGNO (bl->initial_value) < FIRST_PSEUDO_REGISTER)) 2360: { 2361: rtx tem = gen_reg_rtx (bl->biv->mode); 2362: 2363: emit_insn_before (gen_move_insn (tem, bl->biv->src_reg), 2364: loop_start); 2365: 2366: if (loop_dump_stream) 2367: fprintf (loop_dump_stream, "Biv %d initial value remapped to %d.\n", 2368: bl->regno, REGNO (tem)); 2369: 2370: splittable_regs[bl->regno] = tem; 2371: } 2372: else 2373: splittable_regs[bl->regno] = bl->initial_value; 2374: } 2375: else 2376: splittable_regs[bl->regno] = const0_rtx; 2377: 2378: /* Save the number of instructions that modify the biv, so that 2379: we can treat the last one specially. */ 2380: 2381: splittable_regs_updates[bl->regno] = bl->biv_count; 1.1.1.6 root 2382: result += bl->biv_count; 1.1 root 2383: 2384: if (loop_dump_stream) 2385: fprintf (loop_dump_stream, 2386: "Biv %d safe to split.\n", bl->regno); 2387: } 2388: 2389: /* Check every giv that depends on this biv to see whether it is 2390: splittable also. Even if the biv isn't splittable, givs which 2391: depend on it may be splittable if the biv is live outside the 2392: loop, and the givs aren't. */ 2393: 1.1.1.6 root 2394: result += find_splittable_givs (bl, unroll_type, loop_start, loop_end, 2395: increment, unroll_number); 1.1 root 2396: 2397: /* If final value is non-zero, then must emit an instruction which sets 2398: the value of the biv to the proper value. This is done after 2399: handling all of the givs, since some of them may need to use the 2400: biv's value in their initialization code. */ 2401: if (biv_final_value) 2402: { 2403: /* If the loop has multiple exits, emit the insns before the 2404: loop to ensure that it will always be executed no matter 2405: how the loop exits. Otherwise emit the insn after the loop, 2406: since this is slightly more efficient. */ 2407: if (! loop_number_exit_labels[uid_loop_num[INSN_UID (loop_start)]]) 2408: emit_insn_before (gen_move_insn (bl->biv->src_reg, 2409: biv_final_value), 2410: end_insert_before); 2411: else 2412: { 2413: /* Create a new register to hold the value of the biv, and then 2414: set the biv to its final value before the loop start. The biv 2415: is set to its final value before loop start to ensure that 2416: this insn will always be executed, no matter how the loop 2417: exits. */ 2418: rtx tem = gen_reg_rtx (bl->biv->mode); 2419: emit_insn_before (gen_move_insn (tem, bl->biv->src_reg), 2420: loop_start); 2421: emit_insn_before (gen_move_insn (bl->biv->src_reg, 2422: biv_final_value), 2423: loop_start); 2424: 2425: if (loop_dump_stream) 2426: fprintf (loop_dump_stream, "Biv %d mapped to %d for split.\n", 2427: REGNO (bl->biv->src_reg), REGNO (tem)); 2428: 2429: /* Set up the mapping from the original biv register to the new 2430: register. */ 2431: bl->biv->src_reg = tem; 2432: } 2433: } 2434: } 2435: return result; 2436: } 2437: 2438: /* For every giv based on the biv BL, check to determine whether it is 1.1.1.6 root 2439: splittable. This is a subroutine to find_splittable_regs (). 2440: 2441: Return the number of instructions that set splittable registers. */ 1.1 root 2442: 2443: static int 2444: find_splittable_givs (bl, unroll_type, loop_start, loop_end, increment, 1.1.1.6 root 2445: unroll_number) 1.1 root 2446: struct iv_class *bl; 2447: enum unroll_types unroll_type; 2448: rtx loop_start, loop_end; 2449: rtx increment; 1.1.1.6 root 2450: int unroll_number; 1.1 root 2451: { 2452: struct induction *v; 2453: rtx final_value; 2454: rtx tem; 1.1.1.6 root 2455: int result = 0; 1.1 root 2456: 2457: for (v = bl->giv; v; v = v->next_iv) 2458: { 2459: rtx giv_inc, value; 2460: 2461: /* Only split the giv if it has already been reduced, or if the loop is 2462: being completely unrolled. */ 2463: if (unroll_type != UNROLL_COMPLETELY && v->ignore) 2464: continue; 2465: 2466: /* The giv can be split if the insn that sets the giv is executed once 2467: and only once on every iteration of the loop. */ 2468: /* An address giv can always be split. v->insn is just a use not a set, 2469: and hence it does not matter whether it is always executed. All that 2470: matters is that all the biv increments are always executed, and we 2471: won't reach here if they aren't. */ 2472: if (v->giv_type != DEST_ADDR 2473: && (! v->always_computable 2474: || back_branch_in_range_p (v->insn, loop_start, loop_end))) 2475: continue; 2476: 2477: /* The giv increment value must be a constant. */ 2478: giv_inc = fold_rtx_mult_add (v->mult_val, increment, const0_rtx, 2479: v->mode); 2480: if (! giv_inc || GET_CODE (giv_inc) != CONST_INT) 2481: continue; 2482: 2483: /* The loop must be unrolled completely, or else have a known number of 2484: iterations and only one exit, or else the giv must be dead outside 2485: the loop, or else the final value of the giv must be known. 2486: Otherwise, it is not safe to split the giv since it may not have the 2487: proper value on loop exit. */ 2488: 2489: /* The used outside loop test will fail for DEST_ADDR givs. They are 2490: never used outside the loop anyways, so it is always safe to split a 2491: DEST_ADDR giv. */ 2492: 2493: final_value = 0; 2494: if (unroll_type != UNROLL_COMPLETELY 2495: && (loop_number_exit_labels[uid_loop_num[INSN_UID (loop_start)]] 2496: || unroll_type == UNROLL_NAIVE) 2497: && v->giv_type != DEST_ADDR 2498: && ((regno_first_uid[REGNO (v->dest_reg)] != INSN_UID (v->insn) 2499: /* Check for the case where the pseudo is set by a shift/add 2500: sequence, in which case the first insn setting the pseudo 2501: is the first insn of the shift/add sequence. */ 1.1.1.4 root 2502: && (! (tem = find_reg_note (v->insn, REG_RETVAL, NULL_RTX)) 1.1 root 2503: || (regno_first_uid[REGNO (v->dest_reg)] 2504: != INSN_UID (XEXP (tem, 0))))) 2505: /* Line above always fails if INSN was moved by loop opt. */ 2506: || (uid_luid[regno_last_uid[REGNO (v->dest_reg)]] 2507: >= INSN_LUID (loop_end))) 2508: && ! (final_value = v->final_value)) 2509: continue; 2510: 2511: #if 0 2512: /* Currently, non-reduced/final-value givs are never split. */ 2513: /* Should emit insns after the loop if possible, as the biv final value 2514: code below does. */ 2515: 2516: /* If the final value is non-zero, and the giv has not been reduced, 2517: then must emit an instruction to set the final value. */ 2518: if (final_value && !v->new_reg) 2519: { 2520: /* Create a new register to hold the value of the giv, and then set 2521: the giv to its final value before the loop start. The giv is set 2522: to its final value before loop start to ensure that this insn 2523: will always be executed, no matter how we exit. */ 2524: tem = gen_reg_rtx (v->mode); 2525: emit_insn_before (gen_move_insn (tem, v->dest_reg), loop_start); 2526: emit_insn_before (gen_move_insn (v->dest_reg, final_value), 2527: loop_start); 2528: 2529: if (loop_dump_stream) 2530: fprintf (loop_dump_stream, "Giv %d mapped to %d for split.\n", 2531: REGNO (v->dest_reg), REGNO (tem)); 2532: 2533: v->src_reg = tem; 2534: } 2535: #endif 2536: 2537: /* This giv is splittable. If completely unrolling the loop, save the 2538: giv's initial value. Otherwise, save the constant zero for it. */ 2539: 2540: if (unroll_type == UNROLL_COMPLETELY) 1.1.1.4 root 2541: { 2542: /* It is not safe to use bl->initial_value here, because it may not 2543: be invariant. It is safe to use the initial value stored in 2544: the splittable_regs array if it is set. In rare cases, it won't 2545: be set, so then we do exactly the same thing as 2546: find_splittable_regs does to get a safe value. */ 2547: rtx biv_initial_value; 2548: 2549: if (splittable_regs[bl->regno]) 2550: biv_initial_value = splittable_regs[bl->regno]; 2551: else if (GET_CODE (bl->initial_value) != REG 2552: || (REGNO (bl->initial_value) != bl->regno 2553: && REGNO (bl->initial_value) >= FIRST_PSEUDO_REGISTER)) 2554: biv_initial_value = bl->initial_value; 2555: else 2556: { 2557: rtx tem = gen_reg_rtx (bl->biv->mode); 2558: 2559: emit_insn_before (gen_move_insn (tem, bl->biv->src_reg), 2560: loop_start); 2561: biv_initial_value = tem; 2562: } 2563: value = fold_rtx_mult_add (v->mult_val, biv_initial_value, 2564: v->add_val, v->mode); 2565: } 1.1 root 2566: else 2567: value = const0_rtx; 2568: 2569: if (v->new_reg) 2570: { 1.1.1.3 root 2571: /* If a giv was combined with another giv, then we can only split 2572: this giv if the giv it was combined with was reduced. This 2573: is because the value of v->new_reg is meaningless in this 2574: case. */ 2575: if (v->same && ! v->same->new_reg) 1.1 root 2576: { 2577: if (loop_dump_stream) 2578: fprintf (loop_dump_stream, 1.1.1.3 root 2579: "giv combined with unreduced giv not split.\n"); 2580: continue; 2581: } 2582: /* If the giv is an address destination, it could be something other 2583: than a simple register, these have to be treated differently. */ 2584: else if (v->giv_type == DEST_REG) 2585: { 2586: /* If value is not a constant, register, or register plus 2587: constant, then compute its value into a register before 2588: loop start. This prevents illegal rtx sharing, and should 2589: generate better code. We can use bl->initial_value here 2590: instead of splittable_regs[bl->regno] because this code 2591: is going before the loop start. */ 2592: if (unroll_type == UNROLL_COMPLETELY 2593: && GET_CODE (value) != CONST_INT 2594: && GET_CODE (value) != REG 2595: && (GET_CODE (value) != PLUS 2596: || GET_CODE (XEXP (value, 0)) != REG 2597: || GET_CODE (XEXP (value, 1)) != CONST_INT)) 2598: { 2599: rtx tem = gen_reg_rtx (v->mode); 2600: emit_iv_add_mult (bl->initial_value, v->mult_val, 2601: v->add_val, tem, loop_start); 2602: value = tem; 2603: } 2604: 2605: splittable_regs[REGNO (v->new_reg)] = value; 1.1 root 2606: } 2607: else 2608: { 2609: /* Splitting address givs is useful since it will often allow us 2610: to eliminate some increment insns for the base giv as 2611: unnecessary. */ 2612: 2613: /* If the addr giv is combined with a dest_reg giv, then all 2614: references to that dest reg will be remapped, which is NOT 2615: what we want for split addr regs. We always create a new 2616: register for the split addr giv, just to be safe. */ 2617: 2618: /* ??? If there are multiple address givs which have been 2619: combined with the same dest_reg giv, then we may only need 2620: one new register for them. Pulling out constants below will 2621: catch some of the common cases of this. Currently, I leave 2622: the work of simplifying multiple address givs to the 2623: following cse pass. */ 2624: 1.1.1.7 ! root 2625: /* As a special case, if we have multiple identical address givs ! 2626: within a single instruction, then we do use a single psuedo ! 2627: reg for both. This is necessary in case one is a match_dup ! 2628: of the other. */ ! 2629: 1.1 root 2630: v->const_adjust = 0; 1.1.1.7 ! root 2631: ! 2632: if (v->same && v->same->insn == v->insn ! 2633: && v->new_reg == v->same->new_reg) ! 2634: { ! 2635: v->dest_reg = v->same->dest_reg; ! 2636: if (loop_dump_stream) ! 2637: fprintf (loop_dump_stream, ! 2638: "Sharing address givs with reg %d\n", ! 2639: REGNO (v->dest_reg)); ! 2640: } ! 2641: else if (unroll_type != UNROLL_COMPLETELY) 1.1 root 2642: { 2643: /* If not completely unrolling the loop, then create a new 2644: register to hold the split value of the DEST_ADDR giv. 2645: Emit insn to initialize its value before loop start. */ 2646: tem = gen_reg_rtx (v->mode); 2647: 2648: /* If the address giv has a constant in its new_reg value, 2649: then this constant can be pulled out and put in value, 2650: instead of being part of the initialization code. */ 2651: 2652: if (GET_CODE (v->new_reg) == PLUS 2653: && GET_CODE (XEXP (v->new_reg, 1)) == CONST_INT) 2654: { 2655: v->dest_reg 2656: = plus_constant (tem, INTVAL (XEXP (v->new_reg,1))); 2657: 2658: /* Only succeed if this will give valid addresses. 2659: Try to validate both the first and the last 2660: address resulting from loop unrolling, if 2661: one fails, then can't do const elim here. */ 1.1.1.4 root 2662: if (memory_address_p (v->mem_mode, v->dest_reg) 2663: && memory_address_p (v->mem_mode, 1.1 root 2664: plus_constant (v->dest_reg, 2665: INTVAL (giv_inc) 2666: * (unroll_number - 1)))) 2667: { 2668: /* Save the negative of the eliminated const, so 2669: that we can calculate the dest_reg's increment 2670: value later. */ 2671: v->const_adjust = - INTVAL (XEXP (v->new_reg, 1)); 2672: 2673: v->new_reg = XEXP (v->new_reg, 0); 2674: if (loop_dump_stream) 2675: fprintf (loop_dump_stream, 2676: "Eliminating constant from giv %d\n", 2677: REGNO (tem)); 2678: } 2679: else 2680: v->dest_reg = tem; 2681: } 2682: else 2683: v->dest_reg = tem; 2684: 2685: /* If the address hasn't been checked for validity yet, do so 2686: now, and fail completely if either the first or the last 2687: unrolled copy of the address is not a valid address. */ 2688: if (v->dest_reg == tem 1.1.1.4 root 2689: && (! memory_address_p (v->mem_mode, v->dest_reg) 2690: || ! memory_address_p (v->mem_mode, 1.1 root 2691: plus_constant (v->dest_reg, 2692: INTVAL (giv_inc) 2693: * (unroll_number -1))))) 2694: { 2695: if (loop_dump_stream) 2696: fprintf (loop_dump_stream, 2697: "Illegal address for giv at insn %d\n", 2698: INSN_UID (v->insn)); 2699: continue; 2700: } 2701: 2702: /* To initialize the new register, just move the value of 2703: new_reg into it. This is not guaranteed to give a valid 2704: instruction on machines with complex addressing modes. 2705: If we can't recognize it, then delete it and emit insns 2706: to calculate the value from scratch. */ 2707: emit_insn_before (gen_rtx (SET, VOIDmode, tem, 2708: copy_rtx (v->new_reg)), 2709: loop_start); 1.1.1.4 root 2710: if (recog_memoized (PREV_INSN (loop_start)) < 0) 1.1 root 2711: { 1.1.1.7 ! root 2712: rtx sequence, ret; ! 2713: ! 2714: /* We can't use bl->initial_value to compute the initial ! 2715: value, because the loop may have been preconditioned. ! 2716: We must calculate it from NEW_REG. Try using ! 2717: force_operand instead of emit_iv_add_mult. */ 1.1 root 2718: delete_insn (PREV_INSN (loop_start)); 1.1.1.7 ! root 2719: ! 2720: start_sequence (); ! 2721: ret = force_operand (v->new_reg, tem); ! 2722: if (ret != tem) ! 2723: emit_move_insn (tem, ret); ! 2724: sequence = gen_sequence (); ! 2725: end_sequence (); ! 2726: emit_insn_before (sequence, loop_start); ! 2727: 1.1 root 2728: if (loop_dump_stream) 2729: fprintf (loop_dump_stream, 2730: "Illegal init insn, rewritten.\n"); 2731: } 2732: } 2733: else 2734: { 2735: v->dest_reg = value; 2736: 2737: /* Check the resulting address for validity, and fail 2738: if the resulting address would be illegal. */ 1.1.1.4 root 2739: if (! memory_address_p (v->mem_mode, v->dest_reg) 2740: || ! memory_address_p (v->mem_mode, 1.1 root 2741: plus_constant (v->dest_reg, 2742: INTVAL (giv_inc) * 2743: (unroll_number -1)))) 2744: { 2745: if (loop_dump_stream) 2746: fprintf (loop_dump_stream, 2747: "Illegal address for giv at insn %d\n", 2748: INSN_UID (v->insn)); 2749: continue; 2750: } 2751: } 2752: 2753: /* Store the value of dest_reg into the insn. This sharing 2754: will not be a problem as this insn will always be copied 2755: later. */ 2756: 2757: *v->location = v->dest_reg; 2758: 2759: /* If this address giv is combined with a dest reg giv, then 2760: save the base giv's induction pointer so that we will be 2761: able to handle this address giv properly. The base giv 2762: itself does not have to be splittable. */ 2763: 2764: if (v->same && v->same->giv_type == DEST_REG) 2765: addr_combined_regs[REGNO (v->same->new_reg)] = v->same; 2766: 2767: if (GET_CODE (v->new_reg) == REG) 2768: { 2769: /* This giv maybe hasn't been combined with any others. 2770: Make sure that it's giv is marked as splittable here. */ 2771: 2772: splittable_regs[REGNO (v->new_reg)] = value; 2773: 2774: /* Make it appear to depend upon itself, so that the 2775: giv will be properly split in the main loop above. */ 2776: if (! v->same) 2777: { 2778: v->same = v; 2779: addr_combined_regs[REGNO (v->new_reg)] = v; 2780: } 2781: } 1.1.1.2 root 2782: 1.1 root 2783: if (loop_dump_stream) 2784: fprintf (loop_dump_stream, "DEST_ADDR giv being split.\n"); 2785: } 2786: } 2787: else 2788: { 2789: #if 0 2790: /* Currently, unreduced giv's can't be split. This is not too much 2791: of a problem since unreduced giv's are not live across loop 2792: iterations anyways. When unrolling a loop completely though, 2793: it makes sense to reduce&split givs when possible, as this will 2794: result in simpler instructions, and will not require that a reg 2795: be live across loop iterations. */ 2796: 2797: splittable_regs[REGNO (v->dest_reg)] = value; 2798: fprintf (stderr, "Giv %d at insn %d not reduced\n", 2799: REGNO (v->dest_reg), INSN_UID (v->insn)); 2800: #else 2801: continue; 2802: #endif 2803: } 2804: 2805: /* Givs are only updated once by definition. Mark it so if this is 2806: a splittable register. Don't need to do anything for address givs 2807: where this may not be a register. */ 2808: 2809: if (GET_CODE (v->new_reg) == REG) 2810: splittable_regs_updates[REGNO (v->new_reg)] = 1; 2811: 2812: result++; 2813: 2814: if (loop_dump_stream) 2815: { 2816: int regnum; 2817: 2818: if (GET_CODE (v->dest_reg) == CONST_INT) 2819: regnum = -1; 2820: else if (GET_CODE (v->dest_reg) != REG) 2821: regnum = REGNO (XEXP (v->dest_reg, 0)); 2822: else 2823: regnum = REGNO (v->dest_reg); 2824: fprintf (loop_dump_stream, "Giv %d at insn %d safe to split.\n", 2825: regnum, INSN_UID (v->insn)); 2826: } 2827: } 2828: 2829: return result; 2830: } 2831: 2832: /* Try to prove that the register is dead after the loop exits. Trace every 2833: loop exit looking for an insn that will always be executed, which sets 2834: the register to some value, and appears before the first use of the register 2835: is found. If successful, then return 1, otherwise return 0. */ 2836: 2837: /* ?? Could be made more intelligent in the handling of jumps, so that 2838: it can search past if statements and other similar structures. */ 2839: 2840: static int 2841: reg_dead_after_loop (reg, loop_start, loop_end) 2842: rtx reg, loop_start, loop_end; 2843: { 2844: rtx insn, label; 2845: enum rtx_code code; 1.1.1.2 root 2846: int jump_count = 0; 1.1 root 2847: 2848: /* HACK: Must also search the loop fall through exit, create a label_ref 2849: here which points to the loop_end, and append the loop_number_exit_labels 2850: list to it. */ 2851: label = gen_rtx (LABEL_REF, VOIDmode, loop_end); 2852: LABEL_NEXTREF (label) 2853: = loop_number_exit_labels[uid_loop_num[INSN_UID (loop_start)]]; 2854: 2855: for ( ; label; label = LABEL_NEXTREF (label)) 2856: { 2857: /* Succeed if find an insn which sets the biv or if reach end of 2858: function. Fail if find an insn that uses the biv, or if come to 2859: a conditional jump. */ 2860: 2861: insn = NEXT_INSN (XEXP (label, 0)); 1.1.1.2 root 2862: while (insn) 1.1 root 2863: { 1.1.1.2 root 2864: code = GET_CODE (insn); 2865: if (GET_RTX_CLASS (code) == 'i') 1.1 root 2866: { 1.1.1.2 root 2867: rtx set; 2868: 2869: if (reg_referenced_p (reg, PATTERN (insn))) 1.1 root 2870: return 0; 1.1.1.2 root 2871: 2872: set = single_set (insn); 2873: if (set && rtx_equal_p (SET_DEST (set), reg)) 2874: break; 1.1 root 2875: } 1.1.1.2 root 2876: 1.1 root 2877: if (code == JUMP_INSN) 2878: { 2879: if (GET_CODE (PATTERN (insn)) == RETURN) 2880: break; 1.1.1.2 root 2881: else if (! simplejump_p (insn) 2882: /* Prevent infinite loop following infinite loops. */ 2883: || jump_count++ > 20) 1.1 root 2884: return 0; 2885: else 1.1.1.2 root 2886: insn = JUMP_LABEL (insn); 1.1 root 2887: } 1.1.1.2 root 2888: 1.1 root 2889: insn = NEXT_INSN (insn); 2890: } 2891: } 2892: 2893: /* Success, the register is dead on all loop exits. */ 2894: return 1; 2895: } 2896: 2897: /* Try to calculate the final value of the biv, the value it will have at 2898: the end of the loop. If we can do it, return that value. */ 2899: 2900: rtx 2901: final_biv_value (bl, loop_start, loop_end) 2902: struct iv_class *bl; 2903: rtx loop_start, loop_end; 2904: { 2905: rtx increment, tem; 2906: 1.1.1.2 root 2907: /* ??? This only works for MODE_INT biv's. Reject all others for now. */ 2908: 2909: if (GET_MODE_CLASS (bl->biv->mode) != MODE_INT) 2910: return 0; 2911: 1.1 root 2912: /* The final value for reversed bivs must be calculated differently than 2913: for ordinary bivs. In this case, there is already an insn after the 2914: loop which sets this biv's final value (if necessary), and there are 2915: no other loop exits, so we can return any value. */ 2916: if (bl->reversed) 2917: { 2918: if (loop_dump_stream) 2919: fprintf (loop_dump_stream, 2920: "Final biv value for %d, reversed biv.\n", bl->regno); 2921: 2922: return const0_rtx; 2923: } 2924: 2925: /* Try to calculate the final value as initial value + (number of iterations 2926: * increment). For this to work, increment must be invariant, the only 2927: exit from the loop must be the fall through at the bottom (otherwise 2928: it may not have its final value when the loop exits), and the initial 2929: value of the biv must be invariant. */ 2930: 2931: if (loop_n_iterations != 0 2932: && ! loop_number_exit_labels[uid_loop_num[INSN_UID (loop_start)]] 2933: && invariant_p (bl->initial_value)) 2934: { 2935: increment = biv_total_increment (bl, loop_start, loop_end); 2936: 2937: if (increment && invariant_p (increment)) 2938: { 2939: /* Can calculate the loop exit value, emit insns after loop 2940: end to calculate this value into a temporary register in 2941: case it is needed later. */ 2942: 2943: tem = gen_reg_rtx (bl->biv->mode); 1.1.1.4 root 2944: /* Make sure loop_end is not the last insn. */ 2945: if (NEXT_INSN (loop_end) == 0) 2946: emit_note_after (NOTE_INSN_DELETED, loop_end); 2947: emit_iv_add_mult (increment, GEN_INT (loop_n_iterations), 1.1 root 2948: bl->initial_value, tem, NEXT_INSN (loop_end)); 2949: 2950: if (loop_dump_stream) 2951: fprintf (loop_dump_stream, 2952: "Final biv value for %d, calculated.\n", bl->regno); 2953: 2954: return tem; 2955: } 2956: } 2957: 2958: /* Check to see if the biv is dead at all loop exits. */ 2959: if (reg_dead_after_loop (bl->biv->src_reg, loop_start, loop_end)) 2960: { 2961: if (loop_dump_stream) 2962: fprintf (loop_dump_stream, 2963: "Final biv value for %d, biv dead after loop exit.\n", 2964: bl->regno); 2965: 2966: return const0_rtx; 2967: } 2968: 2969: return 0; 2970: } 2971: 2972: /* Try to calculate the final value of the giv, the value it will have at 2973: the end of the loop. If we can do it, return that value. */ 2974: 2975: rtx 2976: final_giv_value (v, loop_start, loop_end) 2977: struct induction *v; 2978: rtx loop_start, loop_end; 2979: { 2980: struct iv_class *bl; 1.1.1.4 root 2981: rtx insn; 1.1 root 2982: rtx increment, tem; 1.1.1.3 root 2983: rtx insert_before, seq; 1.1 root 2984: 2985: bl = reg_biv_class[REGNO (v->src_reg)]; 2986: 2987: /* The final value for givs which depend on reversed bivs must be calculated 2988: differently than for ordinary givs. In this case, there is already an 2989: insn after the loop which sets this giv's final value (if necessary), 2990: and there are no other loop exits, so we can return any value. */ 2991: if (bl->reversed) 2992: { 2993: if (loop_dump_stream) 2994: fprintf (loop_dump_stream, 2995: "Final giv value for %d, depends on reversed biv\n", 2996: REGNO (v->dest_reg)); 2997: return const0_rtx; 2998: } 2999: 3000: /* Try to calculate the final value as a function of the biv it depends 3001: upon. The only exit from the loop must be the fall through at the bottom 3002: (otherwise it may not have its final value when the loop exits). */ 3003: 3004: /* ??? Can calculate the final giv value by subtracting off the 3005: extra biv increments times the giv's mult_val. The loop must have 3006: only one exit for this to work, but the loop iterations does not need 3007: to be known. */ 3008: 3009: if (loop_n_iterations != 0 3010: && ! loop_number_exit_labels[uid_loop_num[INSN_UID (loop_start)]]) 3011: { 3012: /* ?? It is tempting to use the biv's value here since these insns will 3013: be put after the loop, and hence the biv will have its final value 3014: then. However, this fails if the biv is subsequently eliminated. 3015: Perhaps determine whether biv's are eliminable before trying to 3016: determine whether giv's are replaceable so that we can use the 3017: biv value here if it is not eliminable. */ 3018: 3019: increment = biv_total_increment (bl, loop_start, loop_end); 3020: 3021: if (increment && invariant_p (increment)) 3022: { 3023: /* Can calculate the loop exit value of its biv as 3024: (loop_n_iterations * increment) + initial_value */ 3025: 3026: /* The loop exit value of the giv is then 3027: (final_biv_value - extra increments) * mult_val + add_val. 3028: The extra increments are any increments to the biv which 3029: occur in the loop after the giv's value is calculated. 3030: We must search from the insn that sets the giv to the end 3031: of the loop to calculate this value. */ 3032: 3033: insert_before = NEXT_INSN (loop_end); 3034: 3035: /* Put the final biv value in tem. */ 3036: tem = gen_reg_rtx (bl->biv->mode); 1.1.1.4 root 3037: emit_iv_add_mult (increment, GEN_INT (loop_n_iterations), 1.1 root 3038: bl->initial_value, tem, insert_before); 3039: 3040: /* Subtract off extra increments as we find them. */ 3041: for (insn = NEXT_INSN (v->insn); insn != loop_end; 3042: insn = NEXT_INSN (insn)) 3043: { 1.1.1.4 root 3044: struct induction *biv; 3045: 3046: for (biv = bl->biv; biv; biv = biv->next_iv) 3047: if (biv->insn == insn) 3048: { 3049: start_sequence (); 3050: tem = expand_binop (GET_MODE (tem), sub_optab, tem, 3051: biv->add_val, NULL_RTX, 0, 3052: OPTAB_LIB_WIDEN); 3053: seq = gen_sequence (); 3054: end_sequence (); 3055: emit_insn_before (seq, insert_before); 3056: } 1.1 root 3057: } 3058: 3059: /* Now calculate the giv's final value. */ 3060: emit_iv_add_mult (tem, v->mult_val, v->add_val, tem, 3061: insert_before); 3062: 3063: if (loop_dump_stream) 3064: fprintf (loop_dump_stream, 3065: "Final giv value for %d, calc from biv's value.\n", 3066: REGNO (v->dest_reg)); 3067: 3068: return tem; 3069: } 3070: } 3071: 3072: /* Replaceable giv's should never reach here. */ 3073: if (v->replaceable) 3074: abort (); 3075: 3076: /* Check to see if the biv is dead at all loop exits. */ 3077: if (reg_dead_after_loop (v->dest_reg, loop_start, loop_end)) 3078: { 3079: if (loop_dump_stream) 3080: fprintf (loop_dump_stream, 3081: "Final giv value for %d, giv dead after loop exit.\n", 3082: REGNO (v->dest_reg)); 3083: 3084: return const0_rtx; 3085: } 3086: 3087: return 0; 3088: } 3089: 3090: 3091: /* Calculate the number of loop iterations. Returns the exact number of loop 1.1.1.3 root 3092: iterations if it can be calculated, otherwise returns zero. */ 1.1 root 3093: 1.1.1.4 root 3094: unsigned HOST_WIDE_INT 1.1 root 3095: loop_iterations (loop_start, loop_end) 3096: rtx loop_start, loop_end; 3097: { 3098: rtx comparison, comparison_value; 3099: rtx iteration_var, initial_value, increment, final_value; 3100: enum rtx_code comparison_code; 1.1.1.4 root 3101: HOST_WIDE_INT i; 3102: int increment_dir; 1.1 root 3103: int unsigned_compare, compare_dir, final_larger; 3104: unsigned long tempu; 3105: rtx last_loop_insn; 3106: 3107: /* First find the iteration variable. If the last insn is a conditional 3108: branch, and the insn before tests a register value, make that the 3109: iteration variable. */ 3110: 3111: loop_initial_value = 0; 3112: loop_increment = 0; 3113: loop_final_value = 0; 3114: loop_iteration_var = 0; 3115: 1.1.1.7 ! root 3116: /* We used to use pren_nonnote_insn here, but that fails because it might ! 3117: accidentally get the branch for a contained loop if the branch for this ! 3118: loop was deleted. We can only trust branches immediately before the ! 3119: loop_end. */ ! 3120: last_loop_insn = PREV_INSN (loop_end); 1.1 root 3121: 3122: comparison = get_condition_for_loop (last_loop_insn); 3123: if (comparison == 0) 3124: { 3125: if (loop_dump_stream) 3126: fprintf (loop_dump_stream, 3127: "Loop unrolling: No final conditional branch found.\n"); 3128: return 0; 3129: } 3130: 3131: /* ??? Get_condition may switch position of induction variable and 3132: invariant register when it canonicalizes the comparison. */ 3133: 3134: comparison_code = GET_CODE (comparison); 3135: iteration_var = XEXP (comparison, 0); 3136: comparison_value = XEXP (comparison, 1); 3137: 3138: if (GET_CODE (iteration_var) != REG) 3139: { 3140: if (loop_dump_stream) 3141: fprintf (loop_dump_stream, 3142: "Loop unrolling: Comparison not against register.\n"); 3143: return 0; 3144: } 3145: 3146: /* Loop iterations is always called before any new registers are created 3147: now, so this should never occur. */ 3148: 3149: if (REGNO (iteration_var) >= max_reg_before_loop) 3150: abort (); 3151: 3152: iteration_info (iteration_var, &initial_value, &increment, 3153: loop_start, loop_end); 3154: if (initial_value == 0) 3155: /* iteration_info already printed a message. */ 3156: return 0; 3157: 3158: /* If the comparison value is an invariant register, then try to find 3159: its value from the insns before the start of the loop. */ 3160: 3161: if (GET_CODE (comparison_value) == REG && invariant_p (comparison_value)) 3162: { 3163: rtx insn, set; 3164: 3165: for (insn = PREV_INSN (loop_start); insn ; insn = PREV_INSN (insn)) 3166: { 3167: if (GET_CODE (insn) == CODE_LABEL) 3168: break; 3169: 3170: else if (GET_RTX_CLASS (GET_CODE (insn)) == 'i' 1.1.1.5 root 3171: && reg_set_p (comparison_value, insn)) 1.1 root 3172: { 1.1.1.5 root 3173: /* We found the last insn before the loop that sets the register. 3174: If it sets the entire register, and has a REG_EQUAL note, 3175: then use the value of the REG_EQUAL note. */ 3176: if ((set = single_set (insn)) 3177: && (SET_DEST (set) == comparison_value)) 3178: { 3179: rtx note = find_reg_note (insn, REG_EQUAL, NULL_RTX); 1.1 root 3180: 1.1.1.7 ! root 3181: /* Only use the REG_EQUAL note if it is a constant. ! 3182: Other things, divide in particular, will cause ! 3183: problems later if we use them. */ ! 3184: if (note && GET_CODE (XEXP (note, 0)) != EXPR_LIST ! 3185: && CONSTANT_P (XEXP (note, 0))) 1.1.1.5 root 3186: comparison_value = XEXP (note, 0); 3187: } 1.1 root 3188: break; 3189: } 3190: } 3191: } 3192: 3193: final_value = approx_final_value (comparison_code, comparison_value, 3194: &unsigned_compare, &compare_dir); 3195: 3196: /* Save the calculated values describing this loop's bounds, in case 3197: precondition_loop_p will need them later. These values can not be 3198: recalculated inside precondition_loop_p because strength reduction 3199: optimizations may obscure the loop's structure. */ 3200: 3201: loop_iteration_var = iteration_var; 3202: loop_initial_value = initial_value; 3203: loop_increment = increment; 3204: loop_final_value = final_value; 3205: 1.1.1.7 ! root 3206: if (increment == 0) ! 3207: { ! 3208: if (loop_dump_stream) ! 3209: fprintf (loop_dump_stream, ! 3210: "Loop unrolling: Increment value can't be calculated.\n"); ! 3211: return 0; ! 3212: } ! 3213: else if (GET_CODE (increment) != CONST_INT) ! 3214: { ! 3215: if (loop_dump_stream) ! 3216: fprintf (loop_dump_stream, ! 3217: "Loop unrolling: Increment value not constant.\n"); ! 3218: return 0; ! 3219: } ! 3220: else if (GET_CODE (initial_value) != CONST_INT) ! 3221: { ! 3222: if (loop_dump_stream) ! 3223: fprintf (loop_dump_stream, ! 3224: "Loop unrolling: Initial value not constant.\n"); ! 3225: return 0; ! 3226: } ! 3227: else if (final_value == 0) 1.1 root 3228: { 3229: if (loop_dump_stream) 3230: fprintf (loop_dump_stream, 3231: "Loop unrolling: EQ comparison loop.\n"); 3232: return 0; 3233: } 3234: else if (GET_CODE (final_value) != CONST_INT) 3235: { 3236: if (loop_dump_stream) 3237: fprintf (loop_dump_stream, 3238: "Loop unrolling: Final value not constant.\n"); 3239: return 0; 3240: } 3241: 3242: /* ?? Final value and initial value do not have to be constants. 3243: Only their difference has to be constant. When the iteration variable 3244: is an array address, the final value and initial value might both 3245: be addresses with the same base but different constant offsets. 3246: Final value must be invariant for this to work. 3247: 1.1.1.3 root 3248: To do this, need some way to find the values of registers which are 1.1 root 3249: invariant. */ 3250: 3251: /* Final_larger is 1 if final larger, 0 if they are equal, otherwise -1. */ 3252: if (unsigned_compare) 3253: final_larger 1.1.1.4 root 3254: = ((unsigned HOST_WIDE_INT) INTVAL (final_value) 3255: > (unsigned HOST_WIDE_INT) INTVAL (initial_value)) 3256: - ((unsigned HOST_WIDE_INT) INTVAL (final_value) 3257: < (unsigned HOST_WIDE_INT) INTVAL (initial_value)); 1.1 root 3258: else 1.1.1.4 root 3259: final_larger = (INTVAL (final_value) > INTVAL (initial_value)) 3260: - (INTVAL (final_value) < INTVAL (initial_value)); 1.1 root 3261: 3262: if (INTVAL (increment) > 0) 3263: increment_dir = 1; 3264: else if (INTVAL (increment) == 0) 3265: increment_dir = 0; 3266: else 3267: increment_dir = -1; 3268: 3269: /* There are 27 different cases: compare_dir = -1, 0, 1; 3270: final_larger = -1, 0, 1; increment_dir = -1, 0, 1. 3271: There are 4 normal cases, 4 reverse cases (where the iteration variable 3272: will overflow before the loop exits), 4 infinite loop cases, and 15 3273: immediate exit (0 or 1 iteration depending on loop type) cases. 3274: Only try to optimize the normal cases. */ 3275: 3276: /* (compare_dir/final_larger/increment_dir) 3277: Normal cases: (0/-1/-1), (0/1/1), (-1/-1/-1), (1/1/1) 3278: Reverse cases: (0/-1/1), (0/1/-1), (-1/-1/1), (1/1/-1) 3279: Infinite loops: (0/-1/0), (0/1/0), (-1/-1/0), (1/1/0) 3280: Immediate exit: (0/0/X), (-1/0/X), (-1/1/X), (1/0/X), (1/-1/X) */ 3281: 3282: /* ?? If the meaning of reverse loops (where the iteration variable 3283: will overflow before the loop exits) is undefined, then could 3284: eliminate all of these special checks, and just always assume 3285: the loops are normal/immediate/infinite. Note that this means 3286: the sign of increment_dir does not have to be known. Also, 3287: since it does not really hurt if immediate exit loops or infinite loops 3288: are optimized, then that case could be ignored also, and hence all 3289: loops can be optimized. 3290: 3291: According to ANSI Spec, the reverse loop case result is undefined, 3292: because the action on overflow is undefined. 3293: 3294: See also the special test for NE loops below. */ 3295: 3296: if (final_larger == increment_dir && final_larger != 0 3297: && (final_larger == compare_dir || compare_dir == 0)) 3298: /* Normal case. */ 3299: ; 3300: else 3301: { 3302: if (loop_dump_stream) 3303: fprintf (loop_dump_stream, 3304: "Loop unrolling: Not normal loop.\n"); 3305: return 0; 3306: } 3307: 3308: /* Calculate the number of iterations, final_value is only an approximation, 3309: so correct for that. Note that tempu and loop_n_iterations are 3310: unsigned, because they can be as large as 2^n - 1. */ 3311: 3312: i = INTVAL (increment); 3313: if (i > 0) 3314: tempu = INTVAL (final_value) - INTVAL (initial_value); 3315: else if (i < 0) 3316: { 3317: tempu = INTVAL (initial_value) - INTVAL (final_value); 3318: i = -i; 3319: } 3320: else 3321: abort (); 3322: 3323: /* For NE tests, make sure that the iteration variable won't miss the 3324: final value. If tempu mod i is not zero, then the iteration variable 3325: will overflow before the loop exits, and we can not calculate the 3326: number of iterations. */ 3327: if (compare_dir == 0 && (tempu % i) != 0) 3328: return 0; 3329: 3330: return tempu / i + ((tempu % i) != 0); 3331: } 1.1.1.7 ! root 3332: ! 3333: /* Replace uses of split bivs with their split psuedo register. This is ! 3334: for original instructions which remain after loop unrolling without ! 3335: copying. */ ! 3336: ! 3337: static rtx ! 3338: remap_split_bivs (x) ! 3339: rtx x; ! 3340: { ! 3341: register enum rtx_code code; ! 3342: register int i; ! 3343: register char *fmt; ! 3344: ! 3345: if (x == 0) ! 3346: return x; ! 3347: ! 3348: code = GET_CODE (x); ! 3349: switch (code) ! 3350: { ! 3351: case SCRATCH: ! 3352: case PC: ! 3353: case CC0: ! 3354: case CONST_INT: ! 3355: case CONST_DOUBLE: ! 3356: case CONST: ! 3357: case SYMBOL_REF: ! 3358: case LABEL_REF: ! 3359: return x; ! 3360: ! 3361: case REG: ! 3362: #if 0 ! 3363: /* If non-reduced/final-value givs were split, then this would also ! 3364: have to remap those givs also. */ ! 3365: #endif ! 3366: if (REGNO (x) < max_reg_before_loop ! 3367: && reg_iv_type[REGNO (x)] == BASIC_INDUCT) ! 3368: return reg_biv_class[REGNO (x)]->biv->src_reg; ! 3369: } ! 3370: ! 3371: fmt = GET_RTX_FORMAT (code); ! 3372: for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) ! 3373: { ! 3374: if (fmt[i] == 'e') ! 3375: XEXP (x, i) = remap_split_bivs (XEXP (x, i)); ! 3376: if (fmt[i] == 'E') ! 3377: { ! 3378: register int j; ! 3379: for (j = 0; j < XVECLEN (x, i); j++) ! 3380: XVECEXP (x, i, j) = remap_split_bivs (XVECEXP (x, i, j)); ! 3381: } ! 3382: } ! 3383: return x; ! 3384: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.