From b0a168b645d310b6bf2638967562cfab8f89d555 Mon Sep 17 00:00:00 2001 From: Zdenek Dvorak Date: Sun, 6 Feb 2005 19:47:12 +0100 Subject: [PATCH] re PR tree-optimization/18219 (bloats code by 31%) PR tree-optimization/18219 * tree-ssa-loop-ivopts.c (get_computation_at): Produce computations in distributed form. From-SVN: r94680 --- gcc/ChangeLog | 6 ++++++ gcc/tree-ssa-loop-ivopts.c | 20 ++++++++------------ 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e02434e999df..83c0ed5836e6 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2005-02-06 Zdenek Dvorak + + PR tree-optimization/18219 + * tree-ssa-loop-ivopts.c (get_computation_at): Produce computations + in distributed form. + 2005-02-06 Richard Sandiford * expmed.c (store_bit_field): Make the SUBREG code adjust bitnum. diff --git a/gcc/tree-ssa-loop-ivopts.c b/gcc/tree-ssa-loop-ivopts.c index 3288080ac528..05f4a8da7bbd 100644 --- a/gcc/tree-ssa-loop-ivopts.c +++ b/gcc/tree-ssa-loop-ivopts.c @@ -2376,10 +2376,13 @@ get_computation_at (struct loop *loop, if (stmt_after_increment (loop, cand, at)) cbase = fold (build2 (PLUS_EXPR, uutype, cbase, cstep)); - /* use = ubase + ratio * (var - cbase). If either cbase is a constant - or |ratio| == 1, it is better to handle this like - - ubase - ratio * cbase + ratio * var. */ + /* use = ubase - ratio * cbase + ratio * var. + + In general case ubase + ratio * (var - cbase) could be better (one less + multiplication), but often it is possible to eliminate redundant parts + of computations from (ubase - ratio * cbase) term, and if it does not + happen, fold is able to apply the distributive law to obtain this form + anyway. */ if (ratioi == 1) { @@ -2391,7 +2394,7 @@ get_computation_at (struct loop *loop, delta = fold (build2 (PLUS_EXPR, uutype, ubase, cbase)); expr = fold (build2 (MINUS_EXPR, uutype, delta, expr)); } - else if (TREE_CODE (cbase) == INTEGER_CST) + else { ratio = build_int_cst_type (uutype, ratioi); delta = fold (build2 (MULT_EXPR, uutype, ratio, cbase)); @@ -2399,13 +2402,6 @@ get_computation_at (struct loop *loop, expr = fold (build2 (MULT_EXPR, uutype, ratio, expr)); expr = fold (build2 (PLUS_EXPR, uutype, delta, expr)); } - else - { - expr = fold (build2 (MINUS_EXPR, uutype, expr, cbase)); - ratio = build_int_cst_type (uutype, ratioi); - expr = fold (build2 (MULT_EXPR, uutype, ratio, expr)); - expr = fold (build2 (PLUS_EXPR, uutype, ubase, expr)); - } return fold_convert (utype, expr); } -- 2.47.2