diff options
author | kan <kan@FreeBSD.org> | 2002-09-17 04:03:37 +0000 |
---|---|---|
committer | kan <kan@FreeBSD.org> | 2002-09-17 04:03:37 +0000 |
commit | 366976642281939a5ef910427ef046ec6f72af8a (patch) | |
tree | 142ed567a01fe5d8a2452c34837343fe24fa825a /contrib/gcc/unroll.c | |
parent | e921678e240f578a38fecb6143e3cdd2b0494996 (diff) | |
download | FreeBSD-src-366976642281939a5ef910427ef046ec6f72af8a.zip FreeBSD-src-366976642281939a5ef910427ef046ec6f72af8a.tar.gz |
Gcc 3.2.1-prerelease from the FSF anoncvs repo gcc-3_2-branch on 16-Sep-2002 13:23:11 EDT.
Diffstat (limited to 'contrib/gcc/unroll.c')
-rw-r--r-- | contrib/gcc/unroll.c | 43 |
1 files changed, 37 insertions, 6 deletions
diff --git a/contrib/gcc/unroll.c b/contrib/gcc/unroll.c index 6be951e..032d675 100644 --- a/contrib/gcc/unroll.c +++ b/contrib/gcc/unroll.c @@ -3997,12 +3997,6 @@ loop_iterations (loop) } return 0; } - else if (comparison_code == EQ) - { - if (loop_dump_stream) - fprintf (loop_dump_stream, "Loop iterations: EQ comparison loop.\n"); - return 0; - } else if (GET_CODE (final_value) != CONST_INT) { if (loop_dump_stream) @@ -4014,6 +4008,43 @@ loop_iterations (loop) } return 0; } + else if (comparison_code == EQ) + { + rtx inc_once; + + if (loop_dump_stream) + fprintf (loop_dump_stream, "Loop iterations: EQ comparison loop.\n"); + + inc_once = gen_int_mode (INTVAL (initial_value) + INTVAL (increment), + GET_MODE (iteration_var)); + + if (inc_once == final_value) + { + /* The iterator value once through the loop is equal to the + comparision value. Either we have an infinite loop, or + we'll loop twice. */ + if (increment == const0_rtx) + return 0; + loop_info->n_iterations = 2; + } + else + loop_info->n_iterations = 1; + + if (GET_CODE (loop_info->initial_value) == CONST_INT) + loop_info->final_value + = gen_int_mode ((INTVAL (loop_info->initial_value) + + loop_info->n_iterations * INTVAL (increment)), + GET_MODE (iteration_var)); + else + loop_info->final_value + = plus_constant (loop_info->initial_value, + loop_info->n_iterations * INTVAL (increment)); + loop_info->final_equiv_value + = gen_int_mode ((INTVAL (initial_value) + + loop_info->n_iterations * INTVAL (increment)), + GET_MODE (iteration_var)); + return loop_info->n_iterations; + } /* Final_larger is 1 if final larger, 0 if they are equal, otherwise -1. */ if (unsigned_p) |