aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZdenek Dvorak <dvorakz@suse.cz>2005-02-06 19:47:12 +0100
committerZdenek Dvorak <rakdver@gcc.gnu.org>2005-02-06 18:47:12 +0000
commitb0a168b645d310b6bf2638967562cfab8f89d555 (patch)
treec3b38491c272a4ee7153374630dc46936ef4c86d
parent2c58f7dde2bdb003105479ffe316cb7935b711c3 (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/tree-ssa-loop-ivopts.c20
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);
}