diff options
author | Zdenek Dvorak <dvorakz@suse.cz> | 2005-02-06 19:47:12 +0100 |
---|---|---|
committer | Zdenek Dvorak <rakdver@gcc.gnu.org> | 2005-02-06 18:47:12 +0000 |
commit | b0a168b645d310b6bf2638967562cfab8f89d555 (patch) | |
tree | c3b38491c272a4ee7153374630dc46936ef4c86d | |
parent | 2c58f7dde2bdb003105479ffe316cb7935b711c3 (diff) | |
download | gcc-b0a168b645d310b6bf2638967562cfab8f89d555.zip gcc-b0a168b645d310b6bf2638967562cfab8f89d555.tar.gz gcc-b0a168b645d310b6bf2638967562cfab8f89d555.tar.bz2 |
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
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/tree-ssa-loop-ivopts.c | 20 |
2 files changed, 14 insertions, 12 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e02434e..83c0ed5 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2005-02-06 Zdenek Dvorak <dvorakz@suse.cz> + + PR tree-optimization/18219 + * tree-ssa-loop-ivopts.c (get_computation_at): Produce computations + in distributed form. + 2005-02-06 Richard Sandiford <rsandifo@redhat.com> * 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 3288080..05f4a8d 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); } |