diff options
Diffstat (limited to 'gcc/loop-iv.c')
-rw-r--r-- | gcc/loop-iv.c | 11 |
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); |