diff options
author | rakdver <rakdver@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-02-06 18:47:12 +0000 |
---|---|---|
committer | rakdver <rakdver@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-02-06 18:47:12 +0000 |
commit | 2ca7b961e623a0b74599ab7ec9401373fbd5256b (patch) | |
tree | c3b38491c272a4ee7153374630dc46936ef4c86d /gcc/tree-ssa-loop-ivopts.c | |
parent | bc5449fc88f53b28252fdbec7662765405d1f013 (diff) | |
download | gcc-2ca7b961e623a0b74599ab7ec9401373fbd5256b.tar.gz |
PR tree-optimization/18219
* tree-ssa-loop-ivopts.c (get_computation_at): Produce computations
in distributed form.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@94680 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-ssa-loop-ivopts.c')
-rw-r--r-- | gcc/tree-ssa-loop-ivopts.c | 20 |
1 files changed, 8 insertions, 12 deletions
diff --git a/gcc/tree-ssa-loop-ivopts.c b/gcc/tree-ssa-loop-ivopts.c index 3288080ac52..05f4a8da7bb 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); } |