diff options
author | Richard Kenner <kenner@gcc.gnu.org> | 1995-07-14 08:27:10 -0400 |
---|---|---|
committer | Richard Kenner <kenner@gcc.gnu.org> | 1995-07-14 08:27:10 -0400 |
commit | 3669e64614f74846486340dbe3939dbb35bed5f8 (patch) | |
tree | 8ec8b20df28afb9253898213681c754c11a6e196 /gcc | |
parent | 85ee74529a9ae57ca64c807956048308976c8ea5 (diff) | |
download | gcc-3669e64614f74846486340dbe3939dbb35bed5f8.zip gcc-3669e64614f74846486340dbe3939dbb35bed5f8.tar.gz gcc-3669e64614f74846486340dbe3939dbb35bed5f8.tar.bz2 |
(find_splittable_{regs,givs}, final_[bg]iv_value): Use loop_number_exit_count instead of loop_number_exit_labels.
(find_splittable_{regs,givs}, final_[bg]iv_value): Use loop_number_exit_count
instead of loop_number_exit_labels.
(reg_dead_after_loop): Check loop_number_exit_count, and fail if the count
doesn't match loop_number_exit_labels.
From-SVN: r10130
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/unroll.c | 29 |
1 files changed, 21 insertions, 8 deletions
diff --git a/gcc/unroll.c b/gcc/unroll.c index 76543d9..4bc72ae 100644 --- a/gcc/unroll.c +++ b/gcc/unroll.c @@ -2357,13 +2357,13 @@ find_splittable_regs (unroll_type, loop_start, loop_end, end_insert_before, it is unsafe to split the biv since it may not have the proper value on loop exit. */ - /* loop_number_exit_labels is non-zero if the loop has an exit other than + /* loop_number_exit_count is non-zero if the loop has an exit other than a fall through at the end. */ biv_splittable = 1; biv_final_value = 0; if (unroll_type != UNROLL_COMPLETELY - && (loop_number_exit_labels[uid_loop_num[INSN_UID (loop_start)]] + && (loop_number_exit_count[uid_loop_num[INSN_UID (loop_start)]] || unroll_type == UNROLL_NAIVE) && (uid_luid[regno_last_uid[bl->regno]] >= INSN_LUID (loop_end) || ! bl->init_insn @@ -2451,7 +2451,7 @@ find_splittable_regs (unroll_type, loop_start, loop_end, end_insert_before, loop to ensure that it will always be executed no matter how the loop exits. Otherwise emit the insn after the loop, since this is slightly more efficient. */ - if (! loop_number_exit_labels[uid_loop_num[INSN_UID (loop_start)]]) + if (! loop_number_exit_count[uid_loop_num[INSN_UID (loop_start)]]) emit_insn_before (gen_move_insn (bl->biv->src_reg, biv_final_value), end_insert_before); @@ -2574,7 +2574,7 @@ find_splittable_givs (bl, unroll_type, loop_start, loop_end, increment, final_value = 0; if (unroll_type != UNROLL_COMPLETELY - && (loop_number_exit_labels[uid_loop_num[INSN_UID (loop_start)]] + && (loop_number_exit_count[uid_loop_num[INSN_UID (loop_start)]] || unroll_type == UNROLL_NAIVE) && v->giv_type != DEST_ADDR && ((regno_first_uid[REGNO (v->dest_reg)] != INSN_UID (v->insn) @@ -2914,13 +2914,26 @@ reg_dead_after_loop (reg, loop_start, loop_end) rtx insn, label; enum rtx_code code; int jump_count = 0; + int label_count = 0; + int this_loop_num = uid_loop_num[INSN_UID (loop_start)]; + + /* In addition to checking all exits of this loop, we must also check + all exits of inner nested loops that would exit this loop. We don't + have any way to identify those, so we just give up if there are any + such inner loop exits. */ + + for (label = loop_number_exit_labels[this_loop_num]; label; + label = LABEL_NEXTREF (label)) + label_count++; + + if (label_count != loop_number_exit_count[this_loop_num]) + return 0; /* HACK: Must also search the loop fall through exit, create a label_ref here which points to the loop_end, and append the loop_number_exit_labels list to it. */ label = gen_rtx (LABEL_REF, VOIDmode, loop_end); - LABEL_NEXTREF (label) - = loop_number_exit_labels[uid_loop_num[INSN_UID (loop_start)]]; + LABEL_NEXTREF (label) = loop_number_exit_labels[this_loop_num]; for ( ; label; label = LABEL_NEXTREF (label)) { @@ -2999,7 +3012,7 @@ final_biv_value (bl, loop_start, loop_end) value of the biv must be invariant. */ if (loop_n_iterations != 0 - && ! loop_number_exit_labels[uid_loop_num[INSN_UID (loop_start)]] + && ! loop_number_exit_count[uid_loop_num[INSN_UID (loop_start)]] && invariant_p (bl->initial_value)) { increment = biv_total_increment (bl, loop_start, loop_end); @@ -3077,7 +3090,7 @@ final_giv_value (v, loop_start, loop_end) to be known. */ if (loop_n_iterations != 0 - && ! loop_number_exit_labels[uid_loop_num[INSN_UID (loop_start)]]) + && ! loop_number_exit_count[uid_loop_num[INSN_UID (loop_start)]]) { /* ?? It is tempting to use the biv's value here since these insns will be put after the loop, and hence the biv will have its final value |