aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-loop-ivopts.c
diff options
context:
space:
mode:
authorZdenek Dvorak <dvorakz@suse.cz>2006-08-16 23:14:11 +0200
committerZdenek Dvorak <rakdver@gcc.gnu.org>2006-08-16 21:14:11 +0000
commitb43a2366d696649472d8615dec3765fecc54477a (patch)
treee8173d30c8c27f0101aa05f52b4041fe6a80bf11 /gcc/tree-ssa-loop-ivopts.c
parentc58e8676dd02e78d29512ff0f0b024ce91c62883 (diff)
downloadgcc-b43a2366d696649472d8615dec3765fecc54477a.zip
gcc-b43a2366d696649472d8615dec3765fecc54477a.tar.gz
gcc-b43a2366d696649472d8615dec3765fecc54477a.tar.bz2
re PR tree-optimization/28364 (poor optimization choices when iterating over a std::string (probably not c++-specific))
PR tree-optimization/28364 * tree-ssa-loop-ivopts.c (aff_combination_to_tree): Handle zero correctly. (fold_affine_expr): New function. (may_eliminate_iv): Use fold_affine_expr. From-SVN: r116189
Diffstat (limited to 'gcc/tree-ssa-loop-ivopts.c')
-rw-r--r--gcc/tree-ssa-loop-ivopts.c30
1 files changed, 26 insertions, 4 deletions
diff --git a/gcc/tree-ssa-loop-ivopts.c b/gcc/tree-ssa-loop-ivopts.c
index 8a69664..0e8fa94 100644
--- a/gcc/tree-ssa-loop-ivopts.c
+++ b/gcc/tree-ssa-loop-ivopts.c
@@ -2917,10 +2917,17 @@ aff_combination_to_tree (struct affine_tree_combination *comb)
unsigned i;
unsigned HOST_WIDE_INT off, sgn;
- /* Handle the special case produced by get_computation_aff when
- the type does not fit in HOST_WIDE_INT. */
if (comb->n == 0 && comb->offset == 0)
- return fold_convert (type, expr);
+ {
+ if (expr)
+ {
+ /* Handle the special case produced by get_computation_aff when
+ the type does not fit in HOST_WIDE_INT. */
+ return fold_convert (type, expr);
+ }
+ else
+ return build_int_cst (type, 0);
+ }
gcc_assert (comb->n == MAX_AFF_ELTS || comb->rest == NULL_TREE);
@@ -2943,6 +2950,21 @@ aff_combination_to_tree (struct affine_tree_combination *comb)
comb->mask);
}
+/* Folds EXPR using the affine expressions framework. */
+
+static tree
+fold_affine_expr (tree expr)
+{
+ tree type = TREE_TYPE (expr);
+ struct affine_tree_combination comb;
+
+ if (TYPE_PRECISION (type) > HOST_BITS_PER_WIDE_INT)
+ return expr;
+
+ tree_to_aff_combination (expr, type, &comb);
+ return aff_combination_to_tree (&comb);
+}
+
/* Determines the expression by that USE is expressed from induction variable
CAND at statement AT in LOOP. The expression is stored in a decomposed
form into AFF. Returns false if USE cannot be expressed using CAND. */
@@ -4029,7 +4051,7 @@ may_eliminate_iv (struct ivopts_data *data,
fold_convert (wider_type, nit))))
return false;
- *bound = cand_value_at (loop, cand, use->stmt, nit);
+ *bound = fold_affine_expr (cand_value_at (loop, cand, use->stmt, nit));
return true;
}