From fe3f617f6d19d4c3ea07c5387d9988e5dd854c52 Mon Sep 17 00:00:00 2001 From: Zdenek Dvorak Date: Sun, 11 Jul 2004 04:52:54 +0200 Subject: [PATCH] re PR rtl-optimization/16001 (unable to find a register to spill in class `AREG' (-O2 -funroll-loops)) PR rtl-optimization/16001 * loop-iv.c (iv_number_of_iterations): Prevent copy propagation in niter_expr. From-SVN: r84486 --- gcc/ChangeLog | 7 +++++++ gcc/loop-iv.c | 18 ++++++++++++++++-- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 851644f6b82..a8e979df06c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2004-07-10 Zdenek Dvorak + + PR rtl-optimization/16001 + * loop-iv.c (iv_number_of_iterations): Prevent copy propagation in + niter_expr. + 2004-07-10 Geoffrey Keating * config/darwin.h (LINK_COMMAND_SPEC): Don't call c++filt. @@ -10,6 +16,7 @@ 2004-07-10 Zdenek Dvorak + PR rtl-optimization/15387 * calls.c (check_sibcall_argument_overlap_1): Handle pointers to incoming args space correctly. diff --git a/gcc/loop-iv.c b/gcc/loop-iv.c index 965359c5931..f390cdd487c 100644 --- a/gcc/loop-iv.c +++ b/gcc/loop-iv.c @@ -1967,6 +1967,7 @@ iv_number_of_iterations (struct loop *loop, rtx insn, rtx condition, unsigned HOST_WIDEST_INT s, size, d, inv; HOST_WIDEST_INT up, down, inc; int was_sharp = false; + rtx old_niter; /* The meaning of these assumptions is this: if !assumptions @@ -2366,6 +2367,8 @@ iv_number_of_iterations (struct loop *loop, rtx insn, rtx condition, desc->niter_expr = delta; } + old_niter = desc->niter_expr; + simplify_using_initial_values (loop, AND, &desc->assumptions); if (desc->assumptions && XEXP (desc->assumptions, 0) == const0_rtx) @@ -2408,8 +2411,19 @@ iv_number_of_iterations (struct loop *loop, rtx insn, rtx condition, desc->const_iter = true; desc->niter_max = desc->niter = val & GET_MODE_MASK (desc->mode); } - else if (!desc->niter_max) - desc->niter_max = determine_max_iter (desc); + else + { + if (!desc->niter_max) + desc->niter_max = determine_max_iter (desc); + + /* simplify_using_initial_values does a copy propagation on the registers + in the expression for the number of iterations. This prolongs life + ranges of registers and increases register pressure, and usually + brings no gain (and if it happens to do, the cse pass will take care + of it anyway). So prevent this behavior, unless it enabled us to + derive that the number of iterations is a constant. */ + desc->niter_expr = old_niter; + } return; -- 2.30.2