aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJim Wilson <wilson@gcc.gnu.org>1993-12-22 11:21:01 -0800
committerJim Wilson <wilson@gcc.gnu.org>1993-12-22 11:21:01 -0800
commit75540fea2d9274160057355dcaca3c70428f22d1 (patch)
tree7d35a9f5e09f7a3bbbcf695a91dc1889295e5571
parent1810c3fa48bfd1071b9a53d6eab3969f45b77c8f (diff)
downloadgcc-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.c17
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");