aboutsummaryrefslogtreecommitdiff
path: root/gcc/loop-iv.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/loop-iv.c')
-rw-r--r--gcc/loop-iv.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/gcc/loop-iv.c b/gcc/loop-iv.c
index 97cfdf7c07e..dd9f06ebddb 100644
--- a/gcc/loop-iv.c
+++ b/gcc/loop-iv.c
@@ -1874,7 +1874,7 @@ iv_number_of_iterations (struct loop *loop, rtx insn, rtx condition,
enum rtx_code cond;
enum machine_mode mode, comp_mode;
rtx mmin, mmax;
- unsigned HOST_WIDEST_INT s, size, d;
+ unsigned HOST_WIDEST_INT s, size, d, inv;
HOST_WIDEST_INT up, down, inc;
int was_sharp = false;
@@ -2186,8 +2186,9 @@ iv_number_of_iterations (struct loop *loop, rtx insn, rtx condition,
desc->infinite = alloc_EXPR_LIST (0, assumption, desc->infinite);
tmp = simplify_gen_binary (UDIV, mode, tmp1, GEN_INT (d));
- tmp = simplify_gen_binary (MULT, mode,
- tmp, GEN_INT (inverse (s, size)));
+ inv = inverse (s, size);
+ inv = trunc_int_for_mode (inv, mode);
+ tmp = simplify_gen_binary (MULT, mode, tmp, GEN_INT (inv));
desc->niter_expr = simplify_gen_binary (AND, mode, tmp, bound);
}
else
@@ -2281,6 +2282,10 @@ iv_number_of_iterations (struct loop *loop, rtx insn, rtx condition,
simplify_using_initial_values (loop, IOR, &desc->infinite);
simplify_using_initial_values (loop, NIL, &desc->niter_expr);
+ if (desc->noloop_assumptions
+ && XEXP (desc->noloop_assumptions, 0) == const_true_rtx)
+ goto zero_iter;
+
if (GET_CODE (desc->niter_expr) == CONST_INT)
{
unsigned HOST_WIDEST_INT val = INTVAL (desc->niter_expr);