From: Zdenek Dvorak Date: Sun, 6 Feb 2005 18:47:12 +0000 (+0100) Subject: re PR tree-optimization/18219 (bloats code by 31%) X-Git-Tag: releases/gcc-4.0.0~1056 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=b0a168b645d310b6bf2638967562cfab8f89d555;p=thirdparty%2Fgcc.git 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 --- 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); }