diff options
author | Jim Wilson <wilson@gcc.gnu.org> | 1993-12-22 11:21:01 -0800 |
---|---|---|
committer | Jim Wilson <wilson@gcc.gnu.org> | 1993-12-22 11:21:01 -0800 |
commit | 75540fea2d9274160057355dcaca3c70428f22d1 (patch) | |
tree | 7d35a9f5e09f7a3bbbcf695a91dc1889295e5571 | |
parent | 1810c3fa48bfd1071b9a53d6eab3969f45b77c8f (diff) | |
download | gcc-75540fea2d9274160057355dcaca3c70428f22d1.zip gcc-75540fea2d9274160057355dcaca3c70428f22d1.tar.gz gcc-75540fea2d9274160057355dcaca3c70428f22d1.tar.bz2 |
(find_splittable_givs): For rewritting illegal init
insn, use force_operand instead of emit_iv_add_mult.
From-SVN: r6267
-rw-r--r-- | gcc/unroll.c | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/gcc/unroll.c b/gcc/unroll.c index e3ed103..eac1e95 100644 --- a/gcc/unroll.c +++ b/gcc/unroll.c @@ -2669,9 +2669,22 @@ find_splittable_givs (bl, unroll_type, loop_start, loop_end, increment, loop_start); if (recog_memoized (PREV_INSN (loop_start)) < 0) { + rtx sequence, ret; + + /* We can't use bl->initial_value to compute the initial + value, because the loop may have been preconditioned. + We must calculate it from NEW_REG. Try using + force_operand instead of emit_iv_add_mult. */ delete_insn (PREV_INSN (loop_start)); - emit_iv_add_mult (bl->initial_value, v->mult_val, - v->add_val, tem, loop_start); + + start_sequence (); + ret = force_operand (v->new_reg, tem); + if (ret != tem) + emit_move_insn (tem, ret); + sequence = gen_sequence (); + end_sequence (); + emit_insn_before (sequence, loop_start); + if (loop_dump_stream) fprintf (loop_dump_stream, "Illegal init insn, rewritten.\n"); |