From 9827f778db2e051f0803ef226ee3076fd7ef9d20 Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Tue, 27 Nov 2001 14:09:10 -0800 Subject: [PATCH] unroll.c (loop_iterations): Move last change ... * unroll.c (loop_iterations): Move last change ... * doloop.c (doloop_modify_runtime): ... here. From-SVN: r47387 --- gcc/ChangeLog | 5 +++++ gcc/doloop.c | 40 ++++++++++++++++++++++++++++++++++++++++ gcc/unroll.c | 35 ----------------------------------- 3 files changed, 45 insertions(+), 35 deletions(-) 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) -- 2.30.2