diff options
author | Zdenek Dvorak <dvorakz@suse.cz> | 2006-08-16 23:14:11 +0200 |
---|---|---|
committer | Zdenek Dvorak <rakdver@gcc.gnu.org> | 2006-08-16 21:14:11 +0000 |
commit | b43a2366d696649472d8615dec3765fecc54477a (patch) | |
tree | e8173d30c8c27f0101aa05f52b4041fe6a80bf11 /gcc/tree-ssa-loop-ivopts.c | |
parent | c58e8676dd02e78d29512ff0f0b024ce91c62883 (diff) | |
download | gcc-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.c | 30 |
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; } |