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