From: Richard Henderson Date: Tue, 27 Nov 2001 22:09:10 +0000 (-0800) Subject: unroll.c (loop_iterations): Move last change ... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=9827f778db2e051f0803ef226ee3076fd7ef9d20;p=gcc.git unroll.c (loop_iterations): Move last change ... * unroll.c (loop_iterations): Move last change ... * doloop.c (doloop_modify_runtime): ... here. From-SVN: r47387 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 00e613407a8..577c2a393bf 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2001-11-17 Richard Henderson + + * unroll.c (loop_iterations): Move last change ... + * doloop.c (doloop_modify_runtime): ... here. + 2001-11-17 Corey Minyard Richard Henderson diff --git a/gcc/doloop.c b/gcc/doloop.c index 2b1317f900a..be232d63e6c 100644 --- a/gcc/doloop.c +++ b/gcc/doloop.c @@ -596,6 +596,46 @@ doloop_modify_runtime (loop, iterations_max, copy_rtx (neg_inc ? final_value : initial_value), NULL_RTX, unsigned_p, OPTAB_LIB_WIDEN); + /* Some code transformations can result in code akin to + + tmp = i + 1; + ... + goto scan_start; + top: + tmp = tmp + 1; + scan_start: + i = tmp; + if (i < n) goto top; + + We'll have already detected this form of loop in scan_loop, + and set loop->top and loop->scan_start appropriately. + + In this situation, we skip the increment the first time through + the loop, which results in an incorrect estimate of the number + of iterations. Adjust the difference to compensate. */ + /* ??? Logically, it would seem this belongs in loop_iterations. + However, this causes regressions e.g. on x86 execute/20011008-3.c, + so I do not believe we've properly characterized the exact nature + of the problem. In the meantime, this fixes execute/20011126-2.c + on ia64 and some Ada front end miscompilation on ppc. */ + + if (loop->scan_start) + { + struct loop_ivs *ivs = LOOP_IVS (loop); + struct iv_class *bl + = REG_IV_CLASS (ivs, REGNO (loop_info->iteration_var)); + + if (INSN_LUID (bl->biv->insn) < INSN_LUID (loop->scan_start)) + { + if (loop_dump_stream) + fprintf (loop_dump_stream, + "Doloop: Basic induction var skips initial incr.\n"); + + diff = expand_simple_binop (mode, PLUS, diff, increment, diff, + unsigned_p, OPTAB_LIB_WIDEN); + } + } + if (abs_inc * loop_info->unroll_number != 1) { int shift_count; diff --git a/gcc/unroll.c b/gcc/unroll.c index 35ce939f012..4b7dd974925 100644 --- a/gcc/unroll.c +++ b/gcc/unroll.c @@ -3706,41 +3706,6 @@ loop_iterations (loop) if (initial_value == 0) return 0; - /* Some code transformations can result in code akin to - - tmp = i + 1; - ... - goto scan_start; - top: - tmp = tmp + 1; - scan_start: - i = tmp; - if (i < n) goto top; - - We'll have already detected this form of loop in scan_loop, - and set loop->top and loop->scan_start appropriately. - - In this situation, we skip the increment the first time through - the loop, which results in an incorrect estimate of the number - of iterations. Adjust the initial value to compensate. */ - - if (loop->scan_start && loop->cont - && INSN_LUID (loop->scan_start) < INSN_LUID (loop->cont) - && INSN_LUID (bl->biv->insn) < INSN_LUID (loop->scan_start)) - { - if (loop_dump_stream) - fprintf (loop_dump_stream, - "Loop iterations: Basic induction var skips initial incr.\n"); - if (GET_CODE (increment) != CONST_INT) - { - if (loop_dump_stream) - fprintf (loop_dump_stream, - "Loop iterations: Can't adjust with non-constant incr.\n"); - return 0; - } - initial_value = plus_constant (initial_value, -INTVAL (increment)); - } - unsigned_p = 0; off_by_one = 0; switch (comparison_code)