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
This commit is contained in:
Zdenek Dvorak 2006-08-16 23:14:11 +02:00 committed by Zdenek Dvorak
parent c58e8676dd
commit b43a2366d6
2 changed files with 34 additions and 4 deletions

View file

@ -1,3 +1,11 @@
2006-08-16 Zdenek Dvorak <dvorakz@suse.cz>
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.
2006-08-16 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
PR c/27489

View file

@ -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;
}